From d5dd18e6b3292b7581e444d8a9a5a854f0ec6b0b Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Thu, 25 Apr 2024 14:54:22 -0700 Subject: [PATCH 01/22] =?UTF-8?q?ProposalPolice=E2=84=A2=20GH=20Actions=20?= =?UTF-8?q?Workflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../proposal-police/issue-comment-edit.js | 116 +++++++++++++++++ .../scripts/proposal-police/issue-comment.js | 120 ++++++++++++++++++ .github/scripts/proposal-police/package.json | 10 ++ .github/workflows/proposalPolice.yml | 41 ++++++ 4 files changed, 287 insertions(+) create mode 100644 .github/scripts/proposal-police/issue-comment-edit.js create mode 100644 .github/scripts/proposal-police/issue-comment.js create mode 100644 .github/scripts/proposal-police/package.json create mode 100644 .github/workflows/proposalPolice.yml diff --git a/.github/scripts/proposal-police/issue-comment-edit.js b/.github/scripts/proposal-police/issue-comment-edit.js new file mode 100644 index 000000000000..fd17903b8f76 --- /dev/null +++ b/.github/scripts/proposal-police/issue-comment-edit.js @@ -0,0 +1,116 @@ +// Import GitHub toolkit and Octokit REST client +const { context, getOctokit } = require('@actions/github'); +const InitOpenAI = require('openai'); +const _ = require('underscore'); + +const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); + +/** + * Handles the case when somebody edits a comment on an issue to check whether it's a proposal and what kind of changes were made. + * @param {*} octokit - GitHub REST client + * @param {*} labelNames - String array of label names to check for, ex. ['Help Wanted', "External"] + * @returns {Promise} + */ +async function handleIssueCommentEdited(octokit, labelNames) { + const payload = context.payload; + const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; + + // check if the issue is opened and the has all passed labels + if ( + payload.issue.state === 'open' && + _.every(labelNames, labelName => _.some(payload.issue.labels, issueLabel => issueLabel.name === labelName)) + ) { + if (!OPENAI_ASSISTANT_ID) { + console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); + return; + } + + // You need to adapt this part to fit the Edit Use Case as in the original function + const content = `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body.from}.\n\nEdited comment content: ${payload.comment.body}`; + + // create thread with first user message and run it + const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ + assistant_id: OPENAI_ASSISTANT_ID || '', + thread: {messages: [{ role: "user", content }],}, + }); + + // count calls for debug purposes + let count = 0; + // poll for run completion + const intervalID = setInterval(() => { + OpenAI.beta.threads.runs.retrieve(createAndRunResponse.thread_id, createAndRunResponse.id).then(threadRun => { + // return if run is not completed yet + if (threadRun.status !== "completed") { + console.log('issue_comment.edited - run pending completion'); + return; + } + + // get assistant response + OpenAI.beta.threads.messages.list(createAndRunResponse.thread_id).then(threadMessages => { + // list thread messages content + threadMessages.data.forEach((message, index) => { + // @ts-ignore - we do have text value in content[0] but typescript doesn't know that + // this is a 'openai' package type issue + const assistantResponse = message.content[index].text.value; + console.log('issue_comment.edited - assistantResponse', assistantResponse); + + if (!assistantResponse) { + return console.log('issue_comment.edited - assistantResponse is empty'); + } + + // check if assistant response is either NO_ACTION or "NO_ACTION" strings + // as sometimes the assistant response varies + const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; + // if assistant response is NO_ACTION or message role is 'user', do nothing + if (isNoAction || threadMessages.data[index].role === 'user') { + if (threadMessages.data[index].role === 'user') { + return; + } + return console.log('issue_comment.edited - NO_ACTION'); + } + + // edit comment if assistant detected substantial changes and if the comment was not edited already by the bot + if (assistantResponse.includes('[EDIT_COMMENT]') && !payload.comment.body.includes('Edited by **proposal-police**')) { + // extract the text after [EDIT_COMMENT] from assistantResponse since this is a + // bot related action keyword + let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')[1].replace('"', ''); + // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC + const date = new Date(payload.comment.updated_at); + const formattedDate = `${date.toISOString().split('.')[0].replace('T', ' ') } UTC`; + extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); + + console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment.id}`); + return octokit.issues.updateComment({ + ...context.repo, + comment_id: payload.comment.id, + body: `${extractedNotice}\n\n${ payload.comment.body}`, + }); + } + + return false; + }); + }).catch(err => console.log('threads.messages.list - err', err)); + + // stop polling + clearInterval(intervalID); + }).catch(err => console.log('threads.runs.retrieve - err', err)); + + // increment count for every threads.runs.retrieve call + count++; + console.log('threads.runs.retrieve - called:', count); + }, 1500); + } + + // return so that the script doesn't hang + return false; +} + +async function run() { + const octokit = getOctokit(process.env.GITHUB_TOKEN); + await handleIssueCommentEdited(octokit, ['Help Wanted']); +} + +run().catch(error => { + console.error(error); + process.exit(1); +}); diff --git a/.github/scripts/proposal-police/issue-comment.js b/.github/scripts/proposal-police/issue-comment.js new file mode 100644 index 000000000000..a8dab4a95a84 --- /dev/null +++ b/.github/scripts/proposal-police/issue-comment.js @@ -0,0 +1,120 @@ +// Import GitHub toolkit and Octokit REST client +const { context, getOctokit } = require('@actions/github'); +const InitOpenAI = require('openai'); +const _ = require('underscore'); + +const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); + +/** + * Handles the case when somebody edits a comment on an issue to check whether it's a proposal and what kind of changes were made. + * @param {*} octokit - GitHub REST client + * @param {*} labelNames - String array of label names to check for, ex. ['Help Wanted', "External"] + * @returns {Promise} + */ +async function handleIssueCommentCreated(octokit, labelNames) { + const payload = context.payload; + const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; + + // check if the issue is opened and the has all passed labels + if ( + payload.issue.state === 'open' && + _.every(labelNames, labelName => _.some(payload.issue.labels, issueLabel => issueLabel.name === labelName)) + ) { + if (!OPENAI_ASSISTANT_ID) { + console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); + return; + } + + // 1, check if comment is proposal and if proposal template is followed + const content = `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment.body}`; + + // create thread with first user message and run it + const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ + assistant_id: OPENAI_ASSISTANT_ID || '', + thread: {messages: [{ role: "user", content }],}, + }); + + // count calls for debug purposes + let count = 0; + // poll for run completion + const intervalID = setInterval(() => { + OpenAI.beta.threads.runs.retrieve(createAndRunResponse.thread_id, createAndRunResponse.id).then(threadRun => { + // return if run is not completed + if (threadRun.status !== "completed") { + return; + } + + // get assistant response + OpenAI.beta.threads.messages.list(createAndRunResponse.thread_id).then(threadMessages => { + // list thread messages content + threadMessages.data.forEach((message, index) => { + // @ts-ignore - we do have text value in content[0] but typescript doesn't know that + // this is a 'openai' package type issue + let assistantResponse = message.content[index].text.value; + console.log('issue_comment.created - assistantResponse', assistantResponse); + + if (!assistantResponse) { + return console.log('issue_comment.created - assistantResponse is empty'); + } + + // check if assistant response is either NO_ACTION or "NO_ACTION" strings + // as sometimes the assistant response varies + const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; + // if assistant response is NO_ACTION or message role is 'user', do nothing + if (isNoAction || threadMessages.data[index].role === 'user') { + if (threadMessages.data[index].role === 'user') { + return; + } + return console.log('issue_comment.created - NO_ACTION'); + } + + // if the assistant responded with no action but there's some context in the response + if (assistantResponse.includes('[NO_ACTION]')) { + // extract the text after [NO_ACTION] from assistantResponse since this is a + // bot related action keyword + const noActionContext = assistantResponse.split('[NO_ACTION] ')[1].replace('"', ''); + console.log('issue_comment.created - [NO_ACTION] w/ context: ', noActionContext); + return; + } + // replace {user} from response template with @username + assistantResponse = assistantResponse.replace('{user}', `@${payload.comment.user.login}`); + // replace {proposalLink} from response template with the link to the comment + assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment.html_url); + + // remove any double quotes from the final comment because sometimes the assistant's + // response contains double quotes / sometimes it doesn't + assistantResponse = assistantResponse.replace('"', ''); + // create a comment with the assistant's response + console.log('issue_comment.created - proposal-police posts comment'); + return octokit.issues.createComment({ + ...context.repo, + issue_number: payload.issue.number, + body: assistantResponse + }); + }); + }).catch(err => console.log('threads.messages.list - err', err)); + + // stop polling + clearInterval(intervalID); + }).catch(err => console.log('threads.runs.retrieve - err', err)); + + // increment count for every threads.runs.retrieve call + count++; + console.log('threads.runs.retrieve - called:', count); + }, 1500); + } + + // return so that the script doesn't hang + return false; +} + +// Main function to process the workflow event +async function run() { + const octokit = getOctokit(process.env.GITHUB_TOKEN); + await handleIssueCommentCreated(octokit, ['Help Wanted']); +} + +run().catch(error => { + console.error(error); + process.exit(1); +}); diff --git a/.github/scripts/proposal-police/package.json b/.github/scripts/proposal-police/package.json new file mode 100644 index 000000000000..700e1d576c27 --- /dev/null +++ b/.github/scripts/proposal-police/package.json @@ -0,0 +1,10 @@ +{ + "name": "github-action", + "version": "1.0.0", + "dependencies": { + "@actions/core": "^1.2.6", + "@actions/github": "^4.0.0", + "@octokit/rest": "^18.0.0", + "openai": "^4.24.7" + } +} \ No newline at end of file diff --git a/.github/workflows/proposalPolice.yml b/.github/workflows/proposalPolice.yml new file mode 100644 index 000000000000..e69beee2590a --- /dev/null +++ b/.github/workflows/proposalPolice.yml @@ -0,0 +1,41 @@ +name: ProposalPolice™ - Issue Comment Workflow +on: + issue_comment: + types: [created, edited] + +jobs: + process-issue-comment: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Setup Node.js + uses: actions/setup-node@v2 + with: + node-version: "16" + + - name: Install dependencies + run: npm install + working-directory: .github/scripts/proposal-police + + # Checks if the comment is created and follows the template + - name: Run issue new comment script + if: github.event.action == 'created' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + OPENAI_ASSISTANT_ID: ${{ secrets.OPENAI_ASSISTANT_ID }} + ISSUE: ${{ toJson(github.event.issue) }} + COMMENT: ${{ toJson(github.event.comment) }} + run: node .github/scripts/proposal-police/issue-comment.js + + # Checks if the comment is edited and if proposal template is followed + - name: Run issue comment edited script + if: github.event.action == 'edited' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + OPENAI_ASSISTANT_ID: ${{ secrets.OPENAI_ASSISTANT_ID }} + ISSUE: ${{ toJson(github.event.issue) }} + COMMENT: ${{ toJson(github.event.comment) }} + run: node .github/scripts/proposal-police/issue-comment-edit.js From dd1659899f79bd260addce26e55a595b65ec9453 Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Sat, 27 Apr 2024 12:23:11 -0700 Subject: [PATCH 02/22] refactoring --- .../proposalPoliceComment/action.yml} | 19 +- .../proposalPoliceComment.ts | 121 ++++++++++ .../proposalPoliceCommentEdit/action.yml | 30 +++ .../proposalPoliceCommentEdit.ts | 117 +++++++++ .github/libs/GithubUtils.ts | 14 +- .github/scripts/buildActions.sh | 2 + .../proposal-police/issue-comment-edit.js | 116 --------- .../scripts/proposal-police/issue-comment.js | 120 ---------- .github/scripts/proposal-police/package.json | 10 - package-lock.json | 226 ++++++++++++++++++ package.json | 2 + 11 files changed, 515 insertions(+), 262 deletions(-) rename .github/{workflows/proposalPolice.yml => actions/javascript/proposalPoliceComment/action.yml} (51%) create mode 100644 .github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts create mode 100644 .github/actions/javascript/proposalPoliceCommentEdit/action.yml create mode 100644 .github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts delete mode 100644 .github/scripts/proposal-police/issue-comment-edit.js delete mode 100644 .github/scripts/proposal-police/issue-comment.js delete mode 100644 .github/scripts/proposal-police/package.json diff --git a/.github/workflows/proposalPolice.yml b/.github/actions/javascript/proposalPoliceComment/action.yml similarity index 51% rename from .github/workflows/proposalPolice.yml rename to .github/actions/javascript/proposalPoliceComment/action.yml index e69beee2590a..f3e1474e4f04 100644 --- a/.github/workflows/proposalPolice.yml +++ b/.github/actions/javascript/proposalPoliceComment/action.yml @@ -1,7 +1,7 @@ name: ProposalPolice™ - Issue Comment Workflow on: issue_comment: - types: [created, edited] + types: [created] jobs: process-issue-comment: @@ -12,11 +12,11 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v2 with: - node-version: "16" + node-version: "20" - name: Install dependencies run: npm install - working-directory: .github/scripts/proposal-police + working-directory: ../../../ # Checks if the comment is created and follows the template - name: Run issue new comment script @@ -27,15 +27,4 @@ jobs: OPENAI_ASSISTANT_ID: ${{ secrets.OPENAI_ASSISTANT_ID }} ISSUE: ${{ toJson(github.event.issue) }} COMMENT: ${{ toJson(github.event.comment) }} - run: node .github/scripts/proposal-police/issue-comment.js - - # Checks if the comment is edited and if proposal template is followed - - name: Run issue comment edited script - if: github.event.action == 'edited' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - OPENAI_ASSISTANT_ID: ${{ secrets.OPENAI_ASSISTANT_ID }} - ISSUE: ${{ toJson(github.event.issue) }} - COMMENT: ${{ toJson(github.event.comment) }} - run: node .github/scripts/proposal-police/issue-comment-edit.js + run: ./index.js diff --git a/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts b/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts new file mode 100644 index 000000000000..d06e2d35f673 --- /dev/null +++ b/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts @@ -0,0 +1,121 @@ +// Import GitHub toolkit and Octokit REST client +import {context, getOctokit} from '@actions/github'; +import InitOpenAI from 'openai'; +import type {GitHubType} from '@github/libs/GithubUtils'; + +// @ts-ignore - process is not imported +const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); + +async function handleIssueCommentCreated(octokit: InstanceType, labelNames: string[]) { + const payload = context.payload; + // @ts-ignore - process is not imported + const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; + + // check if the issue is opened and the has all passed labels + if (payload.issue?.state === 'open' && labelNames.every((labelName: string) => payload.issue?.labels.some((issueLabel: {name: string}) => issueLabel.name === labelName))) { + if (!OPENAI_ASSISTANT_ID) { + console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); + return; + } + + // 1, check if comment is proposal and if proposal template is followed + const content = `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment?.body}`; + + // create thread with first user message and run it + const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ + assistant_id: OPENAI_ASSISTANT_ID ?? '', + thread: {messages: [{role: 'user', content}]}, + }); + + // count calls for debug purposes + let count = 0; + // poll for run completion + const intervalID = setInterval(() => { + OpenAI.beta.threads.runs + .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) + .then((run) => { + // return if run is not completed + if (run.status !== 'completed') { + return; + } + + // get assistant response + OpenAI.beta.threads.messages + .list(createAndRunResponse.thread_id) + .then((threadMessages) => { + // list thread messages content + threadMessages.data.forEach((message, index) => { + // @ts-ignore - we do have text value in content[0] but typescript doesn't know that + // this is a 'openai' package type issue + let assistantResponse = message.content?.[index]?.text?.value; + console.log('issue_comment.created - assistantResponse', assistantResponse); + + if (!assistantResponse) { + return console.log('issue_comment.created - assistantResponse is empty'); + } + + // check if assistant response is either NO_ACTION or "NO_ACTION" strings + // as sometimes the assistant response varies + const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; + // if assistant response is NO_ACTION or message role is 'user', do nothing + if (isNoAction || threadMessages.data?.[index]?.role === 'user') { + if (threadMessages.data?.[index]?.role === 'user') { + return; + } + return console.log('issue_comment.created - NO_ACTION'); + } + + // if the assistant responded with no action but there's some context in the response + if (assistantResponse.includes('[NO_ACTION]')) { + // extract the text after [NO_ACTION] from assistantResponse since this is a + // bot related action keyword + const noActionContext = assistantResponse.split('[NO_ACTION] ')?.[1]?.replace('"', ''); + console.log('issue_comment.created - [NO_ACTION] w/ context: ', noActionContext); + return; + } + // replace {user} from response template with @username + assistantResponse = assistantResponse.replace('{user}', `@${payload.comment?.user.login}`); + // replace {proposalLink} from response template with the link to the comment + assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment?.html_url); + + // remove any double quotes from the final comment because sometimes the assistant's + // response contains double quotes / sometimes it doesn't + assistantResponse = assistantResponse.replace('"', ''); + // create a comment with the assistant's response + console.log('issue_comment.created - proposal-police posts comment'); + return octokit.issues.createComment({ + ...context.repo, + issue_number: payload.issue?.number as number, + body: assistantResponse, + }); + }); + }) + .catch((err) => console.log('threads.messages.list - err', err)); + + // stop polling + clearInterval(intervalID); + }) + .catch((err) => console.log('threads.runs.retrieve - err', err)); + + // increment count for every threads.runs.retrieve call + count++; + console.log('threads.runs.retrieve - called:', count); + }, 1500); + } + + // return so that the script doesn't hang + return false; +} + +// Main function to process the workflow event +async function run() { + // @ts-ignore - process is not imported + const octokit: InstanceType = getOctokit(process.env.GITHUB_TOKEN); + await handleIssueCommentCreated(octokit, ['Help Wanted']); +} + +run().catch((error) => { + console.error(error); + // @ts-ignore - process is not imported + process.exit(1); +}); diff --git a/.github/actions/javascript/proposalPoliceCommentEdit/action.yml b/.github/actions/javascript/proposalPoliceCommentEdit/action.yml new file mode 100644 index 000000000000..e8cc92cd2027 --- /dev/null +++ b/.github/actions/javascript/proposalPoliceCommentEdit/action.yml @@ -0,0 +1,30 @@ +name: ProposalPolice™ - Issue Comment Edit Workflow +on: + issue_comment: + types: [edited] + +jobs: + process-issue-comment: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Setup Node.js + uses: actions/setup-node@v2 + with: + node-version: "20" + + - name: Install dependencies + run: npm install + working-directory: ../../../ + + # Checks if the comment is edited and if proposal template is followed + - name: Run issue comment edited script + if: github.event.action == 'edited' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + OPENAI_ASSISTANT_ID: ${{ secrets.OPENAI_ASSISTANT_ID }} + ISSUE: ${{ toJson(github.event.issue) }} + COMMENT: ${{ toJson(github.event.comment) }} + run: ./index.js diff --git a/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts b/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts new file mode 100644 index 000000000000..1d5fe462430a --- /dev/null +++ b/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts @@ -0,0 +1,117 @@ +// Import GitHub toolkit and Octokit REST client +import {context, getOctokit} from '@actions/github'; +import InitOpenAI from 'openai'; +import type {GitHubType} from '@github/libs/GithubUtils'; + +// @ts-ignore - process is not imported +const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); + +async function handleIssueCommentEdited(octokit: InstanceType, labelNames: string[]) { + const payload = context.payload; + // @ts-ignore - process is not imported + const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; + + // check if the issue is opened and the has all passed labels + if (payload.issue?.state === 'open' && labelNames.every((labelName: string) => payload.issue?.labels.some((issueLabel: {name: string}) => issueLabel.name === labelName))) { + if (!OPENAI_ASSISTANT_ID) { + console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); + return; + } + + // You need to adapt this part to fit the Edit Use Case as in the original function + const content = `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body?.from}.\n\nEdited comment content: ${payload.comment?.body}`; + + // create thread with first user message and run it + const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ + assistant_id: OPENAI_ASSISTANT_ID ?? '', + thread: {messages: [{role: 'user', content}]}, + }); + + // count calls for debug purposes + let count = 0; + // poll for run completion + const intervalID = setInterval(() => { + OpenAI.beta.threads.runs + .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) + .then((run) => { + // return if run is not completed yet + if (run.status !== 'completed') { + console.log('issue_comment.edited - run pending completion'); + return; + } + + // get assistant response + OpenAI.beta.threads.messages + .list(createAndRunResponse.thread_id) + .then((threadMessages) => { + // list thread messages content + threadMessages.data.forEach((message, index) => { + // @ts-ignore - we do have text value in content[0] but typescript doesn't know that + // this is a 'openai' package type issue + let assistantResponse = message.content?.[index]?.text?.value; + console.log('issue_comment.edited - assistantResponse', assistantResponse); + + if (!assistantResponse) { + return console.log('issue_comment.edited - assistantResponse is empty'); + } + + // check if assistant response is either NO_ACTION or "NO_ACTION" strings + // as sometimes the assistant response varies + const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; + // if assistant response is NO_ACTION or message role is 'user', do nothing + if (isNoAction || threadMessages.data?.[index]?.role === 'user') { + if (threadMessages.data?.[index]?.role === 'user') { + return; + } + return console.log('issue_comment.edited - NO_ACTION'); + } + + // edit comment if assistant detected substantial changes and if the comment was not edited already by the bot + if (assistantResponse.includes('[EDIT_COMMENT]') && !payload.comment?.body.includes('Edited by **proposal-police**')) { + // extract the text after [EDIT_COMMENT] from assistantResponse since this is a + // bot related action keyword + let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); + // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC + const date = new Date(payload.comment?.updated_at); + const formattedDate = date.toISOString()?.split('.')?.[0]?.replace('T', ' ') + ' UTC'; + extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); + + console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment?.id}`); + return octokit.issues.updateComment({ + ...context.repo, + comment_id: payload.comment?.id as number, + body: `${extractedNotice}\n\n` + payload.comment?.body, + }); + } + + return false; + }); + }) + .catch((err) => console.log('threads.messages.list - err', err)); + + // stop polling + clearInterval(intervalID); + }) + .catch((err) => console.log('threads.runs.retrieve - err', err)); + + // increment count for every threads.runs.retrieve call + count++; + console.log('threads.runs.retrieve - called:', count); + }, 1500); + } + + // return so that the script doesn't hang + return false; +} + +async function run() { + // @ts-ignore - process is not imported + const octokit: InstanceType = getOctokit(process.env.GITHUB_TOKEN); + await handleIssueCommentEdited(octokit, ['Help Wanted']); +} + +run().catch((error) => { + console.error(error); + // @ts-ignore - process is not imported + process.exit(1); +}); diff --git a/.github/libs/GithubUtils.ts b/.github/libs/GithubUtils.ts index f445fc368559..99302f0ee765 100644 --- a/.github/libs/GithubUtils.ts +++ b/.github/libs/GithubUtils.ts @@ -1,7 +1,8 @@ /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ import * as core from '@actions/core'; import {getOctokitOptions, GitHub} from '@actions/github/lib/utils'; -import type {Octokit as OctokitCore} from '@octokit/core'; +import type {Octokit, Octokit as OctokitCore} from '@octokit/core'; +import type {Constructor} from '@octokit/core/dist-types/types'; import type {graphql} from '@octokit/graphql/dist-types/types'; import type {components as OctokitComponents} from '@octokit/openapi-types/types'; import type {PaginateInterface} from '@octokit/plugin-paginate-rest'; @@ -534,4 +535,15 @@ export default GithubUtils; // This is a temporary solution to allow the use of the GithubUtils class in both TypeScript and JavaScript. // Once all the files that import GithubUtils are migrated to TypeScript, this can be removed. +declare const GitHubType: (new (...args: unknown[]) => Record) & { + new (...args: unknown[]): Record; + plugins: unknown[]; +} & typeof Octokit & + Constructor< + RestEndpointMethods & { + paginate: PaginateInterface; + } + >; + +export {GitHubType}; export type {ListForRepoMethod, InternalOctokit, CreateCommentResponse, StagingDeployCashData}; diff --git a/.github/scripts/buildActions.sh b/.github/scripts/buildActions.sh index 30c284a776be..b533c404447d 100755 --- a/.github/scripts/buildActions.sh +++ b/.github/scripts/buildActions.sh @@ -27,6 +27,8 @@ declare -r GITHUB_ACTIONS=( "$ACTIONS_DIR/validateReassureOutput/validateReassureOutput.ts" "$ACTIONS_DIR/getGraphiteString/getGraphiteString.ts" "$ACTIONS_DIR/getArtifactInfo/getArtifactInfo.ts" + "$ACTIONS_DIR/proposalPoliceComment/proposalPoliceComment.ts" + "$ACTIONS_DIR/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts" ) # This will be inserted at the top of all compiled files as a warning to devs. diff --git a/.github/scripts/proposal-police/issue-comment-edit.js b/.github/scripts/proposal-police/issue-comment-edit.js deleted file mode 100644 index fd17903b8f76..000000000000 --- a/.github/scripts/proposal-police/issue-comment-edit.js +++ /dev/null @@ -1,116 +0,0 @@ -// Import GitHub toolkit and Octokit REST client -const { context, getOctokit } = require('@actions/github'); -const InitOpenAI = require('openai'); -const _ = require('underscore'); - -const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); - -/** - * Handles the case when somebody edits a comment on an issue to check whether it's a proposal and what kind of changes were made. - * @param {*} octokit - GitHub REST client - * @param {*} labelNames - String array of label names to check for, ex. ['Help Wanted', "External"] - * @returns {Promise} - */ -async function handleIssueCommentEdited(octokit, labelNames) { - const payload = context.payload; - const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; - - // check if the issue is opened and the has all passed labels - if ( - payload.issue.state === 'open' && - _.every(labelNames, labelName => _.some(payload.issue.labels, issueLabel => issueLabel.name === labelName)) - ) { - if (!OPENAI_ASSISTANT_ID) { - console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); - return; - } - - // You need to adapt this part to fit the Edit Use Case as in the original function - const content = `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body.from}.\n\nEdited comment content: ${payload.comment.body}`; - - // create thread with first user message and run it - const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ - assistant_id: OPENAI_ASSISTANT_ID || '', - thread: {messages: [{ role: "user", content }],}, - }); - - // count calls for debug purposes - let count = 0; - // poll for run completion - const intervalID = setInterval(() => { - OpenAI.beta.threads.runs.retrieve(createAndRunResponse.thread_id, createAndRunResponse.id).then(threadRun => { - // return if run is not completed yet - if (threadRun.status !== "completed") { - console.log('issue_comment.edited - run pending completion'); - return; - } - - // get assistant response - OpenAI.beta.threads.messages.list(createAndRunResponse.thread_id).then(threadMessages => { - // list thread messages content - threadMessages.data.forEach((message, index) => { - // @ts-ignore - we do have text value in content[0] but typescript doesn't know that - // this is a 'openai' package type issue - const assistantResponse = message.content[index].text.value; - console.log('issue_comment.edited - assistantResponse', assistantResponse); - - if (!assistantResponse) { - return console.log('issue_comment.edited - assistantResponse is empty'); - } - - // check if assistant response is either NO_ACTION or "NO_ACTION" strings - // as sometimes the assistant response varies - const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; - // if assistant response is NO_ACTION or message role is 'user', do nothing - if (isNoAction || threadMessages.data[index].role === 'user') { - if (threadMessages.data[index].role === 'user') { - return; - } - return console.log('issue_comment.edited - NO_ACTION'); - } - - // edit comment if assistant detected substantial changes and if the comment was not edited already by the bot - if (assistantResponse.includes('[EDIT_COMMENT]') && !payload.comment.body.includes('Edited by **proposal-police**')) { - // extract the text after [EDIT_COMMENT] from assistantResponse since this is a - // bot related action keyword - let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')[1].replace('"', ''); - // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC - const date = new Date(payload.comment.updated_at); - const formattedDate = `${date.toISOString().split('.')[0].replace('T', ' ') } UTC`; - extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); - - console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment.id}`); - return octokit.issues.updateComment({ - ...context.repo, - comment_id: payload.comment.id, - body: `${extractedNotice}\n\n${ payload.comment.body}`, - }); - } - - return false; - }); - }).catch(err => console.log('threads.messages.list - err', err)); - - // stop polling - clearInterval(intervalID); - }).catch(err => console.log('threads.runs.retrieve - err', err)); - - // increment count for every threads.runs.retrieve call - count++; - console.log('threads.runs.retrieve - called:', count); - }, 1500); - } - - // return so that the script doesn't hang - return false; -} - -async function run() { - const octokit = getOctokit(process.env.GITHUB_TOKEN); - await handleIssueCommentEdited(octokit, ['Help Wanted']); -} - -run().catch(error => { - console.error(error); - process.exit(1); -}); diff --git a/.github/scripts/proposal-police/issue-comment.js b/.github/scripts/proposal-police/issue-comment.js deleted file mode 100644 index a8dab4a95a84..000000000000 --- a/.github/scripts/proposal-police/issue-comment.js +++ /dev/null @@ -1,120 +0,0 @@ -// Import GitHub toolkit and Octokit REST client -const { context, getOctokit } = require('@actions/github'); -const InitOpenAI = require('openai'); -const _ = require('underscore'); - -const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); - -/** - * Handles the case when somebody edits a comment on an issue to check whether it's a proposal and what kind of changes were made. - * @param {*} octokit - GitHub REST client - * @param {*} labelNames - String array of label names to check for, ex. ['Help Wanted', "External"] - * @returns {Promise} - */ -async function handleIssueCommentCreated(octokit, labelNames) { - const payload = context.payload; - const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; - - // check if the issue is opened and the has all passed labels - if ( - payload.issue.state === 'open' && - _.every(labelNames, labelName => _.some(payload.issue.labels, issueLabel => issueLabel.name === labelName)) - ) { - if (!OPENAI_ASSISTANT_ID) { - console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); - return; - } - - // 1, check if comment is proposal and if proposal template is followed - const content = `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment.body}`; - - // create thread with first user message and run it - const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ - assistant_id: OPENAI_ASSISTANT_ID || '', - thread: {messages: [{ role: "user", content }],}, - }); - - // count calls for debug purposes - let count = 0; - // poll for run completion - const intervalID = setInterval(() => { - OpenAI.beta.threads.runs.retrieve(createAndRunResponse.thread_id, createAndRunResponse.id).then(threadRun => { - // return if run is not completed - if (threadRun.status !== "completed") { - return; - } - - // get assistant response - OpenAI.beta.threads.messages.list(createAndRunResponse.thread_id).then(threadMessages => { - // list thread messages content - threadMessages.data.forEach((message, index) => { - // @ts-ignore - we do have text value in content[0] but typescript doesn't know that - // this is a 'openai' package type issue - let assistantResponse = message.content[index].text.value; - console.log('issue_comment.created - assistantResponse', assistantResponse); - - if (!assistantResponse) { - return console.log('issue_comment.created - assistantResponse is empty'); - } - - // check if assistant response is either NO_ACTION or "NO_ACTION" strings - // as sometimes the assistant response varies - const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; - // if assistant response is NO_ACTION or message role is 'user', do nothing - if (isNoAction || threadMessages.data[index].role === 'user') { - if (threadMessages.data[index].role === 'user') { - return; - } - return console.log('issue_comment.created - NO_ACTION'); - } - - // if the assistant responded with no action but there's some context in the response - if (assistantResponse.includes('[NO_ACTION]')) { - // extract the text after [NO_ACTION] from assistantResponse since this is a - // bot related action keyword - const noActionContext = assistantResponse.split('[NO_ACTION] ')[1].replace('"', ''); - console.log('issue_comment.created - [NO_ACTION] w/ context: ', noActionContext); - return; - } - // replace {user} from response template with @username - assistantResponse = assistantResponse.replace('{user}', `@${payload.comment.user.login}`); - // replace {proposalLink} from response template with the link to the comment - assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment.html_url); - - // remove any double quotes from the final comment because sometimes the assistant's - // response contains double quotes / sometimes it doesn't - assistantResponse = assistantResponse.replace('"', ''); - // create a comment with the assistant's response - console.log('issue_comment.created - proposal-police posts comment'); - return octokit.issues.createComment({ - ...context.repo, - issue_number: payload.issue.number, - body: assistantResponse - }); - }); - }).catch(err => console.log('threads.messages.list - err', err)); - - // stop polling - clearInterval(intervalID); - }).catch(err => console.log('threads.runs.retrieve - err', err)); - - // increment count for every threads.runs.retrieve call - count++; - console.log('threads.runs.retrieve - called:', count); - }, 1500); - } - - // return so that the script doesn't hang - return false; -} - -// Main function to process the workflow event -async function run() { - const octokit = getOctokit(process.env.GITHUB_TOKEN); - await handleIssueCommentCreated(octokit, ['Help Wanted']); -} - -run().catch(error => { - console.error(error); - process.exit(1); -}); diff --git a/.github/scripts/proposal-police/package.json b/.github/scripts/proposal-police/package.json deleted file mode 100644 index 700e1d576c27..000000000000 --- a/.github/scripts/proposal-police/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "github-action", - "version": "1.0.0", - "dependencies": { - "@actions/core": "^1.2.6", - "@actions/github": "^4.0.0", - "@octokit/rest": "^18.0.0", - "openai": "^4.24.7" - } -} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 00e65ef8964b..51690a1e3ed1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -154,6 +154,7 @@ "@octokit/core": "4.0.4", "@octokit/plugin-paginate-rest": "3.1.0", "@octokit/plugin-throttling": "4.1.0", + "@octokit/rest": "^18.0.0", "@react-native-community/eslint-config": "3.0.0", "@react-native/babel-preset": "^0.73.21", "@react-native/metro-config": "^0.73.5", @@ -222,6 +223,7 @@ "jest-transformer-svg": "^2.0.1", "memfs": "^4.6.0", "onchange": "^7.1.0", + "openai": "^4.24.7", "patch-package": "^8.0.0", "portfinder": "^1.0.28", "prettier": "^2.8.8", @@ -7517,6 +7519,15 @@ "@octokit/core": ">=4" } }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, "node_modules/@octokit/plugin-rest-endpoint-methods": { "version": "5.16.2", "dev": true, @@ -7599,6 +7610,101 @@ "@octokit/openapi-types": "^18.0.0" } }, + "node_modules/@octokit/rest": { + "version": "18.12.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", + "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", + "dev": true, + "dependencies": { + "@octokit/core": "^3.5.1", + "@octokit/plugin-paginate-rest": "^2.16.8", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^5.12.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/auth-token": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", + "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/core": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", + "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", + "@octokit/request": "^5.6.3", + "@octokit/request-error": "^2.0.5", + "@octokit/types": "^6.0.3", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/endpoint": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", + "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/graphql": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", + "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "dev": true, + "dependencies": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest": { + "version": "2.21.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", + "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.40.0" + }, + "peerDependencies": { + "@octokit/core": ">=2" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/request": { + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", + "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", + "@octokit/types": "^6.16.1", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/request-error": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", + "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dev": true, + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, "node_modules/@octokit/types": { "version": "6.41.0", "dev": true, @@ -12489,6 +12595,30 @@ "undici-types": "~5.26.4" } }, + "node_modules/@types/node-fetch": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", + "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", + "dev": true, + "dependencies": { + "@types/node": "*", + "form-data": "^4.0.0" + } + }, + "node_modules/@types/node-fetch/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", @@ -13788,6 +13918,18 @@ "node": ">= 6.0.0" } }, + "node_modules/agentkeepalive": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", + "dev": true, + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "license": "MIT", @@ -21345,6 +21487,34 @@ "node": ">= 6" } }, + "node_modules/form-data-encoder": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", + "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", + "dev": true + }, + "node_modules/formdata-node": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", + "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", + "dev": true, + "dependencies": { + "node-domexception": "1.0.0", + "web-streams-polyfill": "4.0.0-beta.3" + }, + "engines": { + "node": ">= 12.20" + } + }, + "node_modules/formdata-node/node_modules/web-streams-polyfill": { + "version": "4.0.0-beta.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", + "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/forwarded": { "version": "0.2.0", "license": "MIT", @@ -22428,6 +22598,15 @@ "node": ">=10.17.0" } }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, "node_modules/husky": { "version": "1.3.1", "dev": true, @@ -28592,6 +28771,25 @@ "node": ">= 0.10.5" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, "node_modules/node-fetch": { "version": "2.6.7", "license": "MIT", @@ -29285,6 +29483,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/openai": { + "version": "4.38.5", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.38.5.tgz", + "integrity": "sha512-Ym5GJL98ZhLJJ7enBx53jjG3vwN/fsB+Ozh46nnRZZS9W1NiYqbwkJ+sXd3dkCIiWIgcyyOPL2Zr8SQAzbpj3g==", + "dev": true, + "dependencies": { + "@types/node": "^18.11.18", + "@types/node-fetch": "^2.6.4", + "abort-controller": "^3.0.0", + "agentkeepalive": "^4.2.1", + "form-data-encoder": "1.7.2", + "formdata-node": "^4.3.2", + "node-fetch": "^2.6.7", + "web-streams-polyfill": "^3.2.1" + }, + "bin": { + "openai": "bin/cli" + } + }, + "node_modules/openai/node_modules/@types/node": { + "version": "18.19.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.31.tgz", + "integrity": "sha512-ArgCD39YpyyrtFKIqMDvjz79jto5fcI/SVUs2HwB+f0dAzq68yqOdyaSivLiLugSziTpNXLQrVb7RZFmdZzbhA==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, "node_modules/opencollective-postinstall": { "version": "2.0.3", "license": "MIT", diff --git a/package.json b/package.json index 064c902fac49..91e51017f206 100644 --- a/package.json +++ b/package.json @@ -188,6 +188,8 @@ "devDependencies": { "@actions/core": "1.10.0", "@actions/github": "5.1.1", + "@octokit/rest": "^18.0.0", + "openai": "^4.24.7", "@babel/core": "^7.20.0", "@babel/parser": "^7.22.16", "@babel/plugin-proposal-class-properties": "^7.12.1", From d073a6c926b4adaa2b8e386d799772c34dd174a9 Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Tue, 7 May 2024 17:00:37 -0700 Subject: [PATCH 03/22] new refactoring --- .../proposalPoliceComment/action.yml | 48 +- .../javascript/proposalPoliceComment/index.js | 20941 ++++++++++++++++ .../proposalPoliceCommentEdit/action.yml | 48 +- .../proposalPoliceCommentEdit/index.js | 20936 +++++++++++++++ .github/workflows/proposalPolice.yml | 37 + 5 files changed, 41950 insertions(+), 60 deletions(-) create mode 100644 .github/actions/javascript/proposalPoliceComment/index.js create mode 100644 .github/actions/javascript/proposalPoliceCommentEdit/index.js create mode 100644 .github/workflows/proposalPolice.yml diff --git a/.github/actions/javascript/proposalPoliceComment/action.yml b/.github/actions/javascript/proposalPoliceComment/action.yml index f3e1474e4f04..fb3667570553 100644 --- a/.github/actions/javascript/proposalPoliceComment/action.yml +++ b/.github/actions/javascript/proposalPoliceComment/action.yml @@ -1,30 +1,18 @@ -name: ProposalPolice™ - Issue Comment Workflow -on: - issue_comment: - types: [created] - -jobs: - process-issue-comment: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Setup Node.js - uses: actions/setup-node@v2 - with: - node-version: "20" - - - name: Install dependencies - run: npm install - working-directory: ../../../ - - # Checks if the comment is created and follows the template - - name: Run issue new comment script - if: github.event.action == 'created' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - OPENAI_ASSISTANT_ID: ${{ secrets.OPENAI_ASSISTANT_ID }} - ISSUE: ${{ toJson(github.event.issue) }} - COMMENT: ${{ toJson(github.event.comment) }} - run: ./index.js +name: 'ProposalPolice™ Comment Check' +description: 'Verifies whether a proposal comment follows the template' +inputs: + GITHUB_TOKEN: + description: 'Auth token for New Expensify Github' + required: true + OPENAI_API_KEY: + description: 'OpenAI API key for accessing AI services' + required: true + OPENAI_ASSISTANT_ID: + description: 'OpenAI Assistant ID for personalized AI assistant' + required: true +runs: + using: 'node20' + main: './index.js' + env: + ISSUE: '${{ toJson(github.event.issue) }}' + COMMENT: '${{ toJson(github.event.comment) }}' diff --git a/.github/actions/javascript/proposalPoliceComment/index.js b/.github/actions/javascript/proposalPoliceComment/index.js new file mode 100644 index 000000000000..f04d61e1a506 --- /dev/null +++ b/.github/actions/javascript/proposalPoliceComment/index.js @@ -0,0 +1,20941 @@ +/** + * NOTE: This is a compiled file. DO NOT directly edit this file. + */ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 4087: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Context = void 0; +const fs_1 = __nccwpck_require__(7147); +const os_1 = __nccwpck_require__(2037); +class Context { + /** + * Hydrate the context from the environment + */ + constructor() { + var _a, _b, _c; + this.payload = {}; + if (process.env.GITHUB_EVENT_PATH) { + if (fs_1.existsSync(process.env.GITHUB_EVENT_PATH)) { + this.payload = JSON.parse(fs_1.readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' })); + } + else { + const path = process.env.GITHUB_EVENT_PATH; + process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`); + } + } + this.eventName = process.env.GITHUB_EVENT_NAME; + this.sha = process.env.GITHUB_SHA; + this.ref = process.env.GITHUB_REF; + this.workflow = process.env.GITHUB_WORKFLOW; + this.action = process.env.GITHUB_ACTION; + this.actor = process.env.GITHUB_ACTOR; + this.job = process.env.GITHUB_JOB; + this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); + this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); + this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`; + this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`; + this.graphqlUrl = (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`; + } + get issue() { + const payload = this.payload; + return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number }); + } + get repo() { + if (process.env.GITHUB_REPOSITORY) { + const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/'); + return { owner, repo }; + } + if (this.payload.repository) { + return { + owner: this.payload.repository.owner.login, + repo: this.payload.repository.name + }; + } + throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'"); + } +} +exports.Context = Context; +//# sourceMappingURL=context.js.map + +/***/ }), + +/***/ 5438: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getOctokit = exports.context = void 0; +const Context = __importStar(__nccwpck_require__(4087)); +const utils_1 = __nccwpck_require__(3030); +exports.context = new Context.Context(); +/** + * Returns a hydrated octokit ready to use for GitHub Actions + * + * @param token the repo PAT or GITHUB_TOKEN + * @param options other options to set + */ +function getOctokit(token, options, ...additionalPlugins) { + const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins); + return new GitHubWithPlugins(utils_1.getOctokitOptions(token, options)); +} +exports.getOctokit = getOctokit; +//# sourceMappingURL=github.js.map + +/***/ }), + +/***/ 7914: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getApiBaseUrl = exports.getProxyAgent = exports.getAuthString = void 0; +const httpClient = __importStar(__nccwpck_require__(6255)); +function getAuthString(token, options) { + if (!token && !options.auth) { + throw new Error('Parameter token or opts.auth is required'); + } + else if (token && options.auth) { + throw new Error('Parameters token and opts.auth may not both be specified'); + } + return typeof options.auth === 'string' ? options.auth : `token ${token}`; +} +exports.getAuthString = getAuthString; +function getProxyAgent(destinationUrl) { + const hc = new httpClient.HttpClient(); + return hc.getAgent(destinationUrl); +} +exports.getProxyAgent = getProxyAgent; +function getApiBaseUrl() { + return process.env['GITHUB_API_URL'] || 'https://api.github.com'; +} +exports.getApiBaseUrl = getApiBaseUrl; +//# sourceMappingURL=utils.js.map + +/***/ }), + +/***/ 3030: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0; +const Context = __importStar(__nccwpck_require__(4087)); +const Utils = __importStar(__nccwpck_require__(7914)); +// octokit + plugins +const core_1 = __nccwpck_require__(8525); +const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044); +const plugin_paginate_rest_1 = __nccwpck_require__(8945); +exports.context = new Context.Context(); +const baseUrl = Utils.getApiBaseUrl(); +exports.defaults = { + baseUrl, + request: { + agent: Utils.getProxyAgent(baseUrl) + } +}; +exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults); +/** + * Convience function to correctly format Octokit Options to pass into the constructor. + * + * @param token the repo PAT or GITHUB_TOKEN + * @param options other options to set + */ +function getOctokitOptions(token, options) { + const opts = Object.assign({}, options || {}); // Shallow clone - don't mutate the object provided by the caller + // Auth + const auth = Utils.getAuthString(token, opts); + if (auth) { + opts.auth = auth; + } + return opts; +} +exports.getOctokitOptions = getOctokitOptions; +//# sourceMappingURL=utils.js.map + +/***/ }), + +/***/ 673: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +const REGEX_IS_INSTALLATION_LEGACY = /^v1\./; +const REGEX_IS_INSTALLATION = /^ghs_/; +const REGEX_IS_USER_TO_SERVER = /^ghu_/; +async function auth(token) { + const isApp = token.split(/\./).length === 3; + const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token); + const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token); + const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; + return { + type: "token", + token: token, + tokenType + }; +} + +/** + * Prefix token for usage in the Authorization header + * + * @param token OAuth token or JSON Web Token + */ +function withAuthorizationPrefix(token) { + if (token.split(/\./).length === 3) { + return `bearer ${token}`; + } + + return `token ${token}`; +} + +async function hook(token, request, route, parameters) { + const endpoint = request.endpoint.merge(route, parameters); + endpoint.headers.authorization = withAuthorizationPrefix(token); + return request(endpoint); +} + +const createTokenAuth = function createTokenAuth(token) { + if (!token) { + throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); + } + + if (typeof token !== "string") { + throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string"); + } + + token = token.replace(/^(token|bearer) +/i, ""); + return Object.assign(auth.bind(null, token), { + hook: hook.bind(null, token) + }); +}; + +exports.createTokenAuth = createTokenAuth; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 8525: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +var universalUserAgent = __nccwpck_require__(5030); +var beforeAfterHook = __nccwpck_require__(3682); +var request = __nccwpck_require__(9353); +var graphql = __nccwpck_require__(6422); +var authToken = __nccwpck_require__(673); + +function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + + return target; +} + +function _objectWithoutProperties(source, excluded) { + if (source == null) return {}; + + var target = _objectWithoutPropertiesLoose(source, excluded); + + var key, i; + + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + + for (i = 0; i < sourceSymbolKeys.length; i++) { + key = sourceSymbolKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; + target[key] = source[key]; + } + } + + return target; +} + +const VERSION = "3.6.0"; + +const _excluded = ["authStrategy"]; +class Octokit { + constructor(options = {}) { + const hook = new beforeAfterHook.Collection(); + const requestDefaults = { + baseUrl: request.request.endpoint.DEFAULTS.baseUrl, + headers: {}, + request: Object.assign({}, options.request, { + // @ts-ignore internal usage only, no need to type + hook: hook.bind(null, "request") + }), + mediaType: { + previews: [], + format: "" + } + }; // prepend default user agent with `options.userAgent` if set + + requestDefaults.headers["user-agent"] = [options.userAgent, `octokit-core.js/${VERSION} ${universalUserAgent.getUserAgent()}`].filter(Boolean).join(" "); + + if (options.baseUrl) { + requestDefaults.baseUrl = options.baseUrl; + } + + if (options.previews) { + requestDefaults.mediaType.previews = options.previews; + } + + if (options.timeZone) { + requestDefaults.headers["time-zone"] = options.timeZone; + } + + this.request = request.request.defaults(requestDefaults); + this.graphql = graphql.withCustomRequest(this.request).defaults(requestDefaults); + this.log = Object.assign({ + debug: () => {}, + info: () => {}, + warn: console.warn.bind(console), + error: console.error.bind(console) + }, options.log); + this.hook = hook; // (1) If neither `options.authStrategy` nor `options.auth` are set, the `octokit` instance + // is unauthenticated. The `this.auth()` method is a no-op and no request hook is registered. + // (2) If only `options.auth` is set, use the default token authentication strategy. + // (3) If `options.authStrategy` is set then use it and pass in `options.auth`. Always pass own request as many strategies accept a custom request instance. + // TODO: type `options.auth` based on `options.authStrategy`. + + if (!options.authStrategy) { + if (!options.auth) { + // (1) + this.auth = async () => ({ + type: "unauthenticated" + }); + } else { + // (2) + const auth = authToken.createTokenAuth(options.auth); // @ts-ignore ¯\_(ツ)_/¯ + + hook.wrap("request", auth.hook); + this.auth = auth; + } + } else { + const { + authStrategy + } = options, + otherOptions = _objectWithoutProperties(options, _excluded); + + const auth = authStrategy(Object.assign({ + request: this.request, + log: this.log, + // we pass the current octokit instance as well as its constructor options + // to allow for authentication strategies that return a new octokit instance + // that shares the same internal state as the current one. The original + // requirement for this was the "event-octokit" authentication strategy + // of https://github.com/probot/octokit-auth-probot. + octokit: this, + octokitOptions: otherOptions + }, options.auth)); // @ts-ignore ¯\_(ツ)_/¯ + + hook.wrap("request", auth.hook); + this.auth = auth; + } // apply plugins + // https://stackoverflow.com/a/16345172 + + + const classConstructor = this.constructor; + classConstructor.plugins.forEach(plugin => { + Object.assign(this, plugin(this, options)); + }); + } + + static defaults(defaults) { + const OctokitWithDefaults = class extends this { + constructor(...args) { + const options = args[0] || {}; + + if (typeof defaults === "function") { + super(defaults(options)); + return; + } + + super(Object.assign({}, defaults, options, options.userAgent && defaults.userAgent ? { + userAgent: `${options.userAgent} ${defaults.userAgent}` + } : null)); + } + + }; + return OctokitWithDefaults; + } + /** + * Attach a plugin (or many) to your Octokit instance. + * + * @example + * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...) + */ + + + static plugin(...newPlugins) { + var _a; + + const currentPlugins = this.plugins; + const NewOctokit = (_a = class extends this {}, _a.plugins = currentPlugins.concat(newPlugins.filter(plugin => !currentPlugins.includes(plugin))), _a); + return NewOctokit; + } + +} +Octokit.VERSION = VERSION; +Octokit.plugins = []; + +exports.Octokit = Octokit; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 8713: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +var isPlainObject = __nccwpck_require__(3287); +var universalUserAgent = __nccwpck_require__(5030); + +function lowercaseKeys(object) { + if (!object) { + return {}; + } + + return Object.keys(object).reduce((newObj, key) => { + newObj[key.toLowerCase()] = object[key]; + return newObj; + }, {}); +} + +function mergeDeep(defaults, options) { + const result = Object.assign({}, defaults); + Object.keys(options).forEach(key => { + if (isPlainObject.isPlainObject(options[key])) { + if (!(key in defaults)) Object.assign(result, { + [key]: options[key] + });else result[key] = mergeDeep(defaults[key], options[key]); + } else { + Object.assign(result, { + [key]: options[key] + }); + } + }); + return result; +} + +function removeUndefinedProperties(obj) { + for (const key in obj) { + if (obj[key] === undefined) { + delete obj[key]; + } + } + + return obj; +} + +function merge(defaults, route, options) { + if (typeof route === "string") { + let [method, url] = route.split(" "); + options = Object.assign(url ? { + method, + url + } : { + url: method + }, options); + } else { + options = Object.assign({}, route); + } // lowercase header names before merging with defaults to avoid duplicates + + + options.headers = lowercaseKeys(options.headers); // remove properties with undefined values before merging + + removeUndefinedProperties(options); + removeUndefinedProperties(options.headers); + const mergedOptions = mergeDeep(defaults || {}, options); // mediaType.previews arrays are merged, instead of overwritten + + if (defaults && defaults.mediaType.previews.length) { + mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(preview => !mergedOptions.mediaType.previews.includes(preview)).concat(mergedOptions.mediaType.previews); + } + + mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map(preview => preview.replace(/-preview/, "")); + return mergedOptions; +} + +function addQueryParameters(url, parameters) { + const separator = /\?/.test(url) ? "&" : "?"; + const names = Object.keys(parameters); + + if (names.length === 0) { + return url; + } + + return url + separator + names.map(name => { + if (name === "q") { + return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); + } + + return `${name}=${encodeURIComponent(parameters[name])}`; + }).join("&"); +} + +const urlVariableRegex = /\{[^}]+\}/g; + +function removeNonChars(variableName) { + return variableName.replace(/^\W+|\W+$/g, "").split(/,/); +} + +function extractUrlVariableNames(url) { + const matches = url.match(urlVariableRegex); + + if (!matches) { + return []; + } + + return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []); +} + +function omit(object, keysToOmit) { + return Object.keys(object).filter(option => !keysToOmit.includes(option)).reduce((obj, key) => { + obj[key] = object[key]; + return obj; + }, {}); +} + +// Based on https://github.com/bramstein/url-template, licensed under BSD +// TODO: create separate package. +// +// Copyright (c) 2012-2014, Bram Stein +// All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. The name of the author may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* istanbul ignore file */ +function encodeReserved(str) { + return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) { + if (!/%[0-9A-Fa-f]/.test(part)) { + part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); + } + + return part; + }).join(""); +} + +function encodeUnreserved(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { + return "%" + c.charCodeAt(0).toString(16).toUpperCase(); + }); +} + +function encodeValue(operator, value, key) { + value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); + + if (key) { + return encodeUnreserved(key) + "=" + value; + } else { + return value; + } +} + +function isDefined(value) { + return value !== undefined && value !== null; +} + +function isKeyOperator(operator) { + return operator === ";" || operator === "&" || operator === "?"; +} + +function getValues(context, operator, key, modifier) { + var value = context[key], + result = []; + + if (isDefined(value) && value !== "") { + if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { + value = value.toString(); + + if (modifier && modifier !== "*") { + value = value.substring(0, parseInt(modifier, 10)); + } + + result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); + } else { + if (modifier === "*") { + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function (value) { + result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); + }); + } else { + Object.keys(value).forEach(function (k) { + if (isDefined(value[k])) { + result.push(encodeValue(operator, value[k], k)); + } + }); + } + } else { + const tmp = []; + + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function (value) { + tmp.push(encodeValue(operator, value)); + }); + } else { + Object.keys(value).forEach(function (k) { + if (isDefined(value[k])) { + tmp.push(encodeUnreserved(k)); + tmp.push(encodeValue(operator, value[k].toString())); + } + }); + } + + if (isKeyOperator(operator)) { + result.push(encodeUnreserved(key) + "=" + tmp.join(",")); + } else if (tmp.length !== 0) { + result.push(tmp.join(",")); + } + } + } + } else { + if (operator === ";") { + if (isDefined(value)) { + result.push(encodeUnreserved(key)); + } + } else if (value === "" && (operator === "&" || operator === "?")) { + result.push(encodeUnreserved(key) + "="); + } else if (value === "") { + result.push(""); + } + } + + return result; +} + +function parseUrl(template) { + return { + expand: expand.bind(null, template) + }; +} + +function expand(template, context) { + var operators = ["+", "#", ".", "/", ";", "?", "&"]; + return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) { + if (expression) { + let operator = ""; + const values = []; + + if (operators.indexOf(expression.charAt(0)) !== -1) { + operator = expression.charAt(0); + expression = expression.substr(1); + } + + expression.split(/,/g).forEach(function (variable) { + var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); + values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); + }); + + if (operator && operator !== "+") { + var separator = ","; + + if (operator === "?") { + separator = "&"; + } else if (operator !== "#") { + separator = operator; + } + + return (values.length !== 0 ? operator : "") + values.join(separator); + } else { + return values.join(","); + } + } else { + return encodeReserved(literal); + } + }); +} + +function parse(options) { + // https://fetch.spec.whatwg.org/#methods + let method = options.method.toUpperCase(); // replace :varname with {varname} to make it RFC 6570 compatible + + let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); + let headers = Object.assign({}, options.headers); + let body; + let parameters = omit(options, ["method", "baseUrl", "url", "headers", "request", "mediaType"]); // extract variable names from URL to calculate remaining variables later + + const urlVariableNames = extractUrlVariableNames(url); + url = parseUrl(url).expand(parameters); + + if (!/^http/.test(url)) { + url = options.baseUrl + url; + } + + const omittedParameters = Object.keys(options).filter(option => urlVariableNames.includes(option)).concat("baseUrl"); + const remainingParameters = omit(parameters, omittedParameters); + const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); + + if (!isBinaryRequest) { + if (options.mediaType.format) { + // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw + headers.accept = headers.accept.split(/,/).map(preview => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`)).join(","); + } + + if (options.mediaType.previews.length) { + const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || []; + headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map(preview => { + const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; + return `application/vnd.github.${preview}-preview${format}`; + }).join(","); + } + } // for GET/HEAD requests, set URL query parameters from remaining parameters + // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters + + + if (["GET", "HEAD"].includes(method)) { + url = addQueryParameters(url, remainingParameters); + } else { + if ("data" in remainingParameters) { + body = remainingParameters.data; + } else { + if (Object.keys(remainingParameters).length) { + body = remainingParameters; + } else { + headers["content-length"] = 0; + } + } + } // default content-type for JSON if body is set + + + if (!headers["content-type"] && typeof body !== "undefined") { + headers["content-type"] = "application/json; charset=utf-8"; + } // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body. + // fetch does not allow to set `content-length` header, but we can set body to an empty string + + + if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { + body = ""; + } // Only return body/request keys if present + + + return Object.assign({ + method, + url, + headers + }, typeof body !== "undefined" ? { + body + } : null, options.request ? { + request: options.request + } : null); +} + +function endpointWithDefaults(defaults, route, options) { + return parse(merge(defaults, route, options)); +} + +function withDefaults(oldDefaults, newDefaults) { + const DEFAULTS = merge(oldDefaults, newDefaults); + const endpoint = endpointWithDefaults.bind(null, DEFAULTS); + return Object.assign(endpoint, { + DEFAULTS, + defaults: withDefaults.bind(null, DEFAULTS), + merge: merge.bind(null, DEFAULTS), + parse + }); +} + +const VERSION = "6.0.12"; + +const userAgent = `octokit-endpoint.js/${VERSION} ${universalUserAgent.getUserAgent()}`; // DEFAULTS has all properties set that EndpointOptions has, except url. +// So we use RequestParameters and add method as additional required property. + +const DEFAULTS = { + method: "GET", + baseUrl: "https://api.github.com", + headers: { + accept: "application/vnd.github.v3+json", + "user-agent": userAgent + }, + mediaType: { + format: "", + previews: [] + } +}; + +const endpoint = withDefaults(null, DEFAULTS); + +exports.endpoint = endpoint; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 6422: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +var request = __nccwpck_require__(9353); +var universalUserAgent = __nccwpck_require__(5030); + +const VERSION = "4.8.0"; + +function _buildMessageForResponseErrors(data) { + return `Request failed due to following response errors:\n` + data.errors.map(e => ` - ${e.message}`).join("\n"); +} + +class GraphqlResponseError extends Error { + constructor(request, headers, response) { + super(_buildMessageForResponseErrors(response)); + this.request = request; + this.headers = headers; + this.response = response; + this.name = "GraphqlResponseError"; // Expose the errors and response data in their shorthand properties. + + this.errors = response.errors; + this.data = response.data; // Maintains proper stack trace (only available on V8) + + /* istanbul ignore next */ + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + } + +} + +const NON_VARIABLE_OPTIONS = ["method", "baseUrl", "url", "headers", "request", "query", "mediaType"]; +const FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; +const GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; +function graphql(request, query, options) { + if (options) { + if (typeof query === "string" && "query" in options) { + return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`)); + } + + for (const key in options) { + if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue; + return Promise.reject(new Error(`[@octokit/graphql] "${key}" cannot be used as variable name`)); + } + } + + const parsedOptions = typeof query === "string" ? Object.assign({ + query + }, options) : query; + const requestOptions = Object.keys(parsedOptions).reduce((result, key) => { + if (NON_VARIABLE_OPTIONS.includes(key)) { + result[key] = parsedOptions[key]; + return result; + } + + if (!result.variables) { + result.variables = {}; + } + + result.variables[key] = parsedOptions[key]; + return result; + }, {}); // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix + // https://github.com/octokit/auth-app.js/issues/111#issuecomment-657610451 + + const baseUrl = parsedOptions.baseUrl || request.endpoint.DEFAULTS.baseUrl; + + if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { + requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); + } + + return request(requestOptions).then(response => { + if (response.data.errors) { + const headers = {}; + + for (const key of Object.keys(response.headers)) { + headers[key] = response.headers[key]; + } + + throw new GraphqlResponseError(requestOptions, headers, response.data); + } + + return response.data.data; + }); +} + +function withDefaults(request$1, newDefaults) { + const newRequest = request$1.defaults(newDefaults); + + const newApi = (query, options) => { + return graphql(newRequest, query, options); + }; + + return Object.assign(newApi, { + defaults: withDefaults.bind(null, newRequest), + endpoint: request.request.endpoint + }); +} + +const graphql$1 = withDefaults(request.request, { + headers: { + "user-agent": `octokit-graphql.js/${VERSION} ${universalUserAgent.getUserAgent()}` + }, + method: "POST", + url: "/graphql" +}); +function withCustomRequest(customRequest) { + return withDefaults(customRequest, { + method: "POST", + url: "/graphql" + }); +} + +exports.GraphqlResponseError = GraphqlResponseError; +exports.graphql = graphql$1; +exports.withCustomRequest = withCustomRequest; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 8945: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +const VERSION = "2.21.3"; + +function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + enumerableOnly && (symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + })), keys.push.apply(keys, symbols); + } + + return keys; +} + +function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = null != arguments[i] ? arguments[i] : {}; + i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { + _defineProperty(target, key, source[key]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + + return target; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +/** + * Some “list” response that can be paginated have a different response structure + * + * They have a `total_count` key in the response (search also has `incomplete_results`, + * /installation/repositories also has `repository_selection`), as well as a key with + * the list of the items which name varies from endpoint to endpoint. + * + * Octokit normalizes these responses so that paginated results are always returned following + * the same structure. One challenge is that if the list response has only one page, no Link + * header is provided, so this header alone is not sufficient to check wether a response is + * paginated or not. + * + * We check if a "total_count" key is present in the response data, but also make sure that + * a "url" property is not, as the "Get the combined status for a specific ref" endpoint would + * otherwise match: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref + */ +function normalizePaginatedListResponse(response) { + // endpoints can respond with 204 if repository is empty + if (!response.data) { + return _objectSpread2(_objectSpread2({}, response), {}, { + data: [] + }); + } + + const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data); + if (!responseNeedsNormalization) return response; // keep the additional properties intact as there is currently no other way + // to retrieve the same information. + + const incompleteResults = response.data.incomplete_results; + const repositorySelection = response.data.repository_selection; + const totalCount = response.data.total_count; + delete response.data.incomplete_results; + delete response.data.repository_selection; + delete response.data.total_count; + const namespaceKey = Object.keys(response.data)[0]; + const data = response.data[namespaceKey]; + response.data = data; + + if (typeof incompleteResults !== "undefined") { + response.data.incomplete_results = incompleteResults; + } + + if (typeof repositorySelection !== "undefined") { + response.data.repository_selection = repositorySelection; + } + + response.data.total_count = totalCount; + return response; +} + +function iterator(octokit, route, parameters) { + const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters); + const requestMethod = typeof route === "function" ? route : octokit.request; + const method = options.method; + const headers = options.headers; + let url = options.url; + return { + [Symbol.asyncIterator]: () => ({ + async next() { + if (!url) return { + done: true + }; + + try { + const response = await requestMethod({ + method, + url, + headers + }); + const normalizedResponse = normalizePaginatedListResponse(response); // `response.headers.link` format: + // '; rel="next", ; rel="last"' + // sets `url` to undefined if "next" URL is not present or `link` header is not set + + url = ((normalizedResponse.headers.link || "").match(/<([^>]+)>;\s*rel="next"/) || [])[1]; + return { + value: normalizedResponse + }; + } catch (error) { + if (error.status !== 409) throw error; + url = ""; + return { + value: { + status: 200, + headers: {}, + data: [] + } + }; + } + } + + }) + }; +} + +function paginate(octokit, route, parameters, mapFn) { + if (typeof parameters === "function") { + mapFn = parameters; + parameters = undefined; + } + + return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn); +} + +function gather(octokit, results, iterator, mapFn) { + return iterator.next().then(result => { + if (result.done) { + return results; + } + + let earlyExit = false; + + function done() { + earlyExit = true; + } + + results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data); + + if (earlyExit) { + return results; + } + + return gather(octokit, results, iterator, mapFn); + }); +} + +const composePaginateRest = Object.assign(paginate, { + iterator +}); + +const paginatingEndpoints = ["GET /app/hook/deliveries", "GET /app/installations", "GET /applications/grants", "GET /authorizations", "GET /enterprises/{enterprise}/actions/permissions/organizations", "GET /enterprises/{enterprise}/actions/runner-groups", "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations", "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners", "GET /enterprises/{enterprise}/actions/runners", "GET /enterprises/{enterprise}/audit-log", "GET /enterprises/{enterprise}/secret-scanning/alerts", "GET /enterprises/{enterprise}/settings/billing/advanced-security", "GET /events", "GET /gists", "GET /gists/public", "GET /gists/starred", "GET /gists/{gist_id}/comments", "GET /gists/{gist_id}/commits", "GET /gists/{gist_id}/forks", "GET /installation/repositories", "GET /issues", "GET /licenses", "GET /marketplace_listing/plans", "GET /marketplace_listing/plans/{plan_id}/accounts", "GET /marketplace_listing/stubbed/plans", "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts", "GET /networks/{owner}/{repo}/events", "GET /notifications", "GET /organizations", "GET /orgs/{org}/actions/cache/usage-by-repository", "GET /orgs/{org}/actions/permissions/repositories", "GET /orgs/{org}/actions/runner-groups", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners", "GET /orgs/{org}/actions/runners", "GET /orgs/{org}/actions/secrets", "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", "GET /orgs/{org}/audit-log", "GET /orgs/{org}/blocks", "GET /orgs/{org}/code-scanning/alerts", "GET /orgs/{org}/codespaces", "GET /orgs/{org}/credential-authorizations", "GET /orgs/{org}/dependabot/secrets", "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", "GET /orgs/{org}/events", "GET /orgs/{org}/external-groups", "GET /orgs/{org}/failed_invitations", "GET /orgs/{org}/hooks", "GET /orgs/{org}/hooks/{hook_id}/deliveries", "GET /orgs/{org}/installations", "GET /orgs/{org}/invitations", "GET /orgs/{org}/invitations/{invitation_id}/teams", "GET /orgs/{org}/issues", "GET /orgs/{org}/members", "GET /orgs/{org}/migrations", "GET /orgs/{org}/migrations/{migration_id}/repositories", "GET /orgs/{org}/outside_collaborators", "GET /orgs/{org}/packages", "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", "GET /orgs/{org}/projects", "GET /orgs/{org}/public_members", "GET /orgs/{org}/repos", "GET /orgs/{org}/secret-scanning/alerts", "GET /orgs/{org}/settings/billing/advanced-security", "GET /orgs/{org}/team-sync/groups", "GET /orgs/{org}/teams", "GET /orgs/{org}/teams/{team_slug}/discussions", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", "GET /orgs/{org}/teams/{team_slug}/invitations", "GET /orgs/{org}/teams/{team_slug}/members", "GET /orgs/{org}/teams/{team_slug}/projects", "GET /orgs/{org}/teams/{team_slug}/repos", "GET /orgs/{org}/teams/{team_slug}/teams", "GET /projects/columns/{column_id}/cards", "GET /projects/{project_id}/collaborators", "GET /projects/{project_id}/columns", "GET /repos/{owner}/{repo}/actions/artifacts", "GET /repos/{owner}/{repo}/actions/caches", "GET /repos/{owner}/{repo}/actions/runners", "GET /repos/{owner}/{repo}/actions/runs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs", "GET /repos/{owner}/{repo}/actions/secrets", "GET /repos/{owner}/{repo}/actions/workflows", "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs", "GET /repos/{owner}/{repo}/assignees", "GET /repos/{owner}/{repo}/branches", "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", "GET /repos/{owner}/{repo}/code-scanning/alerts", "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", "GET /repos/{owner}/{repo}/code-scanning/analyses", "GET /repos/{owner}/{repo}/codespaces", "GET /repos/{owner}/{repo}/codespaces/devcontainers", "GET /repos/{owner}/{repo}/codespaces/secrets", "GET /repos/{owner}/{repo}/collaborators", "GET /repos/{owner}/{repo}/comments", "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/commits", "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments", "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", "GET /repos/{owner}/{repo}/commits/{ref}/check-runs", "GET /repos/{owner}/{repo}/commits/{ref}/check-suites", "GET /repos/{owner}/{repo}/commits/{ref}/status", "GET /repos/{owner}/{repo}/commits/{ref}/statuses", "GET /repos/{owner}/{repo}/contributors", "GET /repos/{owner}/{repo}/dependabot/secrets", "GET /repos/{owner}/{repo}/deployments", "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", "GET /repos/{owner}/{repo}/environments", "GET /repos/{owner}/{repo}/events", "GET /repos/{owner}/{repo}/forks", "GET /repos/{owner}/{repo}/git/matching-refs/{ref}", "GET /repos/{owner}/{repo}/hooks", "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries", "GET /repos/{owner}/{repo}/invitations", "GET /repos/{owner}/{repo}/issues", "GET /repos/{owner}/{repo}/issues/comments", "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/issues/events", "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", "GET /repos/{owner}/{repo}/issues/{issue_number}/events", "GET /repos/{owner}/{repo}/issues/{issue_number}/labels", "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", "GET /repos/{owner}/{repo}/keys", "GET /repos/{owner}/{repo}/labels", "GET /repos/{owner}/{repo}/milestones", "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels", "GET /repos/{owner}/{repo}/notifications", "GET /repos/{owner}/{repo}/pages/builds", "GET /repos/{owner}/{repo}/projects", "GET /repos/{owner}/{repo}/pulls", "GET /repos/{owner}/{repo}/pulls/comments", "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments", "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", "GET /repos/{owner}/{repo}/pulls/{pull_number}/files", "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers", "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews", "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments", "GET /repos/{owner}/{repo}/releases", "GET /repos/{owner}/{repo}/releases/{release_id}/assets", "GET /repos/{owner}/{repo}/releases/{release_id}/reactions", "GET /repos/{owner}/{repo}/secret-scanning/alerts", "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", "GET /repos/{owner}/{repo}/stargazers", "GET /repos/{owner}/{repo}/subscribers", "GET /repos/{owner}/{repo}/tags", "GET /repos/{owner}/{repo}/teams", "GET /repos/{owner}/{repo}/topics", "GET /repositories", "GET /repositories/{repository_id}/environments/{environment_name}/secrets", "GET /search/code", "GET /search/commits", "GET /search/issues", "GET /search/labels", "GET /search/repositories", "GET /search/topics", "GET /search/users", "GET /teams/{team_id}/discussions", "GET /teams/{team_id}/discussions/{discussion_number}/comments", "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions", "GET /teams/{team_id}/discussions/{discussion_number}/reactions", "GET /teams/{team_id}/invitations", "GET /teams/{team_id}/members", "GET /teams/{team_id}/projects", "GET /teams/{team_id}/repos", "GET /teams/{team_id}/teams", "GET /user/blocks", "GET /user/codespaces", "GET /user/codespaces/secrets", "GET /user/emails", "GET /user/followers", "GET /user/following", "GET /user/gpg_keys", "GET /user/installations", "GET /user/installations/{installation_id}/repositories", "GET /user/issues", "GET /user/keys", "GET /user/marketplace_purchases", "GET /user/marketplace_purchases/stubbed", "GET /user/memberships/orgs", "GET /user/migrations", "GET /user/migrations/{migration_id}/repositories", "GET /user/orgs", "GET /user/packages", "GET /user/packages/{package_type}/{package_name}/versions", "GET /user/public_emails", "GET /user/repos", "GET /user/repository_invitations", "GET /user/starred", "GET /user/subscriptions", "GET /user/teams", "GET /users", "GET /users/{username}/events", "GET /users/{username}/events/orgs/{org}", "GET /users/{username}/events/public", "GET /users/{username}/followers", "GET /users/{username}/following", "GET /users/{username}/gists", "GET /users/{username}/gpg_keys", "GET /users/{username}/keys", "GET /users/{username}/orgs", "GET /users/{username}/packages", "GET /users/{username}/projects", "GET /users/{username}/received_events", "GET /users/{username}/received_events/public", "GET /users/{username}/repos", "GET /users/{username}/starred", "GET /users/{username}/subscriptions"]; + +function isPaginatingEndpoint(arg) { + if (typeof arg === "string") { + return paginatingEndpoints.includes(arg); + } else { + return false; + } +} + +/** + * @param octokit Octokit instance + * @param options Options passed to Octokit constructor + */ + +function paginateRest(octokit) { + return { + paginate: Object.assign(paginate.bind(null, octokit), { + iterator: iterator.bind(null, octokit) + }) + }; +} +paginateRest.VERSION = VERSION; + +exports.composePaginateRest = composePaginateRest; +exports.isPaginatingEndpoint = isPaginatingEndpoint; +exports.paginateRest = paginateRest; +exports.paginatingEndpoints = paginatingEndpoints; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 7471: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var deprecation = __nccwpck_require__(8932); +var once = _interopDefault(__nccwpck_require__(1223)); + +const logOnceCode = once(deprecation => console.warn(deprecation)); +const logOnceHeaders = once(deprecation => console.warn(deprecation)); +/** + * Error with extra properties to help with debugging + */ + +class RequestError extends Error { + constructor(message, statusCode, options) { + super(message); // Maintains proper stack trace (only available on V8) + + /* istanbul ignore next */ + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = "HttpError"; + this.status = statusCode; + let headers; + + if ("headers" in options && typeof options.headers !== "undefined") { + headers = options.headers; + } + + if ("response" in options) { + this.response = options.response; + headers = options.response.headers; + } // redact request credentials without mutating original request options + + + const requestCopy = Object.assign({}, options.request); + + if (options.request.headers.authorization) { + requestCopy.headers = Object.assign({}, options.request.headers, { + authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]") + }); + } + + requestCopy.url = requestCopy.url // client_id & client_secret can be passed as URL query parameters to increase rate limit + // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications + .replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]") // OAuth tokens can be passed as URL query parameters, although it is not recommended + // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header + .replace(/\baccess_token=\w+/g, "access_token=[REDACTED]"); + this.request = requestCopy; // deprecations + + Object.defineProperty(this, "code", { + get() { + logOnceCode(new deprecation.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`.")); + return statusCode; + } + + }); + Object.defineProperty(this, "headers", { + get() { + logOnceHeaders(new deprecation.Deprecation("[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`.")); + return headers || {}; + } + + }); + } + +} + +exports.RequestError = RequestError; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 9353: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var endpoint = __nccwpck_require__(8713); +var universalUserAgent = __nccwpck_require__(5030); +var isPlainObject = __nccwpck_require__(3287); +var nodeFetch = _interopDefault(__nccwpck_require__(467)); +var requestError = __nccwpck_require__(7471); + +const VERSION = "5.6.3"; + +function getBufferResponse(response) { + return response.arrayBuffer(); +} + +function fetchWrapper(requestOptions) { + const log = requestOptions.request && requestOptions.request.log ? requestOptions.request.log : console; + + if (isPlainObject.isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) { + requestOptions.body = JSON.stringify(requestOptions.body); + } + + let headers = {}; + let status; + let url; + const fetch = requestOptions.request && requestOptions.request.fetch || nodeFetch; + return fetch(requestOptions.url, Object.assign({ + method: requestOptions.method, + body: requestOptions.body, + headers: requestOptions.headers, + redirect: requestOptions.redirect + }, // `requestOptions.request.agent` type is incompatible + // see https://github.com/octokit/types.ts/pull/264 + requestOptions.request)).then(async response => { + url = response.url; + status = response.status; + + for (const keyAndValue of response.headers) { + headers[keyAndValue[0]] = keyAndValue[1]; + } + + if ("deprecation" in headers) { + const matches = headers.link && headers.link.match(/<([^>]+)>; rel="deprecation"/); + const deprecationLink = matches && matches.pop(); + log.warn(`[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`); + } + + if (status === 204 || status === 205) { + return; + } // GitHub API returns 200 for HEAD requests + + + if (requestOptions.method === "HEAD") { + if (status < 400) { + return; + } + + throw new requestError.RequestError(response.statusText, status, { + response: { + url, + status, + headers, + data: undefined + }, + request: requestOptions + }); + } + + if (status === 304) { + throw new requestError.RequestError("Not modified", status, { + response: { + url, + status, + headers, + data: await getResponseData(response) + }, + request: requestOptions + }); + } + + if (status >= 400) { + const data = await getResponseData(response); + const error = new requestError.RequestError(toErrorMessage(data), status, { + response: { + url, + status, + headers, + data + }, + request: requestOptions + }); + throw error; + } + + return getResponseData(response); + }).then(data => { + return { + status, + url, + headers, + data + }; + }).catch(error => { + if (error instanceof requestError.RequestError) throw error; + throw new requestError.RequestError(error.message, 500, { + request: requestOptions + }); + }); +} + +async function getResponseData(response) { + const contentType = response.headers.get("content-type"); + + if (/application\/json/.test(contentType)) { + return response.json(); + } + + if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { + return response.text(); + } + + return getBufferResponse(response); +} + +function toErrorMessage(data) { + if (typeof data === "string") return data; // istanbul ignore else - just in case + + if ("message" in data) { + if (Array.isArray(data.errors)) { + return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`; + } + + return data.message; + } // istanbul ignore next - just in case + + + return `Unknown error: ${JSON.stringify(data)}`; +} + +function withDefaults(oldEndpoint, newDefaults) { + const endpoint = oldEndpoint.defaults(newDefaults); + + const newApi = function (route, parameters) { + const endpointOptions = endpoint.merge(route, parameters); + + if (!endpointOptions.request || !endpointOptions.request.hook) { + return fetchWrapper(endpoint.parse(endpointOptions)); + } + + const request = (route, parameters) => { + return fetchWrapper(endpoint.parse(endpoint.merge(route, parameters))); + }; + + Object.assign(request, { + endpoint, + defaults: withDefaults.bind(null, endpoint) + }); + return endpointOptions.request.hook(request, endpointOptions); + }; + + return Object.assign(newApi, { + endpoint, + defaults: withDefaults.bind(null, endpoint) + }); +} + +const request = withDefaults(endpoint.endpoint, { + headers: { + "user-agent": `octokit-request.js/${VERSION} ${universalUserAgent.getUserAgent()}` + } +}); + +exports.request = request; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 6255: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +/* eslint-disable @typescript-eslint/no-explicit-any */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0; +const http = __importStar(__nccwpck_require__(3685)); +const https = __importStar(__nccwpck_require__(5687)); +const pm = __importStar(__nccwpck_require__(9835)); +const tunnel = __importStar(__nccwpck_require__(4294)); +var HttpCodes; +(function (HttpCodes) { + HttpCodes[HttpCodes["OK"] = 200] = "OK"; + HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; + HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; + HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; + HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; + HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; + HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; + HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; + HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; + HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; + HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; + HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; + HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; + HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; + HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; + HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; + HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; + HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; + HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; + HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; + HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; + HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; + HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; + HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; + HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; + HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; + HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; +})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); +var Headers; +(function (Headers) { + Headers["Accept"] = "accept"; + Headers["ContentType"] = "content-type"; +})(Headers = exports.Headers || (exports.Headers = {})); +var MediaTypes; +(function (MediaTypes) { + MediaTypes["ApplicationJson"] = "application/json"; +})(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {})); +/** + * Returns the proxy URL, depending upon the supplied url and proxy environment variables. + * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com + */ +function getProxyUrl(serverUrl) { + const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); + return proxyUrl ? proxyUrl.href : ''; +} +exports.getProxyUrl = getProxyUrl; +const HttpRedirectCodes = [ + HttpCodes.MovedPermanently, + HttpCodes.ResourceMoved, + HttpCodes.SeeOther, + HttpCodes.TemporaryRedirect, + HttpCodes.PermanentRedirect +]; +const HttpResponseRetryCodes = [ + HttpCodes.BadGateway, + HttpCodes.ServiceUnavailable, + HttpCodes.GatewayTimeout +]; +const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; +const ExponentialBackoffCeiling = 10; +const ExponentialBackoffTimeSlice = 5; +class HttpClientError extends Error { + constructor(message, statusCode) { + super(message); + this.name = 'HttpClientError'; + this.statusCode = statusCode; + Object.setPrototypeOf(this, HttpClientError.prototype); + } +} +exports.HttpClientError = HttpClientError; +class HttpClientResponse { + constructor(message) { + this.message = message; + } + readBody() { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { + let output = Buffer.alloc(0); + this.message.on('data', (chunk) => { + output = Buffer.concat([output, chunk]); + }); + this.message.on('end', () => { + resolve(output.toString()); + }); + })); + }); + } +} +exports.HttpClientResponse = HttpClientResponse; +function isHttps(requestUrl) { + const parsedUrl = new URL(requestUrl); + return parsedUrl.protocol === 'https:'; +} +exports.isHttps = isHttps; +class HttpClient { + constructor(userAgent, handlers, requestOptions) { + this._ignoreSslError = false; + this._allowRedirects = true; + this._allowRedirectDowngrade = false; + this._maxRedirects = 50; + this._allowRetries = false; + this._maxRetries = 1; + this._keepAlive = false; + this._disposed = false; + this.userAgent = userAgent; + this.handlers = handlers || []; + this.requestOptions = requestOptions; + if (requestOptions) { + if (requestOptions.ignoreSslError != null) { + this._ignoreSslError = requestOptions.ignoreSslError; + } + this._socketTimeout = requestOptions.socketTimeout; + if (requestOptions.allowRedirects != null) { + this._allowRedirects = requestOptions.allowRedirects; + } + if (requestOptions.allowRedirectDowngrade != null) { + this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; + } + if (requestOptions.maxRedirects != null) { + this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); + } + if (requestOptions.keepAlive != null) { + this._keepAlive = requestOptions.keepAlive; + } + if (requestOptions.allowRetries != null) { + this._allowRetries = requestOptions.allowRetries; + } + if (requestOptions.maxRetries != null) { + this._maxRetries = requestOptions.maxRetries; + } + } + } + options(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); + }); + } + get(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('GET', requestUrl, null, additionalHeaders || {}); + }); + } + del(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('DELETE', requestUrl, null, additionalHeaders || {}); + }); + } + post(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('POST', requestUrl, data, additionalHeaders || {}); + }); + } + patch(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('PATCH', requestUrl, data, additionalHeaders || {}); + }); + } + put(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('PUT', requestUrl, data, additionalHeaders || {}); + }); + } + head(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('HEAD', requestUrl, null, additionalHeaders || {}); + }); + } + sendStream(verb, requestUrl, stream, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request(verb, requestUrl, stream, additionalHeaders); + }); + } + /** + * Gets a typed object from an endpoint + * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise + */ + getJson(requestUrl, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + const res = yield this.get(requestUrl, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + postJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.post(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + putJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.put(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + patchJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.patch(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + /** + * Makes a raw http request. + * All other methods such as get, post, patch, and request ultimately call this. + * Prefer get, del, post and patch + */ + request(verb, requestUrl, data, headers) { + return __awaiter(this, void 0, void 0, function* () { + if (this._disposed) { + throw new Error('Client has already been disposed.'); + } + const parsedUrl = new URL(requestUrl); + let info = this._prepareRequest(verb, parsedUrl, headers); + // Only perform retries on reads since writes may not be idempotent. + const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) + ? this._maxRetries + 1 + : 1; + let numTries = 0; + let response; + do { + response = yield this.requestRaw(info, data); + // Check if it's an authentication challenge + if (response && + response.message && + response.message.statusCode === HttpCodes.Unauthorized) { + let authenticationHandler; + for (const handler of this.handlers) { + if (handler.canHandleAuthentication(response)) { + authenticationHandler = handler; + break; + } + } + if (authenticationHandler) { + return authenticationHandler.handleAuthentication(this, info, data); + } + else { + // We have received an unauthorized response but have no handlers to handle it. + // Let the response return to the caller. + return response; + } + } + let redirectsRemaining = this._maxRedirects; + while (response.message.statusCode && + HttpRedirectCodes.includes(response.message.statusCode) && + this._allowRedirects && + redirectsRemaining > 0) { + const redirectUrl = response.message.headers['location']; + if (!redirectUrl) { + // if there's no location to redirect to, we won't + break; + } + const parsedRedirectUrl = new URL(redirectUrl); + if (parsedUrl.protocol === 'https:' && + parsedUrl.protocol !== parsedRedirectUrl.protocol && + !this._allowRedirectDowngrade) { + throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); + } + // we need to finish reading the response before reassigning response + // which will leak the open socket. + yield response.readBody(); + // strip authorization header if redirected to a different hostname + if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { + for (const header in headers) { + // header names are case insensitive + if (header.toLowerCase() === 'authorization') { + delete headers[header]; + } + } + } + // let's make the request with the new redirectUrl + info = this._prepareRequest(verb, parsedRedirectUrl, headers); + response = yield this.requestRaw(info, data); + redirectsRemaining--; + } + if (!response.message.statusCode || + !HttpResponseRetryCodes.includes(response.message.statusCode)) { + // If not a retry code, return immediately instead of retrying + return response; + } + numTries += 1; + if (numTries < maxTries) { + yield response.readBody(); + yield this._performExponentialBackoff(numTries); + } + } while (numTries < maxTries); + return response; + }); + } + /** + * Needs to be called if keepAlive is set to true in request options. + */ + dispose() { + if (this._agent) { + this._agent.destroy(); + } + this._disposed = true; + } + /** + * Raw request. + * @param info + * @param data + */ + requestRaw(info, data) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => { + function callbackForResult(err, res) { + if (err) { + reject(err); + } + else if (!res) { + // If `err` is not passed, then `res` must be passed. + reject(new Error('Unknown error')); + } + else { + resolve(res); + } + } + this.requestRawWithCallback(info, data, callbackForResult); + }); + }); + } + /** + * Raw request with callback. + * @param info + * @param data + * @param onResult + */ + requestRawWithCallback(info, data, onResult) { + if (typeof data === 'string') { + if (!info.options.headers) { + info.options.headers = {}; + } + info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); + } + let callbackCalled = false; + function handleResult(err, res) { + if (!callbackCalled) { + callbackCalled = true; + onResult(err, res); + } + } + const req = info.httpModule.request(info.options, (msg) => { + const res = new HttpClientResponse(msg); + handleResult(undefined, res); + }); + let socket; + req.on('socket', sock => { + socket = sock; + }); + // If we ever get disconnected, we want the socket to timeout eventually + req.setTimeout(this._socketTimeout || 3 * 60000, () => { + if (socket) { + socket.end(); + } + handleResult(new Error(`Request timeout: ${info.options.path}`)); + }); + req.on('error', function (err) { + // err has statusCode property + // res should have headers + handleResult(err); + }); + if (data && typeof data === 'string') { + req.write(data, 'utf8'); + } + if (data && typeof data !== 'string') { + data.on('close', function () { + req.end(); + }); + data.pipe(req); + } + else { + req.end(); + } + } + /** + * Gets an http agent. This function is useful when you need an http agent that handles + * routing through a proxy server - depending upon the url and proxy environment variables. + * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com + */ + getAgent(serverUrl) { + const parsedUrl = new URL(serverUrl); + return this._getAgent(parsedUrl); + } + _prepareRequest(method, requestUrl, headers) { + const info = {}; + info.parsedUrl = requestUrl; + const usingSsl = info.parsedUrl.protocol === 'https:'; + info.httpModule = usingSsl ? https : http; + const defaultPort = usingSsl ? 443 : 80; + info.options = {}; + info.options.host = info.parsedUrl.hostname; + info.options.port = info.parsedUrl.port + ? parseInt(info.parsedUrl.port) + : defaultPort; + info.options.path = + (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); + info.options.method = method; + info.options.headers = this._mergeHeaders(headers); + if (this.userAgent != null) { + info.options.headers['user-agent'] = this.userAgent; + } + info.options.agent = this._getAgent(info.parsedUrl); + // gives handlers an opportunity to participate + if (this.handlers) { + for (const handler of this.handlers) { + handler.prepareRequest(info.options); + } + } + return info; + } + _mergeHeaders(headers) { + if (this.requestOptions && this.requestOptions.headers) { + return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); + } + return lowercaseKeys(headers || {}); + } + _getExistingOrDefaultHeader(additionalHeaders, header, _default) { + let clientHeader; + if (this.requestOptions && this.requestOptions.headers) { + clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; + } + return additionalHeaders[header] || clientHeader || _default; + } + _getAgent(parsedUrl) { + let agent; + const proxyUrl = pm.getProxyUrl(parsedUrl); + const useProxy = proxyUrl && proxyUrl.hostname; + if (this._keepAlive && useProxy) { + agent = this._proxyAgent; + } + if (this._keepAlive && !useProxy) { + agent = this._agent; + } + // if agent is already assigned use that agent. + if (agent) { + return agent; + } + const usingSsl = parsedUrl.protocol === 'https:'; + let maxSockets = 100; + if (this.requestOptions) { + maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; + } + // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis. + if (proxyUrl && proxyUrl.hostname) { + const agentOptions = { + maxSockets, + keepAlive: this._keepAlive, + proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && { + proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` + })), { host: proxyUrl.hostname, port: proxyUrl.port }) + }; + let tunnelAgent; + const overHttps = proxyUrl.protocol === 'https:'; + if (usingSsl) { + tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; + } + else { + tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; + } + agent = tunnelAgent(agentOptions); + this._proxyAgent = agent; + } + // if reusing agent across request and tunneling agent isn't assigned create a new agent + if (this._keepAlive && !agent) { + const options = { keepAlive: this._keepAlive, maxSockets }; + agent = usingSsl ? new https.Agent(options) : new http.Agent(options); + this._agent = agent; + } + // if not using private agent and tunnel agent isn't setup then use global agent + if (!agent) { + agent = usingSsl ? https.globalAgent : http.globalAgent; + } + if (usingSsl && this._ignoreSslError) { + // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process + // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options + // we have to cast it to any and change it directly + agent.options = Object.assign(agent.options || {}, { + rejectUnauthorized: false + }); + } + return agent; + } + _performExponentialBackoff(retryNumber) { + return __awaiter(this, void 0, void 0, function* () { + retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); + const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); + return new Promise(resolve => setTimeout(() => resolve(), ms)); + }); + } + _processResponse(res, options) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + const statusCode = res.message.statusCode || 0; + const response = { + statusCode, + result: null, + headers: {} + }; + // not found leads to null obj returned + if (statusCode === HttpCodes.NotFound) { + resolve(response); + } + // get the result from the body + function dateTimeDeserializer(key, value) { + if (typeof value === 'string') { + const a = new Date(value); + if (!isNaN(a.valueOf())) { + return a; + } + } + return value; + } + let obj; + let contents; + try { + contents = yield res.readBody(); + if (contents && contents.length > 0) { + if (options && options.deserializeDates) { + obj = JSON.parse(contents, dateTimeDeserializer); + } + else { + obj = JSON.parse(contents); + } + response.result = obj; + } + response.headers = res.message.headers; + } + catch (err) { + // Invalid resource (contents not json); leaving result obj null + } + // note that 3xx redirects are handled by the http layer. + if (statusCode > 299) { + let msg; + // if exception/error in body, attempt to get better error + if (obj && obj.message) { + msg = obj.message; + } + else if (contents && contents.length > 0) { + // it may be the case that the exception is in the body message as string + msg = contents; + } + else { + msg = `Failed request: (${statusCode})`; + } + const err = new HttpClientError(msg, statusCode); + err.result = response.result; + reject(err); + } + else { + resolve(response); + } + })); + }); + } +} +exports.HttpClient = HttpClient; +const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ 9835: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkBypass = exports.getProxyUrl = void 0; +function getProxyUrl(reqUrl) { + const usingSsl = reqUrl.protocol === 'https:'; + if (checkBypass(reqUrl)) { + return undefined; + } + const proxyVar = (() => { + if (usingSsl) { + return process.env['https_proxy'] || process.env['HTTPS_PROXY']; + } + else { + return process.env['http_proxy'] || process.env['HTTP_PROXY']; + } + })(); + if (proxyVar) { + return new URL(proxyVar); + } + else { + return undefined; + } +} +exports.getProxyUrl = getProxyUrl; +function checkBypass(reqUrl) { + if (!reqUrl.hostname) { + return false; + } + const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; + if (!noProxy) { + return false; + } + // Determine the request port + let reqPort; + if (reqUrl.port) { + reqPort = Number(reqUrl.port); + } + else if (reqUrl.protocol === 'http:') { + reqPort = 80; + } + else if (reqUrl.protocol === 'https:') { + reqPort = 443; + } + // Format the request hostname and hostname with port + const upperReqHosts = [reqUrl.hostname.toUpperCase()]; + if (typeof reqPort === 'number') { + upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); + } + // Compare request host against noproxy + for (const upperNoProxyItem of noProxy + .split(',') + .map(x => x.trim().toUpperCase()) + .filter(x => x)) { + if (upperReqHosts.some(x => x === upperNoProxyItem)) { + return true; + } + } + return false; +} +exports.checkBypass = checkBypass; +//# sourceMappingURL=proxy.js.map + +/***/ }), + +/***/ 3044: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + + if (enumerableOnly) { + symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + }); + } + + keys.push.apply(keys, symbols); + } + + return keys; +} + +function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + + if (i % 2) { + ownKeys(Object(source), true).forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } else if (Object.getOwnPropertyDescriptors) { + Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); + } else { + ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + } + + return target; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +const Endpoints = { + actions: { + addCustomLabelsToSelfHostedRunnerForOrg: ["POST /orgs/{org}/actions/runners/{runner_id}/labels"], + addCustomLabelsToSelfHostedRunnerForRepo: ["POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], + approveWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"], + cancelWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"], + createOrUpdateEnvironmentSecret: ["PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + createRegistrationTokenForOrg: ["POST /orgs/{org}/actions/runners/registration-token"], + createRegistrationTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/registration-token"], + createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"], + createRemoveTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/remove-token"], + createWorkflowDispatch: ["POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"], + deleteActionsCacheById: ["DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"], + deleteActionsCacheByKey: ["DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"], + deleteArtifact: ["DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + deleteEnvironmentSecret: ["DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + deleteSelfHostedRunnerFromOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}"], + deleteSelfHostedRunnerFromRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"], + deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"], + deleteWorkflowRunLogs: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], + disableSelectedRepositoryGithubActionsOrganization: ["DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}"], + disableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"], + downloadArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"], + downloadJobLogsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"], + downloadWorkflowRunAttemptLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs"], + downloadWorkflowRunLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], + enableSelectedRepositoryGithubActionsOrganization: ["PUT /orgs/{org}/actions/permissions/repositories/{repository_id}"], + enableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"], + getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"], + getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"], + getActionsCacheUsageByRepoForOrg: ["GET /orgs/{org}/actions/cache/usage-by-repository"], + getActionsCacheUsageForEnterprise: ["GET /enterprises/{enterprise}/actions/cache/usage"], + getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"], + getAllowedActionsOrganization: ["GET /orgs/{org}/actions/permissions/selected-actions"], + getAllowedActionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/selected-actions"], + getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + getEnvironmentPublicKey: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key"], + getEnvironmentSecret: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + getGithubActionsDefaultWorkflowPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/workflow"], + getGithubActionsDefaultWorkflowPermissionsOrganization: ["GET /orgs/{org}/actions/permissions/workflow"], + getGithubActionsDefaultWorkflowPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/workflow"], + getGithubActionsPermissionsOrganization: ["GET /orgs/{org}/actions/permissions"], + getGithubActionsPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions"], + getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], + getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], + getPendingDeploymentsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"], + getRepoPermissions: ["GET /repos/{owner}/{repo}/actions/permissions", {}, { + renamed: ["actions", "getGithubActionsPermissionsRepository"] + }], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + getReviewsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"], + getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"], + getSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}"], + getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"], + getWorkflowAccessToRepository: ["GET /repos/{owner}/{repo}/actions/permissions/access"], + getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"], + getWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"], + getWorkflowRunUsage: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"], + getWorkflowUsage: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"], + listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"], + listEnvironmentSecrets: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets"], + listJobsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"], + listJobsForWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"], + listLabelsForSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}/labels"], + listLabelsForSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + listOrgSecrets: ["GET /orgs/{org}/actions/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"], + listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"], + listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"], + listRunnerApplicationsForRepo: ["GET /repos/{owner}/{repo}/actions/runners/downloads"], + listSelectedReposForOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}/repositories"], + listSelectedRepositoriesEnabledGithubActionsOrganization: ["GET /orgs/{org}/actions/permissions/repositories"], + listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"], + listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"], + listWorkflowRunArtifacts: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"], + listWorkflowRuns: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"], + listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"], + reRunJobForWorkflowRun: ["POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"], + reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"], + reRunWorkflowFailedJobs: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"], + removeAllCustomLabelsFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels"], + removeAllCustomLabelsFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + removeCustomLabelFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"], + removeCustomLabelFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"], + removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], + reviewPendingDeploymentsForRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"], + setAllowedActionsOrganization: ["PUT /orgs/{org}/actions/permissions/selected-actions"], + setAllowedActionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"], + setCustomLabelsForSelfHostedRunnerForOrg: ["PUT /orgs/{org}/actions/runners/{runner_id}/labels"], + setCustomLabelsForSelfHostedRunnerForRepo: ["PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + setGithubActionsDefaultWorkflowPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/workflow"], + setGithubActionsDefaultWorkflowPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions/workflow"], + setGithubActionsDefaultWorkflowPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/workflow"], + setGithubActionsPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions"], + setGithubActionsPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions"], + setSelectedReposForOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"], + setSelectedRepositoriesEnabledGithubActionsOrganization: ["PUT /orgs/{org}/actions/permissions/repositories"], + setWorkflowAccessToRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/access"] + }, + activity: { + checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"], + deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"], + deleteThreadSubscription: ["DELETE /notifications/threads/{thread_id}/subscription"], + getFeeds: ["GET /feeds"], + getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"], + getThread: ["GET /notifications/threads/{thread_id}"], + getThreadSubscriptionForAuthenticatedUser: ["GET /notifications/threads/{thread_id}/subscription"], + listEventsForAuthenticatedUser: ["GET /users/{username}/events"], + listNotificationsForAuthenticatedUser: ["GET /notifications"], + listOrgEventsForAuthenticatedUser: ["GET /users/{username}/events/orgs/{org}"], + listPublicEvents: ["GET /events"], + listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"], + listPublicEventsForUser: ["GET /users/{username}/events/public"], + listPublicOrgEvents: ["GET /orgs/{org}/events"], + listReceivedEventsForUser: ["GET /users/{username}/received_events"], + listReceivedPublicEventsForUser: ["GET /users/{username}/received_events/public"], + listRepoEvents: ["GET /repos/{owner}/{repo}/events"], + listRepoNotificationsForAuthenticatedUser: ["GET /repos/{owner}/{repo}/notifications"], + listReposStarredByAuthenticatedUser: ["GET /user/starred"], + listReposStarredByUser: ["GET /users/{username}/starred"], + listReposWatchedByUser: ["GET /users/{username}/subscriptions"], + listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"], + listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"], + listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], + markNotificationsAsRead: ["PUT /notifications"], + markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], + markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], + setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], + setThreadSubscription: ["PUT /notifications/threads/{thread_id}/subscription"], + starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"], + unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"] + }, + apps: { + addRepoToInstallation: ["PUT /user/installations/{installation_id}/repositories/{repository_id}", {}, { + renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] + }], + addRepoToInstallationForAuthenticatedUser: ["PUT /user/installations/{installation_id}/repositories/{repository_id}"], + checkToken: ["POST /applications/{client_id}/token"], + createFromManifest: ["POST /app-manifests/{code}/conversions"], + createInstallationAccessToken: ["POST /app/installations/{installation_id}/access_tokens"], + deleteAuthorization: ["DELETE /applications/{client_id}/grant"], + deleteInstallation: ["DELETE /app/installations/{installation_id}"], + deleteToken: ["DELETE /applications/{client_id}/token"], + getAuthenticated: ["GET /app"], + getBySlug: ["GET /apps/{app_slug}"], + getInstallation: ["GET /app/installations/{installation_id}"], + getOrgInstallation: ["GET /orgs/{org}/installation"], + getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"], + getSubscriptionPlanForAccount: ["GET /marketplace_listing/accounts/{account_id}"], + getSubscriptionPlanForAccountStubbed: ["GET /marketplace_listing/stubbed/accounts/{account_id}"], + getUserInstallation: ["GET /users/{username}/installation"], + getWebhookConfigForApp: ["GET /app/hook/config"], + getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"], + listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"], + listAccountsForPlanStubbed: ["GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"], + listInstallationReposForAuthenticatedUser: ["GET /user/installations/{installation_id}/repositories"], + listInstallations: ["GET /app/installations"], + listInstallationsForAuthenticatedUser: ["GET /user/installations"], + listPlans: ["GET /marketplace_listing/plans"], + listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"], + listReposAccessibleToInstallation: ["GET /installation/repositories"], + listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"], + listSubscriptionsForAuthenticatedUserStubbed: ["GET /user/marketplace_purchases/stubbed"], + listWebhookDeliveries: ["GET /app/hook/deliveries"], + redeliverWebhookDelivery: ["POST /app/hook/deliveries/{delivery_id}/attempts"], + removeRepoFromInstallation: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}", {}, { + renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] + }], + removeRepoFromInstallationForAuthenticatedUser: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}"], + resetToken: ["PATCH /applications/{client_id}/token"], + revokeInstallationAccessToken: ["DELETE /installation/token"], + scopeToken: ["POST /applications/{client_id}/token/scoped"], + suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"], + unsuspendInstallation: ["DELETE /app/installations/{installation_id}/suspended"], + updateWebhookConfigForApp: ["PATCH /app/hook/config"] + }, + billing: { + getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"], + getGithubActionsBillingUser: ["GET /users/{username}/settings/billing/actions"], + getGithubAdvancedSecurityBillingGhe: ["GET /enterprises/{enterprise}/settings/billing/advanced-security"], + getGithubAdvancedSecurityBillingOrg: ["GET /orgs/{org}/settings/billing/advanced-security"], + getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], + getGithubPackagesBillingUser: ["GET /users/{username}/settings/billing/packages"], + getSharedStorageBillingOrg: ["GET /orgs/{org}/settings/billing/shared-storage"], + getSharedStorageBillingUser: ["GET /users/{username}/settings/billing/shared-storage"] + }, + checks: { + create: ["POST /repos/{owner}/{repo}/check-runs"], + createSuite: ["POST /repos/{owner}/{repo}/check-suites"], + get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"], + getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"], + listAnnotations: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"], + listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"], + listForSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"], + listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"], + rerequestRun: ["POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"], + rerequestSuite: ["POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"], + setSuitesPreferences: ["PATCH /repos/{owner}/{repo}/check-suites/preferences"], + update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"] + }, + codeScanning: { + deleteAnalysis: ["DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}"], + getAlert: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", {}, { + renamedParameters: { + alert_id: "alert_number" + } + }], + getAnalysis: ["GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"], + getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"], + listAlertInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"], + listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"], + listAlertsInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", {}, { + renamed: ["codeScanning", "listAlertInstances"] + }], + listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"], + updateAlert: ["PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"], + uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] + }, + codesOfConduct: { + getAllCodesOfConduct: ["GET /codes_of_conduct"], + getConductCode: ["GET /codes_of_conduct/{key}"] + }, + codespaces: { + addRepositoryForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"], + codespaceMachinesForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/machines"], + createForAuthenticatedUser: ["POST /user/codespaces"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + createOrUpdateSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}"], + createWithPrForAuthenticatedUser: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"], + createWithRepoForAuthenticatedUser: ["POST /repos/{owner}/{repo}/codespaces"], + deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"], + deleteFromOrganization: ["DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + deleteSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}"], + exportForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/exports"], + getExportDetailsForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/exports/{export_id}"], + getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"], + getPublicKeyForAuthenticatedUser: ["GET /user/codespaces/secrets/public-key"], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/codespaces/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + getSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}"], + listDevcontainersInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/devcontainers"], + listForAuthenticatedUser: ["GET /user/codespaces"], + listInOrganization: ["GET /orgs/{org}/codespaces", {}, { + renamedParameters: { + org_id: "org" + } + }], + listInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"], + listRepositoriesForSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}/repositories"], + listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"], + removeRepositoryForSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"], + repoMachinesForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/machines"], + setRepositoriesForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories"], + startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"], + stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"], + stopInOrganization: ["POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"], + updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"] + }, + dependabot: { + addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/dependabot/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"], + listSelectedReposForOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"], + removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"], + setSelectedReposForOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"] + }, + dependencyGraph: { + createRepositorySnapshot: ["POST /repos/{owner}/{repo}/dependency-graph/snapshots"], + diffRange: ["GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"] + }, + emojis: { + get: ["GET /emojis"] + }, + enterpriseAdmin: { + addCustomLabelsToSelfHostedRunnerForEnterprise: ["POST /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + disableSelectedOrganizationGithubActionsEnterprise: ["DELETE /enterprises/{enterprise}/actions/permissions/organizations/{org_id}"], + enableSelectedOrganizationGithubActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/organizations/{org_id}"], + getAllowedActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/selected-actions"], + getGithubActionsPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions"], + getServerStatistics: ["GET /enterprise-installation/{enterprise_or_org}/server-statistics"], + listLabelsForSelfHostedRunnerForEnterprise: ["GET /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + listSelectedOrganizationsEnabledGithubActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/organizations"], + removeAllCustomLabelsFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + removeCustomLabelFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels/{name}"], + setAllowedActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/selected-actions"], + setCustomLabelsForSelfHostedRunnerForEnterprise: ["PUT /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + setGithubActionsPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions"], + setSelectedOrganizationsEnabledGithubActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/organizations"] + }, + gists: { + checkIsStarred: ["GET /gists/{gist_id}/star"], + create: ["POST /gists"], + createComment: ["POST /gists/{gist_id}/comments"], + delete: ["DELETE /gists/{gist_id}"], + deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"], + fork: ["POST /gists/{gist_id}/forks"], + get: ["GET /gists/{gist_id}"], + getComment: ["GET /gists/{gist_id}/comments/{comment_id}"], + getRevision: ["GET /gists/{gist_id}/{sha}"], + list: ["GET /gists"], + listComments: ["GET /gists/{gist_id}/comments"], + listCommits: ["GET /gists/{gist_id}/commits"], + listForUser: ["GET /users/{username}/gists"], + listForks: ["GET /gists/{gist_id}/forks"], + listPublic: ["GET /gists/public"], + listStarred: ["GET /gists/starred"], + star: ["PUT /gists/{gist_id}/star"], + unstar: ["DELETE /gists/{gist_id}/star"], + update: ["PATCH /gists/{gist_id}"], + updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"] + }, + git: { + createBlob: ["POST /repos/{owner}/{repo}/git/blobs"], + createCommit: ["POST /repos/{owner}/{repo}/git/commits"], + createRef: ["POST /repos/{owner}/{repo}/git/refs"], + createTag: ["POST /repos/{owner}/{repo}/git/tags"], + createTree: ["POST /repos/{owner}/{repo}/git/trees"], + deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"], + getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"], + getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"], + getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"], + getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"], + getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"], + listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"], + updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"] + }, + gitignore: { + getAllTemplates: ["GET /gitignore/templates"], + getTemplate: ["GET /gitignore/templates/{name}"] + }, + interactions: { + getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"], + getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"], + getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"], + getRestrictionsForYourPublicRepos: ["GET /user/interaction-limits", {}, { + renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] + }], + removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"], + removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"], + removeRestrictionsForRepo: ["DELETE /repos/{owner}/{repo}/interaction-limits"], + removeRestrictionsForYourPublicRepos: ["DELETE /user/interaction-limits", {}, { + renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] + }], + setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"], + setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"], + setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"], + setRestrictionsForYourPublicRepos: ["PUT /user/interaction-limits", {}, { + renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] + }] + }, + issues: { + addAssignees: ["POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"], + addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], + checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], + create: ["POST /repos/{owner}/{repo}/issues"], + createComment: ["POST /repos/{owner}/{repo}/issues/{issue_number}/comments"], + createLabel: ["POST /repos/{owner}/{repo}/labels"], + createMilestone: ["POST /repos/{owner}/{repo}/milestones"], + deleteComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"], + deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"], + deleteMilestone: ["DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"], + get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"], + getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"], + getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"], + getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"], + getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"], + list: ["GET /issues"], + listAssignees: ["GET /repos/{owner}/{repo}/assignees"], + listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"], + listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"], + listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"], + listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"], + listEventsForTimeline: ["GET /repos/{owner}/{repo}/issues/{issue_number}/timeline"], + listForAuthenticatedUser: ["GET /user/issues"], + listForOrg: ["GET /orgs/{org}/issues"], + listForRepo: ["GET /repos/{owner}/{repo}/issues"], + listLabelsForMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"], + listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"], + listLabelsOnIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"], + listMilestones: ["GET /repos/{owner}/{repo}/milestones"], + lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], + removeAllLabels: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"], + removeAssignees: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"], + removeLabel: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"], + setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], + unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], + update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], + updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"], + updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"], + updateMilestone: ["PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"] + }, + licenses: { + get: ["GET /licenses/{license}"], + getAllCommonlyUsed: ["GET /licenses"], + getForRepo: ["GET /repos/{owner}/{repo}/license"] + }, + markdown: { + render: ["POST /markdown"], + renderRaw: ["POST /markdown/raw", { + headers: { + "content-type": "text/plain; charset=utf-8" + } + }] + }, + meta: { + get: ["GET /meta"], + getOctocat: ["GET /octocat"], + getZen: ["GET /zen"], + root: ["GET /"] + }, + migrations: { + cancelImport: ["DELETE /repos/{owner}/{repo}/import"], + deleteArchiveForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/archive"], + deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive"], + downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive"], + getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive"], + getCommitAuthors: ["GET /repos/{owner}/{repo}/import/authors"], + getImportStatus: ["GET /repos/{owner}/{repo}/import"], + getLargeFiles: ["GET /repos/{owner}/{repo}/import/large_files"], + getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"], + getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"], + listForAuthenticatedUser: ["GET /user/migrations"], + listForOrg: ["GET /orgs/{org}/migrations"], + listReposForAuthenticatedUser: ["GET /user/migrations/{migration_id}/repositories"], + listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"], + listReposForUser: ["GET /user/migrations/{migration_id}/repositories", {}, { + renamed: ["migrations", "listReposForAuthenticatedUser"] + }], + mapCommitAuthor: ["PATCH /repos/{owner}/{repo}/import/authors/{author_id}"], + setLfsPreference: ["PATCH /repos/{owner}/{repo}/import/lfs"], + startForAuthenticatedUser: ["POST /user/migrations"], + startForOrg: ["POST /orgs/{org}/migrations"], + startImport: ["PUT /repos/{owner}/{repo}/import"], + unlockRepoForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock"], + unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"], + updateImport: ["PATCH /repos/{owner}/{repo}/import"] + }, + orgs: { + blockUser: ["PUT /orgs/{org}/blocks/{username}"], + cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], + checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], + checkMembershipForUser: ["GET /orgs/{org}/members/{username}"], + checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"], + convertMemberToOutsideCollaborator: ["PUT /orgs/{org}/outside_collaborators/{username}"], + createInvitation: ["POST /orgs/{org}/invitations"], + createWebhook: ["POST /orgs/{org}/hooks"], + deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], + get: ["GET /orgs/{org}"], + getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], + getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], + getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], + getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], + getWebhookDelivery: ["GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"], + list: ["GET /organizations"], + listAppInstallations: ["GET /orgs/{org}/installations"], + listBlockedUsers: ["GET /orgs/{org}/blocks"], + listCustomRoles: ["GET /organizations/{organization_id}/custom_roles"], + listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], + listForAuthenticatedUser: ["GET /user/orgs"], + listForUser: ["GET /users/{username}/orgs"], + listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], + listMembers: ["GET /orgs/{org}/members"], + listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], + listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], + listPendingInvitations: ["GET /orgs/{org}/invitations"], + listPublicMembers: ["GET /orgs/{org}/public_members"], + listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], + listWebhooks: ["GET /orgs/{org}/hooks"], + pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], + redeliverWebhookDelivery: ["POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"], + removeMember: ["DELETE /orgs/{org}/members/{username}"], + removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], + removeOutsideCollaborator: ["DELETE /orgs/{org}/outside_collaborators/{username}"], + removePublicMembershipForAuthenticatedUser: ["DELETE /orgs/{org}/public_members/{username}"], + setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], + setPublicMembershipForAuthenticatedUser: ["PUT /orgs/{org}/public_members/{username}"], + unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], + update: ["PATCH /orgs/{org}"], + updateMembershipForAuthenticatedUser: ["PATCH /user/memberships/orgs/{org}"], + updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"], + updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"] + }, + packages: { + deletePackageForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}"], + deletePackageForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}"], + deletePackageForUser: ["DELETE /users/{username}/packages/{package_type}/{package_name}"], + deletePackageVersionForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}"], + deletePackageVersionForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + deletePackageVersionForUser: ["DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getAllPackageVersionsForAPackageOwnedByAnOrg: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions", {}, { + renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] + }], + getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions", {}, { + renamed: ["packages", "getAllPackageVersionsForPackageOwnedByAuthenticatedUser"] + }], + getAllPackageVersionsForPackageOwnedByAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions"], + getAllPackageVersionsForPackageOwnedByOrg: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions"], + getAllPackageVersionsForPackageOwnedByUser: ["GET /users/{username}/packages/{package_type}/{package_name}/versions"], + getPackageForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}"], + getPackageForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}"], + getPackageForUser: ["GET /users/{username}/packages/{package_type}/{package_name}"], + getPackageVersionForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getPackageVersionForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getPackageVersionForUser: ["GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + listPackagesForAuthenticatedUser: ["GET /user/packages"], + listPackagesForOrganization: ["GET /orgs/{org}/packages"], + listPackagesForUser: ["GET /users/{username}/packages"], + restorePackageForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageForUser: ["POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageVersionForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"], + restorePackageVersionForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"], + restorePackageVersionForUser: ["POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"] + }, + projects: { + addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"], + createCard: ["POST /projects/columns/{column_id}/cards"], + createColumn: ["POST /projects/{project_id}/columns"], + createForAuthenticatedUser: ["POST /user/projects"], + createForOrg: ["POST /orgs/{org}/projects"], + createForRepo: ["POST /repos/{owner}/{repo}/projects"], + delete: ["DELETE /projects/{project_id}"], + deleteCard: ["DELETE /projects/columns/cards/{card_id}"], + deleteColumn: ["DELETE /projects/columns/{column_id}"], + get: ["GET /projects/{project_id}"], + getCard: ["GET /projects/columns/cards/{card_id}"], + getColumn: ["GET /projects/columns/{column_id}"], + getPermissionForUser: ["GET /projects/{project_id}/collaborators/{username}/permission"], + listCards: ["GET /projects/columns/{column_id}/cards"], + listCollaborators: ["GET /projects/{project_id}/collaborators"], + listColumns: ["GET /projects/{project_id}/columns"], + listForOrg: ["GET /orgs/{org}/projects"], + listForRepo: ["GET /repos/{owner}/{repo}/projects"], + listForUser: ["GET /users/{username}/projects"], + moveCard: ["POST /projects/columns/cards/{card_id}/moves"], + moveColumn: ["POST /projects/columns/{column_id}/moves"], + removeCollaborator: ["DELETE /projects/{project_id}/collaborators/{username}"], + update: ["PATCH /projects/{project_id}"], + updateCard: ["PATCH /projects/columns/cards/{card_id}"], + updateColumn: ["PATCH /projects/columns/{column_id}"] + }, + pulls: { + checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + create: ["POST /repos/{owner}/{repo}/pulls"], + createReplyForReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"], + createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + createReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"], + deletePendingReview: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + deleteReviewComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + dismissReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"], + get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"], + getReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + list: ["GET /repos/{owner}/{repo}/pulls"], + listCommentsForReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"], + listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"], + listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"], + listRequestedReviewers: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + listReviewComments: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"], + listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"], + listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + removeRequestedReviewers: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + requestReviewers: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + submitReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"], + update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"], + updateBranch: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch"], + updateReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + updateReviewComment: ["PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"] + }, + rateLimit: { + get: ["GET /rate_limit"] + }, + reactions: { + createForCommitComment: ["POST /repos/{owner}/{repo}/comments/{comment_id}/reactions"], + createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"], + createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"], + createForPullRequestReviewComment: ["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"], + createForRelease: ["POST /repos/{owner}/{repo}/releases/{release_id}/reactions"], + createForTeamDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"], + createForTeamDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"], + deleteForCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"], + deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"], + deleteForIssueComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"], + deleteForPullRequestComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"], + deleteForRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"], + deleteForTeamDiscussion: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"], + deleteForTeamDiscussionComment: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"], + listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"], + listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"], + listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"], + listForPullRequestReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"], + listForRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}/reactions"], + listForTeamDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"], + listForTeamDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"] + }, + repos: { + acceptInvitation: ["PATCH /user/repository_invitations/{invitation_id}", {}, { + renamed: ["repos", "acceptInvitationForAuthenticatedUser"] + }], + acceptInvitationForAuthenticatedUser: ["PATCH /user/repository_invitations/{invitation_id}"], + addAppAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"], + addStatusCheckContexts: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + addTeamAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + addUserAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"], + checkVulnerabilityAlerts: ["GET /repos/{owner}/{repo}/vulnerability-alerts"], + codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"], + compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"], + compareCommitsWithBasehead: ["GET /repos/{owner}/{repo}/compare/{basehead}"], + createAutolink: ["POST /repos/{owner}/{repo}/autolinks"], + createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"], + createCommitSignatureProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], + createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"], + createDeployKey: ["POST /repos/{owner}/{repo}/keys"], + createDeployment: ["POST /repos/{owner}/{repo}/deployments"], + createDeploymentStatus: ["POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], + createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"], + createForAuthenticatedUser: ["POST /user/repos"], + createFork: ["POST /repos/{owner}/{repo}/forks"], + createInOrg: ["POST /orgs/{org}/repos"], + createOrUpdateEnvironment: ["PUT /repos/{owner}/{repo}/environments/{environment_name}"], + createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], + createPagesSite: ["POST /repos/{owner}/{repo}/pages"], + createRelease: ["POST /repos/{owner}/{repo}/releases"], + createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"], + createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate"], + createWebhook: ["POST /repos/{owner}/{repo}/hooks"], + declineInvitation: ["DELETE /user/repository_invitations/{invitation_id}", {}, { + renamed: ["repos", "declineInvitationForAuthenticatedUser"] + }], + declineInvitationForAuthenticatedUser: ["DELETE /user/repository_invitations/{invitation_id}"], + delete: ["DELETE /repos/{owner}/{repo}"], + deleteAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], + deleteAdminBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + deleteAnEnvironment: ["DELETE /repos/{owner}/{repo}/environments/{environment_name}"], + deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"], + deleteBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection"], + deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"], + deleteCommitSignatureProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], + deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"], + deleteDeployment: ["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"], + deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"], + deleteInvitation: ["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"], + deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"], + deletePullRequestReviewProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"], + deleteReleaseAsset: ["DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"], + deleteTagProtection: ["DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}"], + deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], + disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes"], + disableLfsForRepo: ["DELETE /repos/{owner}/{repo}/lfs"], + disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts"], + downloadArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}", {}, { + renamed: ["repos", "downloadZipballArchive"] + }], + downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"], + downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"], + enableAutomatedSecurityFixes: ["PUT /repos/{owner}/{repo}/automated-security-fixes"], + enableLfsForRepo: ["PUT /repos/{owner}/{repo}/lfs"], + enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts"], + generateReleaseNotes: ["POST /repos/{owner}/{repo}/releases/generate-notes"], + get: ["GET /repos/{owner}/{repo}"], + getAccessRestrictions: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], + getAdminBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"], + getAllStatusCheckContexts: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"], + getAllTopics: ["GET /repos/{owner}/{repo}/topics"], + getAppsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"], + getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"], + getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"], + getBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection"], + getClones: ["GET /repos/{owner}/{repo}/traffic/clones"], + getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"], + getCollaboratorPermissionLevel: ["GET /repos/{owner}/{repo}/collaborators/{username}/permission"], + getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"], + getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"], + getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"], + getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"], + getCommitSignatureProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], + getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"], + getContent: ["GET /repos/{owner}/{repo}/contents/{path}"], + getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"], + getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], + getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], + getDeploymentStatus: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"], + getEnvironment: ["GET /repos/{owner}/{repo}/environments/{environment_name}"], + getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], + getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], + getPages: ["GET /repos/{owner}/{repo}/pages"], + getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], + getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], + getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], + getPullRequestReviewProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"], + getReadme: ["GET /repos/{owner}/{repo}/readme"], + getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"], + getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], + getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], + getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], + getStatusChecksProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + getTeamsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"], + getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"], + getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"], + getUsersWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"], + getViews: ["GET /repos/{owner}/{repo}/traffic/views"], + getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"], + getWebhookConfigForRepo: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/config"], + getWebhookDelivery: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"], + listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"], + listBranches: ["GET /repos/{owner}/{repo}/branches"], + listBranchesForHeadCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"], + listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"], + listCommentsForCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"], + listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"], + listCommitStatusesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/statuses"], + listCommits: ["GET /repos/{owner}/{repo}/commits"], + listContributors: ["GET /repos/{owner}/{repo}/contributors"], + listDeployKeys: ["GET /repos/{owner}/{repo}/keys"], + listDeploymentStatuses: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], + listDeployments: ["GET /repos/{owner}/{repo}/deployments"], + listForAuthenticatedUser: ["GET /user/repos"], + listForOrg: ["GET /orgs/{org}/repos"], + listForUser: ["GET /users/{username}/repos"], + listForks: ["GET /repos/{owner}/{repo}/forks"], + listInvitations: ["GET /repos/{owner}/{repo}/invitations"], + listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"], + listLanguages: ["GET /repos/{owner}/{repo}/languages"], + listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"], + listPublic: ["GET /repositories"], + listPullRequestsAssociatedWithCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls"], + listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"], + listReleases: ["GET /repos/{owner}/{repo}/releases"], + listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"], + listTags: ["GET /repos/{owner}/{repo}/tags"], + listTeams: ["GET /repos/{owner}/{repo}/teams"], + listWebhookDeliveries: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"], + listWebhooks: ["GET /repos/{owner}/{repo}/hooks"], + merge: ["POST /repos/{owner}/{repo}/merges"], + mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"], + pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"], + redeliverWebhookDelivery: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"], + removeAppAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + removeCollaborator: ["DELETE /repos/{owner}/{repo}/collaborators/{username}"], + removeStatusCheckContexts: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + removeStatusCheckProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + removeTeamAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + removeUserAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"], + replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"], + requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"], + setAdminBranchProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + setAppAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + setStatusCheckContexts: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + setTeamAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + setUserAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"], + transfer: ["POST /repos/{owner}/{repo}/transfer"], + update: ["PATCH /repos/{owner}/{repo}"], + updateBranchProtection: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection"], + updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"], + updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"], + updateInvitation: ["PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"], + updatePullRequestReviewProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"], + updateReleaseAsset: ["PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"], + updateStatusCheckPotection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks", {}, { + renamed: ["repos", "updateStatusCheckProtection"] + }], + updateStatusCheckProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"], + updateWebhookConfigForRepo: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"], + uploadReleaseAsset: ["POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}", { + baseUrl: "https://uploads.github.com" + }] + }, + search: { + code: ["GET /search/code"], + commits: ["GET /search/commits"], + issuesAndPullRequests: ["GET /search/issues"], + labels: ["GET /search/labels"], + repos: ["GET /search/repositories"], + topics: ["GET /search/topics"], + users: ["GET /search/users"] + }, + secretScanning: { + getAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"], + listAlertsForEnterprise: ["GET /enterprises/{enterprise}/secret-scanning/alerts"], + listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"], + listLocationsForAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"], + updateAlert: ["PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"] + }, + teams: { + addOrUpdateMembershipForUserInOrg: ["PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"], + addOrUpdateProjectPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}"], + addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + checkPermissionsForProjectInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects/{project_id}"], + checkPermissionsForRepoInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + create: ["POST /orgs/{org}/teams"], + createDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], + createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"], + deleteDiscussionCommentInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + deleteDiscussionInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"], + getByName: ["GET /orgs/{org}/teams/{team_slug}"], + getDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + getDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + getMembershipForUserInOrg: ["GET /orgs/{org}/teams/{team_slug}/memberships/{username}"], + list: ["GET /orgs/{org}/teams"], + listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"], + listDiscussionCommentsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], + listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"], + listForAuthenticatedUser: ["GET /user/teams"], + listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"], + listPendingInvitationsInOrg: ["GET /orgs/{org}/teams/{team_slug}/invitations"], + listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects"], + listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], + removeMembershipForUserInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"], + removeProjectInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}"], + removeRepoInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + updateDiscussionCommentInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + updateDiscussionInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"] + }, + users: { + addEmailForAuthenticated: ["POST /user/emails", {}, { + renamed: ["users", "addEmailForAuthenticatedUser"] + }], + addEmailForAuthenticatedUser: ["POST /user/emails"], + block: ["PUT /user/blocks/{username}"], + checkBlocked: ["GET /user/blocks/{username}"], + checkFollowingForUser: ["GET /users/{username}/following/{target_user}"], + checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"], + createGpgKeyForAuthenticated: ["POST /user/gpg_keys", {}, { + renamed: ["users", "createGpgKeyForAuthenticatedUser"] + }], + createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"], + createPublicSshKeyForAuthenticated: ["POST /user/keys", {}, { + renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] + }], + createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"], + deleteEmailForAuthenticated: ["DELETE /user/emails", {}, { + renamed: ["users", "deleteEmailForAuthenticatedUser"] + }], + deleteEmailForAuthenticatedUser: ["DELETE /user/emails"], + deleteGpgKeyForAuthenticated: ["DELETE /user/gpg_keys/{gpg_key_id}", {}, { + renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] + }], + deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"], + deletePublicSshKeyForAuthenticated: ["DELETE /user/keys/{key_id}", {}, { + renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] + }], + deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"], + follow: ["PUT /user/following/{username}"], + getAuthenticated: ["GET /user"], + getByUsername: ["GET /users/{username}"], + getContextForUser: ["GET /users/{username}/hovercard"], + getGpgKeyForAuthenticated: ["GET /user/gpg_keys/{gpg_key_id}", {}, { + renamed: ["users", "getGpgKeyForAuthenticatedUser"] + }], + getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"], + getPublicSshKeyForAuthenticated: ["GET /user/keys/{key_id}", {}, { + renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] + }], + getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"], + list: ["GET /users"], + listBlockedByAuthenticated: ["GET /user/blocks", {}, { + renamed: ["users", "listBlockedByAuthenticatedUser"] + }], + listBlockedByAuthenticatedUser: ["GET /user/blocks"], + listEmailsForAuthenticated: ["GET /user/emails", {}, { + renamed: ["users", "listEmailsForAuthenticatedUser"] + }], + listEmailsForAuthenticatedUser: ["GET /user/emails"], + listFollowedByAuthenticated: ["GET /user/following", {}, { + renamed: ["users", "listFollowedByAuthenticatedUser"] + }], + listFollowedByAuthenticatedUser: ["GET /user/following"], + listFollowersForAuthenticatedUser: ["GET /user/followers"], + listFollowersForUser: ["GET /users/{username}/followers"], + listFollowingForUser: ["GET /users/{username}/following"], + listGpgKeysForAuthenticated: ["GET /user/gpg_keys", {}, { + renamed: ["users", "listGpgKeysForAuthenticatedUser"] + }], + listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"], + listGpgKeysForUser: ["GET /users/{username}/gpg_keys"], + listPublicEmailsForAuthenticated: ["GET /user/public_emails", {}, { + renamed: ["users", "listPublicEmailsForAuthenticatedUser"] + }], + listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"], + listPublicKeysForUser: ["GET /users/{username}/keys"], + listPublicSshKeysForAuthenticated: ["GET /user/keys", {}, { + renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] + }], + listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"], + setPrimaryEmailVisibilityForAuthenticated: ["PATCH /user/email/visibility", {}, { + renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] + }], + setPrimaryEmailVisibilityForAuthenticatedUser: ["PATCH /user/email/visibility"], + unblock: ["DELETE /user/blocks/{username}"], + unfollow: ["DELETE /user/following/{username}"], + updateAuthenticated: ["PATCH /user"] + } +}; + +const VERSION = "5.16.2"; + +function endpointsToMethods(octokit, endpointsMap) { + const newMethods = {}; + + for (const [scope, endpoints] of Object.entries(endpointsMap)) { + for (const [methodName, endpoint] of Object.entries(endpoints)) { + const [route, defaults, decorations] = endpoint; + const [method, url] = route.split(/ /); + const endpointDefaults = Object.assign({ + method, + url + }, defaults); + + if (!newMethods[scope]) { + newMethods[scope] = {}; + } + + const scopeMethods = newMethods[scope]; + + if (decorations) { + scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations); + continue; + } + + scopeMethods[methodName] = octokit.request.defaults(endpointDefaults); + } + } + + return newMethods; +} + +function decorate(octokit, scope, methodName, defaults, decorations) { + const requestWithDefaults = octokit.request.defaults(defaults); + /* istanbul ignore next */ + + function withDecorations(...args) { + // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 + let options = requestWithDefaults.endpoint.merge(...args); // There are currently no other decorations than `.mapToData` + + if (decorations.mapToData) { + options = Object.assign({}, options, { + data: options[decorations.mapToData], + [decorations.mapToData]: undefined + }); + return requestWithDefaults(options); + } + + if (decorations.renamed) { + const [newScope, newMethodName] = decorations.renamed; + octokit.log.warn(`octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`); + } + + if (decorations.deprecated) { + octokit.log.warn(decorations.deprecated); + } + + if (decorations.renamedParameters) { + // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 + const options = requestWithDefaults.endpoint.merge(...args); + + for (const [name, alias] of Object.entries(decorations.renamedParameters)) { + if (name in options) { + octokit.log.warn(`"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`); + + if (!(alias in options)) { + options[alias] = options[name]; + } + + delete options[name]; + } + } + + return requestWithDefaults(options); + } // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 + + + return requestWithDefaults(...args); + } + + return Object.assign(withDecorations, requestWithDefaults); +} + +function restEndpointMethods(octokit) { + const api = endpointsToMethods(octokit, Endpoints); + return { + rest: api + }; +} +restEndpointMethods.VERSION = VERSION; +function legacyRestEndpointMethods(octokit) { + const api = endpointsToMethods(octokit, Endpoints); + return _objectSpread2(_objectSpread2({}, api), {}, { + rest: api + }); +} +legacyRestEndpointMethods.VERSION = VERSION; + +exports.legacyRestEndpointMethods = legacyRestEndpointMethods; +exports.restEndpointMethods = restEndpointMethods; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 1659: +/***/ ((module, exports, __nccwpck_require__) => { + +"use strict"; +/** + * @author Toru Nagashima + * See LICENSE file in root directory for full license. + */ + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +var eventTargetShim = __nccwpck_require__(4697); + +/** + * The signal class. + * @see https://dom.spec.whatwg.org/#abortsignal + */ +class AbortSignal extends eventTargetShim.EventTarget { + /** + * AbortSignal cannot be constructed directly. + */ + constructor() { + super(); + throw new TypeError("AbortSignal cannot be constructed directly"); + } + /** + * Returns `true` if this `AbortSignal`'s `AbortController` has signaled to abort, and `false` otherwise. + */ + get aborted() { + const aborted = abortedFlags.get(this); + if (typeof aborted !== "boolean") { + throw new TypeError(`Expected 'this' to be an 'AbortSignal' object, but got ${this === null ? "null" : typeof this}`); + } + return aborted; + } +} +eventTargetShim.defineEventAttribute(AbortSignal.prototype, "abort"); +/** + * Create an AbortSignal object. + */ +function createAbortSignal() { + const signal = Object.create(AbortSignal.prototype); + eventTargetShim.EventTarget.call(signal); + abortedFlags.set(signal, false); + return signal; +} +/** + * Abort a given signal. + */ +function abortSignal(signal) { + if (abortedFlags.get(signal) !== false) { + return; + } + abortedFlags.set(signal, true); + signal.dispatchEvent({ type: "abort" }); +} +/** + * Aborted flag for each instances. + */ +const abortedFlags = new WeakMap(); +// Properties should be enumerable. +Object.defineProperties(AbortSignal.prototype, { + aborted: { enumerable: true }, +}); +// `toString()` should return `"[object AbortSignal]"` +if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { + Object.defineProperty(AbortSignal.prototype, Symbol.toStringTag, { + configurable: true, + value: "AbortSignal", + }); +} + +/** + * The AbortController. + * @see https://dom.spec.whatwg.org/#abortcontroller + */ +class AbortController { + /** + * Initialize this controller. + */ + constructor() { + signals.set(this, createAbortSignal()); + } + /** + * Returns the `AbortSignal` object associated with this object. + */ + get signal() { + return getSignal(this); + } + /** + * Abort and signal to any observers that the associated activity is to be aborted. + */ + abort() { + abortSignal(getSignal(this)); + } +} +/** + * Associated signals. + */ +const signals = new WeakMap(); +/** + * Get the associated signal of a given controller. + */ +function getSignal(controller) { + const signal = signals.get(controller); + if (signal == null) { + throw new TypeError(`Expected 'this' to be an 'AbortController' object, but got ${controller === null ? "null" : typeof controller}`); + } + return signal; +} +// Properties should be enumerable. +Object.defineProperties(AbortController.prototype, { + signal: { enumerable: true }, + abort: { enumerable: true }, +}); +if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { + Object.defineProperty(AbortController.prototype, Symbol.toStringTag, { + configurable: true, + value: "AbortController", + }); +} + +exports.AbortController = AbortController; +exports.AbortSignal = AbortSignal; +exports["default"] = AbortController; + +module.exports = AbortController +module.exports.AbortController = module.exports["default"] = AbortController +module.exports.AbortSignal = AbortSignal +//# sourceMappingURL=abort-controller.js.map + + +/***/ }), + +/***/ 4623: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +module.exports = __nccwpck_require__(5006); +module.exports.HttpsAgent = __nccwpck_require__(5500); +module.exports.constants = __nccwpck_require__(7757); + + +/***/ }), + +/***/ 5006: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +const OriginalAgent = (__nccwpck_require__(3685).Agent); +const ms = __nccwpck_require__(845); +const debug = (__nccwpck_require__(3837).debuglog)('agentkeepalive'); +const { + INIT_SOCKET, + CURRENT_ID, + CREATE_ID, + SOCKET_CREATED_TIME, + SOCKET_NAME, + SOCKET_REQUEST_COUNT, + SOCKET_REQUEST_FINISHED_COUNT, +} = __nccwpck_require__(7757); + +// OriginalAgent come from +// - https://github.com/nodejs/node/blob/v8.12.0/lib/_http_agent.js +// - https://github.com/nodejs/node/blob/v10.12.0/lib/_http_agent.js + +// node <= 10 +let defaultTimeoutListenerCount = 1; +const majorVersion = parseInt(process.version.split('.', 1)[0].substring(1)); +if (majorVersion >= 11 && majorVersion <= 12) { + defaultTimeoutListenerCount = 2; +} else if (majorVersion >= 13) { + defaultTimeoutListenerCount = 3; +} + +function deprecate(message) { + console.log('[agentkeepalive:deprecated] %s', message); +} + +class Agent extends OriginalAgent { + constructor(options) { + options = options || {}; + options.keepAlive = options.keepAlive !== false; + // default is keep-alive and 4s free socket timeout + // see https://medium.com/ssense-tech/reduce-networking-errors-in-nodejs-23b4eb9f2d83 + if (options.freeSocketTimeout === undefined) { + options.freeSocketTimeout = 4000; + } + // Legacy API: keepAliveTimeout should be rename to `freeSocketTimeout` + if (options.keepAliveTimeout) { + deprecate('options.keepAliveTimeout is deprecated, please use options.freeSocketTimeout instead'); + options.freeSocketTimeout = options.keepAliveTimeout; + delete options.keepAliveTimeout; + } + // Legacy API: freeSocketKeepAliveTimeout should be rename to `freeSocketTimeout` + if (options.freeSocketKeepAliveTimeout) { + deprecate('options.freeSocketKeepAliveTimeout is deprecated, please use options.freeSocketTimeout instead'); + options.freeSocketTimeout = options.freeSocketKeepAliveTimeout; + delete options.freeSocketKeepAliveTimeout; + } + + // Sets the socket to timeout after timeout milliseconds of inactivity on the socket. + // By default is double free socket timeout. + if (options.timeout === undefined) { + // make sure socket default inactivity timeout >= 8s + options.timeout = Math.max(options.freeSocketTimeout * 2, 8000); + } + + // support humanize format + options.timeout = ms(options.timeout); + options.freeSocketTimeout = ms(options.freeSocketTimeout); + options.socketActiveTTL = options.socketActiveTTL ? ms(options.socketActiveTTL) : 0; + + super(options); + + this[CURRENT_ID] = 0; + + // create socket success counter + this.createSocketCount = 0; + this.createSocketCountLastCheck = 0; + + this.createSocketErrorCount = 0; + this.createSocketErrorCountLastCheck = 0; + + this.closeSocketCount = 0; + this.closeSocketCountLastCheck = 0; + + // socket error event count + this.errorSocketCount = 0; + this.errorSocketCountLastCheck = 0; + + // request finished counter + this.requestCount = 0; + this.requestCountLastCheck = 0; + + // including free socket timeout counter + this.timeoutSocketCount = 0; + this.timeoutSocketCountLastCheck = 0; + + this.on('free', socket => { + // https://github.com/nodejs/node/pull/32000 + // Node.js native agent will check socket timeout eqs agent.options.timeout. + // Use the ttl or freeSocketTimeout to overwrite. + const timeout = this.calcSocketTimeout(socket); + if (timeout > 0 && socket.timeout !== timeout) { + socket.setTimeout(timeout); + } + }); + } + + get freeSocketKeepAliveTimeout() { + deprecate('agent.freeSocketKeepAliveTimeout is deprecated, please use agent.options.freeSocketTimeout instead'); + return this.options.freeSocketTimeout; + } + + get timeout() { + deprecate('agent.timeout is deprecated, please use agent.options.timeout instead'); + return this.options.timeout; + } + + get socketActiveTTL() { + deprecate('agent.socketActiveTTL is deprecated, please use agent.options.socketActiveTTL instead'); + return this.options.socketActiveTTL; + } + + calcSocketTimeout(socket) { + /** + * return <= 0: should free socket + * return > 0: should update socket timeout + * return undefined: not find custom timeout + */ + let freeSocketTimeout = this.options.freeSocketTimeout; + const socketActiveTTL = this.options.socketActiveTTL; + if (socketActiveTTL) { + // check socketActiveTTL + const aliveTime = Date.now() - socket[SOCKET_CREATED_TIME]; + const diff = socketActiveTTL - aliveTime; + if (diff <= 0) { + return diff; + } + if (freeSocketTimeout && diff < freeSocketTimeout) { + freeSocketTimeout = diff; + } + } + // set freeSocketTimeout + if (freeSocketTimeout) { + // set free keepalive timer + // try to use socket custom freeSocketTimeout first, support headers['keep-alive'] + // https://github.com/node-modules/urllib/blob/b76053020923f4d99a1c93cf2e16e0c5ba10bacf/lib/urllib.js#L498 + const customFreeSocketTimeout = socket.freeSocketTimeout || socket.freeSocketKeepAliveTimeout; + return customFreeSocketTimeout || freeSocketTimeout; + } + } + + keepSocketAlive(socket) { + const result = super.keepSocketAlive(socket); + // should not keepAlive, do nothing + if (!result) return result; + + const customTimeout = this.calcSocketTimeout(socket); + if (typeof customTimeout === 'undefined') { + return true; + } + if (customTimeout <= 0) { + debug('%s(requests: %s, finished: %s) free but need to destroy by TTL, request count %s, diff is %s', + socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], customTimeout); + return false; + } + if (socket.timeout !== customTimeout) { + socket.setTimeout(customTimeout); + } + return true; + } + + // only call on addRequest + reuseSocket(...args) { + // reuseSocket(socket, req) + super.reuseSocket(...args); + const socket = args[0]; + const req = args[1]; + req.reusedSocket = true; + const agentTimeout = this.options.timeout; + if (getSocketTimeout(socket) !== agentTimeout) { + // reset timeout before use + socket.setTimeout(agentTimeout); + debug('%s reset timeout to %sms', socket[SOCKET_NAME], agentTimeout); + } + socket[SOCKET_REQUEST_COUNT]++; + debug('%s(requests: %s, finished: %s) reuse on addRequest, timeout %sms', + socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], + getSocketTimeout(socket)); + } + + [CREATE_ID]() { + const id = this[CURRENT_ID]++; + if (this[CURRENT_ID] === Number.MAX_SAFE_INTEGER) this[CURRENT_ID] = 0; + return id; + } + + [INIT_SOCKET](socket, options) { + // bugfix here. + // https on node 8, 10 won't set agent.options.timeout by default + // TODO: need to fix on node itself + if (options.timeout) { + const timeout = getSocketTimeout(socket); + if (!timeout) { + socket.setTimeout(options.timeout); + } + } + + if (this.options.keepAlive) { + // Disable Nagle's algorithm: http://blog.caustik.com/2012/04/08/scaling-node-js-to-100k-concurrent-connections/ + // https://fengmk2.com/benchmark/nagle-algorithm-delayed-ack-mock.html + socket.setNoDelay(true); + } + this.createSocketCount++; + if (this.options.socketActiveTTL) { + socket[SOCKET_CREATED_TIME] = Date.now(); + } + // don't show the hole '-----BEGIN CERTIFICATE----' key string + socket[SOCKET_NAME] = `sock[${this[CREATE_ID]()}#${options._agentKey}]`.split('-----BEGIN', 1)[0]; + socket[SOCKET_REQUEST_COUNT] = 1; + socket[SOCKET_REQUEST_FINISHED_COUNT] = 0; + installListeners(this, socket, options); + } + + createConnection(options, oncreate) { + let called = false; + const onNewCreate = (err, socket) => { + if (called) return; + called = true; + + if (err) { + this.createSocketErrorCount++; + return oncreate(err); + } + this[INIT_SOCKET](socket, options); + oncreate(err, socket); + }; + + const newSocket = super.createConnection(options, onNewCreate); + if (newSocket) onNewCreate(null, newSocket); + return newSocket; + } + + get statusChanged() { + const changed = this.createSocketCount !== this.createSocketCountLastCheck || + this.createSocketErrorCount !== this.createSocketErrorCountLastCheck || + this.closeSocketCount !== this.closeSocketCountLastCheck || + this.errorSocketCount !== this.errorSocketCountLastCheck || + this.timeoutSocketCount !== this.timeoutSocketCountLastCheck || + this.requestCount !== this.requestCountLastCheck; + if (changed) { + this.createSocketCountLastCheck = this.createSocketCount; + this.createSocketErrorCountLastCheck = this.createSocketErrorCount; + this.closeSocketCountLastCheck = this.closeSocketCount; + this.errorSocketCountLastCheck = this.errorSocketCount; + this.timeoutSocketCountLastCheck = this.timeoutSocketCount; + this.requestCountLastCheck = this.requestCount; + } + return changed; + } + + getCurrentStatus() { + return { + createSocketCount: this.createSocketCount, + createSocketErrorCount: this.createSocketErrorCount, + closeSocketCount: this.closeSocketCount, + errorSocketCount: this.errorSocketCount, + timeoutSocketCount: this.timeoutSocketCount, + requestCount: this.requestCount, + freeSockets: inspect(this.freeSockets), + sockets: inspect(this.sockets), + requests: inspect(this.requests), + }; + } +} + +// node 8 don't has timeout attribute on socket +// https://github.com/nodejs/node/pull/21204/files#diff-e6ef024c3775d787c38487a6309e491dR408 +function getSocketTimeout(socket) { + return socket.timeout || socket._idleTimeout; +} + +function installListeners(agent, socket, options) { + debug('%s create, timeout %sms', socket[SOCKET_NAME], getSocketTimeout(socket)); + + // listener socket events: close, timeout, error, free + function onFree() { + // create and socket.emit('free') logic + // https://github.com/nodejs/node/blob/master/lib/_http_agent.js#L311 + // no req on the socket, it should be the new socket + if (!socket._httpMessage && socket[SOCKET_REQUEST_COUNT] === 1) return; + + socket[SOCKET_REQUEST_FINISHED_COUNT]++; + agent.requestCount++; + debug('%s(requests: %s, finished: %s) free', + socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]); + + // should reuse on pedding requests? + const name = agent.getName(options); + if (socket.writable && agent.requests[name] && agent.requests[name].length) { + // will be reuse on agent free listener + socket[SOCKET_REQUEST_COUNT]++; + debug('%s(requests: %s, finished: %s) will be reuse on agent free event', + socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]); + } + } + socket.on('free', onFree); + + function onClose(isError) { + debug('%s(requests: %s, finished: %s) close, isError: %s', + socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], isError); + agent.closeSocketCount++; + } + socket.on('close', onClose); + + // start socket timeout handler + function onTimeout() { + // onTimeout and emitRequestTimeout(_http_client.js) + // https://github.com/nodejs/node/blob/v12.x/lib/_http_client.js#L711 + const listenerCount = socket.listeners('timeout').length; + // node <= 10, default listenerCount is 1, onTimeout + // 11 < node <= 12, default listenerCount is 2, onTimeout and emitRequestTimeout + // node >= 13, default listenerCount is 3, onTimeout, + // onTimeout(https://github.com/nodejs/node/pull/32000/files#diff-5f7fb0850412c6be189faeddea6c5359R333) + // and emitRequestTimeout + const timeout = getSocketTimeout(socket); + const req = socket._httpMessage; + const reqTimeoutListenerCount = req && req.listeners('timeout').length || 0; + debug('%s(requests: %s, finished: %s) timeout after %sms, listeners %s, defaultTimeoutListenerCount %s, hasHttpRequest %s, HttpRequest timeoutListenerCount %s', + socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], + timeout, listenerCount, defaultTimeoutListenerCount, !!req, reqTimeoutListenerCount); + if (debug.enabled) { + debug('timeout listeners: %s', socket.listeners('timeout').map(f => f.name).join(', ')); + } + agent.timeoutSocketCount++; + const name = agent.getName(options); + if (agent.freeSockets[name] && agent.freeSockets[name].indexOf(socket) !== -1) { + // free socket timeout, destroy quietly + socket.destroy(); + // Remove it from freeSockets list immediately to prevent new requests + // from being sent through this socket. + agent.removeSocket(socket, options); + debug('%s is free, destroy quietly', socket[SOCKET_NAME]); + } else { + // if there is no any request socket timeout handler, + // agent need to handle socket timeout itself. + // + // custom request socket timeout handle logic must follow these rules: + // 1. Destroy socket first + // 2. Must emit socket 'agentRemove' event tell agent remove socket + // from freeSockets list immediately. + // Otherise you may be get 'socket hang up' error when reuse + // free socket and timeout happen in the same time. + if (reqTimeoutListenerCount === 0) { + const error = new Error('Socket timeout'); + error.code = 'ERR_SOCKET_TIMEOUT'; + error.timeout = timeout; + // must manually call socket.end() or socket.destroy() to end the connection. + // https://nodejs.org/dist/latest-v10.x/docs/api/net.html#net_socket_settimeout_timeout_callback + socket.destroy(error); + agent.removeSocket(socket, options); + debug('%s destroy with timeout error', socket[SOCKET_NAME]); + } + } + } + socket.on('timeout', onTimeout); + + function onError(err) { + const listenerCount = socket.listeners('error').length; + debug('%s(requests: %s, finished: %s) error: %s, listenerCount: %s', + socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], + err, listenerCount); + agent.errorSocketCount++; + if (listenerCount === 1) { + // if socket don't contain error event handler, don't catch it, emit it again + debug('%s emit uncaught error event', socket[SOCKET_NAME]); + socket.removeListener('error', onError); + socket.emit('error', err); + } + } + socket.on('error', onError); + + function onRemove() { + debug('%s(requests: %s, finished: %s) agentRemove', + socket[SOCKET_NAME], + socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]); + // We need this function for cases like HTTP 'upgrade' + // (defined by WebSockets) where we need to remove a socket from the + // pool because it'll be locked up indefinitely + socket.removeListener('close', onClose); + socket.removeListener('error', onError); + socket.removeListener('free', onFree); + socket.removeListener('timeout', onTimeout); + socket.removeListener('agentRemove', onRemove); + } + socket.on('agentRemove', onRemove); +} + +module.exports = Agent; + +function inspect(obj) { + const res = {}; + for (const key in obj) { + res[key] = obj[key].length; + } + return res; +} + + +/***/ }), + +/***/ 7757: +/***/ ((module) => { + +"use strict"; + + +module.exports = { + // agent + CURRENT_ID: Symbol('agentkeepalive#currentId'), + CREATE_ID: Symbol('agentkeepalive#createId'), + INIT_SOCKET: Symbol('agentkeepalive#initSocket'), + CREATE_HTTPS_CONNECTION: Symbol('agentkeepalive#createHttpsConnection'), + // socket + SOCKET_CREATED_TIME: Symbol('agentkeepalive#socketCreatedTime'), + SOCKET_NAME: Symbol('agentkeepalive#socketName'), + SOCKET_REQUEST_COUNT: Symbol('agentkeepalive#socketRequestCount'), + SOCKET_REQUEST_FINISHED_COUNT: Symbol('agentkeepalive#socketRequestFinishedCount'), +}; + + +/***/ }), + +/***/ 5500: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +const OriginalHttpsAgent = (__nccwpck_require__(5687).Agent); +const HttpAgent = __nccwpck_require__(5006); +const { + INIT_SOCKET, + CREATE_HTTPS_CONNECTION, +} = __nccwpck_require__(7757); + +class HttpsAgent extends HttpAgent { + constructor(options) { + super(options); + + this.defaultPort = 443; + this.protocol = 'https:'; + this.maxCachedSessions = this.options.maxCachedSessions; + /* istanbul ignore next */ + if (this.maxCachedSessions === undefined) { + this.maxCachedSessions = 100; + } + + this._sessionCache = { + map: {}, + list: [], + }; + } + + createConnection(options, oncreate) { + const socket = this[CREATE_HTTPS_CONNECTION](options, oncreate); + this[INIT_SOCKET](socket, options); + return socket; + } +} + +// https://github.com/nodejs/node/blob/master/lib/https.js#L89 +HttpsAgent.prototype[CREATE_HTTPS_CONNECTION] = OriginalHttpsAgent.prototype.createConnection; + +[ + 'getName', + '_getSession', + '_cacheSession', + // https://github.com/nodejs/node/pull/4982 + '_evictSession', +].forEach(function(method) { + /* istanbul ignore next */ + if (typeof OriginalHttpsAgent.prototype[method] === 'function') { + HttpsAgent.prototype[method] = OriginalHttpsAgent.prototype[method]; + } +}); + +module.exports = HttpsAgent; + + +/***/ }), + +/***/ 3682: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var register = __nccwpck_require__(4670) +var addHook = __nccwpck_require__(5549) +var removeHook = __nccwpck_require__(6819) + +// bind with array of arguments: https://stackoverflow.com/a/21792913 +var bind = Function.bind +var bindable = bind.bind(bind) + +function bindApi (hook, state, name) { + var removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state]) + hook.api = { remove: removeHookRef } + hook.remove = removeHookRef + + ;['before', 'error', 'after', 'wrap'].forEach(function (kind) { + var args = name ? [state, kind, name] : [state, kind] + hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args) + }) +} + +function HookSingular () { + var singularHookName = 'h' + var singularHookState = { + registry: {} + } + var singularHook = register.bind(null, singularHookState, singularHookName) + bindApi(singularHook, singularHookState, singularHookName) + return singularHook +} + +function HookCollection () { + var state = { + registry: {} + } + + var hook = register.bind(null, state) + bindApi(hook, state) + + return hook +} + +var collectionHookDeprecationMessageDisplayed = false +function Hook () { + if (!collectionHookDeprecationMessageDisplayed) { + console.warn('[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4') + collectionHookDeprecationMessageDisplayed = true + } + return HookCollection() +} + +Hook.Singular = HookSingular.bind() +Hook.Collection = HookCollection.bind() + +module.exports = Hook +// expose constructors as a named property for TypeScript +module.exports.Hook = Hook +module.exports.Singular = Hook.Singular +module.exports.Collection = Hook.Collection + + +/***/ }), + +/***/ 5549: +/***/ ((module) => { + +module.exports = addHook; + +function addHook(state, kind, name, hook) { + var orig = hook; + if (!state.registry[name]) { + state.registry[name] = []; + } + + if (kind === "before") { + hook = function (method, options) { + return Promise.resolve() + .then(orig.bind(null, options)) + .then(method.bind(null, options)); + }; + } + + if (kind === "after") { + hook = function (method, options) { + var result; + return Promise.resolve() + .then(method.bind(null, options)) + .then(function (result_) { + result = result_; + return orig(result, options); + }) + .then(function () { + return result; + }); + }; + } + + if (kind === "error") { + hook = function (method, options) { + return Promise.resolve() + .then(method.bind(null, options)) + .catch(function (error) { + return orig(error, options); + }); + }; + } + + state.registry[name].push({ + hook: hook, + orig: orig, + }); +} + + +/***/ }), + +/***/ 4670: +/***/ ((module) => { + +module.exports = register; + +function register(state, name, method, options) { + if (typeof method !== "function") { + throw new Error("method for before hook must be a function"); + } + + if (!options) { + options = {}; + } + + if (Array.isArray(name)) { + return name.reverse().reduce(function (callback, name) { + return register.bind(null, state, name, callback, options); + }, method)(); + } + + return Promise.resolve().then(function () { + if (!state.registry[name]) { + return method(options); + } + + return state.registry[name].reduce(function (method, registered) { + return registered.hook.bind(null, method, options); + }, method)(); + }); +} + + +/***/ }), + +/***/ 6819: +/***/ ((module) => { + +module.exports = removeHook; + +function removeHook(state, name, method) { + if (!state.registry[name]) { + return; + } + + var index = state.registry[name] + .map(function (registered) { + return registered.orig; + }) + .indexOf(method); + + if (index === -1) { + return; + } + + state.registry[name].splice(index, 1); +} + + +/***/ }), + +/***/ 8932: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +class Deprecation extends Error { + constructor(message) { + super(message); // Maintains proper stack trace (only available on V8) + + /* istanbul ignore next */ + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = 'Deprecation'; + } + +} + +exports.Deprecation = Deprecation; + + +/***/ }), + +/***/ 4697: +/***/ ((module, exports) => { + +"use strict"; +/** + * @author Toru Nagashima + * @copyright 2015 Toru Nagashima. All rights reserved. + * See LICENSE file in root directory for full license. + */ + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +/** + * @typedef {object} PrivateData + * @property {EventTarget} eventTarget The event target. + * @property {{type:string}} event The original event object. + * @property {number} eventPhase The current event phase. + * @property {EventTarget|null} currentTarget The current event target. + * @property {boolean} canceled The flag to prevent default. + * @property {boolean} stopped The flag to stop propagation. + * @property {boolean} immediateStopped The flag to stop propagation immediately. + * @property {Function|null} passiveListener The listener if the current listener is passive. Otherwise this is null. + * @property {number} timeStamp The unix time. + * @private + */ + +/** + * Private data for event wrappers. + * @type {WeakMap} + * @private + */ +const privateData = new WeakMap(); + +/** + * Cache for wrapper classes. + * @type {WeakMap} + * @private + */ +const wrappers = new WeakMap(); + +/** + * Get private data. + * @param {Event} event The event object to get private data. + * @returns {PrivateData} The private data of the event. + * @private + */ +function pd(event) { + const retv = privateData.get(event); + console.assert( + retv != null, + "'this' is expected an Event object, but got", + event + ); + return retv +} + +/** + * https://dom.spec.whatwg.org/#set-the-canceled-flag + * @param data {PrivateData} private data. + */ +function setCancelFlag(data) { + if (data.passiveListener != null) { + if ( + typeof console !== "undefined" && + typeof console.error === "function" + ) { + console.error( + "Unable to preventDefault inside passive event listener invocation.", + data.passiveListener + ); + } + return + } + if (!data.event.cancelable) { + return + } + + data.canceled = true; + if (typeof data.event.preventDefault === "function") { + data.event.preventDefault(); + } +} + +/** + * @see https://dom.spec.whatwg.org/#interface-event + * @private + */ +/** + * The event wrapper. + * @constructor + * @param {EventTarget} eventTarget The event target of this dispatching. + * @param {Event|{type:string}} event The original event to wrap. + */ +function Event(eventTarget, event) { + privateData.set(this, { + eventTarget, + event, + eventPhase: 2, + currentTarget: eventTarget, + canceled: false, + stopped: false, + immediateStopped: false, + passiveListener: null, + timeStamp: event.timeStamp || Date.now(), + }); + + // https://heycam.github.io/webidl/#Unforgeable + Object.defineProperty(this, "isTrusted", { value: false, enumerable: true }); + + // Define accessors + const keys = Object.keys(event); + for (let i = 0; i < keys.length; ++i) { + const key = keys[i]; + if (!(key in this)) { + Object.defineProperty(this, key, defineRedirectDescriptor(key)); + } + } +} + +// Should be enumerable, but class methods are not enumerable. +Event.prototype = { + /** + * The type of this event. + * @type {string} + */ + get type() { + return pd(this).event.type + }, + + /** + * The target of this event. + * @type {EventTarget} + */ + get target() { + return pd(this).eventTarget + }, + + /** + * The target of this event. + * @type {EventTarget} + */ + get currentTarget() { + return pd(this).currentTarget + }, + + /** + * @returns {EventTarget[]} The composed path of this event. + */ + composedPath() { + const currentTarget = pd(this).currentTarget; + if (currentTarget == null) { + return [] + } + return [currentTarget] + }, + + /** + * Constant of NONE. + * @type {number} + */ + get NONE() { + return 0 + }, + + /** + * Constant of CAPTURING_PHASE. + * @type {number} + */ + get CAPTURING_PHASE() { + return 1 + }, + + /** + * Constant of AT_TARGET. + * @type {number} + */ + get AT_TARGET() { + return 2 + }, + + /** + * Constant of BUBBLING_PHASE. + * @type {number} + */ + get BUBBLING_PHASE() { + return 3 + }, + + /** + * The target of this event. + * @type {number} + */ + get eventPhase() { + return pd(this).eventPhase + }, + + /** + * Stop event bubbling. + * @returns {void} + */ + stopPropagation() { + const data = pd(this); + + data.stopped = true; + if (typeof data.event.stopPropagation === "function") { + data.event.stopPropagation(); + } + }, + + /** + * Stop event bubbling. + * @returns {void} + */ + stopImmediatePropagation() { + const data = pd(this); + + data.stopped = true; + data.immediateStopped = true; + if (typeof data.event.stopImmediatePropagation === "function") { + data.event.stopImmediatePropagation(); + } + }, + + /** + * The flag to be bubbling. + * @type {boolean} + */ + get bubbles() { + return Boolean(pd(this).event.bubbles) + }, + + /** + * The flag to be cancelable. + * @type {boolean} + */ + get cancelable() { + return Boolean(pd(this).event.cancelable) + }, + + /** + * Cancel this event. + * @returns {void} + */ + preventDefault() { + setCancelFlag(pd(this)); + }, + + /** + * The flag to indicate cancellation state. + * @type {boolean} + */ + get defaultPrevented() { + return pd(this).canceled + }, + + /** + * The flag to be composed. + * @type {boolean} + */ + get composed() { + return Boolean(pd(this).event.composed) + }, + + /** + * The unix time of this event. + * @type {number} + */ + get timeStamp() { + return pd(this).timeStamp + }, + + /** + * The target of this event. + * @type {EventTarget} + * @deprecated + */ + get srcElement() { + return pd(this).eventTarget + }, + + /** + * The flag to stop event bubbling. + * @type {boolean} + * @deprecated + */ + get cancelBubble() { + return pd(this).stopped + }, + set cancelBubble(value) { + if (!value) { + return + } + const data = pd(this); + + data.stopped = true; + if (typeof data.event.cancelBubble === "boolean") { + data.event.cancelBubble = true; + } + }, + + /** + * The flag to indicate cancellation state. + * @type {boolean} + * @deprecated + */ + get returnValue() { + return !pd(this).canceled + }, + set returnValue(value) { + if (!value) { + setCancelFlag(pd(this)); + } + }, + + /** + * Initialize this event object. But do nothing under event dispatching. + * @param {string} type The event type. + * @param {boolean} [bubbles=false] The flag to be possible to bubble up. + * @param {boolean} [cancelable=false] The flag to be possible to cancel. + * @deprecated + */ + initEvent() { + // Do nothing. + }, +}; + +// `constructor` is not enumerable. +Object.defineProperty(Event.prototype, "constructor", { + value: Event, + configurable: true, + writable: true, +}); + +// Ensure `event instanceof window.Event` is `true`. +if (typeof window !== "undefined" && typeof window.Event !== "undefined") { + Object.setPrototypeOf(Event.prototype, window.Event.prototype); + + // Make association for wrappers. + wrappers.set(window.Event.prototype, Event); +} + +/** + * Get the property descriptor to redirect a given property. + * @param {string} key Property name to define property descriptor. + * @returns {PropertyDescriptor} The property descriptor to redirect the property. + * @private + */ +function defineRedirectDescriptor(key) { + return { + get() { + return pd(this).event[key] + }, + set(value) { + pd(this).event[key] = value; + }, + configurable: true, + enumerable: true, + } +} + +/** + * Get the property descriptor to call a given method property. + * @param {string} key Property name to define property descriptor. + * @returns {PropertyDescriptor} The property descriptor to call the method property. + * @private + */ +function defineCallDescriptor(key) { + return { + value() { + const event = pd(this).event; + return event[key].apply(event, arguments) + }, + configurable: true, + enumerable: true, + } +} + +/** + * Define new wrapper class. + * @param {Function} BaseEvent The base wrapper class. + * @param {Object} proto The prototype of the original event. + * @returns {Function} The defined wrapper class. + * @private + */ +function defineWrapper(BaseEvent, proto) { + const keys = Object.keys(proto); + if (keys.length === 0) { + return BaseEvent + } + + /** CustomEvent */ + function CustomEvent(eventTarget, event) { + BaseEvent.call(this, eventTarget, event); + } + + CustomEvent.prototype = Object.create(BaseEvent.prototype, { + constructor: { value: CustomEvent, configurable: true, writable: true }, + }); + + // Define accessors. + for (let i = 0; i < keys.length; ++i) { + const key = keys[i]; + if (!(key in BaseEvent.prototype)) { + const descriptor = Object.getOwnPropertyDescriptor(proto, key); + const isFunc = typeof descriptor.value === "function"; + Object.defineProperty( + CustomEvent.prototype, + key, + isFunc + ? defineCallDescriptor(key) + : defineRedirectDescriptor(key) + ); + } + } + + return CustomEvent +} + +/** + * Get the wrapper class of a given prototype. + * @param {Object} proto The prototype of the original event to get its wrapper. + * @returns {Function} The wrapper class. + * @private + */ +function getWrapper(proto) { + if (proto == null || proto === Object.prototype) { + return Event + } + + let wrapper = wrappers.get(proto); + if (wrapper == null) { + wrapper = defineWrapper(getWrapper(Object.getPrototypeOf(proto)), proto); + wrappers.set(proto, wrapper); + } + return wrapper +} + +/** + * Wrap a given event to management a dispatching. + * @param {EventTarget} eventTarget The event target of this dispatching. + * @param {Object} event The event to wrap. + * @returns {Event} The wrapper instance. + * @private + */ +function wrapEvent(eventTarget, event) { + const Wrapper = getWrapper(Object.getPrototypeOf(event)); + return new Wrapper(eventTarget, event) +} + +/** + * Get the immediateStopped flag of a given event. + * @param {Event} event The event to get. + * @returns {boolean} The flag to stop propagation immediately. + * @private + */ +function isStopped(event) { + return pd(event).immediateStopped +} + +/** + * Set the current event phase of a given event. + * @param {Event} event The event to set current target. + * @param {number} eventPhase New event phase. + * @returns {void} + * @private + */ +function setEventPhase(event, eventPhase) { + pd(event).eventPhase = eventPhase; +} + +/** + * Set the current target of a given event. + * @param {Event} event The event to set current target. + * @param {EventTarget|null} currentTarget New current target. + * @returns {void} + * @private + */ +function setCurrentTarget(event, currentTarget) { + pd(event).currentTarget = currentTarget; +} + +/** + * Set a passive listener of a given event. + * @param {Event} event The event to set current target. + * @param {Function|null} passiveListener New passive listener. + * @returns {void} + * @private + */ +function setPassiveListener(event, passiveListener) { + pd(event).passiveListener = passiveListener; +} + +/** + * @typedef {object} ListenerNode + * @property {Function} listener + * @property {1|2|3} listenerType + * @property {boolean} passive + * @property {boolean} once + * @property {ListenerNode|null} next + * @private + */ + +/** + * @type {WeakMap>} + * @private + */ +const listenersMap = new WeakMap(); + +// Listener types +const CAPTURE = 1; +const BUBBLE = 2; +const ATTRIBUTE = 3; + +/** + * Check whether a given value is an object or not. + * @param {any} x The value to check. + * @returns {boolean} `true` if the value is an object. + */ +function isObject(x) { + return x !== null && typeof x === "object" //eslint-disable-line no-restricted-syntax +} + +/** + * Get listeners. + * @param {EventTarget} eventTarget The event target to get. + * @returns {Map} The listeners. + * @private + */ +function getListeners(eventTarget) { + const listeners = listenersMap.get(eventTarget); + if (listeners == null) { + throw new TypeError( + "'this' is expected an EventTarget object, but got another value." + ) + } + return listeners +} + +/** + * Get the property descriptor for the event attribute of a given event. + * @param {string} eventName The event name to get property descriptor. + * @returns {PropertyDescriptor} The property descriptor. + * @private + */ +function defineEventAttributeDescriptor(eventName) { + return { + get() { + const listeners = getListeners(this); + let node = listeners.get(eventName); + while (node != null) { + if (node.listenerType === ATTRIBUTE) { + return node.listener + } + node = node.next; + } + return null + }, + + set(listener) { + if (typeof listener !== "function" && !isObject(listener)) { + listener = null; // eslint-disable-line no-param-reassign + } + const listeners = getListeners(this); + + // Traverse to the tail while removing old value. + let prev = null; + let node = listeners.get(eventName); + while (node != null) { + if (node.listenerType === ATTRIBUTE) { + // Remove old value. + if (prev !== null) { + prev.next = node.next; + } else if (node.next !== null) { + listeners.set(eventName, node.next); + } else { + listeners.delete(eventName); + } + } else { + prev = node; + } + + node = node.next; + } + + // Add new value. + if (listener !== null) { + const newNode = { + listener, + listenerType: ATTRIBUTE, + passive: false, + once: false, + next: null, + }; + if (prev === null) { + listeners.set(eventName, newNode); + } else { + prev.next = newNode; + } + } + }, + configurable: true, + enumerable: true, + } +} + +/** + * Define an event attribute (e.g. `eventTarget.onclick`). + * @param {Object} eventTargetPrototype The event target prototype to define an event attrbite. + * @param {string} eventName The event name to define. + * @returns {void} + */ +function defineEventAttribute(eventTargetPrototype, eventName) { + Object.defineProperty( + eventTargetPrototype, + `on${eventName}`, + defineEventAttributeDescriptor(eventName) + ); +} + +/** + * Define a custom EventTarget with event attributes. + * @param {string[]} eventNames Event names for event attributes. + * @returns {EventTarget} The custom EventTarget. + * @private + */ +function defineCustomEventTarget(eventNames) { + /** CustomEventTarget */ + function CustomEventTarget() { + EventTarget.call(this); + } + + CustomEventTarget.prototype = Object.create(EventTarget.prototype, { + constructor: { + value: CustomEventTarget, + configurable: true, + writable: true, + }, + }); + + for (let i = 0; i < eventNames.length; ++i) { + defineEventAttribute(CustomEventTarget.prototype, eventNames[i]); + } + + return CustomEventTarget +} + +/** + * EventTarget. + * + * - This is constructor if no arguments. + * - This is a function which returns a CustomEventTarget constructor if there are arguments. + * + * For example: + * + * class A extends EventTarget {} + * class B extends EventTarget("message") {} + * class C extends EventTarget("message", "error") {} + * class D extends EventTarget(["message", "error"]) {} + */ +function EventTarget() { + /*eslint-disable consistent-return */ + if (this instanceof EventTarget) { + listenersMap.set(this, new Map()); + return + } + if (arguments.length === 1 && Array.isArray(arguments[0])) { + return defineCustomEventTarget(arguments[0]) + } + if (arguments.length > 0) { + const types = new Array(arguments.length); + for (let i = 0; i < arguments.length; ++i) { + types[i] = arguments[i]; + } + return defineCustomEventTarget(types) + } + throw new TypeError("Cannot call a class as a function") + /*eslint-enable consistent-return */ +} + +// Should be enumerable, but class methods are not enumerable. +EventTarget.prototype = { + /** + * Add a given listener to this event target. + * @param {string} eventName The event name to add. + * @param {Function} listener The listener to add. + * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener. + * @returns {void} + */ + addEventListener(eventName, listener, options) { + if (listener == null) { + return + } + if (typeof listener !== "function" && !isObject(listener)) { + throw new TypeError("'listener' should be a function or an object.") + } + + const listeners = getListeners(this); + const optionsIsObj = isObject(options); + const capture = optionsIsObj + ? Boolean(options.capture) + : Boolean(options); + const listenerType = capture ? CAPTURE : BUBBLE; + const newNode = { + listener, + listenerType, + passive: optionsIsObj && Boolean(options.passive), + once: optionsIsObj && Boolean(options.once), + next: null, + }; + + // Set it as the first node if the first node is null. + let node = listeners.get(eventName); + if (node === undefined) { + listeners.set(eventName, newNode); + return + } + + // Traverse to the tail while checking duplication.. + let prev = null; + while (node != null) { + if ( + node.listener === listener && + node.listenerType === listenerType + ) { + // Should ignore duplication. + return + } + prev = node; + node = node.next; + } + + // Add it. + prev.next = newNode; + }, + + /** + * Remove a given listener from this event target. + * @param {string} eventName The event name to remove. + * @param {Function} listener The listener to remove. + * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener. + * @returns {void} + */ + removeEventListener(eventName, listener, options) { + if (listener == null) { + return + } + + const listeners = getListeners(this); + const capture = isObject(options) + ? Boolean(options.capture) + : Boolean(options); + const listenerType = capture ? CAPTURE : BUBBLE; + + let prev = null; + let node = listeners.get(eventName); + while (node != null) { + if ( + node.listener === listener && + node.listenerType === listenerType + ) { + if (prev !== null) { + prev.next = node.next; + } else if (node.next !== null) { + listeners.set(eventName, node.next); + } else { + listeners.delete(eventName); + } + return + } + + prev = node; + node = node.next; + } + }, + + /** + * Dispatch a given event. + * @param {Event|{type:string}} event The event to dispatch. + * @returns {boolean} `false` if canceled. + */ + dispatchEvent(event) { + if (event == null || typeof event.type !== "string") { + throw new TypeError('"event.type" should be a string.') + } + + // If listeners aren't registered, terminate. + const listeners = getListeners(this); + const eventName = event.type; + let node = listeners.get(eventName); + if (node == null) { + return true + } + + // Since we cannot rewrite several properties, so wrap object. + const wrappedEvent = wrapEvent(this, event); + + // This doesn't process capturing phase and bubbling phase. + // This isn't participating in a tree. + let prev = null; + while (node != null) { + // Remove this listener if it's once + if (node.once) { + if (prev !== null) { + prev.next = node.next; + } else if (node.next !== null) { + listeners.set(eventName, node.next); + } else { + listeners.delete(eventName); + } + } else { + prev = node; + } + + // Call this listener + setPassiveListener( + wrappedEvent, + node.passive ? node.listener : null + ); + if (typeof node.listener === "function") { + try { + node.listener.call(this, wrappedEvent); + } catch (err) { + if ( + typeof console !== "undefined" && + typeof console.error === "function" + ) { + console.error(err); + } + } + } else if ( + node.listenerType !== ATTRIBUTE && + typeof node.listener.handleEvent === "function" + ) { + node.listener.handleEvent(wrappedEvent); + } + + // Break if `event.stopImmediatePropagation` was called. + if (isStopped(wrappedEvent)) { + break + } + + node = node.next; + } + setPassiveListener(wrappedEvent, null); + setEventPhase(wrappedEvent, 0); + setCurrentTarget(wrappedEvent, null); + + return !wrappedEvent.defaultPrevented + }, +}; + +// `constructor` is not enumerable. +Object.defineProperty(EventTarget.prototype, "constructor", { + value: EventTarget, + configurable: true, + writable: true, +}); + +// Ensure `eventTarget instanceof window.EventTarget` is `true`. +if ( + typeof window !== "undefined" && + typeof window.EventTarget !== "undefined" +) { + Object.setPrototypeOf(EventTarget.prototype, window.EventTarget.prototype); +} + +exports.defineEventAttribute = defineEventAttribute; +exports.EventTarget = EventTarget; +exports["default"] = EventTarget; + +module.exports = EventTarget +module.exports.EventTarget = module.exports["default"] = EventTarget +module.exports.defineEventAttribute = defineEventAttribute +//# sourceMappingURL=event-target-shim.js.map + + +/***/ }), + +/***/ 6993: +/***/ (function(__unused_webpack_module, exports) { + +/** + * @license + * web-streams-polyfill v4.0.0-beta.3 + * Copyright 2021 Mattias Buelens, Diwank Singh Tomer and other contributors. + * This code is released under the MIT license. + * SPDX-License-Identifier: MIT + */ +!function(e,t){ true?t(exports):0}(this,(function(e){"use strict";const t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol:e=>`Symbol(${e})`;function r(){}function o(e){return"object"==typeof e&&null!==e||"function"==typeof e}const n=r;function a(e,t){try{Object.defineProperty(e,"name",{value:t,configurable:!0})}catch(e){}}const i=Promise,l=Promise.prototype.then,s=Promise.resolve.bind(i),u=Promise.reject.bind(i);function c(e){return new i(e)}function d(e){return s(e)}function f(e){return u(e)}function b(e,t,r){return l.call(e,t,r)}function h(e,t,r){b(b(e,t,r),void 0,n)}function _(e,t){h(e,t)}function p(e,t){h(e,void 0,t)}function m(e,t,r){return b(e,t,r)}function y(e){b(e,void 0,n)}let g=e=>{if("function"==typeof queueMicrotask)g=queueMicrotask;else{const e=d(void 0);g=t=>b(e,t)}return g(e)};function S(e,t,r){if("function"!=typeof e)throw new TypeError("Argument is not a function");return Function.prototype.apply.call(e,t,r)}function w(e,t,r){try{return d(S(e,t,r))}catch(e){return f(e)}}class v{constructor(){this._cursor=0,this._size=0,this._front={_elements:[],_next:void 0},this._back=this._front,this._cursor=0,this._size=0}get length(){return this._size}push(e){const t=this._back;let r=t;16383===t._elements.length&&(r={_elements:[],_next:void 0}),t._elements.push(e),r!==t&&(this._back=r,t._next=r),++this._size}shift(){const e=this._front;let t=e;const r=this._cursor;let o=r+1;const n=e._elements,a=n[r];return 16384===o&&(t=e._next,o=0),--this._size,this._cursor=o,e!==t&&(this._front=t),n[r]=void 0,a}forEach(e){let t=this._cursor,r=this._front,o=r._elements;for(;!(t===o.length&&void 0===r._next||t===o.length&&(r=r._next,o=r._elements,t=0,0===o.length));)e(o[t]),++t}peek(){const e=this._front,t=this._cursor;return e._elements[t]}}const R=t("[[AbortSteps]]"),T=t("[[ErrorSteps]]"),q=t("[[CancelSteps]]"),C=t("[[PullSteps]]"),P=t("[[ReleaseSteps]]");function E(e,t){e._ownerReadableStream=t,t._reader=e,"readable"===t._state?B(e):"closed"===t._state?function(e){B(e),z(e)}(e):A(e,t._storedError)}function W(e,t){return Xt(e._ownerReadableStream,t)}function O(e){const t=e._ownerReadableStream;"readable"===t._state?j(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")):function(e,t){A(e,t)}(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")),t._readableStreamController[P](),t._reader=void 0,e._ownerReadableStream=void 0}function k(e){return new TypeError("Cannot "+e+" a stream using a released reader")}function B(e){e._closedPromise=c(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r}))}function A(e,t){B(e),j(e,t)}function j(e,t){void 0!==e._closedPromise_reject&&(y(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}function z(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}const L=Number.isFinite||function(e){return"number"==typeof e&&isFinite(e)},F=Math.trunc||function(e){return e<0?Math.ceil(e):Math.floor(e)};function D(e,t){if(void 0!==e&&("object"!=typeof(r=e)&&"function"!=typeof r))throw new TypeError(`${t} is not an object.`);var r}function I(e,t){if("function"!=typeof e)throw new TypeError(`${t} is not a function.`)}function $(e,t){if(!function(e){return"object"==typeof e&&null!==e||"function"==typeof e}(e))throw new TypeError(`${t} is not an object.`)}function M(e,t,r){if(void 0===e)throw new TypeError(`Parameter ${t} is required in '${r}'.`)}function Y(e,t,r){if(void 0===e)throw new TypeError(`${t} is required in '${r}'.`)}function Q(e){return Number(e)}function N(e){return 0===e?0:e}function x(e,t){const r=Number.MAX_SAFE_INTEGER;let o=Number(e);if(o=N(o),!L(o))throw new TypeError(`${t} is not a finite number`);if(o=function(e){return N(F(e))}(o),o<0||o>r)throw new TypeError(`${t} is outside the accepted range of 0 to ${r}, inclusive`);return L(o)&&0!==o?o:0}function H(e){if(!o(e))return!1;if("function"!=typeof e.getReader)return!1;try{return"boolean"==typeof e.locked}catch(e){return!1}}function V(e){if(!o(e))return!1;if("function"!=typeof e.getWriter)return!1;try{return"boolean"==typeof e.locked}catch(e){return!1}}function U(e,t){if(!Ut(e))throw new TypeError(`${t} is not a ReadableStream.`)}function G(e,t){e._reader._readRequests.push(t)}function X(e,t,r){const o=e._reader._readRequests.shift();r?o._closeSteps():o._chunkSteps(t)}function J(e){return e._reader._readRequests.length}function K(e){const t=e._reader;return void 0!==t&&!!Z(t)}class ReadableStreamDefaultReader{constructor(e){if(M(e,1,"ReadableStreamDefaultReader"),U(e,"First parameter"),Gt(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");E(this,e),this._readRequests=new v}get closed(){return Z(this)?this._closedPromise:f(te("closed"))}cancel(e){return Z(this)?void 0===this._ownerReadableStream?f(k("cancel")):W(this,e):f(te("cancel"))}read(){if(!Z(this))return f(te("read"));if(void 0===this._ownerReadableStream)return f(k("read from"));let e,t;const r=c(((r,o)=>{e=r,t=o}));return function(e,t){const r=e._ownerReadableStream;r._disturbed=!0,"closed"===r._state?t._closeSteps():"errored"===r._state?t._errorSteps(r._storedError):r._readableStreamController[C](t)}(this,{_chunkSteps:t=>e({value:t,done:!1}),_closeSteps:()=>e({value:void 0,done:!0}),_errorSteps:e=>t(e)}),r}releaseLock(){if(!Z(this))throw te("releaseLock");void 0!==this._ownerReadableStream&&function(e){O(e);const t=new TypeError("Reader was released");ee(e,t)}(this)}}function Z(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readRequests")&&e instanceof ReadableStreamDefaultReader)}function ee(e,t){const r=e._readRequests;e._readRequests=new v,r.forEach((e=>{e._errorSteps(t)}))}function te(e){return new TypeError(`ReadableStreamDefaultReader.prototype.${e} can only be used on a ReadableStreamDefaultReader`)}Object.defineProperties(ReadableStreamDefaultReader.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),a(ReadableStreamDefaultReader.prototype.cancel,"cancel"),a(ReadableStreamDefaultReader.prototype.read,"read"),a(ReadableStreamDefaultReader.prototype.releaseLock,"releaseLock"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStreamDefaultReader.prototype,t.toStringTag,{value:"ReadableStreamDefaultReader",configurable:!0});class re{constructor(e,t){this._ongoingPromise=void 0,this._isFinished=!1,this._reader=e,this._preventCancel=t}next(){const e=()=>this._nextSteps();return this._ongoingPromise=this._ongoingPromise?m(this._ongoingPromise,e,e):e(),this._ongoingPromise}return(e){const t=()=>this._returnSteps(e);return this._ongoingPromise?m(this._ongoingPromise,t,t):t()}_nextSteps(){if(this._isFinished)return Promise.resolve({value:void 0,done:!0});const e=this._reader;return void 0===e?f(k("iterate")):b(e.read(),(e=>{var t;return this._ongoingPromise=void 0,e.done&&(this._isFinished=!0,null===(t=this._reader)||void 0===t||t.releaseLock(),this._reader=void 0),e}),(e=>{var t;throw this._ongoingPromise=void 0,this._isFinished=!0,null===(t=this._reader)||void 0===t||t.releaseLock(),this._reader=void 0,e}))}_returnSteps(e){if(this._isFinished)return Promise.resolve({value:e,done:!0});this._isFinished=!0;const t=this._reader;if(void 0===t)return f(k("finish iterating"));if(this._reader=void 0,!this._preventCancel){const r=t.cancel(e);return t.releaseLock(),m(r,(()=>({value:e,done:!0})))}return t.releaseLock(),d({value:e,done:!0})}}const oe={next(){return ne(this)?this._asyncIteratorImpl.next():f(ae("next"))},return(e){return ne(this)?this._asyncIteratorImpl.return(e):f(ae("return"))}};function ne(e){if(!o(e))return!1;if(!Object.prototype.hasOwnProperty.call(e,"_asyncIteratorImpl"))return!1;try{return e._asyncIteratorImpl instanceof re}catch(e){return!1}}function ae(e){return new TypeError(`ReadableStreamAsyncIterator.${e} can only be used on a ReadableSteamAsyncIterator`)}"symbol"==typeof t.asyncIterator&&Object.defineProperty(oe,t.asyncIterator,{value(){return this},writable:!0,configurable:!0});const ie=Number.isNaN||function(e){return e!=e};function le(e,t,r,o,n){new Uint8Array(e).set(new Uint8Array(r,o,n),t)}function se(e){const t=function(e,t,r){if(e.slice)return e.slice(t,r);const o=r-t,n=new ArrayBuffer(o);return le(n,0,e,t,o),n}(e.buffer,e.byteOffset,e.byteOffset+e.byteLength);return new Uint8Array(t)}function ue(e){const t=e._queue.shift();return e._queueTotalSize-=t.size,e._queueTotalSize<0&&(e._queueTotalSize=0),t.value}function ce(e,t,r){if("number"!=typeof(o=r)||ie(o)||o<0||r===1/0)throw new RangeError("Size must be a finite, non-NaN, non-negative number.");var o;e._queue.push({value:t,size:r}),e._queueTotalSize+=r}function de(e){e._queue=new v,e._queueTotalSize=0}class ReadableStreamBYOBRequest{constructor(){throw new TypeError("Illegal constructor")}get view(){if(!be(this))throw Ae("view");return this._view}respond(e){if(!be(this))throw Ae("respond");if(M(e,1,"respond"),e=x(e,"First parameter"),void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");this._view.buffer,function(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t)throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream")}else{if(0===t)throw new TypeError("bytesWritten must be greater than 0 when calling respond() on a readable stream");if(r.bytesFilled+t>r.byteLength)throw new RangeError("bytesWritten out of range")}r.buffer=r.buffer,Ce(e,t)}(this._associatedReadableByteStreamController,e)}respondWithNewView(e){if(!be(this))throw Ae("respondWithNewView");if(M(e,1,"respondWithNewView"),!ArrayBuffer.isView(e))throw new TypeError("You can only respond with array buffer views");if(void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");e.buffer,function(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t.byteLength)throw new TypeError("The view's length must be 0 when calling respondWithNewView() on a closed stream")}else if(0===t.byteLength)throw new TypeError("The view's length must be greater than 0 when calling respondWithNewView() on a readable stream");if(r.byteOffset+r.bytesFilled!==t.byteOffset)throw new RangeError("The region specified by view does not match byobRequest");if(r.bufferByteLength!==t.buffer.byteLength)throw new RangeError("The buffer of view has different capacity than byobRequest");if(r.bytesFilled+t.byteLength>r.byteLength)throw new RangeError("The region specified by view is larger than byobRequest");const o=t.byteLength;r.buffer=t.buffer,Ce(e,o)}(this._associatedReadableByteStreamController,e)}}Object.defineProperties(ReadableStreamBYOBRequest.prototype,{respond:{enumerable:!0},respondWithNewView:{enumerable:!0},view:{enumerable:!0}}),a(ReadableStreamBYOBRequest.prototype.respond,"respond"),a(ReadableStreamBYOBRequest.prototype.respondWithNewView,"respondWithNewView"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStreamBYOBRequest.prototype,t.toStringTag,{value:"ReadableStreamBYOBRequest",configurable:!0});class ReadableByteStreamController{constructor(){throw new TypeError("Illegal constructor")}get byobRequest(){if(!fe(this))throw je("byobRequest");return function(e){if(null===e._byobRequest&&e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek(),r=new Uint8Array(t.buffer,t.byteOffset+t.bytesFilled,t.byteLength-t.bytesFilled),o=Object.create(ReadableStreamBYOBRequest.prototype);!function(e,t,r){e._associatedReadableByteStreamController=t,e._view=r}(o,e,r),e._byobRequest=o}return e._byobRequest}(this)}get desiredSize(){if(!fe(this))throw je("desiredSize");return ke(this)}close(){if(!fe(this))throw je("close");if(this._closeRequested)throw new TypeError("The stream has already been closed; do not close it again!");const e=this._controlledReadableByteStream._state;if("readable"!==e)throw new TypeError(`The stream (in ${e} state) is not in the readable state and cannot be closed`);!function(e){const t=e._controlledReadableByteStream;if(e._closeRequested||"readable"!==t._state)return;if(e._queueTotalSize>0)return void(e._closeRequested=!0);if(e._pendingPullIntos.length>0){if(e._pendingPullIntos.peek().bytesFilled>0){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");throw We(e,t),t}}Ee(e),Jt(t)}(this)}enqueue(e){if(!fe(this))throw je("enqueue");if(M(e,1,"enqueue"),!ArrayBuffer.isView(e))throw new TypeError("chunk must be an array buffer view");if(0===e.byteLength)throw new TypeError("chunk must have non-zero byteLength");if(0===e.buffer.byteLength)throw new TypeError("chunk's buffer must have non-zero byteLength");if(this._closeRequested)throw new TypeError("stream is closed or draining");const t=this._controlledReadableByteStream._state;if("readable"!==t)throw new TypeError(`The stream (in ${t} state) is not in the readable state and cannot be enqueued to`);!function(e,t){const r=e._controlledReadableByteStream;if(e._closeRequested||"readable"!==r._state)return;const o=t.buffer,n=t.byteOffset,a=t.byteLength,i=o;if(e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek();t.buffer,0,Te(e),t.buffer=t.buffer,"none"===t.readerType&&Se(e,t)}if(K(r))if(function(e){const t=e._controlledReadableByteStream._reader;for(;t._readRequests.length>0;){if(0===e._queueTotalSize)return;Oe(e,t._readRequests.shift())}}(e),0===J(r))ye(e,i,n,a);else{e._pendingPullIntos.length>0&&Pe(e);X(r,new Uint8Array(i,n,a),!1)}else Fe(r)?(ye(e,i,n,a),qe(e)):ye(e,i,n,a);he(e)}(this,e)}error(e){if(!fe(this))throw je("error");We(this,e)}[q](e){_e(this),de(this);const t=this._cancelAlgorithm(e);return Ee(this),t}[C](e){const t=this._controlledReadableByteStream;if(this._queueTotalSize>0)return void Oe(this,e);const r=this._autoAllocateChunkSize;if(void 0!==r){let t;try{t=new ArrayBuffer(r)}catch(t){return void e._errorSteps(t)}const o={buffer:t,bufferByteLength:r,byteOffset:0,byteLength:r,bytesFilled:0,elementSize:1,viewConstructor:Uint8Array,readerType:"default"};this._pendingPullIntos.push(o)}G(t,e),he(this)}[P](){if(this._pendingPullIntos.length>0){const e=this._pendingPullIntos.peek();e.readerType="none",this._pendingPullIntos=new v,this._pendingPullIntos.push(e)}}}function fe(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableByteStream")&&e instanceof ReadableByteStreamController)}function be(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_associatedReadableByteStreamController")&&e instanceof ReadableStreamBYOBRequest)}function he(e){const t=function(e){const t=e._controlledReadableByteStream;if("readable"!==t._state)return!1;if(e._closeRequested)return!1;if(!e._started)return!1;if(K(t)&&J(t)>0)return!0;if(Fe(t)&&Le(t)>0)return!0;if(ke(e)>0)return!0;return!1}(e);if(!t)return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;h(e._pullAlgorithm(),(()=>(e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,he(e)),null)),(t=>(We(e,t),null)))}function _e(e){Te(e),e._pendingPullIntos=new v}function pe(e,t){let r=!1;"closed"===e._state&&(r=!0);const o=me(t);"default"===t.readerType?X(e,o,r):function(e,t,r){const o=e._reader._readIntoRequests.shift();r?o._closeSteps(t):o._chunkSteps(t)}(e,o,r)}function me(e){const t=e.bytesFilled,r=e.elementSize;return new e.viewConstructor(e.buffer,e.byteOffset,t/r)}function ye(e,t,r,o){e._queue.push({buffer:t,byteOffset:r,byteLength:o}),e._queueTotalSize+=o}function ge(e,t,r,o){let n;try{n=t.slice(r,r+o)}catch(t){throw We(e,t),t}ye(e,n,0,o)}function Se(e,t){t.bytesFilled>0&&ge(e,t.buffer,t.byteOffset,t.bytesFilled),Pe(e)}function we(e,t){const r=t.elementSize,o=t.bytesFilled-t.bytesFilled%r,n=Math.min(e._queueTotalSize,t.byteLength-t.bytesFilled),a=t.bytesFilled+n,i=a-a%r;let l=n,s=!1;i>o&&(l=i-t.bytesFilled,s=!0);const u=e._queue;for(;l>0;){const r=u.peek(),o=Math.min(l,r.byteLength),n=t.byteOffset+t.bytesFilled;le(t.buffer,n,r.buffer,r.byteOffset,o),r.byteLength===o?u.shift():(r.byteOffset+=o,r.byteLength-=o),e._queueTotalSize-=o,ve(e,o,t),l-=o}return s}function ve(e,t,r){r.bytesFilled+=t}function Re(e){0===e._queueTotalSize&&e._closeRequested?(Ee(e),Jt(e._controlledReadableByteStream)):he(e)}function Te(e){null!==e._byobRequest&&(e._byobRequest._associatedReadableByteStreamController=void 0,e._byobRequest._view=null,e._byobRequest=null)}function qe(e){for(;e._pendingPullIntos.length>0;){if(0===e._queueTotalSize)return;const t=e._pendingPullIntos.peek();we(e,t)&&(Pe(e),pe(e._controlledReadableByteStream,t))}}function Ce(e,t){const r=e._pendingPullIntos.peek();Te(e);"closed"===e._controlledReadableByteStream._state?function(e,t){"none"===t.readerType&&Pe(e);const r=e._controlledReadableByteStream;if(Fe(r))for(;Le(r)>0;)pe(r,Pe(e))}(e,r):function(e,t,r){if(ve(0,t,r),"none"===r.readerType)return Se(e,r),void qe(e);if(r.bytesFilled0){const t=r.byteOffset+r.bytesFilled;ge(e,r.buffer,t-o,o)}r.bytesFilled-=o,pe(e._controlledReadableByteStream,r),qe(e)}(e,t,r),he(e)}function Pe(e){return e._pendingPullIntos.shift()}function Ee(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0}function We(e,t){const r=e._controlledReadableByteStream;"readable"===r._state&&(_e(e),de(e),Ee(e),Kt(r,t))}function Oe(e,t){const r=e._queue.shift();e._queueTotalSize-=r.byteLength,Re(e);const o=new Uint8Array(r.buffer,r.byteOffset,r.byteLength);t._chunkSteps(o)}function ke(e){const t=e._controlledReadableByteStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Be(e,t,r){const o=Object.create(ReadableByteStreamController.prototype);let n,a,i;n=void 0!==t.start?()=>t.start(o):()=>{},a=void 0!==t.pull?()=>t.pull(o):()=>d(void 0),i=void 0!==t.cancel?e=>t.cancel(e):()=>d(void 0);const l=t.autoAllocateChunkSize;if(0===l)throw new TypeError("autoAllocateChunkSize must be greater than 0");!function(e,t,r,o,n,a,i){t._controlledReadableByteStream=e,t._pullAgain=!1,t._pulling=!1,t._byobRequest=null,t._queue=t._queueTotalSize=void 0,de(t),t._closeRequested=!1,t._started=!1,t._strategyHWM=a,t._pullAlgorithm=o,t._cancelAlgorithm=n,t._autoAllocateChunkSize=i,t._pendingPullIntos=new v,e._readableStreamController=t,h(d(r()),(()=>(t._started=!0,he(t),null)),(e=>(We(t,e),null)))}(e,o,n,a,i,r,l)}function Ae(e){return new TypeError(`ReadableStreamBYOBRequest.prototype.${e} can only be used on a ReadableStreamBYOBRequest`)}function je(e){return new TypeError(`ReadableByteStreamController.prototype.${e} can only be used on a ReadableByteStreamController`)}function ze(e,t){e._reader._readIntoRequests.push(t)}function Le(e){return e._reader._readIntoRequests.length}function Fe(e){const t=e._reader;return void 0!==t&&!!De(t)}Object.defineProperties(ReadableByteStreamController.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},byobRequest:{enumerable:!0},desiredSize:{enumerable:!0}}),a(ReadableByteStreamController.prototype.close,"close"),a(ReadableByteStreamController.prototype.enqueue,"enqueue"),a(ReadableByteStreamController.prototype.error,"error"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableByteStreamController.prototype,t.toStringTag,{value:"ReadableByteStreamController",configurable:!0});class ReadableStreamBYOBReader{constructor(e){if(M(e,1,"ReadableStreamBYOBReader"),U(e,"First parameter"),Gt(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");if(!fe(e._readableStreamController))throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte source");E(this,e),this._readIntoRequests=new v}get closed(){return De(this)?this._closedPromise:f($e("closed"))}cancel(e){return De(this)?void 0===this._ownerReadableStream?f(k("cancel")):W(this,e):f($e("cancel"))}read(e){if(!De(this))return f($e("read"));if(!ArrayBuffer.isView(e))return f(new TypeError("view must be an array buffer view"));if(0===e.byteLength)return f(new TypeError("view must have non-zero byteLength"));if(0===e.buffer.byteLength)return f(new TypeError("view's buffer must have non-zero byteLength"));if(e.buffer,void 0===this._ownerReadableStream)return f(k("read from"));let t,r;const o=c(((e,o)=>{t=e,r=o}));return function(e,t,r){const o=e._ownerReadableStream;o._disturbed=!0,"errored"===o._state?r._errorSteps(o._storedError):function(e,t,r){const o=e._controlledReadableByteStream;let n=1;t.constructor!==DataView&&(n=t.constructor.BYTES_PER_ELEMENT);const a=t.constructor,i=t.buffer,l={buffer:i,bufferByteLength:i.byteLength,byteOffset:t.byteOffset,byteLength:t.byteLength,bytesFilled:0,elementSize:n,viewConstructor:a,readerType:"byob"};if(e._pendingPullIntos.length>0)return e._pendingPullIntos.push(l),void ze(o,r);if("closed"!==o._state){if(e._queueTotalSize>0){if(we(e,l)){const t=me(l);return Re(e),void r._chunkSteps(t)}if(e._closeRequested){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");return We(e,t),void r._errorSteps(t)}}e._pendingPullIntos.push(l),ze(o,r),he(e)}else{const e=new a(l.buffer,l.byteOffset,0);r._closeSteps(e)}}(o._readableStreamController,t,r)}(this,e,{_chunkSteps:e=>t({value:e,done:!1}),_closeSteps:e=>t({value:e,done:!0}),_errorSteps:e=>r(e)}),o}releaseLock(){if(!De(this))throw $e("releaseLock");void 0!==this._ownerReadableStream&&function(e){O(e);const t=new TypeError("Reader was released");Ie(e,t)}(this)}}function De(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readIntoRequests")&&e instanceof ReadableStreamBYOBReader)}function Ie(e,t){const r=e._readIntoRequests;e._readIntoRequests=new v,r.forEach((e=>{e._errorSteps(t)}))}function $e(e){return new TypeError(`ReadableStreamBYOBReader.prototype.${e} can only be used on a ReadableStreamBYOBReader`)}function Me(e,t){const{highWaterMark:r}=e;if(void 0===r)return t;if(ie(r)||r<0)throw new RangeError("Invalid highWaterMark");return r}function Ye(e){const{size:t}=e;return t||(()=>1)}function Qe(e,t){D(e,t);const r=null==e?void 0:e.highWaterMark,o=null==e?void 0:e.size;return{highWaterMark:void 0===r?void 0:Q(r),size:void 0===o?void 0:Ne(o,`${t} has member 'size' that`)}}function Ne(e,t){return I(e,t),t=>Q(e(t))}function xe(e,t,r){return I(e,r),r=>w(e,t,[r])}function He(e,t,r){return I(e,r),()=>w(e,t,[])}function Ve(e,t,r){return I(e,r),r=>S(e,t,[r])}function Ue(e,t,r){return I(e,r),(r,o)=>w(e,t,[r,o])}Object.defineProperties(ReadableStreamBYOBReader.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),a(ReadableStreamBYOBReader.prototype.cancel,"cancel"),a(ReadableStreamBYOBReader.prototype.read,"read"),a(ReadableStreamBYOBReader.prototype.releaseLock,"releaseLock"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStreamBYOBReader.prototype,t.toStringTag,{value:"ReadableStreamBYOBReader",configurable:!0});const Ge="function"==typeof AbortController;class WritableStream{constructor(e={},t={}){void 0===e?e=null:$(e,"First parameter");const r=Qe(t,"Second parameter"),o=function(e,t){D(e,t);const r=null==e?void 0:e.abort,o=null==e?void 0:e.close,n=null==e?void 0:e.start,a=null==e?void 0:e.type,i=null==e?void 0:e.write;return{abort:void 0===r?void 0:xe(r,e,`${t} has member 'abort' that`),close:void 0===o?void 0:He(o,e,`${t} has member 'close' that`),start:void 0===n?void 0:Ve(n,e,`${t} has member 'start' that`),write:void 0===i?void 0:Ue(i,e,`${t} has member 'write' that`),type:a}}(e,"First parameter");var n;(n=this)._state="writable",n._storedError=void 0,n._writer=void 0,n._writableStreamController=void 0,n._writeRequests=new v,n._inFlightWriteRequest=void 0,n._closeRequest=void 0,n._inFlightCloseRequest=void 0,n._pendingAbortRequest=void 0,n._backpressure=!1;if(void 0!==o.type)throw new RangeError("Invalid type is specified");const a=Ye(r);!function(e,t,r,o){const n=Object.create(WritableStreamDefaultController.prototype);let a,i,l,s;a=void 0!==t.start?()=>t.start(n):()=>{};i=void 0!==t.write?e=>t.write(e,n):()=>d(void 0);l=void 0!==t.close?()=>t.close():()=>d(void 0);s=void 0!==t.abort?e=>t.abort(e):()=>d(void 0);!function(e,t,r,o,n,a,i,l){t._controlledWritableStream=e,e._writableStreamController=t,t._queue=void 0,t._queueTotalSize=void 0,de(t),t._abortReason=void 0,t._abortController=function(){if(Ge)return new AbortController}(),t._started=!1,t._strategySizeAlgorithm=l,t._strategyHWM=i,t._writeAlgorithm=o,t._closeAlgorithm=n,t._abortAlgorithm=a;const s=ht(t);at(e,s);const u=r();h(d(u),(()=>(t._started=!0,ft(t),null)),(r=>(t._started=!0,et(e,r),null)))}(e,n,a,i,l,s,r,o)}(this,o,Me(r,1),a)}get locked(){if(!Xe(this))throw pt("locked");return Je(this)}abort(e){return Xe(this)?Je(this)?f(new TypeError("Cannot abort a stream that already has a writer")):Ke(this,e):f(pt("abort"))}close(){return Xe(this)?Je(this)?f(new TypeError("Cannot close a stream that already has a writer")):ot(this)?f(new TypeError("Cannot close an already-closing stream")):Ze(this):f(pt("close"))}getWriter(){if(!Xe(this))throw pt("getWriter");return new WritableStreamDefaultWriter(this)}}function Xe(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_writableStreamController")&&e instanceof WritableStream)}function Je(e){return void 0!==e._writer}function Ke(e,t){var r;if("closed"===e._state||"errored"===e._state)return d(void 0);e._writableStreamController._abortReason=t,null===(r=e._writableStreamController._abortController)||void 0===r||r.abort(t);const o=e._state;if("closed"===o||"errored"===o)return d(void 0);if(void 0!==e._pendingAbortRequest)return e._pendingAbortRequest._promise;let n=!1;"erroring"===o&&(n=!0,t=void 0);const a=c(((r,o)=>{e._pendingAbortRequest={_promise:void 0,_resolve:r,_reject:o,_reason:t,_wasAlreadyErroring:n}}));return e._pendingAbortRequest._promise=a,n||tt(e,t),a}function Ze(e){const t=e._state;if("closed"===t||"errored"===t)return f(new TypeError(`The stream (in ${t} state) is not in the writable state and cannot be closed`));const r=c(((t,r)=>{const o={_resolve:t,_reject:r};e._closeRequest=o})),o=e._writer;var n;return void 0!==o&&e._backpressure&&"writable"===t&&Et(o),ce(n=e._writableStreamController,st,0),ft(n),r}function et(e,t){"writable"!==e._state?rt(e):tt(e,t)}function tt(e,t){const r=e._writableStreamController;e._state="erroring",e._storedError=t;const o=e._writer;void 0!==o&<(o,t),!function(e){if(void 0===e._inFlightWriteRequest&&void 0===e._inFlightCloseRequest)return!1;return!0}(e)&&r._started&&rt(e)}function rt(e){e._state="errored",e._writableStreamController[T]();const t=e._storedError;if(e._writeRequests.forEach((e=>{e._reject(t)})),e._writeRequests=new v,void 0===e._pendingAbortRequest)return void nt(e);const r=e._pendingAbortRequest;if(e._pendingAbortRequest=void 0,r._wasAlreadyErroring)return r._reject(t),void nt(e);h(e._writableStreamController[R](r._reason),(()=>(r._resolve(),nt(e),null)),(t=>(r._reject(t),nt(e),null)))}function ot(e){return void 0!==e._closeRequest||void 0!==e._inFlightCloseRequest}function nt(e){void 0!==e._closeRequest&&(e._closeRequest._reject(e._storedError),e._closeRequest=void 0);const t=e._writer;void 0!==t&&vt(t,e._storedError)}function at(e,t){const r=e._writer;void 0!==r&&t!==e._backpressure&&(t?function(e){Tt(e)}(r):Et(r)),e._backpressure=t}Object.defineProperties(WritableStream.prototype,{abort:{enumerable:!0},close:{enumerable:!0},getWriter:{enumerable:!0},locked:{enumerable:!0}}),a(WritableStream.prototype.abort,"abort"),a(WritableStream.prototype.close,"close"),a(WritableStream.prototype.getWriter,"getWriter"),"symbol"==typeof t.toStringTag&&Object.defineProperty(WritableStream.prototype,t.toStringTag,{value:"WritableStream",configurable:!0});class WritableStreamDefaultWriter{constructor(e){if(M(e,1,"WritableStreamDefaultWriter"),function(e,t){if(!Xe(e))throw new TypeError(`${t} is not a WritableStream.`)}(e,"First parameter"),Je(e))throw new TypeError("This stream has already been locked for exclusive writing by another writer");this._ownerWritableStream=e,e._writer=this;const t=e._state;if("writable"===t)!ot(e)&&e._backpressure?Tt(this):Ct(this),St(this);else if("erroring"===t)qt(this,e._storedError),St(this);else if("closed"===t)Ct(this),St(r=this),Rt(r);else{const t=e._storedError;qt(this,t),wt(this,t)}var r}get closed(){return it(this)?this._closedPromise:f(yt("closed"))}get desiredSize(){if(!it(this))throw yt("desiredSize");if(void 0===this._ownerWritableStream)throw gt("desiredSize");return function(e){const t=e._ownerWritableStream,r=t._state;if("errored"===r||"erroring"===r)return null;if("closed"===r)return 0;return dt(t._writableStreamController)}(this)}get ready(){return it(this)?this._readyPromise:f(yt("ready"))}abort(e){return it(this)?void 0===this._ownerWritableStream?f(gt("abort")):function(e,t){return Ke(e._ownerWritableStream,t)}(this,e):f(yt("abort"))}close(){if(!it(this))return f(yt("close"));const e=this._ownerWritableStream;return void 0===e?f(gt("close")):ot(e)?f(new TypeError("Cannot close an already-closing stream")):Ze(this._ownerWritableStream)}releaseLock(){if(!it(this))throw yt("releaseLock");void 0!==this._ownerWritableStream&&function(e){const t=e._ownerWritableStream,r=new TypeError("Writer was released and can no longer be used to monitor the stream's closedness");lt(e,r),function(e,t){"pending"===e._closedPromiseState?vt(e,t):function(e,t){wt(e,t)}(e,t)}(e,r),t._writer=void 0,e._ownerWritableStream=void 0}(this)}write(e){return it(this)?void 0===this._ownerWritableStream?f(gt("write to")):function(e,t){const r=e._ownerWritableStream,o=r._writableStreamController,n=function(e,t){try{return e._strategySizeAlgorithm(t)}catch(t){return bt(e,t),1}}(o,t);if(r!==e._ownerWritableStream)return f(gt("write to"));const a=r._state;if("errored"===a)return f(r._storedError);if(ot(r)||"closed"===a)return f(new TypeError("The stream is closing or closed and cannot be written to"));if("erroring"===a)return f(r._storedError);const i=function(e){return c(((t,r)=>{const o={_resolve:t,_reject:r};e._writeRequests.push(o)}))}(r);return function(e,t,r){try{ce(e,t,r)}catch(t){return void bt(e,t)}const o=e._controlledWritableStream;if(!ot(o)&&"writable"===o._state){at(o,ht(e))}ft(e)}(o,t,n),i}(this,e):f(yt("write"))}}function it(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_ownerWritableStream")&&e instanceof WritableStreamDefaultWriter)}function lt(e,t){"pending"===e._readyPromiseState?Pt(e,t):function(e,t){qt(e,t)}(e,t)}Object.defineProperties(WritableStreamDefaultWriter.prototype,{abort:{enumerable:!0},close:{enumerable:!0},releaseLock:{enumerable:!0},write:{enumerable:!0},closed:{enumerable:!0},desiredSize:{enumerable:!0},ready:{enumerable:!0}}),a(WritableStreamDefaultWriter.prototype.abort,"abort"),a(WritableStreamDefaultWriter.prototype.close,"close"),a(WritableStreamDefaultWriter.prototype.releaseLock,"releaseLock"),a(WritableStreamDefaultWriter.prototype.write,"write"),"symbol"==typeof t.toStringTag&&Object.defineProperty(WritableStreamDefaultWriter.prototype,t.toStringTag,{value:"WritableStreamDefaultWriter",configurable:!0});const st={};class WritableStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get abortReason(){if(!ut(this))throw mt("abortReason");return this._abortReason}get signal(){if(!ut(this))throw mt("signal");if(void 0===this._abortController)throw new TypeError("WritableStreamDefaultController.prototype.signal is not supported");return this._abortController.signal}error(e){if(!ut(this))throw mt("error");"writable"===this._controlledWritableStream._state&&_t(this,e)}[R](e){const t=this._abortAlgorithm(e);return ct(this),t}[T](){de(this)}}function ut(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledWritableStream")&&e instanceof WritableStreamDefaultController)}function ct(e){e._writeAlgorithm=void 0,e._closeAlgorithm=void 0,e._abortAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function dt(e){return e._strategyHWM-e._queueTotalSize}function ft(e){const t=e._controlledWritableStream;if(!e._started)return;if(void 0!==t._inFlightWriteRequest)return;if("erroring"===t._state)return void rt(t);if(0===e._queue.length)return;const r=e._queue.peek().value;r===st?function(e){const t=e._controlledWritableStream;(function(e){e._inFlightCloseRequest=e._closeRequest,e._closeRequest=void 0})(t),ue(e);const r=e._closeAlgorithm();ct(e),h(r,(()=>(function(e){e._inFlightCloseRequest._resolve(void 0),e._inFlightCloseRequest=void 0,"erroring"===e._state&&(e._storedError=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._resolve(),e._pendingAbortRequest=void 0)),e._state="closed";const t=e._writer;void 0!==t&&Rt(t)}(t),null)),(e=>(function(e,t){e._inFlightCloseRequest._reject(t),e._inFlightCloseRequest=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._reject(t),e._pendingAbortRequest=void 0),et(e,t)}(t,e),null)))}(e):function(e,t){const r=e._controlledWritableStream;!function(e){e._inFlightWriteRequest=e._writeRequests.shift()}(r);h(e._writeAlgorithm(t),(()=>{!function(e){e._inFlightWriteRequest._resolve(void 0),e._inFlightWriteRequest=void 0}(r);const t=r._state;if(ue(e),!ot(r)&&"writable"===t){const t=ht(e);at(r,t)}return ft(e),null}),(t=>("writable"===r._state&&ct(e),function(e,t){e._inFlightWriteRequest._reject(t),e._inFlightWriteRequest=void 0,et(e,t)}(r,t),null)))}(e,r)}function bt(e,t){"writable"===e._controlledWritableStream._state&&_t(e,t)}function ht(e){return dt(e)<=0}function _t(e,t){const r=e._controlledWritableStream;ct(e),tt(r,t)}function pt(e){return new TypeError(`WritableStream.prototype.${e} can only be used on a WritableStream`)}function mt(e){return new TypeError(`WritableStreamDefaultController.prototype.${e} can only be used on a WritableStreamDefaultController`)}function yt(e){return new TypeError(`WritableStreamDefaultWriter.prototype.${e} can only be used on a WritableStreamDefaultWriter`)}function gt(e){return new TypeError("Cannot "+e+" a stream using a released writer")}function St(e){e._closedPromise=c(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r,e._closedPromiseState="pending"}))}function wt(e,t){St(e),vt(e,t)}function vt(e,t){void 0!==e._closedPromise_reject&&(y(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="rejected")}function Rt(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="resolved")}function Tt(e){e._readyPromise=c(((t,r)=>{e._readyPromise_resolve=t,e._readyPromise_reject=r})),e._readyPromiseState="pending"}function qt(e,t){Tt(e),Pt(e,t)}function Ct(e){Tt(e),Et(e)}function Pt(e,t){void 0!==e._readyPromise_reject&&(y(e._readyPromise),e._readyPromise_reject(t),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="rejected")}function Et(e){void 0!==e._readyPromise_resolve&&(e._readyPromise_resolve(void 0),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="fulfilled")}Object.defineProperties(WritableStreamDefaultController.prototype,{abortReason:{enumerable:!0},signal:{enumerable:!0},error:{enumerable:!0}}),"symbol"==typeof t.toStringTag&&Object.defineProperty(WritableStreamDefaultController.prototype,t.toStringTag,{value:"WritableStreamDefaultController",configurable:!0});const Wt="undefined"!=typeof DOMException?DOMException:void 0;const Ot=function(e){if("function"!=typeof e&&"object"!=typeof e)return!1;try{return new e,!0}catch(e){return!1}}(Wt)?Wt:function(){const e=function(e,t){this.message=e||"",this.name=t||"Error",Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)};return e.prototype=Object.create(Error.prototype),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,configurable:!0}),e}();function kt(e,t,r,o,n,a){const i=e.getReader(),l=t.getWriter();Ut(e)&&(e._disturbed=!0);let s,u,p,S=!1,w=!1,v="readable",R="writable",T=!1,q=!1;const C=c((e=>{p=e}));let P=Promise.resolve(void 0);return c(((E,W)=>{let O;function k(){if(S)return;const e=c(((e,t)=>{!function r(o){o?e():b(function(){if(S)return d(!0);return b(l.ready,(()=>b(i.read(),(e=>!!e.done||(P=l.write(e.value),y(P),!1)))))}(),r,t)}(!1)}));y(e)}function B(){return v="closed",r?L():z((()=>(Xe(t)&&(T=ot(t),R=t._state),T||"closed"===R?d(void 0):"erroring"===R||"errored"===R?f(u):(T=!0,l.close()))),!1,void 0),null}function A(e){return S||(v="errored",s=e,o?L(!0,e):z((()=>l.abort(e)),!0,e)),null}function j(e){return w||(R="errored",u=e,n?L(!0,e):z((()=>i.cancel(e)),!0,e)),null}if(void 0!==a&&(O=()=>{const e=void 0!==a.reason?a.reason:new Ot("Aborted","AbortError"),t=[];o||t.push((()=>"writable"===R?l.abort(e):d(void 0))),n||t.push((()=>"readable"===v?i.cancel(e):d(void 0))),z((()=>Promise.all(t.map((e=>e())))),!0,e)},a.aborted?O():a.addEventListener("abort",O)),Ut(e)&&(v=e._state,s=e._storedError),Xe(t)&&(R=t._state,u=t._storedError,T=ot(t)),Ut(e)&&Xe(t)&&(q=!0,p()),"errored"===v)A(s);else if("erroring"===R||"errored"===R)j(u);else if("closed"===v)B();else if(T||"closed"===R){const e=new TypeError("the destination writable stream closed before all data could be piped to it");n?L(!0,e):z((()=>i.cancel(e)),!0,e)}function z(e,t,r){function o(){return"writable"!==R||T?n():_(function(){let e;return d(function t(){if(e!==P)return e=P,m(P,t,t)}())}(),n),null}function n(){return e?h(e(),(()=>F(t,r)),(e=>F(!0,e))):F(t,r),null}S||(S=!0,q?o():_(C,o))}function L(e,t){z(void 0,e,t)}function F(e,t){return w=!0,l.releaseLock(),i.releaseLock(),void 0!==a&&a.removeEventListener("abort",O),e?W(t):E(void 0),null}S||(h(i.closed,B,A),h(l.closed,(function(){return w||(R="closed"),null}),j)),q?k():g((()=>{q=!0,p(),k()}))}))}function Bt(e,t){return function(e){try{return e.getReader({mode:"byob"}).releaseLock(),!0}catch(e){return!1}}(e)?function(e){let t,r,o,n,a,i=e.getReader(),l=!1,s=!1,u=!1,f=!1,b=!1,_=!1;const m=c((e=>{a=e}));function y(e){p(e.closed,(t=>(e!==i||(o.error(t),n.error(t),b&&_||a(void 0)),null)))}function g(){l&&(i.releaseLock(),i=e.getReader(),y(i),l=!1),h(i.read(),(e=>{var t,r;if(u=!1,f=!1,e.done)return b||o.close(),_||n.close(),null===(t=o.byobRequest)||void 0===t||t.respond(0),null===(r=n.byobRequest)||void 0===r||r.respond(0),b&&_||a(void 0),null;const l=e.value,c=l;let d=l;if(!b&&!_)try{d=se(l)}catch(e){return o.error(e),n.error(e),a(i.cancel(e)),null}return b||o.enqueue(c),_||n.enqueue(d),s=!1,u?w():f&&v(),null}),(()=>(s=!1,null)))}function S(t,r){l||(i.releaseLock(),i=e.getReader({mode:"byob"}),y(i),l=!0);const c=r?n:o,d=r?o:n;h(i.read(t),(e=>{var t;u=!1,f=!1;const o=r?_:b,n=r?b:_;if(e.done){o||c.close(),n||d.close();const r=e.value;return void 0!==r&&(o||c.byobRequest.respondWithNewView(r),n||null===(t=d.byobRequest)||void 0===t||t.respond(0)),o&&n||a(void 0),null}const l=e.value;if(n)o||c.byobRequest.respondWithNewView(l);else{let e;try{e=se(l)}catch(e){return c.error(e),d.error(e),a(i.cancel(e)),null}o||c.byobRequest.respondWithNewView(l),d.enqueue(e)}return s=!1,u?w():f&&v(),null}),(()=>(s=!1,null)))}function w(){if(s)return u=!0,d(void 0);s=!0;const e=o.byobRequest;return null===e?g():S(e.view,!1),d(void 0)}function v(){if(s)return f=!0,d(void 0);s=!0;const e=n.byobRequest;return null===e?g():S(e.view,!0),d(void 0)}function R(e){if(b=!0,t=e,_){const e=[t,r],o=i.cancel(e);a(o)}return m}function T(e){if(_=!0,r=e,b){const e=[t,r],o=i.cancel(e);a(o)}return m}const q=new ReadableStream({type:"bytes",start(e){o=e},pull:w,cancel:R}),C=new ReadableStream({type:"bytes",start(e){n=e},pull:v,cancel:T});return y(i),[q,C]}(e):function(e,t){const r=e.getReader();let o,n,a,i,l,s=!1,u=!1,f=!1,b=!1;const _=c((e=>{l=e}));function m(){return s?(u=!0,d(void 0)):(s=!0,h(r.read(),(e=>{if(u=!1,e.done)return f||a.close(),b||i.close(),f&&b||l(void 0),null;const t=e.value,r=t,o=t;return f||a.enqueue(r),b||i.enqueue(o),s=!1,u&&m(),null}),(()=>(s=!1,null))),d(void 0))}function y(e){if(f=!0,o=e,b){const e=[o,n],t=r.cancel(e);l(t)}return _}function g(e){if(b=!0,n=e,f){const e=[o,n],t=r.cancel(e);l(t)}return _}const S=new ReadableStream({start(e){a=e},pull:m,cancel:y}),w=new ReadableStream({start(e){i=e},pull:m,cancel:g});return p(r.closed,(e=>(a.error(e),i.error(e),f&&b||l(void 0),null))),[S,w]}(e)}class ReadableStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!At(this))throw $t("desiredSize");return Ft(this)}close(){if(!At(this))throw $t("close");if(!Dt(this))throw new TypeError("The stream is not in a state that permits close");!function(e){if(!Dt(e))return;const t=e._controlledReadableStream;e._closeRequested=!0,0===e._queue.length&&(zt(e),Jt(t))}(this)}enqueue(e){if(!At(this))throw $t("enqueue");if(!Dt(this))throw new TypeError("The stream is not in a state that permits enqueue");return function(e,t){if(!Dt(e))return;const r=e._controlledReadableStream;if(Gt(r)&&J(r)>0)X(r,t,!1);else{let r;try{r=e._strategySizeAlgorithm(t)}catch(t){throw Lt(e,t),t}try{ce(e,t,r)}catch(t){throw Lt(e,t),t}}jt(e)}(this,e)}error(e){if(!At(this))throw $t("error");Lt(this,e)}[q](e){de(this);const t=this._cancelAlgorithm(e);return zt(this),t}[C](e){const t=this._controlledReadableStream;if(this._queue.length>0){const r=ue(this);this._closeRequested&&0===this._queue.length?(zt(this),Jt(t)):jt(this),e._chunkSteps(r)}else G(t,e),jt(this)}[P](){}}function At(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableStream")&&e instanceof ReadableStreamDefaultController)}function jt(e){const t=function(e){const t=e._controlledReadableStream;if(!Dt(e))return!1;if(!e._started)return!1;if(Gt(t)&&J(t)>0)return!0;if(Ft(e)>0)return!0;return!1}(e);if(!t)return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;h(e._pullAlgorithm(),(()=>(e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,jt(e)),null)),(t=>(Lt(e,t),null)))}function zt(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function Lt(e,t){const r=e._controlledReadableStream;"readable"===r._state&&(de(e),zt(e),Kt(r,t))}function Ft(e){const t=e._controlledReadableStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Dt(e){return!e._closeRequested&&"readable"===e._controlledReadableStream._state}function It(e,t,r,o){const n=Object.create(ReadableStreamDefaultController.prototype);let a,i,l;a=void 0!==t.start?()=>t.start(n):()=>{},i=void 0!==t.pull?()=>t.pull(n):()=>d(void 0),l=void 0!==t.cancel?e=>t.cancel(e):()=>d(void 0),function(e,t,r,o,n,a,i){t._controlledReadableStream=e,t._queue=void 0,t._queueTotalSize=void 0,de(t),t._started=!1,t._closeRequested=!1,t._pullAgain=!1,t._pulling=!1,t._strategySizeAlgorithm=i,t._strategyHWM=a,t._pullAlgorithm=o,t._cancelAlgorithm=n,e._readableStreamController=t,h(d(r()),(()=>(t._started=!0,jt(t),null)),(e=>(Lt(t,e),null)))}(e,n,a,i,l,r,o)}function $t(e){return new TypeError(`ReadableStreamDefaultController.prototype.${e} can only be used on a ReadableStreamDefaultController`)}function Mt(e,t,r){return I(e,r),r=>w(e,t,[r])}function Yt(e,t,r){return I(e,r),r=>w(e,t,[r])}function Qt(e,t,r){return I(e,r),r=>S(e,t,[r])}function Nt(e,t){if("bytes"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamType`);return e}function xt(e,t){if("byob"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamReaderMode`);return e}function Ht(e,t){D(e,t);const r=null==e?void 0:e.preventAbort,o=null==e?void 0:e.preventCancel,n=null==e?void 0:e.preventClose,a=null==e?void 0:e.signal;return void 0!==a&&function(e,t){if(!function(e){if("object"!=typeof e||null===e)return!1;try{return"boolean"==typeof e.aborted}catch(e){return!1}}(e))throw new TypeError(`${t} is not an AbortSignal.`)}(a,`${t} has member 'signal' that`),{preventAbort:Boolean(r),preventCancel:Boolean(o),preventClose:Boolean(n),signal:a}}function Vt(e,t){D(e,t);const r=null==e?void 0:e.readable;Y(r,"readable","ReadableWritablePair"),function(e,t){if(!H(e))throw new TypeError(`${t} is not a ReadableStream.`)}(r,`${t} has member 'readable' that`);const o=null==e?void 0:e.writable;return Y(o,"writable","ReadableWritablePair"),function(e,t){if(!V(e))throw new TypeError(`${t} is not a WritableStream.`)}(o,`${t} has member 'writable' that`),{readable:r,writable:o}}Object.defineProperties(ReadableStreamDefaultController.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},desiredSize:{enumerable:!0}}),a(ReadableStreamDefaultController.prototype.close,"close"),a(ReadableStreamDefaultController.prototype.enqueue,"enqueue"),a(ReadableStreamDefaultController.prototype.error,"error"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStreamDefaultController.prototype,t.toStringTag,{value:"ReadableStreamDefaultController",configurable:!0});class ReadableStream{constructor(e={},t={}){void 0===e?e=null:$(e,"First parameter");const r=Qe(t,"Second parameter"),o=function(e,t){D(e,t);const r=e,o=null==r?void 0:r.autoAllocateChunkSize,n=null==r?void 0:r.cancel,a=null==r?void 0:r.pull,i=null==r?void 0:r.start,l=null==r?void 0:r.type;return{autoAllocateChunkSize:void 0===o?void 0:x(o,`${t} has member 'autoAllocateChunkSize' that`),cancel:void 0===n?void 0:Mt(n,r,`${t} has member 'cancel' that`),pull:void 0===a?void 0:Yt(a,r,`${t} has member 'pull' that`),start:void 0===i?void 0:Qt(i,r,`${t} has member 'start' that`),type:void 0===l?void 0:Nt(l,`${t} has member 'type' that`)}}(e,"First parameter");var n;if((n=this)._state="readable",n._reader=void 0,n._storedError=void 0,n._disturbed=!1,"bytes"===o.type){if(void 0!==r.size)throw new RangeError("The strategy for a byte stream cannot have a size function");Be(this,o,Me(r,0))}else{const e=Ye(r);It(this,o,Me(r,1),e)}}get locked(){if(!Ut(this))throw Zt("locked");return Gt(this)}cancel(e){return Ut(this)?Gt(this)?f(new TypeError("Cannot cancel a stream that already has a reader")):Xt(this,e):f(Zt("cancel"))}getReader(e){if(!Ut(this))throw Zt("getReader");return void 0===function(e,t){D(e,t);const r=null==e?void 0:e.mode;return{mode:void 0===r?void 0:xt(r,`${t} has member 'mode' that`)}}(e,"First parameter").mode?new ReadableStreamDefaultReader(this):function(e){return new ReadableStreamBYOBReader(e)}(this)}pipeThrough(e,t={}){if(!H(this))throw Zt("pipeThrough");M(e,1,"pipeThrough");const r=Vt(e,"First parameter"),o=Ht(t,"Second parameter");if(this.locked)throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream");if(r.writable.locked)throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream");return y(kt(this,r.writable,o.preventClose,o.preventAbort,o.preventCancel,o.signal)),r.readable}pipeTo(e,t={}){if(!H(this))return f(Zt("pipeTo"));if(void 0===e)return f("Parameter 1 is required in 'pipeTo'.");if(!V(e))return f(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream"));let r;try{r=Ht(t,"Second parameter")}catch(e){return f(e)}return this.locked?f(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream")):e.locked?f(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream")):kt(this,e,r.preventClose,r.preventAbort,r.preventCancel,r.signal)}tee(){if(!H(this))throw Zt("tee");if(this.locked)throw new TypeError("Cannot tee a stream that already has a reader");return Bt(this)}values(e){if(!H(this))throw Zt("values");return function(e,t){const r=e.getReader(),o=new re(r,t),n=Object.create(oe);return n._asyncIteratorImpl=o,n}(this,function(e,t){D(e,t);const r=null==e?void 0:e.preventCancel;return{preventCancel:Boolean(r)}}(e,"First parameter").preventCancel)}}function Ut(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readableStreamController")&&e instanceof ReadableStream)}function Gt(e){return void 0!==e._reader}function Xt(e,t){if(e._disturbed=!0,"closed"===e._state)return d(void 0);if("errored"===e._state)return f(e._storedError);Jt(e);const o=e._reader;if(void 0!==o&&De(o)){const e=o._readIntoRequests;o._readIntoRequests=new v,e.forEach((e=>{e._closeSteps(void 0)}))}return m(e._readableStreamController[q](t),r)}function Jt(e){e._state="closed";const t=e._reader;if(void 0!==t&&(z(t),Z(t))){const e=t._readRequests;t._readRequests=new v,e.forEach((e=>{e._closeSteps()}))}}function Kt(e,t){e._state="errored",e._storedError=t;const r=e._reader;void 0!==r&&(j(r,t),Z(r)?ee(r,t):Ie(r,t))}function Zt(e){return new TypeError(`ReadableStream.prototype.${e} can only be used on a ReadableStream`)}function er(e,t){D(e,t);const r=null==e?void 0:e.highWaterMark;return Y(r,"highWaterMark","QueuingStrategyInit"),{highWaterMark:Q(r)}}Object.defineProperties(ReadableStream.prototype,{cancel:{enumerable:!0},getReader:{enumerable:!0},pipeThrough:{enumerable:!0},pipeTo:{enumerable:!0},tee:{enumerable:!0},values:{enumerable:!0},locked:{enumerable:!0}}),a(ReadableStream.prototype.cancel,"cancel"),a(ReadableStream.prototype.getReader,"getReader"),a(ReadableStream.prototype.pipeThrough,"pipeThrough"),a(ReadableStream.prototype.pipeTo,"pipeTo"),a(ReadableStream.prototype.tee,"tee"),a(ReadableStream.prototype.values,"values"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStream.prototype,t.toStringTag,{value:"ReadableStream",configurable:!0}),"symbol"==typeof t.asyncIterator&&Object.defineProperty(ReadableStream.prototype,t.asyncIterator,{value:ReadableStream.prototype.values,writable:!0,configurable:!0});const tr=e=>e.byteLength;a(tr,"size");class ByteLengthQueuingStrategy{constructor(e){M(e,1,"ByteLengthQueuingStrategy"),e=er(e,"First parameter"),this._byteLengthQueuingStrategyHighWaterMark=e.highWaterMark}get highWaterMark(){if(!or(this))throw rr("highWaterMark");return this._byteLengthQueuingStrategyHighWaterMark}get size(){if(!or(this))throw rr("size");return tr}}function rr(e){return new TypeError(`ByteLengthQueuingStrategy.prototype.${e} can only be used on a ByteLengthQueuingStrategy`)}function or(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_byteLengthQueuingStrategyHighWaterMark")&&e instanceof ByteLengthQueuingStrategy)}Object.defineProperties(ByteLengthQueuingStrategy.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof t.toStringTag&&Object.defineProperty(ByteLengthQueuingStrategy.prototype,t.toStringTag,{value:"ByteLengthQueuingStrategy",configurable:!0});const nr=()=>1;a(nr,"size");class CountQueuingStrategy{constructor(e){M(e,1,"CountQueuingStrategy"),e=er(e,"First parameter"),this._countQueuingStrategyHighWaterMark=e.highWaterMark}get highWaterMark(){if(!ir(this))throw ar("highWaterMark");return this._countQueuingStrategyHighWaterMark}get size(){if(!ir(this))throw ar("size");return nr}}function ar(e){return new TypeError(`CountQueuingStrategy.prototype.${e} can only be used on a CountQueuingStrategy`)}function ir(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_countQueuingStrategyHighWaterMark")&&e instanceof CountQueuingStrategy)}function lr(e,t,r){return I(e,r),r=>w(e,t,[r])}function sr(e,t,r){return I(e,r),r=>S(e,t,[r])}function ur(e,t,r){return I(e,r),(r,o)=>w(e,t,[r,o])}Object.defineProperties(CountQueuingStrategy.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof t.toStringTag&&Object.defineProperty(CountQueuingStrategy.prototype,t.toStringTag,{value:"CountQueuingStrategy",configurable:!0});class TransformStream{constructor(e={},t={},r={}){void 0===e&&(e=null);const o=Qe(t,"Second parameter"),n=Qe(r,"Third parameter"),a=function(e,t){D(e,t);const r=null==e?void 0:e.flush,o=null==e?void 0:e.readableType,n=null==e?void 0:e.start,a=null==e?void 0:e.transform,i=null==e?void 0:e.writableType;return{flush:void 0===r?void 0:lr(r,e,`${t} has member 'flush' that`),readableType:o,start:void 0===n?void 0:sr(n,e,`${t} has member 'start' that`),transform:void 0===a?void 0:ur(a,e,`${t} has member 'transform' that`),writableType:i}}(e,"First parameter");if(void 0!==a.readableType)throw new RangeError("Invalid readableType specified");if(void 0!==a.writableType)throw new RangeError("Invalid writableType specified");const i=Me(n,0),l=Ye(n),s=Me(o,1),u=Ye(o);let b;!function(e,t,r,o,n,a){function i(){return t}function l(t){return function(e,t){const r=e._transformStreamController;if(e._backpressure){return m(e._backpressureChangePromise,(()=>{if("erroring"===(Xe(e._writable)?e._writable._state:e._writableState))throw Xe(e._writable)?e._writable._storedError:e._writableStoredError;return mr(r,t)}))}return mr(r,t)}(e,t)}function s(t){return function(e,t){return dr(e,t),d(void 0)}(e,t)}function u(){return function(e){const t=e._transformStreamController,r=t._flushAlgorithm();return _r(t),m(r,(()=>{if("errored"===e._readableState)throw e._readableStoredError;Sr(e)&&wr(e)}),(t=>{throw dr(e,t),e._readableStoredError}))}(e)}function c(){return function(e){return br(e,!1),e._backpressureChangePromise}(e)}function f(t){return fr(e,t),d(void 0)}e._writableState="writable",e._writableStoredError=void 0,e._writableHasInFlightOperation=!1,e._writableStarted=!1,e._writable=function(e,t,r,o,n,a,i){return new WritableStream({start(r){e._writableController=r;try{const t=r.signal;void 0!==t&&t.addEventListener("abort",(()=>{"writable"===e._writableState&&(e._writableState="erroring",t.reason&&(e._writableStoredError=t.reason))}))}catch(e){}return m(t(),(()=>(e._writableStarted=!0,Pr(e),null)),(t=>{throw e._writableStarted=!0,Tr(e,t),t}))},write:t=>(function(e){e._writableHasInFlightOperation=!0}(e),m(r(t),(()=>(function(e){e._writableHasInFlightOperation=!1}(e),Pr(e),null)),(t=>{throw function(e,t){e._writableHasInFlightOperation=!1,Tr(e,t)}(e,t),t}))),close:()=>(function(e){e._writableHasInFlightOperation=!0}(e),m(o(),(()=>(function(e){e._writableHasInFlightOperation=!1;"erroring"===e._writableState&&(e._writableStoredError=void 0);e._writableState="closed"}(e),null)),(t=>{throw function(e,t){e._writableHasInFlightOperation=!1,e._writableState,Tr(e,t)}(e,t),t}))),abort:t=>(e._writableState="errored",e._writableStoredError=t,n(t))},{highWaterMark:a,size:i})}(e,i,l,u,s,r,o),e._readableState="readable",e._readableStoredError=void 0,e._readableCloseRequested=!1,e._readablePulling=!1,e._readable=function(e,t,r,o,n,a){return new ReadableStream({start:r=>(e._readableController=r,t().catch((t=>{vr(e,t)}))),pull:()=>(e._readablePulling=!0,r().catch((t=>{vr(e,t)}))),cancel:t=>(e._readableState="closed",o(t))},{highWaterMark:n,size:a})}(e,i,c,f,n,a),e._backpressure=void 0,e._backpressureChangePromise=void 0,e._backpressureChangePromise_resolve=void 0,br(e,!0),e._transformStreamController=void 0}(this,c((e=>{b=e})),s,u,i,l),function(e,t){const r=Object.create(TransformStreamDefaultController.prototype);let o,n;o=void 0!==t.transform?e=>t.transform(e,r):e=>{try{return pr(r,e),d(void 0)}catch(e){return f(e)}};n=void 0!==t.flush?()=>t.flush(r):()=>d(void 0);!function(e,t,r,o){t._controlledTransformStream=e,e._transformStreamController=t,t._transformAlgorithm=r,t._flushAlgorithm=o}(e,r,o,n)}(this,a),void 0!==a.start?b(a.start(this._transformStreamController)):b(void 0)}get readable(){if(!cr(this))throw gr("readable");return this._readable}get writable(){if(!cr(this))throw gr("writable");return this._writable}}function cr(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_transformStreamController")&&e instanceof TransformStream)}function dr(e,t){vr(e,t),fr(e,t)}function fr(e,t){_r(e._transformStreamController),function(e,t){e._writableController.error(t);"writable"===e._writableState&&qr(e,t)}(e,t),e._backpressure&&br(e,!1)}function br(e,t){void 0!==e._backpressureChangePromise&&e._backpressureChangePromise_resolve(),e._backpressureChangePromise=c((t=>{e._backpressureChangePromise_resolve=t})),e._backpressure=t}Object.defineProperties(TransformStream.prototype,{readable:{enumerable:!0},writable:{enumerable:!0}}),"symbol"==typeof t.toStringTag&&Object.defineProperty(TransformStream.prototype,t.toStringTag,{value:"TransformStream",configurable:!0});class TransformStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!hr(this))throw yr("desiredSize");return Rr(this._controlledTransformStream)}enqueue(e){if(!hr(this))throw yr("enqueue");pr(this,e)}error(e){if(!hr(this))throw yr("error");var t;t=e,dr(this._controlledTransformStream,t)}terminate(){if(!hr(this))throw yr("terminate");!function(e){const t=e._controlledTransformStream;Sr(t)&&wr(t);const r=new TypeError("TransformStream terminated");fr(t,r)}(this)}}function hr(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledTransformStream")&&e instanceof TransformStreamDefaultController)}function _r(e){e._transformAlgorithm=void 0,e._flushAlgorithm=void 0}function pr(e,t){const r=e._controlledTransformStream;if(!Sr(r))throw new TypeError("Readable side is not in a state that permits enqueue");try{!function(e,t){e._readablePulling=!1;try{e._readableController.enqueue(t)}catch(t){throw vr(e,t),t}}(r,t)}catch(e){throw fr(r,e),r._readableStoredError}const o=function(e){return!function(e){if(!Sr(e))return!1;if(e._readablePulling)return!0;if(Rr(e)>0)return!0;return!1}(e)}(r);o!==r._backpressure&&br(r,!0)}function mr(e,t){return m(e._transformAlgorithm(t),void 0,(t=>{throw dr(e._controlledTransformStream,t),t}))}function yr(e){return new TypeError(`TransformStreamDefaultController.prototype.${e} can only be used on a TransformStreamDefaultController`)}function gr(e){return new TypeError(`TransformStream.prototype.${e} can only be used on a TransformStream`)}function Sr(e){return!e._readableCloseRequested&&"readable"===e._readableState}function wr(e){e._readableState="closed",e._readableCloseRequested=!0,e._readableController.close()}function vr(e,t){"readable"===e._readableState&&(e._readableState="errored",e._readableStoredError=t),e._readableController.error(t)}function Rr(e){return e._readableController.desiredSize}function Tr(e,t){"writable"!==e._writableState?Cr(e):qr(e,t)}function qr(e,t){e._writableState="erroring",e._writableStoredError=t,!function(e){return e._writableHasInFlightOperation}(e)&&e._writableStarted&&Cr(e)}function Cr(e){e._writableState="errored"}function Pr(e){"erroring"===e._writableState&&Cr(e)}Object.defineProperties(TransformStreamDefaultController.prototype,{enqueue:{enumerable:!0},error:{enumerable:!0},terminate:{enumerable:!0},desiredSize:{enumerable:!0}}),a(TransformStreamDefaultController.prototype.enqueue,"enqueue"),a(TransformStreamDefaultController.prototype.error,"error"),a(TransformStreamDefaultController.prototype.terminate,"terminate"),"symbol"==typeof t.toStringTag&&Object.defineProperty(TransformStreamDefaultController.prototype,t.toStringTag,{value:"TransformStreamDefaultController",configurable:!0}),e.ByteLengthQueuingStrategy=ByteLengthQueuingStrategy,e.CountQueuingStrategy=CountQueuingStrategy,e.ReadableByteStreamController=ReadableByteStreamController,e.ReadableStream=ReadableStream,e.ReadableStreamBYOBReader=ReadableStreamBYOBReader,e.ReadableStreamBYOBRequest=ReadableStreamBYOBRequest,e.ReadableStreamDefaultController=ReadableStreamDefaultController,e.ReadableStreamDefaultReader=ReadableStreamDefaultReader,e.TransformStream=TransformStream,e.TransformStreamDefaultController=TransformStreamDefaultController,e.WritableStream=WritableStream,e.WritableStreamDefaultController=WritableStreamDefaultController,e.WritableStreamDefaultWriter=WritableStreamDefaultWriter,Object.defineProperty(e,"__esModule",{value:!0})})); + + +/***/ }), + +/***/ 845: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +/*! + * humanize-ms - index.js + * Copyright(c) 2014 dead_horse + * MIT Licensed + */ + + + +/** + * Module dependencies. + */ + +var util = __nccwpck_require__(3837); +var ms = __nccwpck_require__(900); + +module.exports = function (t) { + if (typeof t === 'number') return t; + var r = ms(t); + if (r === undefined) { + var err = new Error(util.format('humanize-ms(%j) result undefined', t)); + console.warn(err.stack); + } + return r; +}; + + +/***/ }), + +/***/ 3287: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +/*! + * is-plain-object + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +function isObject(o) { + return Object.prototype.toString.call(o) === '[object Object]'; +} + +function isPlainObject(o) { + var ctor,prot; + + if (isObject(o) === false) return false; + + // If has modified constructor + ctor = o.constructor; + if (ctor === undefined) return true; + + // If has modified prototype + prot = ctor.prototype; + if (isObject(prot) === false) return false; + + // If constructor does not have an Object-specific method + if (prot.hasOwnProperty('isPrototypeOf') === false) { + return false; + } + + // Most likely a plain Object + return true; +} + +exports.isPlainObject = isPlainObject; + + +/***/ }), + +/***/ 900: +/***/ ((module) => { + +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var w = d * 7; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'weeks': + case 'week': + case 'w': + return n * w; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, 'hour'); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, 'minute'); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, 'second'); + } + return ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); +} + + +/***/ }), + +/***/ 7760: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +/*! node-domexception. MIT License. Jimmy Wärting */ + +if (!globalThis.DOMException) { + try { + const { MessageChannel } = __nccwpck_require__(1267), + port = new MessageChannel().port1, + ab = new ArrayBuffer() + port.postMessage(ab, [ab, ab]) + } catch (err) { + err.constructor.name === 'DOMException' && ( + globalThis.DOMException = err.constructor + ) + } +} + +module.exports = globalThis.DOMException + + +/***/ }), + +/***/ 467: +/***/ ((module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var Stream = _interopDefault(__nccwpck_require__(2781)); +var http = _interopDefault(__nccwpck_require__(3685)); +var Url = _interopDefault(__nccwpck_require__(7310)); +var whatwgUrl = _interopDefault(__nccwpck_require__(3323)); +var https = _interopDefault(__nccwpck_require__(5687)); +var zlib = _interopDefault(__nccwpck_require__(9796)); + +// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js + +// fix for "Readable" isn't a named export issue +const Readable = Stream.Readable; + +const BUFFER = Symbol('buffer'); +const TYPE = Symbol('type'); + +class Blob { + constructor() { + this[TYPE] = ''; + + const blobParts = arguments[0]; + const options = arguments[1]; + + const buffers = []; + let size = 0; + + if (blobParts) { + const a = blobParts; + const length = Number(a.length); + for (let i = 0; i < length; i++) { + const element = a[i]; + let buffer; + if (element instanceof Buffer) { + buffer = element; + } else if (ArrayBuffer.isView(element)) { + buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength); + } else if (element instanceof ArrayBuffer) { + buffer = Buffer.from(element); + } else if (element instanceof Blob) { + buffer = element[BUFFER]; + } else { + buffer = Buffer.from(typeof element === 'string' ? element : String(element)); + } + size += buffer.length; + buffers.push(buffer); + } + } + + this[BUFFER] = Buffer.concat(buffers); + + let type = options && options.type !== undefined && String(options.type).toLowerCase(); + if (type && !/[^\u0020-\u007E]/.test(type)) { + this[TYPE] = type; + } + } + get size() { + return this[BUFFER].length; + } + get type() { + return this[TYPE]; + } + text() { + return Promise.resolve(this[BUFFER].toString()); + } + arrayBuffer() { + const buf = this[BUFFER]; + const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + return Promise.resolve(ab); + } + stream() { + const readable = new Readable(); + readable._read = function () {}; + readable.push(this[BUFFER]); + readable.push(null); + return readable; + } + toString() { + return '[object Blob]'; + } + slice() { + const size = this.size; + + const start = arguments[0]; + const end = arguments[1]; + let relativeStart, relativeEnd; + if (start === undefined) { + relativeStart = 0; + } else if (start < 0) { + relativeStart = Math.max(size + start, 0); + } else { + relativeStart = Math.min(start, size); + } + if (end === undefined) { + relativeEnd = size; + } else if (end < 0) { + relativeEnd = Math.max(size + end, 0); + } else { + relativeEnd = Math.min(end, size); + } + const span = Math.max(relativeEnd - relativeStart, 0); + + const buffer = this[BUFFER]; + const slicedBuffer = buffer.slice(relativeStart, relativeStart + span); + const blob = new Blob([], { type: arguments[2] }); + blob[BUFFER] = slicedBuffer; + return blob; + } +} + +Object.defineProperties(Blob.prototype, { + size: { enumerable: true }, + type: { enumerable: true }, + slice: { enumerable: true } +}); + +Object.defineProperty(Blob.prototype, Symbol.toStringTag, { + value: 'Blob', + writable: false, + enumerable: false, + configurable: true +}); + +/** + * fetch-error.js + * + * FetchError interface for operational errors + */ + +/** + * Create FetchError instance + * + * @param String message Error message for human + * @param String type Error type for machine + * @param String systemError For Node.js system error + * @return FetchError + */ +function FetchError(message, type, systemError) { + Error.call(this, message); + + this.message = message; + this.type = type; + + // when err.type is `system`, err.code contains system error code + if (systemError) { + this.code = this.errno = systemError.code; + } + + // hide custom error implementation details from end-users + Error.captureStackTrace(this, this.constructor); +} + +FetchError.prototype = Object.create(Error.prototype); +FetchError.prototype.constructor = FetchError; +FetchError.prototype.name = 'FetchError'; + +let convert; +try { + convert = (__nccwpck_require__(2877).convert); +} catch (e) {} + +const INTERNALS = Symbol('Body internals'); + +// fix an issue where "PassThrough" isn't a named export for node <10 +const PassThrough = Stream.PassThrough; + +/** + * Body mixin + * + * Ref: https://fetch.spec.whatwg.org/#body + * + * @param Stream body Readable stream + * @param Object opts Response options + * @return Void + */ +function Body(body) { + var _this = this; + + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + _ref$size = _ref.size; + + let size = _ref$size === undefined ? 0 : _ref$size; + var _ref$timeout = _ref.timeout; + let timeout = _ref$timeout === undefined ? 0 : _ref$timeout; + + if (body == null) { + // body is undefined or null + body = null; + } else if (isURLSearchParams(body)) { + // body is a URLSearchParams + body = Buffer.from(body.toString()); + } else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') { + // body is ArrayBuffer + body = Buffer.from(body); + } else if (ArrayBuffer.isView(body)) { + // body is ArrayBufferView + body = Buffer.from(body.buffer, body.byteOffset, body.byteLength); + } else if (body instanceof Stream) ; else { + // none of the above + // coerce to string then buffer + body = Buffer.from(String(body)); + } + this[INTERNALS] = { + body, + disturbed: false, + error: null + }; + this.size = size; + this.timeout = timeout; + + if (body instanceof Stream) { + body.on('error', function (err) { + const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err); + _this[INTERNALS].error = error; + }); + } +} + +Body.prototype = { + get body() { + return this[INTERNALS].body; + }, + + get bodyUsed() { + return this[INTERNALS].disturbed; + }, + + /** + * Decode response as ArrayBuffer + * + * @return Promise + */ + arrayBuffer() { + return consumeBody.call(this).then(function (buf) { + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + }); + }, + + /** + * Return raw response as Blob + * + * @return Promise + */ + blob() { + let ct = this.headers && this.headers.get('content-type') || ''; + return consumeBody.call(this).then(function (buf) { + return Object.assign( + // Prevent copying + new Blob([], { + type: ct.toLowerCase() + }), { + [BUFFER]: buf + }); + }); + }, + + /** + * Decode response as json + * + * @return Promise + */ + json() { + var _this2 = this; + + return consumeBody.call(this).then(function (buffer) { + try { + return JSON.parse(buffer.toString()); + } catch (err) { + return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json')); + } + }); + }, + + /** + * Decode response as text + * + * @return Promise + */ + text() { + return consumeBody.call(this).then(function (buffer) { + return buffer.toString(); + }); + }, + + /** + * Decode response as buffer (non-spec api) + * + * @return Promise + */ + buffer() { + return consumeBody.call(this); + }, + + /** + * Decode response as text, while automatically detecting the encoding and + * trying to decode to UTF-8 (non-spec api) + * + * @return Promise + */ + textConverted() { + var _this3 = this; + + return consumeBody.call(this).then(function (buffer) { + return convertBody(buffer, _this3.headers); + }); + } +}; + +// In browsers, all properties are enumerable. +Object.defineProperties(Body.prototype, { + body: { enumerable: true }, + bodyUsed: { enumerable: true }, + arrayBuffer: { enumerable: true }, + blob: { enumerable: true }, + json: { enumerable: true }, + text: { enumerable: true } +}); + +Body.mixIn = function (proto) { + for (const name of Object.getOwnPropertyNames(Body.prototype)) { + // istanbul ignore else: future proof + if (!(name in proto)) { + const desc = Object.getOwnPropertyDescriptor(Body.prototype, name); + Object.defineProperty(proto, name, desc); + } + } +}; + +/** + * Consume and convert an entire Body to a Buffer. + * + * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body + * + * @return Promise + */ +function consumeBody() { + var _this4 = this; + + if (this[INTERNALS].disturbed) { + return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`)); + } + + this[INTERNALS].disturbed = true; + + if (this[INTERNALS].error) { + return Body.Promise.reject(this[INTERNALS].error); + } + + let body = this.body; + + // body is null + if (body === null) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + + // body is blob + if (isBlob(body)) { + body = body.stream(); + } + + // body is buffer + if (Buffer.isBuffer(body)) { + return Body.Promise.resolve(body); + } + + // istanbul ignore if: should never happen + if (!(body instanceof Stream)) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + + // body is stream + // get ready to actually consume the body + let accum = []; + let accumBytes = 0; + let abort = false; + + return new Body.Promise(function (resolve, reject) { + let resTimeout; + + // allow timeout on slow response body + if (_this4.timeout) { + resTimeout = setTimeout(function () { + abort = true; + reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout')); + }, _this4.timeout); + } + + // handle stream errors + body.on('error', function (err) { + if (err.name === 'AbortError') { + // if the request was aborted, reject with this Error + abort = true; + reject(err); + } else { + // other errors, such as incorrect content-encoding + reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err)); + } + }); + + body.on('data', function (chunk) { + if (abort || chunk === null) { + return; + } + + if (_this4.size && accumBytes + chunk.length > _this4.size) { + abort = true; + reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size')); + return; + } + + accumBytes += chunk.length; + accum.push(chunk); + }); + + body.on('end', function () { + if (abort) { + return; + } + + clearTimeout(resTimeout); + + try { + resolve(Buffer.concat(accum, accumBytes)); + } catch (err) { + // handle streams that have accumulated too much data (issue #414) + reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err)); + } + }); + }); +} + +/** + * Detect buffer encoding and convert to target encoding + * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding + * + * @param Buffer buffer Incoming buffer + * @param String encoding Target encoding + * @return String + */ +function convertBody(buffer, headers) { + if (typeof convert !== 'function') { + throw new Error('The package `encoding` must be installed to use the textConverted() function'); + } + + const ct = headers.get('content-type'); + let charset = 'utf-8'; + let res, str; + + // header + if (ct) { + res = /charset=([^;]*)/i.exec(ct); + } + + // no charset in content type, peek at response body for at most 1024 bytes + str = buffer.slice(0, 1024).toString(); + + // html5 + if (!res && str) { + res = / 0 && arguments[0] !== undefined ? arguments[0] : undefined; + + this[MAP] = Object.create(null); + + if (init instanceof Headers) { + const rawHeaders = init.raw(); + const headerNames = Object.keys(rawHeaders); + + for (const headerName of headerNames) { + for (const value of rawHeaders[headerName]) { + this.append(headerName, value); + } + } + + return; + } + + // We don't worry about converting prop to ByteString here as append() + // will handle it. + if (init == null) ; else if (typeof init === 'object') { + const method = init[Symbol.iterator]; + if (method != null) { + if (typeof method !== 'function') { + throw new TypeError('Header pairs must be iterable'); + } + + // sequence> + // Note: per spec we have to first exhaust the lists then process them + const pairs = []; + for (const pair of init) { + if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') { + throw new TypeError('Each header pair must be iterable'); + } + pairs.push(Array.from(pair)); + } + + for (const pair of pairs) { + if (pair.length !== 2) { + throw new TypeError('Each header pair must be a name/value tuple'); + } + this.append(pair[0], pair[1]); + } + } else { + // record + for (const key of Object.keys(init)) { + const value = init[key]; + this.append(key, value); + } + } + } else { + throw new TypeError('Provided initializer must be an object'); + } + } + + /** + * Return combined header value given name + * + * @param String name Header name + * @return Mixed + */ + get(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key === undefined) { + return null; + } + + return this[MAP][key].join(', '); + } + + /** + * Iterate over all headers + * + * @param Function callback Executed for each item with parameters (value, name, thisArg) + * @param Boolean thisArg `this` context for callback function + * @return Void + */ + forEach(callback) { + let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; + + let pairs = getHeaders(this); + let i = 0; + while (i < pairs.length) { + var _pairs$i = pairs[i]; + const name = _pairs$i[0], + value = _pairs$i[1]; + + callback.call(thisArg, value, name, this); + pairs = getHeaders(this); + i++; + } + } + + /** + * Overwrite header values given name + * + * @param String name Header name + * @param String value Header value + * @return Void + */ + set(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + this[MAP][key !== undefined ? key : name] = [value]; + } + + /** + * Append a value onto existing header + * + * @param String name Header name + * @param String value Header value + * @return Void + */ + append(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + if (key !== undefined) { + this[MAP][key].push(value); + } else { + this[MAP][name] = [value]; + } + } + + /** + * Check for header name existence + * + * @param String name Header name + * @return Boolean + */ + has(name) { + name = `${name}`; + validateName(name); + return find(this[MAP], name) !== undefined; + } + + /** + * Delete all header values given name + * + * @param String name Header name + * @return Void + */ + delete(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key !== undefined) { + delete this[MAP][key]; + } + } + + /** + * Return raw headers (non-spec api) + * + * @return Object + */ + raw() { + return this[MAP]; + } + + /** + * Get an iterator on keys. + * + * @return Iterator + */ + keys() { + return createHeadersIterator(this, 'key'); + } + + /** + * Get an iterator on values. + * + * @return Iterator + */ + values() { + return createHeadersIterator(this, 'value'); + } + + /** + * Get an iterator on entries. + * + * This is the default iterator of the Headers object. + * + * @return Iterator + */ + [Symbol.iterator]() { + return createHeadersIterator(this, 'key+value'); + } +} +Headers.prototype.entries = Headers.prototype[Symbol.iterator]; + +Object.defineProperty(Headers.prototype, Symbol.toStringTag, { + value: 'Headers', + writable: false, + enumerable: false, + configurable: true +}); + +Object.defineProperties(Headers.prototype, { + get: { enumerable: true }, + forEach: { enumerable: true }, + set: { enumerable: true }, + append: { enumerable: true }, + has: { enumerable: true }, + delete: { enumerable: true }, + keys: { enumerable: true }, + values: { enumerable: true }, + entries: { enumerable: true } +}); + +function getHeaders(headers) { + let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value'; + + const keys = Object.keys(headers[MAP]).sort(); + return keys.map(kind === 'key' ? function (k) { + return k.toLowerCase(); + } : kind === 'value' ? function (k) { + return headers[MAP][k].join(', '); + } : function (k) { + return [k.toLowerCase(), headers[MAP][k].join(', ')]; + }); +} + +const INTERNAL = Symbol('internal'); + +function createHeadersIterator(target, kind) { + const iterator = Object.create(HeadersIteratorPrototype); + iterator[INTERNAL] = { + target, + kind, + index: 0 + }; + return iterator; +} + +const HeadersIteratorPrototype = Object.setPrototypeOf({ + next() { + // istanbul ignore if + if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) { + throw new TypeError('Value of `this` is not a HeadersIterator'); + } + + var _INTERNAL = this[INTERNAL]; + const target = _INTERNAL.target, + kind = _INTERNAL.kind, + index = _INTERNAL.index; + + const values = getHeaders(target, kind); + const len = values.length; + if (index >= len) { + return { + value: undefined, + done: true + }; + } + + this[INTERNAL].index = index + 1; + + return { + value: values[index], + done: false + }; + } +}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))); + +Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, { + value: 'HeadersIterator', + writable: false, + enumerable: false, + configurable: true +}); + +/** + * Export the Headers object in a form that Node.js can consume. + * + * @param Headers headers + * @return Object + */ +function exportNodeCompatibleHeaders(headers) { + const obj = Object.assign({ __proto__: null }, headers[MAP]); + + // http.request() only supports string as Host header. This hack makes + // specifying custom Host header possible. + const hostHeaderKey = find(headers[MAP], 'Host'); + if (hostHeaderKey !== undefined) { + obj[hostHeaderKey] = obj[hostHeaderKey][0]; + } + + return obj; +} + +/** + * Create a Headers object from an object of headers, ignoring those that do + * not conform to HTTP grammar productions. + * + * @param Object obj Object of headers + * @return Headers + */ +function createHeadersLenient(obj) { + const headers = new Headers(); + for (const name of Object.keys(obj)) { + if (invalidTokenRegex.test(name)) { + continue; + } + if (Array.isArray(obj[name])) { + for (const val of obj[name]) { + if (invalidHeaderCharRegex.test(val)) { + continue; + } + if (headers[MAP][name] === undefined) { + headers[MAP][name] = [val]; + } else { + headers[MAP][name].push(val); + } + } + } else if (!invalidHeaderCharRegex.test(obj[name])) { + headers[MAP][name] = [obj[name]]; + } + } + return headers; +} + +const INTERNALS$1 = Symbol('Response internals'); + +// fix an issue where "STATUS_CODES" aren't a named export for node <10 +const STATUS_CODES = http.STATUS_CODES; + +/** + * Response class + * + * @param Stream body Readable stream + * @param Object opts Response options + * @return Void + */ +class Response { + constructor() { + let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + Body.call(this, body, opts); + + const status = opts.status || 200; + const headers = new Headers(opts.headers); + + if (body != null && !headers.has('Content-Type')) { + const contentType = extractContentType(body); + if (contentType) { + headers.append('Content-Type', contentType); + } + } + + this[INTERNALS$1] = { + url: opts.url, + status, + statusText: opts.statusText || STATUS_CODES[status], + headers, + counter: opts.counter + }; + } + + get url() { + return this[INTERNALS$1].url || ''; + } + + get status() { + return this[INTERNALS$1].status; + } + + /** + * Convenience property representing if the request ended normally + */ + get ok() { + return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300; + } + + get redirected() { + return this[INTERNALS$1].counter > 0; + } + + get statusText() { + return this[INTERNALS$1].statusText; + } + + get headers() { + return this[INTERNALS$1].headers; + } + + /** + * Clone this response + * + * @return Response + */ + clone() { + return new Response(clone(this), { + url: this.url, + status: this.status, + statusText: this.statusText, + headers: this.headers, + ok: this.ok, + redirected: this.redirected + }); + } +} + +Body.mixIn(Response.prototype); + +Object.defineProperties(Response.prototype, { + url: { enumerable: true }, + status: { enumerable: true }, + ok: { enumerable: true }, + redirected: { enumerable: true }, + statusText: { enumerable: true }, + headers: { enumerable: true }, + clone: { enumerable: true } +}); + +Object.defineProperty(Response.prototype, Symbol.toStringTag, { + value: 'Response', + writable: false, + enumerable: false, + configurable: true +}); + +const INTERNALS$2 = Symbol('Request internals'); +const URL = Url.URL || whatwgUrl.URL; + +// fix an issue where "format", "parse" aren't a named export for node <10 +const parse_url = Url.parse; +const format_url = Url.format; + +/** + * Wrapper around `new URL` to handle arbitrary URLs + * + * @param {string} urlStr + * @return {void} + */ +function parseURL(urlStr) { + /* + Check whether the URL is absolute or not + Scheme: https://tools.ietf.org/html/rfc3986#section-3.1 + Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3 + */ + if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) { + urlStr = new URL(urlStr).toString(); + } + + // Fallback to old implementation for arbitrary URLs + return parse_url(urlStr); +} + +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; + +/** + * Check if a value is an instance of Request. + * + * @param Mixed input + * @return Boolean + */ +function isRequest(input) { + return typeof input === 'object' && typeof input[INTERNALS$2] === 'object'; +} + +function isAbortSignal(signal) { + const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal); + return !!(proto && proto.constructor.name === 'AbortSignal'); +} + +/** + * Request class + * + * @param Mixed input Url or Request instance + * @param Object init Custom options + * @return Void + */ +class Request { + constructor(input) { + let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + let parsedURL; + + // normalize input + if (!isRequest(input)) { + if (input && input.href) { + // in order to support Node.js' Url objects; though WHATWG's URL objects + // will fall into this branch also (since their `toString()` will return + // `href` property anyway) + parsedURL = parseURL(input.href); + } else { + // coerce input to a string before attempting to parse + parsedURL = parseURL(`${input}`); + } + input = {}; + } else { + parsedURL = parseURL(input.url); + } + + let method = init.method || input.method || 'GET'; + method = method.toUpperCase(); + + if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) { + throw new TypeError('Request with GET/HEAD method cannot have body'); + } + + let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null; + + Body.call(this, inputBody, { + timeout: init.timeout || input.timeout || 0, + size: init.size || input.size || 0 + }); + + const headers = new Headers(init.headers || input.headers || {}); + + if (inputBody != null && !headers.has('Content-Type')) { + const contentType = extractContentType(inputBody); + if (contentType) { + headers.append('Content-Type', contentType); + } + } + + let signal = isRequest(input) ? input.signal : null; + if ('signal' in init) signal = init.signal; + + if (signal != null && !isAbortSignal(signal)) { + throw new TypeError('Expected signal to be an instanceof AbortSignal'); + } + + this[INTERNALS$2] = { + method, + redirect: init.redirect || input.redirect || 'follow', + headers, + parsedURL, + signal + }; + + // node-fetch-only options + this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20; + this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true; + this.counter = init.counter || input.counter || 0; + this.agent = init.agent || input.agent; + } + + get method() { + return this[INTERNALS$2].method; + } + + get url() { + return format_url(this[INTERNALS$2].parsedURL); + } + + get headers() { + return this[INTERNALS$2].headers; + } + + get redirect() { + return this[INTERNALS$2].redirect; + } + + get signal() { + return this[INTERNALS$2].signal; + } + + /** + * Clone this request + * + * @return Request + */ + clone() { + return new Request(this); + } +} + +Body.mixIn(Request.prototype); + +Object.defineProperty(Request.prototype, Symbol.toStringTag, { + value: 'Request', + writable: false, + enumerable: false, + configurable: true +}); + +Object.defineProperties(Request.prototype, { + method: { enumerable: true }, + url: { enumerable: true }, + headers: { enumerable: true }, + redirect: { enumerable: true }, + clone: { enumerable: true }, + signal: { enumerable: true } +}); + +/** + * Convert a Request to Node.js http request options. + * + * @param Request A Request instance + * @return Object The options object to be passed to http.request + */ +function getNodeRequestOptions(request) { + const parsedURL = request[INTERNALS$2].parsedURL; + const headers = new Headers(request[INTERNALS$2].headers); + + // fetch step 1.3 + if (!headers.has('Accept')) { + headers.set('Accept', '*/*'); + } + + // Basic fetch + if (!parsedURL.protocol || !parsedURL.hostname) { + throw new TypeError('Only absolute URLs are supported'); + } + + if (!/^https?:$/.test(parsedURL.protocol)) { + throw new TypeError('Only HTTP(S) protocols are supported'); + } + + if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) { + throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8'); + } + + // HTTP-network-or-cache fetch steps 2.4-2.7 + let contentLengthValue = null; + if (request.body == null && /^(POST|PUT)$/i.test(request.method)) { + contentLengthValue = '0'; + } + if (request.body != null) { + const totalBytes = getTotalBytes(request); + if (typeof totalBytes === 'number') { + contentLengthValue = String(totalBytes); + } + } + if (contentLengthValue) { + headers.set('Content-Length', contentLengthValue); + } + + // HTTP-network-or-cache fetch step 2.11 + if (!headers.has('User-Agent')) { + headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)'); + } + + // HTTP-network-or-cache fetch step 2.15 + if (request.compress && !headers.has('Accept-Encoding')) { + headers.set('Accept-Encoding', 'gzip,deflate'); + } + + let agent = request.agent; + if (typeof agent === 'function') { + agent = agent(parsedURL); + } + + if (!headers.has('Connection') && !agent) { + headers.set('Connection', 'close'); + } + + // HTTP-network fetch step 4.2 + // chunked encoding is handled by Node.js + + return Object.assign({}, parsedURL, { + method: request.method, + headers: exportNodeCompatibleHeaders(headers), + agent + }); +} + +/** + * abort-error.js + * + * AbortError interface for cancelled requests + */ + +/** + * Create AbortError instance + * + * @param String message Error message for human + * @return AbortError + */ +function AbortError(message) { + Error.call(this, message); + + this.type = 'aborted'; + this.message = message; + + // hide custom error implementation details from end-users + Error.captureStackTrace(this, this.constructor); +} + +AbortError.prototype = Object.create(Error.prototype); +AbortError.prototype.constructor = AbortError; +AbortError.prototype.name = 'AbortError'; + +const URL$1 = Url.URL || whatwgUrl.URL; + +// fix an issue where "PassThrough", "resolve" aren't a named export for node <10 +const PassThrough$1 = Stream.PassThrough; + +const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) { + const orig = new URL$1(original).hostname; + const dest = new URL$1(destination).hostname; + + return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest); +}; + +/** + * Fetch function + * + * @param Mixed url Absolute url or Request instance + * @param Object opts Fetch options + * @return Promise + */ +function fetch(url, opts) { + + // allow custom promise + if (!fetch.Promise) { + throw new Error('native promise missing, set fetch.Promise to your favorite alternative'); + } + + Body.Promise = fetch.Promise; + + // wrap http.request into fetch + return new fetch.Promise(function (resolve, reject) { + // build request object + const request = new Request(url, opts); + const options = getNodeRequestOptions(request); + + const send = (options.protocol === 'https:' ? https : http).request; + const signal = request.signal; + + let response = null; + + const abort = function abort() { + let error = new AbortError('The user aborted a request.'); + reject(error); + if (request.body && request.body instanceof Stream.Readable) { + request.body.destroy(error); + } + if (!response || !response.body) return; + response.body.emit('error', error); + }; + + if (signal && signal.aborted) { + abort(); + return; + } + + const abortAndFinalize = function abortAndFinalize() { + abort(); + finalize(); + }; + + // send request + const req = send(options); + let reqTimeout; + + if (signal) { + signal.addEventListener('abort', abortAndFinalize); + } + + function finalize() { + req.abort(); + if (signal) signal.removeEventListener('abort', abortAndFinalize); + clearTimeout(reqTimeout); + } + + if (request.timeout) { + req.once('socket', function (socket) { + reqTimeout = setTimeout(function () { + reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout')); + finalize(); + }, request.timeout); + }); + } + + req.on('error', function (err) { + reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err)); + finalize(); + }); + + req.on('response', function (res) { + clearTimeout(reqTimeout); + + const headers = createHeadersLenient(res.headers); + + // HTTP fetch step 5 + if (fetch.isRedirect(res.statusCode)) { + // HTTP fetch step 5.2 + const location = headers.get('Location'); + + // HTTP fetch step 5.3 + let locationURL = null; + try { + locationURL = location === null ? null : new URL$1(location, request.url).toString(); + } catch (err) { + // error here can only be invalid URL in Location: header + // do not throw when options.redirect == manual + // let the user extract the errorneous redirect URL + if (request.redirect !== 'manual') { + reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect')); + finalize(); + return; + } + } + + // HTTP fetch step 5.5 + switch (request.redirect) { + case 'error': + reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect')); + finalize(); + return; + case 'manual': + // node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL. + if (locationURL !== null) { + // handle corrupted header + try { + headers.set('Location', locationURL); + } catch (err) { + // istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request + reject(err); + } + } + break; + case 'follow': + // HTTP-redirect fetch step 2 + if (locationURL === null) { + break; + } + + // HTTP-redirect fetch step 5 + if (request.counter >= request.follow) { + reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect')); + finalize(); + return; + } + + // HTTP-redirect fetch step 6 (counter increment) + // Create a new Request object. + const requestOpts = { + headers: new Headers(request.headers), + follow: request.follow, + counter: request.counter + 1, + agent: request.agent, + compress: request.compress, + method: request.method, + body: request.body, + signal: request.signal, + timeout: request.timeout, + size: request.size + }; + + if (!isDomainOrSubdomain(request.url, locationURL)) { + for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) { + requestOpts.headers.delete(name); + } + } + + // HTTP-redirect fetch step 9 + if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) { + reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect')); + finalize(); + return; + } + + // HTTP-redirect fetch step 11 + if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') { + requestOpts.method = 'GET'; + requestOpts.body = undefined; + requestOpts.headers.delete('content-length'); + } + + // HTTP-redirect fetch step 15 + resolve(fetch(new Request(locationURL, requestOpts))); + finalize(); + return; + } + } + + // prepare response + res.once('end', function () { + if (signal) signal.removeEventListener('abort', abortAndFinalize); + }); + let body = res.pipe(new PassThrough$1()); + + const response_options = { + url: request.url, + status: res.statusCode, + statusText: res.statusMessage, + headers: headers, + size: request.size, + timeout: request.timeout, + counter: request.counter + }; + + // HTTP-network fetch step 12.1.1.3 + const codings = headers.get('Content-Encoding'); + + // HTTP-network fetch step 12.1.1.4: handle content codings + + // in following scenarios we ignore compression support + // 1. compression support is disabled + // 2. HEAD request + // 3. no Content-Encoding header + // 4. no content response (204) + // 5. content not modified response (304) + if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) { + response = new Response(body, response_options); + resolve(response); + return; + } + + // For Node v6+ + // Be less strict when decoding compressed responses, since sometimes + // servers send slightly invalid responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + const zlibOptions = { + flush: zlib.Z_SYNC_FLUSH, + finishFlush: zlib.Z_SYNC_FLUSH + }; + + // for gzip + if (codings == 'gzip' || codings == 'x-gzip') { + body = body.pipe(zlib.createGunzip(zlibOptions)); + response = new Response(body, response_options); + resolve(response); + return; + } + + // for deflate + if (codings == 'deflate' || codings == 'x-deflate') { + // handle the infamous raw deflate response from old servers + // a hack for old IIS and Apache servers + const raw = res.pipe(new PassThrough$1()); + raw.once('data', function (chunk) { + // see http://stackoverflow.com/questions/37519828 + if ((chunk[0] & 0x0F) === 0x08) { + body = body.pipe(zlib.createInflate()); + } else { + body = body.pipe(zlib.createInflateRaw()); + } + response = new Response(body, response_options); + resolve(response); + }); + return; + } + + // for br + if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') { + body = body.pipe(zlib.createBrotliDecompress()); + response = new Response(body, response_options); + resolve(response); + return; + } + + // otherwise, use response as-is + response = new Response(body, response_options); + resolve(response); + }); + + writeToStream(req, request); + }); +} +/** + * Redirect code matching + * + * @param Number code Status code + * @return Boolean + */ +fetch.isRedirect = function (code) { + return code === 301 || code === 302 || code === 303 || code === 307 || code === 308; +}; + +// expose Promise +fetch.Promise = global.Promise; + +module.exports = exports = fetch; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports["default"] = exports; +exports.Headers = Headers; +exports.Request = Request; +exports.Response = Response; +exports.FetchError = FetchError; + + +/***/ }), + +/***/ 2299: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var punycode = __nccwpck_require__(5477); +var mappingTable = __nccwpck_require__(1907); + +var PROCESSING_OPTIONS = { + TRANSITIONAL: 0, + NONTRANSITIONAL: 1 +}; + +function normalize(str) { // fix bug in v8 + return str.split('\u0000').map(function (s) { return s.normalize('NFC'); }).join('\u0000'); +} + +function findStatus(val) { + var start = 0; + var end = mappingTable.length - 1; + + while (start <= end) { + var mid = Math.floor((start + end) / 2); + + var target = mappingTable[mid]; + if (target[0][0] <= val && target[0][1] >= val) { + return target; + } else if (target[0][0] > val) { + end = mid - 1; + } else { + start = mid + 1; + } + } + + return null; +} + +var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; + +function countSymbols(string) { + return string + // replace every surrogate pair with a BMP symbol + .replace(regexAstralSymbols, '_') + // then get the length + .length; +} + +function mapChars(domain_name, useSTD3, processing_option) { + var hasError = false; + var processed = ""; + + var len = countSymbols(domain_name); + for (var i = 0; i < len; ++i) { + var codePoint = domain_name.codePointAt(i); + var status = findStatus(codePoint); + + switch (status[1]) { + case "disallowed": + hasError = true; + processed += String.fromCodePoint(codePoint); + break; + case "ignored": + break; + case "mapped": + processed += String.fromCodePoint.apply(String, status[2]); + break; + case "deviation": + if (processing_option === PROCESSING_OPTIONS.TRANSITIONAL) { + processed += String.fromCodePoint.apply(String, status[2]); + } else { + processed += String.fromCodePoint(codePoint); + } + break; + case "valid": + processed += String.fromCodePoint(codePoint); + break; + case "disallowed_STD3_mapped": + if (useSTD3) { + hasError = true; + processed += String.fromCodePoint(codePoint); + } else { + processed += String.fromCodePoint.apply(String, status[2]); + } + break; + case "disallowed_STD3_valid": + if (useSTD3) { + hasError = true; + } + + processed += String.fromCodePoint(codePoint); + break; + } + } + + return { + string: processed, + error: hasError + }; +} + +var combiningMarksRegex = /[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08E4-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u18A9\u1920-\u192B\u1930-\u193B\u19B0-\u19C0\u19C8\u19C9\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFC-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C4\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2D]|\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDE2C-\uDE37\uDEDF-\uDEEA\uDF01-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDE30-\uDE40\uDEAB-\uDEB7]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD83A[\uDCD0-\uDCD6]|\uDB40[\uDD00-\uDDEF]/; + +function validateLabel(label, processing_option) { + if (label.substr(0, 4) === "xn--") { + label = punycode.toUnicode(label); + processing_option = PROCESSING_OPTIONS.NONTRANSITIONAL; + } + + var error = false; + + if (normalize(label) !== label || + (label[3] === "-" && label[4] === "-") || + label[0] === "-" || label[label.length - 1] === "-" || + label.indexOf(".") !== -1 || + label.search(combiningMarksRegex) === 0) { + error = true; + } + + var len = countSymbols(label); + for (var i = 0; i < len; ++i) { + var status = findStatus(label.codePointAt(i)); + if ((processing === PROCESSING_OPTIONS.TRANSITIONAL && status[1] !== "valid") || + (processing === PROCESSING_OPTIONS.NONTRANSITIONAL && + status[1] !== "valid" && status[1] !== "deviation")) { + error = true; + break; + } + } + + return { + label: label, + error: error + }; +} + +function processing(domain_name, useSTD3, processing_option) { + var result = mapChars(domain_name, useSTD3, processing_option); + result.string = normalize(result.string); + + var labels = result.string.split("."); + for (var i = 0; i < labels.length; ++i) { + try { + var validation = validateLabel(labels[i]); + labels[i] = validation.label; + result.error = result.error || validation.error; + } catch(e) { + result.error = true; + } + } + + return { + string: labels.join("."), + error: result.error + }; +} + +module.exports.toASCII = function(domain_name, useSTD3, processing_option, verifyDnsLength) { + var result = processing(domain_name, useSTD3, processing_option); + var labels = result.string.split("."); + labels = labels.map(function(l) { + try { + return punycode.toASCII(l); + } catch(e) { + result.error = true; + return l; + } + }); + + if (verifyDnsLength) { + var total = labels.slice(0, labels.length - 1).join(".").length; + if (total.length > 253 || total.length === 0) { + result.error = true; + } + + for (var i=0; i < labels.length; ++i) { + if (labels.length > 63 || labels.length === 0) { + result.error = true; + break; + } + } + } + + if (result.error) return null; + return labels.join("."); +}; + +module.exports.toUnicode = function(domain_name, useSTD3) { + var result = processing(domain_name, useSTD3, PROCESSING_OPTIONS.NONTRANSITIONAL); + + return { + domain: result.string, + error: result.error + }; +}; + +module.exports.PROCESSING_OPTIONS = PROCESSING_OPTIONS; + + +/***/ }), + +/***/ 5871: +/***/ ((module) => { + +"use strict"; + + +var conversions = {}; +module.exports = conversions; + +function sign(x) { + return x < 0 ? -1 : 1; +} + +function evenRound(x) { + // Round x to the nearest integer, choosing the even integer if it lies halfway between two. + if ((x % 1) === 0.5 && (x & 1) === 0) { // [even number].5; round down (i.e. floor) + return Math.floor(x); + } else { + return Math.round(x); + } +} + +function createNumberConversion(bitLength, typeOpts) { + if (!typeOpts.unsigned) { + --bitLength; + } + const lowerBound = typeOpts.unsigned ? 0 : -Math.pow(2, bitLength); + const upperBound = Math.pow(2, bitLength) - 1; + + const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength); + const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1); + + return function(V, opts) { + if (!opts) opts = {}; + + let x = +V; + + if (opts.enforceRange) { + if (!Number.isFinite(x)) { + throw new TypeError("Argument is not a finite number"); + } + + x = sign(x) * Math.floor(Math.abs(x)); + if (x < lowerBound || x > upperBound) { + throw new TypeError("Argument is not in byte range"); + } + + return x; + } + + if (!isNaN(x) && opts.clamp) { + x = evenRound(x); + + if (x < lowerBound) x = lowerBound; + if (x > upperBound) x = upperBound; + return x; + } + + if (!Number.isFinite(x) || x === 0) { + return 0; + } + + x = sign(x) * Math.floor(Math.abs(x)); + x = x % moduloVal; + + if (!typeOpts.unsigned && x >= moduloBound) { + return x - moduloVal; + } else if (typeOpts.unsigned) { + if (x < 0) { + x += moduloVal; + } else if (x === -0) { // don't return negative zero + return 0; + } + } + + return x; + } +} + +conversions["void"] = function () { + return undefined; +}; + +conversions["boolean"] = function (val) { + return !!val; +}; + +conversions["byte"] = createNumberConversion(8, { unsigned: false }); +conversions["octet"] = createNumberConversion(8, { unsigned: true }); + +conversions["short"] = createNumberConversion(16, { unsigned: false }); +conversions["unsigned short"] = createNumberConversion(16, { unsigned: true }); + +conversions["long"] = createNumberConversion(32, { unsigned: false }); +conversions["unsigned long"] = createNumberConversion(32, { unsigned: true }); + +conversions["long long"] = createNumberConversion(32, { unsigned: false, moduloBitLength: 64 }); +conversions["unsigned long long"] = createNumberConversion(32, { unsigned: true, moduloBitLength: 64 }); + +conversions["double"] = function (V) { + const x = +V; + + if (!Number.isFinite(x)) { + throw new TypeError("Argument is not a finite floating-point value"); + } + + return x; +}; + +conversions["unrestricted double"] = function (V) { + const x = +V; + + if (isNaN(x)) { + throw new TypeError("Argument is NaN"); + } + + return x; +}; + +// not quite valid, but good enough for JS +conversions["float"] = conversions["double"]; +conversions["unrestricted float"] = conversions["unrestricted double"]; + +conversions["DOMString"] = function (V, opts) { + if (!opts) opts = {}; + + if (opts.treatNullAsEmptyString && V === null) { + return ""; + } + + return String(V); +}; + +conversions["ByteString"] = function (V, opts) { + const x = String(V); + let c = undefined; + for (let i = 0; (c = x.codePointAt(i)) !== undefined; ++i) { + if (c > 255) { + throw new TypeError("Argument is not a valid bytestring"); + } + } + + return x; +}; + +conversions["USVString"] = function (V) { + const S = String(V); + const n = S.length; + const U = []; + for (let i = 0; i < n; ++i) { + const c = S.charCodeAt(i); + if (c < 0xD800 || c > 0xDFFF) { + U.push(String.fromCodePoint(c)); + } else if (0xDC00 <= c && c <= 0xDFFF) { + U.push(String.fromCodePoint(0xFFFD)); + } else { + if (i === n - 1) { + U.push(String.fromCodePoint(0xFFFD)); + } else { + const d = S.charCodeAt(i + 1); + if (0xDC00 <= d && d <= 0xDFFF) { + const a = c & 0x3FF; + const b = d & 0x3FF; + U.push(String.fromCodePoint((2 << 15) + (2 << 9) * a + b)); + ++i; + } else { + U.push(String.fromCodePoint(0xFFFD)); + } + } + } + } + + return U.join(''); +}; + +conversions["Date"] = function (V, opts) { + if (!(V instanceof Date)) { + throw new TypeError("Argument is not a Date object"); + } + if (isNaN(V)) { + return undefined; + } + + return V; +}; + +conversions["RegExp"] = function (V, opts) { + if (!(V instanceof RegExp)) { + V = new RegExp(V); + } + + return V; +}; + + +/***/ }), + +/***/ 8262: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +const usm = __nccwpck_require__(33); + +exports.implementation = class URLImpl { + constructor(constructorArgs) { + const url = constructorArgs[0]; + const base = constructorArgs[1]; + + let parsedBase = null; + if (base !== undefined) { + parsedBase = usm.basicURLParse(base); + if (parsedBase === "failure") { + throw new TypeError("Invalid base URL"); + } + } + + const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase }); + if (parsedURL === "failure") { + throw new TypeError("Invalid URL"); + } + + this._url = parsedURL; + + // TODO: query stuff + } + + get href() { + return usm.serializeURL(this._url); + } + + set href(v) { + const parsedURL = usm.basicURLParse(v); + if (parsedURL === "failure") { + throw new TypeError("Invalid URL"); + } + + this._url = parsedURL; + } + + get origin() { + return usm.serializeURLOrigin(this._url); + } + + get protocol() { + return this._url.scheme + ":"; + } + + set protocol(v) { + usm.basicURLParse(v + ":", { url: this._url, stateOverride: "scheme start" }); + } + + get username() { + return this._url.username; + } + + set username(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + usm.setTheUsername(this._url, v); + } + + get password() { + return this._url.password; + } + + set password(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + usm.setThePassword(this._url, v); + } + + get host() { + const url = this._url; + + if (url.host === null) { + return ""; + } + + if (url.port === null) { + return usm.serializeHost(url.host); + } + + return usm.serializeHost(url.host) + ":" + usm.serializeInteger(url.port); + } + + set host(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + usm.basicURLParse(v, { url: this._url, stateOverride: "host" }); + } + + get hostname() { + if (this._url.host === null) { + return ""; + } + + return usm.serializeHost(this._url.host); + } + + set hostname(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + usm.basicURLParse(v, { url: this._url, stateOverride: "hostname" }); + } + + get port() { + if (this._url.port === null) { + return ""; + } + + return usm.serializeInteger(this._url.port); + } + + set port(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + if (v === "") { + this._url.port = null; + } else { + usm.basicURLParse(v, { url: this._url, stateOverride: "port" }); + } + } + + get pathname() { + if (this._url.cannotBeABaseURL) { + return this._url.path[0]; + } + + if (this._url.path.length === 0) { + return ""; + } + + return "/" + this._url.path.join("/"); + } + + set pathname(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + this._url.path = []; + usm.basicURLParse(v, { url: this._url, stateOverride: "path start" }); + } + + get search() { + if (this._url.query === null || this._url.query === "") { + return ""; + } + + return "?" + this._url.query; + } + + set search(v) { + // TODO: query stuff + + const url = this._url; + + if (v === "") { + url.query = null; + return; + } + + const input = v[0] === "?" ? v.substring(1) : v; + url.query = ""; + usm.basicURLParse(input, { url, stateOverride: "query" }); + } + + get hash() { + if (this._url.fragment === null || this._url.fragment === "") { + return ""; + } + + return "#" + this._url.fragment; + } + + set hash(v) { + if (v === "") { + this._url.fragment = null; + return; + } + + const input = v[0] === "#" ? v.substring(1) : v; + this._url.fragment = ""; + usm.basicURLParse(input, { url: this._url, stateOverride: "fragment" }); + } + + toJSON() { + return this.href; + } +}; + + +/***/ }), + +/***/ 653: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +const conversions = __nccwpck_require__(5871); +const utils = __nccwpck_require__(276); +const Impl = __nccwpck_require__(8262); + +const impl = utils.implSymbol; + +function URL(url) { + if (!this || this[impl] || !(this instanceof URL)) { + throw new TypeError("Failed to construct 'URL': Please use the 'new' operator, this DOM object constructor cannot be called as a function."); + } + if (arguments.length < 1) { + throw new TypeError("Failed to construct 'URL': 1 argument required, but only " + arguments.length + " present."); + } + const args = []; + for (let i = 0; i < arguments.length && i < 2; ++i) { + args[i] = arguments[i]; + } + args[0] = conversions["USVString"](args[0]); + if (args[1] !== undefined) { + args[1] = conversions["USVString"](args[1]); + } + + module.exports.setup(this, args); +} + +URL.prototype.toJSON = function toJSON() { + if (!this || !module.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + const args = []; + for (let i = 0; i < arguments.length && i < 0; ++i) { + args[i] = arguments[i]; + } + return this[impl].toJSON.apply(this[impl], args); +}; +Object.defineProperty(URL.prototype, "href", { + get() { + return this[impl].href; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].href = V; + }, + enumerable: true, + configurable: true +}); + +URL.prototype.toString = function () { + if (!this || !module.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + return this.href; +}; + +Object.defineProperty(URL.prototype, "origin", { + get() { + return this[impl].origin; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "protocol", { + get() { + return this[impl].protocol; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].protocol = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "username", { + get() { + return this[impl].username; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].username = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "password", { + get() { + return this[impl].password; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].password = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "host", { + get() { + return this[impl].host; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].host = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "hostname", { + get() { + return this[impl].hostname; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].hostname = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "port", { + get() { + return this[impl].port; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].port = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "pathname", { + get() { + return this[impl].pathname; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].pathname = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "search", { + get() { + return this[impl].search; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].search = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "hash", { + get() { + return this[impl].hash; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].hash = V; + }, + enumerable: true, + configurable: true +}); + + +module.exports = { + is(obj) { + return !!obj && obj[impl] instanceof Impl.implementation; + }, + create(constructorArgs, privateData) { + let obj = Object.create(URL.prototype); + this.setup(obj, constructorArgs, privateData); + return obj; + }, + setup(obj, constructorArgs, privateData) { + if (!privateData) privateData = {}; + privateData.wrapper = obj; + + obj[impl] = new Impl.implementation(constructorArgs, privateData); + obj[impl][utils.wrapperSymbol] = obj; + }, + interface: URL, + expose: { + Window: { URL: URL }, + Worker: { URL: URL } + } +}; + + + +/***/ }), + +/***/ 3323: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +exports.URL = __nccwpck_require__(653)["interface"]; +exports.serializeURL = __nccwpck_require__(33).serializeURL; +exports.serializeURLOrigin = __nccwpck_require__(33).serializeURLOrigin; +exports.basicURLParse = __nccwpck_require__(33).basicURLParse; +exports.setTheUsername = __nccwpck_require__(33).setTheUsername; +exports.setThePassword = __nccwpck_require__(33).setThePassword; +exports.serializeHost = __nccwpck_require__(33).serializeHost; +exports.serializeInteger = __nccwpck_require__(33).serializeInteger; +exports.parseURL = __nccwpck_require__(33).parseURL; + + +/***/ }), + +/***/ 33: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + +const punycode = __nccwpck_require__(5477); +const tr46 = __nccwpck_require__(2299); + +const specialSchemes = { + ftp: 21, + file: null, + gopher: 70, + http: 80, + https: 443, + ws: 80, + wss: 443 +}; + +const failure = Symbol("failure"); + +function countSymbols(str) { + return punycode.ucs2.decode(str).length; +} + +function at(input, idx) { + const c = input[idx]; + return isNaN(c) ? undefined : String.fromCodePoint(c); +} + +function isASCIIDigit(c) { + return c >= 0x30 && c <= 0x39; +} + +function isASCIIAlpha(c) { + return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); +} + +function isASCIIAlphanumeric(c) { + return isASCIIAlpha(c) || isASCIIDigit(c); +} + +function isASCIIHex(c) { + return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); +} + +function isSingleDot(buffer) { + return buffer === "." || buffer.toLowerCase() === "%2e"; +} + +function isDoubleDot(buffer) { + buffer = buffer.toLowerCase(); + return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; +} + +function isWindowsDriveLetterCodePoints(cp1, cp2) { + return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); +} + +function isWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); +} + +function isNormalizedWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; +} + +function containsForbiddenHostCodePoint(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function containsForbiddenHostCodePointExcludingPercent(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function isSpecialScheme(scheme) { + return specialSchemes[scheme] !== undefined; +} + +function isSpecial(url) { + return isSpecialScheme(url.scheme); +} + +function defaultPort(scheme) { + return specialSchemes[scheme]; +} + +function percentEncode(c) { + let hex = c.toString(16).toUpperCase(); + if (hex.length === 1) { + hex = "0" + hex; + } + + return "%" + hex; +} + +function utf8PercentEncode(c) { + const buf = new Buffer(c); + + let str = ""; + + for (let i = 0; i < buf.length; ++i) { + str += percentEncode(buf[i]); + } + + return str; +} + +function utf8PercentDecode(str) { + const input = new Buffer(str); + const output = []; + for (let i = 0; i < input.length; ++i) { + if (input[i] !== 37) { + output.push(input[i]); + } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { + output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); + i += 2; + } else { + output.push(input[i]); + } + } + return new Buffer(output).toString(); +} + +function isC0ControlPercentEncode(c) { + return c <= 0x1F || c > 0x7E; +} + +const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); +function isPathPercentEncode(c) { + return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); +} + +const extraUserinfoPercentEncodeSet = + new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); +function isUserinfoPercentEncode(c) { + return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); +} + +function percentEncodeChar(c, encodeSetPredicate) { + const cStr = String.fromCodePoint(c); + + if (encodeSetPredicate(c)) { + return utf8PercentEncode(cStr); + } + + return cStr; +} + +function parseIPv4Number(input) { + let R = 10; + + if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { + input = input.substring(2); + R = 16; + } else if (input.length >= 2 && input.charAt(0) === "0") { + input = input.substring(1); + R = 8; + } + + if (input === "") { + return 0; + } + + const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); + if (regex.test(input)) { + return failure; + } + + return parseInt(input, R); +} + +function parseIPv4(input) { + const parts = input.split("."); + if (parts[parts.length - 1] === "") { + if (parts.length > 1) { + parts.pop(); + } + } + + if (parts.length > 4) { + return input; + } + + const numbers = []; + for (const part of parts) { + if (part === "") { + return input; + } + const n = parseIPv4Number(part); + if (n === failure) { + return input; + } + + numbers.push(n); + } + + for (let i = 0; i < numbers.length - 1; ++i) { + if (numbers[i] > 255) { + return failure; + } + } + if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { + return failure; + } + + let ipv4 = numbers.pop(); + let counter = 0; + + for (const n of numbers) { + ipv4 += n * Math.pow(256, 3 - counter); + ++counter; + } + + return ipv4; +} + +function serializeIPv4(address) { + let output = ""; + let n = address; + + for (let i = 1; i <= 4; ++i) { + output = String(n % 256) + output; + if (i !== 4) { + output = "." + output; + } + n = Math.floor(n / 256); + } + + return output; +} + +function parseIPv6(input) { + const address = [0, 0, 0, 0, 0, 0, 0, 0]; + let pieceIndex = 0; + let compress = null; + let pointer = 0; + + input = punycode.ucs2.decode(input); + + if (input[pointer] === 58) { + if (input[pointer + 1] !== 58) { + return failure; + } + + pointer += 2; + ++pieceIndex; + compress = pieceIndex; + } + + while (pointer < input.length) { + if (pieceIndex === 8) { + return failure; + } + + if (input[pointer] === 58) { + if (compress !== null) { + return failure; + } + ++pointer; + ++pieceIndex; + compress = pieceIndex; + continue; + } + + let value = 0; + let length = 0; + + while (length < 4 && isASCIIHex(input[pointer])) { + value = value * 0x10 + parseInt(at(input, pointer), 16); + ++pointer; + ++length; + } + + if (input[pointer] === 46) { + if (length === 0) { + return failure; + } + + pointer -= length; + + if (pieceIndex > 6) { + return failure; + } + + let numbersSeen = 0; + + while (input[pointer] !== undefined) { + let ipv4Piece = null; + + if (numbersSeen > 0) { + if (input[pointer] === 46 && numbersSeen < 4) { + ++pointer; + } else { + return failure; + } + } + + if (!isASCIIDigit(input[pointer])) { + return failure; + } + + while (isASCIIDigit(input[pointer])) { + const number = parseInt(at(input, pointer)); + if (ipv4Piece === null) { + ipv4Piece = number; + } else if (ipv4Piece === 0) { + return failure; + } else { + ipv4Piece = ipv4Piece * 10 + number; + } + if (ipv4Piece > 255) { + return failure; + } + ++pointer; + } + + address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; + + ++numbersSeen; + + if (numbersSeen === 2 || numbersSeen === 4) { + ++pieceIndex; + } + } + + if (numbersSeen !== 4) { + return failure; + } + + break; + } else if (input[pointer] === 58) { + ++pointer; + if (input[pointer] === undefined) { + return failure; + } + } else if (input[pointer] !== undefined) { + return failure; + } + + address[pieceIndex] = value; + ++pieceIndex; + } + + if (compress !== null) { + let swaps = pieceIndex - compress; + pieceIndex = 7; + while (pieceIndex !== 0 && swaps > 0) { + const temp = address[compress + swaps - 1]; + address[compress + swaps - 1] = address[pieceIndex]; + address[pieceIndex] = temp; + --pieceIndex; + --swaps; + } + } else if (compress === null && pieceIndex !== 8) { + return failure; + } + + return address; +} + +function serializeIPv6(address) { + let output = ""; + const seqResult = findLongestZeroSequence(address); + const compress = seqResult.idx; + let ignore0 = false; + + for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { + if (ignore0 && address[pieceIndex] === 0) { + continue; + } else if (ignore0) { + ignore0 = false; + } + + if (compress === pieceIndex) { + const separator = pieceIndex === 0 ? "::" : ":"; + output += separator; + ignore0 = true; + continue; + } + + output += address[pieceIndex].toString(16); + + if (pieceIndex !== 7) { + output += ":"; + } + } + + return output; +} + +function parseHost(input, isSpecialArg) { + if (input[0] === "[") { + if (input[input.length - 1] !== "]") { + return failure; + } + + return parseIPv6(input.substring(1, input.length - 1)); + } + + if (!isSpecialArg) { + return parseOpaqueHost(input); + } + + const domain = utf8PercentDecode(input); + const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); + if (asciiDomain === null) { + return failure; + } + + if (containsForbiddenHostCodePoint(asciiDomain)) { + return failure; + } + + const ipv4Host = parseIPv4(asciiDomain); + if (typeof ipv4Host === "number" || ipv4Host === failure) { + return ipv4Host; + } + + return asciiDomain; +} + +function parseOpaqueHost(input) { + if (containsForbiddenHostCodePointExcludingPercent(input)) { + return failure; + } + + let output = ""; + const decoded = punycode.ucs2.decode(input); + for (let i = 0; i < decoded.length; ++i) { + output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); + } + return output; +} + +function findLongestZeroSequence(arr) { + let maxIdx = null; + let maxLen = 1; // only find elements > 1 + let currStart = null; + let currLen = 0; + + for (let i = 0; i < arr.length; ++i) { + if (arr[i] !== 0) { + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + currStart = null; + currLen = 0; + } else { + if (currStart === null) { + currStart = i; + } + ++currLen; + } + } + + // if trailing zeros + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + return { + idx: maxIdx, + len: maxLen + }; +} + +function serializeHost(host) { + if (typeof host === "number") { + return serializeIPv4(host); + } + + // IPv6 serializer + if (host instanceof Array) { + return "[" + serializeIPv6(host) + "]"; + } + + return host; +} + +function trimControlChars(url) { + return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); +} + +function trimTabAndNewline(url) { + return url.replace(/\u0009|\u000A|\u000D/g, ""); +} + +function shortenPath(url) { + const path = url.path; + if (path.length === 0) { + return; + } + if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { + return; + } + + path.pop(); +} + +function includesCredentials(url) { + return url.username !== "" || url.password !== ""; +} + +function cannotHaveAUsernamePasswordPort(url) { + return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; +} + +function isNormalizedWindowsDriveLetter(string) { + return /^[A-Za-z]:$/.test(string); +} + +function URLStateMachine(input, base, encodingOverride, url, stateOverride) { + this.pointer = 0; + this.input = input; + this.base = base || null; + this.encodingOverride = encodingOverride || "utf-8"; + this.stateOverride = stateOverride; + this.url = url; + this.failure = false; + this.parseError = false; + + if (!this.url) { + this.url = { + scheme: "", + username: "", + password: "", + host: null, + port: null, + path: [], + query: null, + fragment: null, + + cannotBeABaseURL: false + }; + + const res = trimControlChars(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + } + + const res = trimTabAndNewline(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + + this.state = stateOverride || "scheme start"; + + this.buffer = ""; + this.atFlag = false; + this.arrFlag = false; + this.passwordTokenSeenFlag = false; + + this.input = punycode.ucs2.decode(this.input); + + for (; this.pointer <= this.input.length; ++this.pointer) { + const c = this.input[this.pointer]; + const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); + + // exec state machine + const ret = this["parse " + this.state](c, cStr); + if (!ret) { + break; // terminate algorithm + } else if (ret === failure) { + this.failure = true; + break; + } + } +} + +URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { + if (isASCIIAlpha(c)) { + this.buffer += cStr.toLowerCase(); + this.state = "scheme"; + } else if (!this.stateOverride) { + this.state = "no scheme"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { + if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { + this.buffer += cStr.toLowerCase(); + } else if (c === 58) { + if (this.stateOverride) { + if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { + return false; + } + + if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { + return false; + } + + if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { + return false; + } + + if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { + return false; + } + } + this.url.scheme = this.buffer; + this.buffer = ""; + if (this.stateOverride) { + return false; + } + if (this.url.scheme === "file") { + if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { + this.parseError = true; + } + this.state = "file"; + } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { + this.state = "special relative or authority"; + } else if (isSpecial(this.url)) { + this.state = "special authority slashes"; + } else if (this.input[this.pointer + 1] === 47) { + this.state = "path or authority"; + ++this.pointer; + } else { + this.url.cannotBeABaseURL = true; + this.url.path.push(""); + this.state = "cannot-be-a-base-URL path"; + } + } else if (!this.stateOverride) { + this.buffer = ""; + this.state = "no scheme"; + this.pointer = -1; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { + if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { + return failure; + } else if (this.base.cannotBeABaseURL && c === 35) { + this.url.scheme = this.base.scheme; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.url.cannotBeABaseURL = true; + this.state = "fragment"; + } else if (this.base.scheme === "file") { + this.state = "file"; + --this.pointer; + } else { + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { + if (c === 47) { + this.state = "authority"; + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative"] = function parseRelative(c) { + this.url.scheme = this.base.scheme; + if (isNaN(c)) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 47) { + this.state = "relative slash"; + } else if (c === 63) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else if (isSpecial(this.url) && c === 92) { + this.parseError = true; + this.state = "relative slash"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(0, this.base.path.length - 1); + + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { + if (isSpecial(this.url) && (c === 47 || c === 92)) { + if (c === 92) { + this.parseError = true; + } + this.state = "special authority ignore slashes"; + } else if (c === 47) { + this.state = "authority"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "special authority ignore slashes"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { + if (c !== 47 && c !== 92) { + this.state = "authority"; + --this.pointer; + } else { + this.parseError = true; + } + + return true; +}; + +URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { + if (c === 64) { + this.parseError = true; + if (this.atFlag) { + this.buffer = "%40" + this.buffer; + } + this.atFlag = true; + + // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars + const len = countSymbols(this.buffer); + for (let pointer = 0; pointer < len; ++pointer) { + const codePoint = this.buffer.codePointAt(pointer); + + if (codePoint === 58 && !this.passwordTokenSeenFlag) { + this.passwordTokenSeenFlag = true; + continue; + } + const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); + if (this.passwordTokenSeenFlag) { + this.url.password += encodedCodePoints; + } else { + this.url.username += encodedCodePoints; + } + } + this.buffer = ""; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + if (this.atFlag && this.buffer === "") { + this.parseError = true; + return failure; + } + this.pointer -= countSymbols(this.buffer) + 1; + this.buffer = ""; + this.state = "host"; + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse hostname"] = +URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { + if (this.stateOverride && this.url.scheme === "file") { + --this.pointer; + this.state = "file host"; + } else if (c === 58 && !this.arrFlag) { + if (this.buffer === "") { + this.parseError = true; + return failure; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "port"; + if (this.stateOverride === "hostname") { + return false; + } + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + --this.pointer; + if (isSpecial(this.url) && this.buffer === "") { + this.parseError = true; + return failure; + } else if (this.stateOverride && this.buffer === "" && + (includesCredentials(this.url) || this.url.port !== null)) { + this.parseError = true; + return false; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "path start"; + if (this.stateOverride) { + return false; + } + } else { + if (c === 91) { + this.arrFlag = true; + } else if (c === 93) { + this.arrFlag = false; + } + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { + if (isASCIIDigit(c)) { + this.buffer += cStr; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92) || + this.stateOverride) { + if (this.buffer !== "") { + const port = parseInt(this.buffer); + if (port > Math.pow(2, 16) - 1) { + this.parseError = true; + return failure; + } + this.url.port = port === defaultPort(this.url.scheme) ? null : port; + this.buffer = ""; + } + if (this.stateOverride) { + return false; + } + this.state = "path start"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); + +URLStateMachine.prototype["parse file"] = function parseFile(c) { + this.url.scheme = "file"; + + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file slash"; + } else if (this.base !== null && this.base.scheme === "file") { + if (isNaN(c)) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 63) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else { + if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points + !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || + (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points + !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + shortenPath(this.url); + } else { + this.parseError = true; + } + + this.state = "path"; + --this.pointer; + } + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file host"; + } else { + if (this.base !== null && this.base.scheme === "file") { + if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { + this.url.path.push(this.base.path[0]); + } else { + this.url.host = this.base.host; + } + } + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { + if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { + --this.pointer; + if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { + this.parseError = true; + this.state = "path"; + } else if (this.buffer === "") { + this.url.host = ""; + if (this.stateOverride) { + return false; + } + this.state = "path start"; + } else { + let host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + if (host === "localhost") { + host = ""; + } + this.url.host = host; + + if (this.stateOverride) { + return false; + } + + this.buffer = ""; + this.state = "path start"; + } + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { + if (isSpecial(this.url)) { + if (c === 92) { + this.parseError = true; + } + this.state = "path"; + + if (c !== 47 && c !== 92) { + --this.pointer; + } + } else if (!this.stateOverride && c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (!this.stateOverride && c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else if (c !== undefined) { + this.state = "path"; + if (c !== 47) { + --this.pointer; + } + } + + return true; +}; + +URLStateMachine.prototype["parse path"] = function parsePath(c) { + if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || + (!this.stateOverride && (c === 63 || c === 35))) { + if (isSpecial(this.url) && c === 92) { + this.parseError = true; + } + + if (isDoubleDot(this.buffer)) { + shortenPath(this.url); + if (c !== 47 && !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } + } else if (isSingleDot(this.buffer) && c !== 47 && + !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } else if (!isSingleDot(this.buffer)) { + if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { + if (this.url.host !== "" && this.url.host !== null) { + this.parseError = true; + this.url.host = ""; + } + this.buffer = this.buffer[0] + ":"; + } + this.url.path.push(this.buffer); + } + this.buffer = ""; + if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { + while (this.url.path.length > 1 && this.url.path[0] === "") { + this.parseError = true; + this.url.path.shift(); + } + } + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += percentEncodeChar(c, isPathPercentEncode); + } + + return true; +}; + +URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else { + // TODO: Add: not a URL code point + if (!isNaN(c) && c !== 37) { + this.parseError = true; + } + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + if (!isNaN(c)) { + this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); + } + } + + return true; +}; + +URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { + if (isNaN(c) || (!this.stateOverride && c === 35)) { + if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { + this.encodingOverride = "utf-8"; + } + + const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead + for (let i = 0; i < buffer.length; ++i) { + if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || + buffer[i] === 0x3C || buffer[i] === 0x3E) { + this.url.query += percentEncode(buffer[i]); + } else { + this.url.query += String.fromCodePoint(buffer[i]); + } + } + + this.buffer = ""; + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { + if (isNaN(c)) { // do nothing + } else if (c === 0x0) { + this.parseError = true; + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); + } + + return true; +}; + +function serializeURL(url, excludeFragment) { + let output = url.scheme + ":"; + if (url.host !== null) { + output += "//"; + + if (url.username !== "" || url.password !== "") { + output += url.username; + if (url.password !== "") { + output += ":" + url.password; + } + output += "@"; + } + + output += serializeHost(url.host); + + if (url.port !== null) { + output += ":" + url.port; + } + } else if (url.host === null && url.scheme === "file") { + output += "//"; + } + + if (url.cannotBeABaseURL) { + output += url.path[0]; + } else { + for (const string of url.path) { + output += "/" + string; + } + } + + if (url.query !== null) { + output += "?" + url.query; + } + + if (!excludeFragment && url.fragment !== null) { + output += "#" + url.fragment; + } + + return output; +} + +function serializeOrigin(tuple) { + let result = tuple.scheme + "://"; + result += serializeHost(tuple.host); + + if (tuple.port !== null) { + result += ":" + tuple.port; + } + + return result; +} + +module.exports.serializeURL = serializeURL; + +module.exports.serializeURLOrigin = function (url) { + // https://url.spec.whatwg.org/#concept-url-origin + switch (url.scheme) { + case "blob": + try { + return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); + } catch (e) { + // serializing an opaque origin returns "null" + return "null"; + } + case "ftp": + case "gopher": + case "http": + case "https": + case "ws": + case "wss": + return serializeOrigin({ + scheme: url.scheme, + host: url.host, + port: url.port + }); + case "file": + // spec says "exercise to the reader", chrome says "file://" + return "file://"; + default: + // serializing an opaque origin returns "null" + return "null"; + } +}; + +module.exports.basicURLParse = function (input, options) { + if (options === undefined) { + options = {}; + } + + const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); + if (usm.failure) { + return "failure"; + } + + return usm.url; +}; + +module.exports.setTheUsername = function (url, username) { + url.username = ""; + const decoded = punycode.ucs2.decode(username); + for (let i = 0; i < decoded.length; ++i) { + url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.setThePassword = function (url, password) { + url.password = ""; + const decoded = punycode.ucs2.decode(password); + for (let i = 0; i < decoded.length; ++i) { + url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.serializeHost = serializeHost; + +module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; + +module.exports.serializeInteger = function (integer) { + return String(integer); +}; + +module.exports.parseURL = function (input, options) { + if (options === undefined) { + options = {}; + } + + // We don't handle blobs, so this just delegates: + return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); +}; + + +/***/ }), + +/***/ 276: +/***/ ((module) => { + +"use strict"; + + +module.exports.mixin = function mixin(target, source) { + const keys = Object.getOwnPropertyNames(source); + for (let i = 0; i < keys.length; ++i) { + Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i])); + } +}; + +module.exports.wrapperSymbol = Symbol("wrapper"); +module.exports.implSymbol = Symbol("impl"); + +module.exports.wrapperForImpl = function (impl) { + return impl[module.exports.wrapperSymbol]; +}; + +module.exports.implForWrapper = function (wrapper) { + return wrapper[module.exports.implSymbol]; +}; + + + +/***/ }), + +/***/ 1223: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var wrappy = __nccwpck_require__(2940) +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) + + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) + +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f +} + +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f +} + + +/***/ }), + +/***/ 4294: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +module.exports = __nccwpck_require__(4219); + + +/***/ }), + +/***/ 4219: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +var net = __nccwpck_require__(1808); +var tls = __nccwpck_require__(4404); +var http = __nccwpck_require__(3685); +var https = __nccwpck_require__(5687); +var events = __nccwpck_require__(2361); +var assert = __nccwpck_require__(9491); +var util = __nccwpck_require__(3837); + + +exports.httpOverHttp = httpOverHttp; +exports.httpsOverHttp = httpsOverHttp; +exports.httpOverHttps = httpOverHttps; +exports.httpsOverHttps = httpsOverHttps; + + +function httpOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + return agent; +} + +function httpsOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; +} + +function httpOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + return agent; +} + +function httpsOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; +} + + +function TunnelingAgent(options) { + var self = this; + self.options = options || {}; + self.proxyOptions = self.options.proxy || {}; + self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; + self.requests = []; + self.sockets = []; + + self.on('free', function onFree(socket, host, port, localAddress) { + var options = toOptions(host, port, localAddress); + for (var i = 0, len = self.requests.length; i < len; ++i) { + var pending = self.requests[i]; + if (pending.host === options.host && pending.port === options.port) { + // Detect the request to connect same origin server, + // reuse the connection. + self.requests.splice(i, 1); + pending.request.onSocket(socket); + return; + } + } + socket.destroy(); + self.removeSocket(socket); + }); +} +util.inherits(TunnelingAgent, events.EventEmitter); + +TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { + var self = this; + var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress)); + + if (self.sockets.length >= this.maxSockets) { + // We are over limit so we'll add it to the queue. + self.requests.push(options); + return; + } + + // If we are under maxSockets create a new one. + self.createSocket(options, function(socket) { + socket.on('free', onFree); + socket.on('close', onCloseOrRemove); + socket.on('agentRemove', onCloseOrRemove); + req.onSocket(socket); + + function onFree() { + self.emit('free', socket, options); + } + + function onCloseOrRemove(err) { + self.removeSocket(socket); + socket.removeListener('free', onFree); + socket.removeListener('close', onCloseOrRemove); + socket.removeListener('agentRemove', onCloseOrRemove); + } + }); +}; + +TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { + var self = this; + var placeholder = {}; + self.sockets.push(placeholder); + + var connectOptions = mergeOptions({}, self.proxyOptions, { + method: 'CONNECT', + path: options.host + ':' + options.port, + agent: false, + headers: { + host: options.host + ':' + options.port + } + }); + if (options.localAddress) { + connectOptions.localAddress = options.localAddress; + } + if (connectOptions.proxyAuth) { + connectOptions.headers = connectOptions.headers || {}; + connectOptions.headers['Proxy-Authorization'] = 'Basic ' + + new Buffer(connectOptions.proxyAuth).toString('base64'); + } + + debug('making CONNECT request'); + var connectReq = self.request(connectOptions); + connectReq.useChunkedEncodingByDefault = false; // for v0.6 + connectReq.once('response', onResponse); // for v0.6 + connectReq.once('upgrade', onUpgrade); // for v0.6 + connectReq.once('connect', onConnect); // for v0.7 or later + connectReq.once('error', onError); + connectReq.end(); + + function onResponse(res) { + // Very hacky. This is necessary to avoid http-parser leaks. + res.upgrade = true; + } + + function onUpgrade(res, socket, head) { + // Hacky. + process.nextTick(function() { + onConnect(res, socket, head); + }); + } + + function onConnect(res, socket, head) { + connectReq.removeAllListeners(); + socket.removeAllListeners(); + + if (res.statusCode !== 200) { + debug('tunneling socket could not be established, statusCode=%d', + res.statusCode); + socket.destroy(); + var error = new Error('tunneling socket could not be established, ' + + 'statusCode=' + res.statusCode); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; + } + if (head.length > 0) { + debug('got illegal response body from proxy'); + socket.destroy(); + var error = new Error('got illegal response body from proxy'); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; + } + debug('tunneling connection has established'); + self.sockets[self.sockets.indexOf(placeholder)] = socket; + return cb(socket); + } + + function onError(cause) { + connectReq.removeAllListeners(); + + debug('tunneling socket could not be established, cause=%s\n', + cause.message, cause.stack); + var error = new Error('tunneling socket could not be established, ' + + 'cause=' + cause.message); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + } +}; + +TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { + var pos = this.sockets.indexOf(socket) + if (pos === -1) { + return; + } + this.sockets.splice(pos, 1); + + var pending = this.requests.shift(); + if (pending) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createSocket(pending, function(socket) { + pending.request.onSocket(socket); + }); + } +}; + +function createSecureSocket(options, cb) { + var self = this; + TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + var hostHeader = options.request.getHeader('host'); + var tlsOptions = mergeOptions({}, self.options, { + socket: socket, + servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host + }); + + // 0 is dummy port for v0.6 + var secureSocket = tls.connect(0, tlsOptions); + self.sockets[self.sockets.indexOf(socket)] = secureSocket; + cb(secureSocket); + }); +} + + +function toOptions(host, port, localAddress) { + if (typeof host === 'string') { // since v0.10 + return { + host: host, + port: port, + localAddress: localAddress + }; + } + return host; // for v0.11 or later +} + +function mergeOptions(target) { + for (var i = 1, len = arguments.length; i < len; ++i) { + var overrides = arguments[i]; + if (typeof overrides === 'object') { + var keys = Object.keys(overrides); + for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { + var k = keys[j]; + if (overrides[k] !== undefined) { + target[k] = overrides[k]; + } + } + } + } + return target; +} + + +var debug; +if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { + debug = function() { + var args = Array.prototype.slice.call(arguments); + if (typeof args[0] === 'string') { + args[0] = 'TUNNEL: ' + args[0]; + } else { + args.unshift('TUNNEL:'); + } + console.error.apply(console, args); + } +} else { + debug = function() {}; +} +exports.debug = debug; // for test + + +/***/ }), + +/***/ 5030: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function getUserAgent() { + if (typeof navigator === "object" && "userAgent" in navigator) { + return navigator.userAgent; + } + + if (typeof process === "object" && "version" in process) { + return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`; + } + + return ""; +} + +exports.getUserAgent = getUserAgent; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 1452: +/***/ (function(__unused_webpack_module, exports) { + +/** + * web-streams-polyfill v3.2.1 + */ +(function (global, factory) { + true ? factory(exports) : + 0; +}(this, (function (exports) { 'use strict'; + + /// + const SymbolPolyfill = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? + Symbol : + description => `Symbol(${description})`; + + /// + function noop() { + return undefined; + } + function getGlobals() { + if (typeof self !== 'undefined') { + return self; + } + else if (typeof window !== 'undefined') { + return window; + } + else if (typeof global !== 'undefined') { + return global; + } + return undefined; + } + const globals = getGlobals(); + + function typeIsObject(x) { + return (typeof x === 'object' && x !== null) || typeof x === 'function'; + } + const rethrowAssertionErrorRejection = noop; + + const originalPromise = Promise; + const originalPromiseThen = Promise.prototype.then; + const originalPromiseResolve = Promise.resolve.bind(originalPromise); + const originalPromiseReject = Promise.reject.bind(originalPromise); + function newPromise(executor) { + return new originalPromise(executor); + } + function promiseResolvedWith(value) { + return originalPromiseResolve(value); + } + function promiseRejectedWith(reason) { + return originalPromiseReject(reason); + } + function PerformPromiseThen(promise, onFulfilled, onRejected) { + // There doesn't appear to be any way to correctly emulate the behaviour from JavaScript, so this is just an + // approximation. + return originalPromiseThen.call(promise, onFulfilled, onRejected); + } + function uponPromise(promise, onFulfilled, onRejected) { + PerformPromiseThen(PerformPromiseThen(promise, onFulfilled, onRejected), undefined, rethrowAssertionErrorRejection); + } + function uponFulfillment(promise, onFulfilled) { + uponPromise(promise, onFulfilled); + } + function uponRejection(promise, onRejected) { + uponPromise(promise, undefined, onRejected); + } + function transformPromiseWith(promise, fulfillmentHandler, rejectionHandler) { + return PerformPromiseThen(promise, fulfillmentHandler, rejectionHandler); + } + function setPromiseIsHandledToTrue(promise) { + PerformPromiseThen(promise, undefined, rethrowAssertionErrorRejection); + } + const queueMicrotask = (() => { + const globalQueueMicrotask = globals && globals.queueMicrotask; + if (typeof globalQueueMicrotask === 'function') { + return globalQueueMicrotask; + } + const resolvedPromise = promiseResolvedWith(undefined); + return (fn) => PerformPromiseThen(resolvedPromise, fn); + })(); + function reflectCall(F, V, args) { + if (typeof F !== 'function') { + throw new TypeError('Argument is not a function'); + } + return Function.prototype.apply.call(F, V, args); + } + function promiseCall(F, V, args) { + try { + return promiseResolvedWith(reflectCall(F, V, args)); + } + catch (value) { + return promiseRejectedWith(value); + } + } + + // Original from Chromium + // https://chromium.googlesource.com/chromium/src/+/0aee4434a4dba42a42abaea9bfbc0cd196a63bc1/third_party/blink/renderer/core/streams/SimpleQueue.js + const QUEUE_MAX_ARRAY_SIZE = 16384; + /** + * Simple queue structure. + * + * Avoids scalability issues with using a packed array directly by using + * multiple arrays in a linked list and keeping the array size bounded. + */ + class SimpleQueue { + constructor() { + this._cursor = 0; + this._size = 0; + // _front and _back are always defined. + this._front = { + _elements: [], + _next: undefined + }; + this._back = this._front; + // The cursor is used to avoid calling Array.shift(). + // It contains the index of the front element of the array inside the + // front-most node. It is always in the range [0, QUEUE_MAX_ARRAY_SIZE). + this._cursor = 0; + // When there is only one node, size === elements.length - cursor. + this._size = 0; + } + get length() { + return this._size; + } + // For exception safety, this method is structured in order: + // 1. Read state + // 2. Calculate required state mutations + // 3. Perform state mutations + push(element) { + const oldBack = this._back; + let newBack = oldBack; + if (oldBack._elements.length === QUEUE_MAX_ARRAY_SIZE - 1) { + newBack = { + _elements: [], + _next: undefined + }; + } + // push() is the mutation most likely to throw an exception, so it + // goes first. + oldBack._elements.push(element); + if (newBack !== oldBack) { + this._back = newBack; + oldBack._next = newBack; + } + ++this._size; + } + // Like push(), shift() follows the read -> calculate -> mutate pattern for + // exception safety. + shift() { // must not be called on an empty queue + const oldFront = this._front; + let newFront = oldFront; + const oldCursor = this._cursor; + let newCursor = oldCursor + 1; + const elements = oldFront._elements; + const element = elements[oldCursor]; + if (newCursor === QUEUE_MAX_ARRAY_SIZE) { + newFront = oldFront._next; + newCursor = 0; + } + // No mutations before this point. + --this._size; + this._cursor = newCursor; + if (oldFront !== newFront) { + this._front = newFront; + } + // Permit shifted element to be garbage collected. + elements[oldCursor] = undefined; + return element; + } + // The tricky thing about forEach() is that it can be called + // re-entrantly. The queue may be mutated inside the callback. It is easy to + // see that push() within the callback has no negative effects since the end + // of the queue is checked for on every iteration. If shift() is called + // repeatedly within the callback then the next iteration may return an + // element that has been removed. In this case the callback will be called + // with undefined values until we either "catch up" with elements that still + // exist or reach the back of the queue. + forEach(callback) { + let i = this._cursor; + let node = this._front; + let elements = node._elements; + while (i !== elements.length || node._next !== undefined) { + if (i === elements.length) { + node = node._next; + elements = node._elements; + i = 0; + if (elements.length === 0) { + break; + } + } + callback(elements[i]); + ++i; + } + } + // Return the element that would be returned if shift() was called now, + // without modifying the queue. + peek() { // must not be called on an empty queue + const front = this._front; + const cursor = this._cursor; + return front._elements[cursor]; + } + } + + function ReadableStreamReaderGenericInitialize(reader, stream) { + reader._ownerReadableStream = stream; + stream._reader = reader; + if (stream._state === 'readable') { + defaultReaderClosedPromiseInitialize(reader); + } + else if (stream._state === 'closed') { + defaultReaderClosedPromiseInitializeAsResolved(reader); + } + else { + defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError); + } + } + // A client of ReadableStreamDefaultReader and ReadableStreamBYOBReader may use these functions directly to bypass state + // check. + function ReadableStreamReaderGenericCancel(reader, reason) { + const stream = reader._ownerReadableStream; + return ReadableStreamCancel(stream, reason); + } + function ReadableStreamReaderGenericRelease(reader) { + if (reader._ownerReadableStream._state === 'readable') { + defaultReaderClosedPromiseReject(reader, new TypeError(`Reader was released and can no longer be used to monitor the stream's closedness`)); + } + else { + defaultReaderClosedPromiseResetToRejected(reader, new TypeError(`Reader was released and can no longer be used to monitor the stream's closedness`)); + } + reader._ownerReadableStream._reader = undefined; + reader._ownerReadableStream = undefined; + } + // Helper functions for the readers. + function readerLockException(name) { + return new TypeError('Cannot ' + name + ' a stream using a released reader'); + } + // Helper functions for the ReadableStreamDefaultReader. + function defaultReaderClosedPromiseInitialize(reader) { + reader._closedPromise = newPromise((resolve, reject) => { + reader._closedPromise_resolve = resolve; + reader._closedPromise_reject = reject; + }); + } + function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) { + defaultReaderClosedPromiseInitialize(reader); + defaultReaderClosedPromiseReject(reader, reason); + } + function defaultReaderClosedPromiseInitializeAsResolved(reader) { + defaultReaderClosedPromiseInitialize(reader); + defaultReaderClosedPromiseResolve(reader); + } + function defaultReaderClosedPromiseReject(reader, reason) { + if (reader._closedPromise_reject === undefined) { + return; + } + setPromiseIsHandledToTrue(reader._closedPromise); + reader._closedPromise_reject(reason); + reader._closedPromise_resolve = undefined; + reader._closedPromise_reject = undefined; + } + function defaultReaderClosedPromiseResetToRejected(reader, reason) { + defaultReaderClosedPromiseInitializeAsRejected(reader, reason); + } + function defaultReaderClosedPromiseResolve(reader) { + if (reader._closedPromise_resolve === undefined) { + return; + } + reader._closedPromise_resolve(undefined); + reader._closedPromise_resolve = undefined; + reader._closedPromise_reject = undefined; + } + + const AbortSteps = SymbolPolyfill('[[AbortSteps]]'); + const ErrorSteps = SymbolPolyfill('[[ErrorSteps]]'); + const CancelSteps = SymbolPolyfill('[[CancelSteps]]'); + const PullSteps = SymbolPolyfill('[[PullSteps]]'); + + /// + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite#Polyfill + const NumberIsFinite = Number.isFinite || function (x) { + return typeof x === 'number' && isFinite(x); + }; + + /// + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc#Polyfill + const MathTrunc = Math.trunc || function (v) { + return v < 0 ? Math.ceil(v) : Math.floor(v); + }; + + // https://heycam.github.io/webidl/#idl-dictionaries + function isDictionary(x) { + return typeof x === 'object' || typeof x === 'function'; + } + function assertDictionary(obj, context) { + if (obj !== undefined && !isDictionary(obj)) { + throw new TypeError(`${context} is not an object.`); + } + } + // https://heycam.github.io/webidl/#idl-callback-functions + function assertFunction(x, context) { + if (typeof x !== 'function') { + throw new TypeError(`${context} is not a function.`); + } + } + // https://heycam.github.io/webidl/#idl-object + function isObject(x) { + return (typeof x === 'object' && x !== null) || typeof x === 'function'; + } + function assertObject(x, context) { + if (!isObject(x)) { + throw new TypeError(`${context} is not an object.`); + } + } + function assertRequiredArgument(x, position, context) { + if (x === undefined) { + throw new TypeError(`Parameter ${position} is required in '${context}'.`); + } + } + function assertRequiredField(x, field, context) { + if (x === undefined) { + throw new TypeError(`${field} is required in '${context}'.`); + } + } + // https://heycam.github.io/webidl/#idl-unrestricted-double + function convertUnrestrictedDouble(value) { + return Number(value); + } + function censorNegativeZero(x) { + return x === 0 ? 0 : x; + } + function integerPart(x) { + return censorNegativeZero(MathTrunc(x)); + } + // https://heycam.github.io/webidl/#idl-unsigned-long-long + function convertUnsignedLongLongWithEnforceRange(value, context) { + const lowerBound = 0; + const upperBound = Number.MAX_SAFE_INTEGER; + let x = Number(value); + x = censorNegativeZero(x); + if (!NumberIsFinite(x)) { + throw new TypeError(`${context} is not a finite number`); + } + x = integerPart(x); + if (x < lowerBound || x > upperBound) { + throw new TypeError(`${context} is outside the accepted range of ${lowerBound} to ${upperBound}, inclusive`); + } + if (!NumberIsFinite(x) || x === 0) { + return 0; + } + // TODO Use BigInt if supported? + // let xBigInt = BigInt(integerPart(x)); + // xBigInt = BigInt.asUintN(64, xBigInt); + // return Number(xBigInt); + return x; + } + + function assertReadableStream(x, context) { + if (!IsReadableStream(x)) { + throw new TypeError(`${context} is not a ReadableStream.`); + } + } + + // Abstract operations for the ReadableStream. + function AcquireReadableStreamDefaultReader(stream) { + return new ReadableStreamDefaultReader(stream); + } + // ReadableStream API exposed for controllers. + function ReadableStreamAddReadRequest(stream, readRequest) { + stream._reader._readRequests.push(readRequest); + } + function ReadableStreamFulfillReadRequest(stream, chunk, done) { + const reader = stream._reader; + const readRequest = reader._readRequests.shift(); + if (done) { + readRequest._closeSteps(); + } + else { + readRequest._chunkSteps(chunk); + } + } + function ReadableStreamGetNumReadRequests(stream) { + return stream._reader._readRequests.length; + } + function ReadableStreamHasDefaultReader(stream) { + const reader = stream._reader; + if (reader === undefined) { + return false; + } + if (!IsReadableStreamDefaultReader(reader)) { + return false; + } + return true; + } + /** + * A default reader vended by a {@link ReadableStream}. + * + * @public + */ + class ReadableStreamDefaultReader { + constructor(stream) { + assertRequiredArgument(stream, 1, 'ReadableStreamDefaultReader'); + assertReadableStream(stream, 'First parameter'); + if (IsReadableStreamLocked(stream)) { + throw new TypeError('This stream has already been locked for exclusive reading by another reader'); + } + ReadableStreamReaderGenericInitialize(this, stream); + this._readRequests = new SimpleQueue(); + } + /** + * Returns a promise that will be fulfilled when the stream becomes closed, + * or rejected if the stream ever errors or the reader's lock is released before the stream finishes closing. + */ + get closed() { + if (!IsReadableStreamDefaultReader(this)) { + return promiseRejectedWith(defaultReaderBrandCheckException('closed')); + } + return this._closedPromise; + } + /** + * If the reader is active, behaves the same as {@link ReadableStream.cancel | stream.cancel(reason)}. + */ + cancel(reason = undefined) { + if (!IsReadableStreamDefaultReader(this)) { + return promiseRejectedWith(defaultReaderBrandCheckException('cancel')); + } + if (this._ownerReadableStream === undefined) { + return promiseRejectedWith(readerLockException('cancel')); + } + return ReadableStreamReaderGenericCancel(this, reason); + } + /** + * Returns a promise that allows access to the next chunk from the stream's internal queue, if available. + * + * If reading a chunk causes the queue to become empty, more data will be pulled from the underlying source. + */ + read() { + if (!IsReadableStreamDefaultReader(this)) { + return promiseRejectedWith(defaultReaderBrandCheckException('read')); + } + if (this._ownerReadableStream === undefined) { + return promiseRejectedWith(readerLockException('read from')); + } + let resolvePromise; + let rejectPromise; + const promise = newPromise((resolve, reject) => { + resolvePromise = resolve; + rejectPromise = reject; + }); + const readRequest = { + _chunkSteps: chunk => resolvePromise({ value: chunk, done: false }), + _closeSteps: () => resolvePromise({ value: undefined, done: true }), + _errorSteps: e => rejectPromise(e) + }; + ReadableStreamDefaultReaderRead(this, readRequest); + return promise; + } + /** + * Releases the reader's lock on the corresponding stream. After the lock is released, the reader is no longer active. + * If the associated stream is errored when the lock is released, the reader will appear errored in the same way + * from now on; otherwise, the reader will appear closed. + * + * A reader's lock cannot be released while it still has a pending read request, i.e., if a promise returned by + * the reader's {@link ReadableStreamDefaultReader.read | read()} method has not yet been settled. Attempting to + * do so will throw a `TypeError` and leave the reader locked to the stream. + */ + releaseLock() { + if (!IsReadableStreamDefaultReader(this)) { + throw defaultReaderBrandCheckException('releaseLock'); + } + if (this._ownerReadableStream === undefined) { + return; + } + if (this._readRequests.length > 0) { + throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled'); + } + ReadableStreamReaderGenericRelease(this); + } + } + Object.defineProperties(ReadableStreamDefaultReader.prototype, { + cancel: { enumerable: true }, + read: { enumerable: true }, + releaseLock: { enumerable: true }, + closed: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamDefaultReader.prototype, SymbolPolyfill.toStringTag, { + value: 'ReadableStreamDefaultReader', + configurable: true + }); + } + // Abstract operations for the readers. + function IsReadableStreamDefaultReader(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) { + return false; + } + return x instanceof ReadableStreamDefaultReader; + } + function ReadableStreamDefaultReaderRead(reader, readRequest) { + const stream = reader._ownerReadableStream; + stream._disturbed = true; + if (stream._state === 'closed') { + readRequest._closeSteps(); + } + else if (stream._state === 'errored') { + readRequest._errorSteps(stream._storedError); + } + else { + stream._readableStreamController[PullSteps](readRequest); + } + } + // Helper functions for the ReadableStreamDefaultReader. + function defaultReaderBrandCheckException(name) { + return new TypeError(`ReadableStreamDefaultReader.prototype.${name} can only be used on a ReadableStreamDefaultReader`); + } + + /// + /* eslint-disable @typescript-eslint/no-empty-function */ + const AsyncIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf(async function* () { }).prototype); + + /// + class ReadableStreamAsyncIteratorImpl { + constructor(reader, preventCancel) { + this._ongoingPromise = undefined; + this._isFinished = false; + this._reader = reader; + this._preventCancel = preventCancel; + } + next() { + const nextSteps = () => this._nextSteps(); + this._ongoingPromise = this._ongoingPromise ? + transformPromiseWith(this._ongoingPromise, nextSteps, nextSteps) : + nextSteps(); + return this._ongoingPromise; + } + return(value) { + const returnSteps = () => this._returnSteps(value); + return this._ongoingPromise ? + transformPromiseWith(this._ongoingPromise, returnSteps, returnSteps) : + returnSteps(); + } + _nextSteps() { + if (this._isFinished) { + return Promise.resolve({ value: undefined, done: true }); + } + const reader = this._reader; + if (reader._ownerReadableStream === undefined) { + return promiseRejectedWith(readerLockException('iterate')); + } + let resolvePromise; + let rejectPromise; + const promise = newPromise((resolve, reject) => { + resolvePromise = resolve; + rejectPromise = reject; + }); + const readRequest = { + _chunkSteps: chunk => { + this._ongoingPromise = undefined; + // This needs to be delayed by one microtask, otherwise we stop pulling too early which breaks a test. + // FIXME Is this a bug in the specification, or in the test? + queueMicrotask(() => resolvePromise({ value: chunk, done: false })); + }, + _closeSteps: () => { + this._ongoingPromise = undefined; + this._isFinished = true; + ReadableStreamReaderGenericRelease(reader); + resolvePromise({ value: undefined, done: true }); + }, + _errorSteps: reason => { + this._ongoingPromise = undefined; + this._isFinished = true; + ReadableStreamReaderGenericRelease(reader); + rejectPromise(reason); + } + }; + ReadableStreamDefaultReaderRead(reader, readRequest); + return promise; + } + _returnSteps(value) { + if (this._isFinished) { + return Promise.resolve({ value, done: true }); + } + this._isFinished = true; + const reader = this._reader; + if (reader._ownerReadableStream === undefined) { + return promiseRejectedWith(readerLockException('finish iterating')); + } + if (!this._preventCancel) { + const result = ReadableStreamReaderGenericCancel(reader, value); + ReadableStreamReaderGenericRelease(reader); + return transformPromiseWith(result, () => ({ value, done: true })); + } + ReadableStreamReaderGenericRelease(reader); + return promiseResolvedWith({ value, done: true }); + } + } + const ReadableStreamAsyncIteratorPrototype = { + next() { + if (!IsReadableStreamAsyncIterator(this)) { + return promiseRejectedWith(streamAsyncIteratorBrandCheckException('next')); + } + return this._asyncIteratorImpl.next(); + }, + return(value) { + if (!IsReadableStreamAsyncIterator(this)) { + return promiseRejectedWith(streamAsyncIteratorBrandCheckException('return')); + } + return this._asyncIteratorImpl.return(value); + } + }; + if (AsyncIteratorPrototype !== undefined) { + Object.setPrototypeOf(ReadableStreamAsyncIteratorPrototype, AsyncIteratorPrototype); + } + // Abstract operations for the ReadableStream. + function AcquireReadableStreamAsyncIterator(stream, preventCancel) { + const reader = AcquireReadableStreamDefaultReader(stream); + const impl = new ReadableStreamAsyncIteratorImpl(reader, preventCancel); + const iterator = Object.create(ReadableStreamAsyncIteratorPrototype); + iterator._asyncIteratorImpl = impl; + return iterator; + } + function IsReadableStreamAsyncIterator(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_asyncIteratorImpl')) { + return false; + } + try { + // noinspection SuspiciousTypeOfGuard + return x._asyncIteratorImpl instanceof + ReadableStreamAsyncIteratorImpl; + } + catch (_a) { + return false; + } + } + // Helper functions for the ReadableStream. + function streamAsyncIteratorBrandCheckException(name) { + return new TypeError(`ReadableStreamAsyncIterator.${name} can only be used on a ReadableSteamAsyncIterator`); + } + + /// + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN#Polyfill + const NumberIsNaN = Number.isNaN || function (x) { + // eslint-disable-next-line no-self-compare + return x !== x; + }; + + function CreateArrayFromList(elements) { + // We use arrays to represent lists, so this is basically a no-op. + // Do a slice though just in case we happen to depend on the unique-ness. + return elements.slice(); + } + function CopyDataBlockBytes(dest, destOffset, src, srcOffset, n) { + new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset); + } + // Not implemented correctly + function TransferArrayBuffer(O) { + return O; + } + // Not implemented correctly + // eslint-disable-next-line @typescript-eslint/no-unused-vars + function IsDetachedBuffer(O) { + return false; + } + function ArrayBufferSlice(buffer, begin, end) { + // ArrayBuffer.prototype.slice is not available on IE10 + // https://www.caniuse.com/mdn-javascript_builtins_arraybuffer_slice + if (buffer.slice) { + return buffer.slice(begin, end); + } + const length = end - begin; + const slice = new ArrayBuffer(length); + CopyDataBlockBytes(slice, 0, buffer, begin, length); + return slice; + } + + function IsNonNegativeNumber(v) { + if (typeof v !== 'number') { + return false; + } + if (NumberIsNaN(v)) { + return false; + } + if (v < 0) { + return false; + } + return true; + } + function CloneAsUint8Array(O) { + const buffer = ArrayBufferSlice(O.buffer, O.byteOffset, O.byteOffset + O.byteLength); + return new Uint8Array(buffer); + } + + function DequeueValue(container) { + const pair = container._queue.shift(); + container._queueTotalSize -= pair.size; + if (container._queueTotalSize < 0) { + container._queueTotalSize = 0; + } + return pair.value; + } + function EnqueueValueWithSize(container, value, size) { + if (!IsNonNegativeNumber(size) || size === Infinity) { + throw new RangeError('Size must be a finite, non-NaN, non-negative number.'); + } + container._queue.push({ value, size }); + container._queueTotalSize += size; + } + function PeekQueueValue(container) { + const pair = container._queue.peek(); + return pair.value; + } + function ResetQueue(container) { + container._queue = new SimpleQueue(); + container._queueTotalSize = 0; + } + + /** + * A pull-into request in a {@link ReadableByteStreamController}. + * + * @public + */ + class ReadableStreamBYOBRequest { + constructor() { + throw new TypeError('Illegal constructor'); + } + /** + * Returns the view for writing in to, or `null` if the BYOB request has already been responded to. + */ + get view() { + if (!IsReadableStreamBYOBRequest(this)) { + throw byobRequestBrandCheckException('view'); + } + return this._view; + } + respond(bytesWritten) { + if (!IsReadableStreamBYOBRequest(this)) { + throw byobRequestBrandCheckException('respond'); + } + assertRequiredArgument(bytesWritten, 1, 'respond'); + bytesWritten = convertUnsignedLongLongWithEnforceRange(bytesWritten, 'First parameter'); + if (this._associatedReadableByteStreamController === undefined) { + throw new TypeError('This BYOB request has been invalidated'); + } + if (IsDetachedBuffer(this._view.buffer)) ; + ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten); + } + respondWithNewView(view) { + if (!IsReadableStreamBYOBRequest(this)) { + throw byobRequestBrandCheckException('respondWithNewView'); + } + assertRequiredArgument(view, 1, 'respondWithNewView'); + if (!ArrayBuffer.isView(view)) { + throw new TypeError('You can only respond with array buffer views'); + } + if (this._associatedReadableByteStreamController === undefined) { + throw new TypeError('This BYOB request has been invalidated'); + } + if (IsDetachedBuffer(view.buffer)) ; + ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view); + } + } + Object.defineProperties(ReadableStreamBYOBRequest.prototype, { + respond: { enumerable: true }, + respondWithNewView: { enumerable: true }, + view: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamBYOBRequest.prototype, SymbolPolyfill.toStringTag, { + value: 'ReadableStreamBYOBRequest', + configurable: true + }); + } + /** + * Allows control of a {@link ReadableStream | readable byte stream}'s state and internal queue. + * + * @public + */ + class ReadableByteStreamController { + constructor() { + throw new TypeError('Illegal constructor'); + } + /** + * Returns the current BYOB pull request, or `null` if there isn't one. + */ + get byobRequest() { + if (!IsReadableByteStreamController(this)) { + throw byteStreamControllerBrandCheckException('byobRequest'); + } + return ReadableByteStreamControllerGetBYOBRequest(this); + } + /** + * Returns the desired size to fill the controlled stream's internal queue. It can be negative, if the queue is + * over-full. An underlying byte source ought to use this information to determine when and how to apply backpressure. + */ + get desiredSize() { + if (!IsReadableByteStreamController(this)) { + throw byteStreamControllerBrandCheckException('desiredSize'); + } + return ReadableByteStreamControllerGetDesiredSize(this); + } + /** + * Closes the controlled readable stream. Consumers will still be able to read any previously-enqueued chunks from + * the stream, but once those are read, the stream will become closed. + */ + close() { + if (!IsReadableByteStreamController(this)) { + throw byteStreamControllerBrandCheckException('close'); + } + if (this._closeRequested) { + throw new TypeError('The stream has already been closed; do not close it again!'); + } + const state = this._controlledReadableByteStream._state; + if (state !== 'readable') { + throw new TypeError(`The stream (in ${state} state) is not in the readable state and cannot be closed`); + } + ReadableByteStreamControllerClose(this); + } + enqueue(chunk) { + if (!IsReadableByteStreamController(this)) { + throw byteStreamControllerBrandCheckException('enqueue'); + } + assertRequiredArgument(chunk, 1, 'enqueue'); + if (!ArrayBuffer.isView(chunk)) { + throw new TypeError('chunk must be an array buffer view'); + } + if (chunk.byteLength === 0) { + throw new TypeError('chunk must have non-zero byteLength'); + } + if (chunk.buffer.byteLength === 0) { + throw new TypeError(`chunk's buffer must have non-zero byteLength`); + } + if (this._closeRequested) { + throw new TypeError('stream is closed or draining'); + } + const state = this._controlledReadableByteStream._state; + if (state !== 'readable') { + throw new TypeError(`The stream (in ${state} state) is not in the readable state and cannot be enqueued to`); + } + ReadableByteStreamControllerEnqueue(this, chunk); + } + /** + * Errors the controlled readable stream, making all future interactions with it fail with the given error `e`. + */ + error(e = undefined) { + if (!IsReadableByteStreamController(this)) { + throw byteStreamControllerBrandCheckException('error'); + } + ReadableByteStreamControllerError(this, e); + } + /** @internal */ + [CancelSteps](reason) { + ReadableByteStreamControllerClearPendingPullIntos(this); + ResetQueue(this); + const result = this._cancelAlgorithm(reason); + ReadableByteStreamControllerClearAlgorithms(this); + return result; + } + /** @internal */ + [PullSteps](readRequest) { + const stream = this._controlledReadableByteStream; + if (this._queueTotalSize > 0) { + const entry = this._queue.shift(); + this._queueTotalSize -= entry.byteLength; + ReadableByteStreamControllerHandleQueueDrain(this); + const view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength); + readRequest._chunkSteps(view); + return; + } + const autoAllocateChunkSize = this._autoAllocateChunkSize; + if (autoAllocateChunkSize !== undefined) { + let buffer; + try { + buffer = new ArrayBuffer(autoAllocateChunkSize); + } + catch (bufferE) { + readRequest._errorSteps(bufferE); + return; + } + const pullIntoDescriptor = { + buffer, + bufferByteLength: autoAllocateChunkSize, + byteOffset: 0, + byteLength: autoAllocateChunkSize, + bytesFilled: 0, + elementSize: 1, + viewConstructor: Uint8Array, + readerType: 'default' + }; + this._pendingPullIntos.push(pullIntoDescriptor); + } + ReadableStreamAddReadRequest(stream, readRequest); + ReadableByteStreamControllerCallPullIfNeeded(this); + } + } + Object.defineProperties(ReadableByteStreamController.prototype, { + close: { enumerable: true }, + enqueue: { enumerable: true }, + error: { enumerable: true }, + byobRequest: { enumerable: true }, + desiredSize: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(ReadableByteStreamController.prototype, SymbolPolyfill.toStringTag, { + value: 'ReadableByteStreamController', + configurable: true + }); + } + // Abstract operations for the ReadableByteStreamController. + function IsReadableByteStreamController(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_controlledReadableByteStream')) { + return false; + } + return x instanceof ReadableByteStreamController; + } + function IsReadableStreamBYOBRequest(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) { + return false; + } + return x instanceof ReadableStreamBYOBRequest; + } + function ReadableByteStreamControllerCallPullIfNeeded(controller) { + const shouldPull = ReadableByteStreamControllerShouldCallPull(controller); + if (!shouldPull) { + return; + } + if (controller._pulling) { + controller._pullAgain = true; + return; + } + controller._pulling = true; + // TODO: Test controller argument + const pullPromise = controller._pullAlgorithm(); + uponPromise(pullPromise, () => { + controller._pulling = false; + if (controller._pullAgain) { + controller._pullAgain = false; + ReadableByteStreamControllerCallPullIfNeeded(controller); + } + }, e => { + ReadableByteStreamControllerError(controller, e); + }); + } + function ReadableByteStreamControllerClearPendingPullIntos(controller) { + ReadableByteStreamControllerInvalidateBYOBRequest(controller); + controller._pendingPullIntos = new SimpleQueue(); + } + function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) { + let done = false; + if (stream._state === 'closed') { + done = true; + } + const filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor); + if (pullIntoDescriptor.readerType === 'default') { + ReadableStreamFulfillReadRequest(stream, filledView, done); + } + else { + ReadableStreamFulfillReadIntoRequest(stream, filledView, done); + } + } + function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) { + const bytesFilled = pullIntoDescriptor.bytesFilled; + const elementSize = pullIntoDescriptor.elementSize; + return new pullIntoDescriptor.viewConstructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize); + } + function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) { + controller._queue.push({ buffer, byteOffset, byteLength }); + controller._queueTotalSize += byteLength; + } + function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) { + const elementSize = pullIntoDescriptor.elementSize; + const currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize; + const maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled); + const maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy; + const maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize; + let totalBytesToCopyRemaining = maxBytesToCopy; + let ready = false; + if (maxAlignedBytes > currentAlignedBytes) { + totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled; + ready = true; + } + const queue = controller._queue; + while (totalBytesToCopyRemaining > 0) { + const headOfQueue = queue.peek(); + const bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength); + const destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled; + CopyDataBlockBytes(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy); + if (headOfQueue.byteLength === bytesToCopy) { + queue.shift(); + } + else { + headOfQueue.byteOffset += bytesToCopy; + headOfQueue.byteLength -= bytesToCopy; + } + controller._queueTotalSize -= bytesToCopy; + ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor); + totalBytesToCopyRemaining -= bytesToCopy; + } + return ready; + } + function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) { + pullIntoDescriptor.bytesFilled += size; + } + function ReadableByteStreamControllerHandleQueueDrain(controller) { + if (controller._queueTotalSize === 0 && controller._closeRequested) { + ReadableByteStreamControllerClearAlgorithms(controller); + ReadableStreamClose(controller._controlledReadableByteStream); + } + else { + ReadableByteStreamControllerCallPullIfNeeded(controller); + } + } + function ReadableByteStreamControllerInvalidateBYOBRequest(controller) { + if (controller._byobRequest === null) { + return; + } + controller._byobRequest._associatedReadableByteStreamController = undefined; + controller._byobRequest._view = null; + controller._byobRequest = null; + } + function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) { + while (controller._pendingPullIntos.length > 0) { + if (controller._queueTotalSize === 0) { + return; + } + const pullIntoDescriptor = controller._pendingPullIntos.peek(); + if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor)) { + ReadableByteStreamControllerShiftPendingPullInto(controller); + ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableByteStream, pullIntoDescriptor); + } + } + } + function ReadableByteStreamControllerPullInto(controller, view, readIntoRequest) { + const stream = controller._controlledReadableByteStream; + let elementSize = 1; + if (view.constructor !== DataView) { + elementSize = view.constructor.BYTES_PER_ELEMENT; + } + const ctor = view.constructor; + // try { + const buffer = TransferArrayBuffer(view.buffer); + // } catch (e) { + // readIntoRequest._errorSteps(e); + // return; + // } + const pullIntoDescriptor = { + buffer, + bufferByteLength: buffer.byteLength, + byteOffset: view.byteOffset, + byteLength: view.byteLength, + bytesFilled: 0, + elementSize, + viewConstructor: ctor, + readerType: 'byob' + }; + if (controller._pendingPullIntos.length > 0) { + controller._pendingPullIntos.push(pullIntoDescriptor); + // No ReadableByteStreamControllerCallPullIfNeeded() call since: + // - No change happens on desiredSize + // - The source has already been notified of that there's at least 1 pending read(view) + ReadableStreamAddReadIntoRequest(stream, readIntoRequest); + return; + } + if (stream._state === 'closed') { + const emptyView = new ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0); + readIntoRequest._closeSteps(emptyView); + return; + } + if (controller._queueTotalSize > 0) { + if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor)) { + const filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor); + ReadableByteStreamControllerHandleQueueDrain(controller); + readIntoRequest._chunkSteps(filledView); + return; + } + if (controller._closeRequested) { + const e = new TypeError('Insufficient bytes to fill elements in the given buffer'); + ReadableByteStreamControllerError(controller, e); + readIntoRequest._errorSteps(e); + return; + } + } + controller._pendingPullIntos.push(pullIntoDescriptor); + ReadableStreamAddReadIntoRequest(stream, readIntoRequest); + ReadableByteStreamControllerCallPullIfNeeded(controller); + } + function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) { + const stream = controller._controlledReadableByteStream; + if (ReadableStreamHasBYOBReader(stream)) { + while (ReadableStreamGetNumReadIntoRequests(stream) > 0) { + const pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller); + ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor); + } + } + } + function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) { + ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor); + if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) { + return; + } + ReadableByteStreamControllerShiftPendingPullInto(controller); + const remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize; + if (remainderSize > 0) { + const end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled; + const remainder = ArrayBufferSlice(pullIntoDescriptor.buffer, end - remainderSize, end); + ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength); + } + pullIntoDescriptor.bytesFilled -= remainderSize; + ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableByteStream, pullIntoDescriptor); + ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); + } + function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) { + const firstDescriptor = controller._pendingPullIntos.peek(); + ReadableByteStreamControllerInvalidateBYOBRequest(controller); + const state = controller._controlledReadableByteStream._state; + if (state === 'closed') { + ReadableByteStreamControllerRespondInClosedState(controller); + } + else { + ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor); + } + ReadableByteStreamControllerCallPullIfNeeded(controller); + } + function ReadableByteStreamControllerShiftPendingPullInto(controller) { + const descriptor = controller._pendingPullIntos.shift(); + return descriptor; + } + function ReadableByteStreamControllerShouldCallPull(controller) { + const stream = controller._controlledReadableByteStream; + if (stream._state !== 'readable') { + return false; + } + if (controller._closeRequested) { + return false; + } + if (!controller._started) { + return false; + } + if (ReadableStreamHasDefaultReader(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { + return true; + } + if (ReadableStreamHasBYOBReader(stream) && ReadableStreamGetNumReadIntoRequests(stream) > 0) { + return true; + } + const desiredSize = ReadableByteStreamControllerGetDesiredSize(controller); + if (desiredSize > 0) { + return true; + } + return false; + } + function ReadableByteStreamControllerClearAlgorithms(controller) { + controller._pullAlgorithm = undefined; + controller._cancelAlgorithm = undefined; + } + // A client of ReadableByteStreamController may use these functions directly to bypass state check. + function ReadableByteStreamControllerClose(controller) { + const stream = controller._controlledReadableByteStream; + if (controller._closeRequested || stream._state !== 'readable') { + return; + } + if (controller._queueTotalSize > 0) { + controller._closeRequested = true; + return; + } + if (controller._pendingPullIntos.length > 0) { + const firstPendingPullInto = controller._pendingPullIntos.peek(); + if (firstPendingPullInto.bytesFilled > 0) { + const e = new TypeError('Insufficient bytes to fill elements in the given buffer'); + ReadableByteStreamControllerError(controller, e); + throw e; + } + } + ReadableByteStreamControllerClearAlgorithms(controller); + ReadableStreamClose(stream); + } + function ReadableByteStreamControllerEnqueue(controller, chunk) { + const stream = controller._controlledReadableByteStream; + if (controller._closeRequested || stream._state !== 'readable') { + return; + } + const buffer = chunk.buffer; + const byteOffset = chunk.byteOffset; + const byteLength = chunk.byteLength; + const transferredBuffer = TransferArrayBuffer(buffer); + if (controller._pendingPullIntos.length > 0) { + const firstPendingPullInto = controller._pendingPullIntos.peek(); + if (IsDetachedBuffer(firstPendingPullInto.buffer)) ; + firstPendingPullInto.buffer = TransferArrayBuffer(firstPendingPullInto.buffer); + } + ReadableByteStreamControllerInvalidateBYOBRequest(controller); + if (ReadableStreamHasDefaultReader(stream)) { + if (ReadableStreamGetNumReadRequests(stream) === 0) { + ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); + } + else { + if (controller._pendingPullIntos.length > 0) { + ReadableByteStreamControllerShiftPendingPullInto(controller); + } + const transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength); + ReadableStreamFulfillReadRequest(stream, transferredView, false); + } + } + else if (ReadableStreamHasBYOBReader(stream)) { + // TODO: Ideally in this branch detaching should happen only if the buffer is not consumed fully. + ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); + ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); + } + else { + ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); + } + ReadableByteStreamControllerCallPullIfNeeded(controller); + } + function ReadableByteStreamControllerError(controller, e) { + const stream = controller._controlledReadableByteStream; + if (stream._state !== 'readable') { + return; + } + ReadableByteStreamControllerClearPendingPullIntos(controller); + ResetQueue(controller); + ReadableByteStreamControllerClearAlgorithms(controller); + ReadableStreamError(stream, e); + } + function ReadableByteStreamControllerGetBYOBRequest(controller) { + if (controller._byobRequest === null && controller._pendingPullIntos.length > 0) { + const firstDescriptor = controller._pendingPullIntos.peek(); + const view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled); + const byobRequest = Object.create(ReadableStreamBYOBRequest.prototype); + SetUpReadableStreamBYOBRequest(byobRequest, controller, view); + controller._byobRequest = byobRequest; + } + return controller._byobRequest; + } + function ReadableByteStreamControllerGetDesiredSize(controller) { + const state = controller._controlledReadableByteStream._state; + if (state === 'errored') { + return null; + } + if (state === 'closed') { + return 0; + } + return controller._strategyHWM - controller._queueTotalSize; + } + function ReadableByteStreamControllerRespond(controller, bytesWritten) { + const firstDescriptor = controller._pendingPullIntos.peek(); + const state = controller._controlledReadableByteStream._state; + if (state === 'closed') { + if (bytesWritten !== 0) { + throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream'); + } + } + else { + if (bytesWritten === 0) { + throw new TypeError('bytesWritten must be greater than 0 when calling respond() on a readable stream'); + } + if (firstDescriptor.bytesFilled + bytesWritten > firstDescriptor.byteLength) { + throw new RangeError('bytesWritten out of range'); + } + } + firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer); + ReadableByteStreamControllerRespondInternal(controller, bytesWritten); + } + function ReadableByteStreamControllerRespondWithNewView(controller, view) { + const firstDescriptor = controller._pendingPullIntos.peek(); + const state = controller._controlledReadableByteStream._state; + if (state === 'closed') { + if (view.byteLength !== 0) { + throw new TypeError('The view\'s length must be 0 when calling respondWithNewView() on a closed stream'); + } + } + else { + if (view.byteLength === 0) { + throw new TypeError('The view\'s length must be greater than 0 when calling respondWithNewView() on a readable stream'); + } + } + if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) { + throw new RangeError('The region specified by view does not match byobRequest'); + } + if (firstDescriptor.bufferByteLength !== view.buffer.byteLength) { + throw new RangeError('The buffer of view has different capacity than byobRequest'); + } + if (firstDescriptor.bytesFilled + view.byteLength > firstDescriptor.byteLength) { + throw new RangeError('The region specified by view is larger than byobRequest'); + } + const viewByteLength = view.byteLength; + firstDescriptor.buffer = TransferArrayBuffer(view.buffer); + ReadableByteStreamControllerRespondInternal(controller, viewByteLength); + } + function SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, autoAllocateChunkSize) { + controller._controlledReadableByteStream = stream; + controller._pullAgain = false; + controller._pulling = false; + controller._byobRequest = null; + // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly. + controller._queue = controller._queueTotalSize = undefined; + ResetQueue(controller); + controller._closeRequested = false; + controller._started = false; + controller._strategyHWM = highWaterMark; + controller._pullAlgorithm = pullAlgorithm; + controller._cancelAlgorithm = cancelAlgorithm; + controller._autoAllocateChunkSize = autoAllocateChunkSize; + controller._pendingPullIntos = new SimpleQueue(); + stream._readableStreamController = controller; + const startResult = startAlgorithm(); + uponPromise(promiseResolvedWith(startResult), () => { + controller._started = true; + ReadableByteStreamControllerCallPullIfNeeded(controller); + }, r => { + ReadableByteStreamControllerError(controller, r); + }); + } + function SetUpReadableByteStreamControllerFromUnderlyingSource(stream, underlyingByteSource, highWaterMark) { + const controller = Object.create(ReadableByteStreamController.prototype); + let startAlgorithm = () => undefined; + let pullAlgorithm = () => promiseResolvedWith(undefined); + let cancelAlgorithm = () => promiseResolvedWith(undefined); + if (underlyingByteSource.start !== undefined) { + startAlgorithm = () => underlyingByteSource.start(controller); + } + if (underlyingByteSource.pull !== undefined) { + pullAlgorithm = () => underlyingByteSource.pull(controller); + } + if (underlyingByteSource.cancel !== undefined) { + cancelAlgorithm = reason => underlyingByteSource.cancel(reason); + } + const autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize; + if (autoAllocateChunkSize === 0) { + throw new TypeError('autoAllocateChunkSize must be greater than 0'); + } + SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, autoAllocateChunkSize); + } + function SetUpReadableStreamBYOBRequest(request, controller, view) { + request._associatedReadableByteStreamController = controller; + request._view = view; + } + // Helper functions for the ReadableStreamBYOBRequest. + function byobRequestBrandCheckException(name) { + return new TypeError(`ReadableStreamBYOBRequest.prototype.${name} can only be used on a ReadableStreamBYOBRequest`); + } + // Helper functions for the ReadableByteStreamController. + function byteStreamControllerBrandCheckException(name) { + return new TypeError(`ReadableByteStreamController.prototype.${name} can only be used on a ReadableByteStreamController`); + } + + // Abstract operations for the ReadableStream. + function AcquireReadableStreamBYOBReader(stream) { + return new ReadableStreamBYOBReader(stream); + } + // ReadableStream API exposed for controllers. + function ReadableStreamAddReadIntoRequest(stream, readIntoRequest) { + stream._reader._readIntoRequests.push(readIntoRequest); + } + function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) { + const reader = stream._reader; + const readIntoRequest = reader._readIntoRequests.shift(); + if (done) { + readIntoRequest._closeSteps(chunk); + } + else { + readIntoRequest._chunkSteps(chunk); + } + } + function ReadableStreamGetNumReadIntoRequests(stream) { + return stream._reader._readIntoRequests.length; + } + function ReadableStreamHasBYOBReader(stream) { + const reader = stream._reader; + if (reader === undefined) { + return false; + } + if (!IsReadableStreamBYOBReader(reader)) { + return false; + } + return true; + } + /** + * A BYOB reader vended by a {@link ReadableStream}. + * + * @public + */ + class ReadableStreamBYOBReader { + constructor(stream) { + assertRequiredArgument(stream, 1, 'ReadableStreamBYOBReader'); + assertReadableStream(stream, 'First parameter'); + if (IsReadableStreamLocked(stream)) { + throw new TypeError('This stream has already been locked for exclusive reading by another reader'); + } + if (!IsReadableByteStreamController(stream._readableStreamController)) { + throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + + 'source'); + } + ReadableStreamReaderGenericInitialize(this, stream); + this._readIntoRequests = new SimpleQueue(); + } + /** + * Returns a promise that will be fulfilled when the stream becomes closed, or rejected if the stream ever errors or + * the reader's lock is released before the stream finishes closing. + */ + get closed() { + if (!IsReadableStreamBYOBReader(this)) { + return promiseRejectedWith(byobReaderBrandCheckException('closed')); + } + return this._closedPromise; + } + /** + * If the reader is active, behaves the same as {@link ReadableStream.cancel | stream.cancel(reason)}. + */ + cancel(reason = undefined) { + if (!IsReadableStreamBYOBReader(this)) { + return promiseRejectedWith(byobReaderBrandCheckException('cancel')); + } + if (this._ownerReadableStream === undefined) { + return promiseRejectedWith(readerLockException('cancel')); + } + return ReadableStreamReaderGenericCancel(this, reason); + } + /** + * Attempts to reads bytes into view, and returns a promise resolved with the result. + * + * If reading a chunk causes the queue to become empty, more data will be pulled from the underlying source. + */ + read(view) { + if (!IsReadableStreamBYOBReader(this)) { + return promiseRejectedWith(byobReaderBrandCheckException('read')); + } + if (!ArrayBuffer.isView(view)) { + return promiseRejectedWith(new TypeError('view must be an array buffer view')); + } + if (view.byteLength === 0) { + return promiseRejectedWith(new TypeError('view must have non-zero byteLength')); + } + if (view.buffer.byteLength === 0) { + return promiseRejectedWith(new TypeError(`view's buffer must have non-zero byteLength`)); + } + if (IsDetachedBuffer(view.buffer)) ; + if (this._ownerReadableStream === undefined) { + return promiseRejectedWith(readerLockException('read from')); + } + let resolvePromise; + let rejectPromise; + const promise = newPromise((resolve, reject) => { + resolvePromise = resolve; + rejectPromise = reject; + }); + const readIntoRequest = { + _chunkSteps: chunk => resolvePromise({ value: chunk, done: false }), + _closeSteps: chunk => resolvePromise({ value: chunk, done: true }), + _errorSteps: e => rejectPromise(e) + }; + ReadableStreamBYOBReaderRead(this, view, readIntoRequest); + return promise; + } + /** + * Releases the reader's lock on the corresponding stream. After the lock is released, the reader is no longer active. + * If the associated stream is errored when the lock is released, the reader will appear errored in the same way + * from now on; otherwise, the reader will appear closed. + * + * A reader's lock cannot be released while it still has a pending read request, i.e., if a promise returned by + * the reader's {@link ReadableStreamBYOBReader.read | read()} method has not yet been settled. Attempting to + * do so will throw a `TypeError` and leave the reader locked to the stream. + */ + releaseLock() { + if (!IsReadableStreamBYOBReader(this)) { + throw byobReaderBrandCheckException('releaseLock'); + } + if (this._ownerReadableStream === undefined) { + return; + } + if (this._readIntoRequests.length > 0) { + throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled'); + } + ReadableStreamReaderGenericRelease(this); + } + } + Object.defineProperties(ReadableStreamBYOBReader.prototype, { + cancel: { enumerable: true }, + read: { enumerable: true }, + releaseLock: { enumerable: true }, + closed: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamBYOBReader.prototype, SymbolPolyfill.toStringTag, { + value: 'ReadableStreamBYOBReader', + configurable: true + }); + } + // Abstract operations for the readers. + function IsReadableStreamBYOBReader(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) { + return false; + } + return x instanceof ReadableStreamBYOBReader; + } + function ReadableStreamBYOBReaderRead(reader, view, readIntoRequest) { + const stream = reader._ownerReadableStream; + stream._disturbed = true; + if (stream._state === 'errored') { + readIntoRequest._errorSteps(stream._storedError); + } + else { + ReadableByteStreamControllerPullInto(stream._readableStreamController, view, readIntoRequest); + } + } + // Helper functions for the ReadableStreamBYOBReader. + function byobReaderBrandCheckException(name) { + return new TypeError(`ReadableStreamBYOBReader.prototype.${name} can only be used on a ReadableStreamBYOBReader`); + } + + function ExtractHighWaterMark(strategy, defaultHWM) { + const { highWaterMark } = strategy; + if (highWaterMark === undefined) { + return defaultHWM; + } + if (NumberIsNaN(highWaterMark) || highWaterMark < 0) { + throw new RangeError('Invalid highWaterMark'); + } + return highWaterMark; + } + function ExtractSizeAlgorithm(strategy) { + const { size } = strategy; + if (!size) { + return () => 1; + } + return size; + } + + function convertQueuingStrategy(init, context) { + assertDictionary(init, context); + const highWaterMark = init === null || init === void 0 ? void 0 : init.highWaterMark; + const size = init === null || init === void 0 ? void 0 : init.size; + return { + highWaterMark: highWaterMark === undefined ? undefined : convertUnrestrictedDouble(highWaterMark), + size: size === undefined ? undefined : convertQueuingStrategySize(size, `${context} has member 'size' that`) + }; + } + function convertQueuingStrategySize(fn, context) { + assertFunction(fn, context); + return chunk => convertUnrestrictedDouble(fn(chunk)); + } + + function convertUnderlyingSink(original, context) { + assertDictionary(original, context); + const abort = original === null || original === void 0 ? void 0 : original.abort; + const close = original === null || original === void 0 ? void 0 : original.close; + const start = original === null || original === void 0 ? void 0 : original.start; + const type = original === null || original === void 0 ? void 0 : original.type; + const write = original === null || original === void 0 ? void 0 : original.write; + return { + abort: abort === undefined ? + undefined : + convertUnderlyingSinkAbortCallback(abort, original, `${context} has member 'abort' that`), + close: close === undefined ? + undefined : + convertUnderlyingSinkCloseCallback(close, original, `${context} has member 'close' that`), + start: start === undefined ? + undefined : + convertUnderlyingSinkStartCallback(start, original, `${context} has member 'start' that`), + write: write === undefined ? + undefined : + convertUnderlyingSinkWriteCallback(write, original, `${context} has member 'write' that`), + type + }; + } + function convertUnderlyingSinkAbortCallback(fn, original, context) { + assertFunction(fn, context); + return (reason) => promiseCall(fn, original, [reason]); + } + function convertUnderlyingSinkCloseCallback(fn, original, context) { + assertFunction(fn, context); + return () => promiseCall(fn, original, []); + } + function convertUnderlyingSinkStartCallback(fn, original, context) { + assertFunction(fn, context); + return (controller) => reflectCall(fn, original, [controller]); + } + function convertUnderlyingSinkWriteCallback(fn, original, context) { + assertFunction(fn, context); + return (chunk, controller) => promiseCall(fn, original, [chunk, controller]); + } + + function assertWritableStream(x, context) { + if (!IsWritableStream(x)) { + throw new TypeError(`${context} is not a WritableStream.`); + } + } + + function isAbortSignal(value) { + if (typeof value !== 'object' || value === null) { + return false; + } + try { + return typeof value.aborted === 'boolean'; + } + catch (_a) { + // AbortSignal.prototype.aborted throws if its brand check fails + return false; + } + } + const supportsAbortController = typeof AbortController === 'function'; + /** + * Construct a new AbortController, if supported by the platform. + * + * @internal + */ + function createAbortController() { + if (supportsAbortController) { + return new AbortController(); + } + return undefined; + } + + /** + * A writable stream represents a destination for data, into which you can write. + * + * @public + */ + class WritableStream { + constructor(rawUnderlyingSink = {}, rawStrategy = {}) { + if (rawUnderlyingSink === undefined) { + rawUnderlyingSink = null; + } + else { + assertObject(rawUnderlyingSink, 'First parameter'); + } + const strategy = convertQueuingStrategy(rawStrategy, 'Second parameter'); + const underlyingSink = convertUnderlyingSink(rawUnderlyingSink, 'First parameter'); + InitializeWritableStream(this); + const type = underlyingSink.type; + if (type !== undefined) { + throw new RangeError('Invalid type is specified'); + } + const sizeAlgorithm = ExtractSizeAlgorithm(strategy); + const highWaterMark = ExtractHighWaterMark(strategy, 1); + SetUpWritableStreamDefaultControllerFromUnderlyingSink(this, underlyingSink, highWaterMark, sizeAlgorithm); + } + /** + * Returns whether or not the writable stream is locked to a writer. + */ + get locked() { + if (!IsWritableStream(this)) { + throw streamBrandCheckException$2('locked'); + } + return IsWritableStreamLocked(this); + } + /** + * Aborts the stream, signaling that the producer can no longer successfully write to the stream and it is to be + * immediately moved to an errored state, with any queued-up writes discarded. This will also execute any abort + * mechanism of the underlying sink. + * + * The returned promise will fulfill if the stream shuts down successfully, or reject if the underlying sink signaled + * that there was an error doing so. Additionally, it will reject with a `TypeError` (without attempting to cancel + * the stream) if the stream is currently locked. + */ + abort(reason = undefined) { + if (!IsWritableStream(this)) { + return promiseRejectedWith(streamBrandCheckException$2('abort')); + } + if (IsWritableStreamLocked(this)) { + return promiseRejectedWith(new TypeError('Cannot abort a stream that already has a writer')); + } + return WritableStreamAbort(this, reason); + } + /** + * Closes the stream. The underlying sink will finish processing any previously-written chunks, before invoking its + * close behavior. During this time any further attempts to write will fail (without erroring the stream). + * + * The method returns a promise that will fulfill if all remaining chunks are successfully written and the stream + * successfully closes, or rejects if an error is encountered during this process. Additionally, it will reject with + * a `TypeError` (without attempting to cancel the stream) if the stream is currently locked. + */ + close() { + if (!IsWritableStream(this)) { + return promiseRejectedWith(streamBrandCheckException$2('close')); + } + if (IsWritableStreamLocked(this)) { + return promiseRejectedWith(new TypeError('Cannot close a stream that already has a writer')); + } + if (WritableStreamCloseQueuedOrInFlight(this)) { + return promiseRejectedWith(new TypeError('Cannot close an already-closing stream')); + } + return WritableStreamClose(this); + } + /** + * Creates a {@link WritableStreamDefaultWriter | writer} and locks the stream to the new writer. While the stream + * is locked, no other writer can be acquired until this one is released. + * + * This functionality is especially useful for creating abstractions that desire the ability to write to a stream + * without interruption or interleaving. By getting a writer for the stream, you can ensure nobody else can write at + * the same time, which would cause the resulting written data to be unpredictable and probably useless. + */ + getWriter() { + if (!IsWritableStream(this)) { + throw streamBrandCheckException$2('getWriter'); + } + return AcquireWritableStreamDefaultWriter(this); + } + } + Object.defineProperties(WritableStream.prototype, { + abort: { enumerable: true }, + close: { enumerable: true }, + getWriter: { enumerable: true }, + locked: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(WritableStream.prototype, SymbolPolyfill.toStringTag, { + value: 'WritableStream', + configurable: true + }); + } + // Abstract operations for the WritableStream. + function AcquireWritableStreamDefaultWriter(stream) { + return new WritableStreamDefaultWriter(stream); + } + // Throws if and only if startAlgorithm throws. + function CreateWritableStream(startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark = 1, sizeAlgorithm = () => 1) { + const stream = Object.create(WritableStream.prototype); + InitializeWritableStream(stream); + const controller = Object.create(WritableStreamDefaultController.prototype); + SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm); + return stream; + } + function InitializeWritableStream(stream) { + stream._state = 'writable'; + // The error that will be reported by new method calls once the state becomes errored. Only set when [[state]] is + // 'erroring' or 'errored'. May be set to an undefined value. + stream._storedError = undefined; + stream._writer = undefined; + // Initialize to undefined first because the constructor of the controller checks this + // variable to validate the caller. + stream._writableStreamController = undefined; + // This queue is placed here instead of the writer class in order to allow for passing a writer to the next data + // producer without waiting for the queued writes to finish. + stream._writeRequests = new SimpleQueue(); + // Write requests are removed from _writeRequests when write() is called on the underlying sink. This prevents + // them from being erroneously rejected on error. If a write() call is in-flight, the request is stored here. + stream._inFlightWriteRequest = undefined; + // The promise that was returned from writer.close(). Stored here because it may be fulfilled after the writer + // has been detached. + stream._closeRequest = undefined; + // Close request is removed from _closeRequest when close() is called on the underlying sink. This prevents it + // from being erroneously rejected on error. If a close() call is in-flight, the request is stored here. + stream._inFlightCloseRequest = undefined; + // The promise that was returned from writer.abort(). This may also be fulfilled after the writer has detached. + stream._pendingAbortRequest = undefined; + // The backpressure signal set by the controller. + stream._backpressure = false; + } + function IsWritableStream(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) { + return false; + } + return x instanceof WritableStream; + } + function IsWritableStreamLocked(stream) { + if (stream._writer === undefined) { + return false; + } + return true; + } + function WritableStreamAbort(stream, reason) { + var _a; + if (stream._state === 'closed' || stream._state === 'errored') { + return promiseResolvedWith(undefined); + } + stream._writableStreamController._abortReason = reason; + (_a = stream._writableStreamController._abortController) === null || _a === void 0 ? void 0 : _a.abort(); + // TypeScript narrows the type of `stream._state` down to 'writable' | 'erroring', + // but it doesn't know that signaling abort runs author code that might have changed the state. + // Widen the type again by casting to WritableStreamState. + const state = stream._state; + if (state === 'closed' || state === 'errored') { + return promiseResolvedWith(undefined); + } + if (stream._pendingAbortRequest !== undefined) { + return stream._pendingAbortRequest._promise; + } + let wasAlreadyErroring = false; + if (state === 'erroring') { + wasAlreadyErroring = true; + // reason will not be used, so don't keep a reference to it. + reason = undefined; + } + const promise = newPromise((resolve, reject) => { + stream._pendingAbortRequest = { + _promise: undefined, + _resolve: resolve, + _reject: reject, + _reason: reason, + _wasAlreadyErroring: wasAlreadyErroring + }; + }); + stream._pendingAbortRequest._promise = promise; + if (!wasAlreadyErroring) { + WritableStreamStartErroring(stream, reason); + } + return promise; + } + function WritableStreamClose(stream) { + const state = stream._state; + if (state === 'closed' || state === 'errored') { + return promiseRejectedWith(new TypeError(`The stream (in ${state} state) is not in the writable state and cannot be closed`)); + } + const promise = newPromise((resolve, reject) => { + const closeRequest = { + _resolve: resolve, + _reject: reject + }; + stream._closeRequest = closeRequest; + }); + const writer = stream._writer; + if (writer !== undefined && stream._backpressure && state === 'writable') { + defaultWriterReadyPromiseResolve(writer); + } + WritableStreamDefaultControllerClose(stream._writableStreamController); + return promise; + } + // WritableStream API exposed for controllers. + function WritableStreamAddWriteRequest(stream) { + const promise = newPromise((resolve, reject) => { + const writeRequest = { + _resolve: resolve, + _reject: reject + }; + stream._writeRequests.push(writeRequest); + }); + return promise; + } + function WritableStreamDealWithRejection(stream, error) { + const state = stream._state; + if (state === 'writable') { + WritableStreamStartErroring(stream, error); + return; + } + WritableStreamFinishErroring(stream); + } + function WritableStreamStartErroring(stream, reason) { + const controller = stream._writableStreamController; + stream._state = 'erroring'; + stream._storedError = reason; + const writer = stream._writer; + if (writer !== undefined) { + WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason); + } + if (!WritableStreamHasOperationMarkedInFlight(stream) && controller._started) { + WritableStreamFinishErroring(stream); + } + } + function WritableStreamFinishErroring(stream) { + stream._state = 'errored'; + stream._writableStreamController[ErrorSteps](); + const storedError = stream._storedError; + stream._writeRequests.forEach(writeRequest => { + writeRequest._reject(storedError); + }); + stream._writeRequests = new SimpleQueue(); + if (stream._pendingAbortRequest === undefined) { + WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); + return; + } + const abortRequest = stream._pendingAbortRequest; + stream._pendingAbortRequest = undefined; + if (abortRequest._wasAlreadyErroring) { + abortRequest._reject(storedError); + WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); + return; + } + const promise = stream._writableStreamController[AbortSteps](abortRequest._reason); + uponPromise(promise, () => { + abortRequest._resolve(); + WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); + }, (reason) => { + abortRequest._reject(reason); + WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); + }); + } + function WritableStreamFinishInFlightWrite(stream) { + stream._inFlightWriteRequest._resolve(undefined); + stream._inFlightWriteRequest = undefined; + } + function WritableStreamFinishInFlightWriteWithError(stream, error) { + stream._inFlightWriteRequest._reject(error); + stream._inFlightWriteRequest = undefined; + WritableStreamDealWithRejection(stream, error); + } + function WritableStreamFinishInFlightClose(stream) { + stream._inFlightCloseRequest._resolve(undefined); + stream._inFlightCloseRequest = undefined; + const state = stream._state; + if (state === 'erroring') { + // The error was too late to do anything, so it is ignored. + stream._storedError = undefined; + if (stream._pendingAbortRequest !== undefined) { + stream._pendingAbortRequest._resolve(); + stream._pendingAbortRequest = undefined; + } + } + stream._state = 'closed'; + const writer = stream._writer; + if (writer !== undefined) { + defaultWriterClosedPromiseResolve(writer); + } + } + function WritableStreamFinishInFlightCloseWithError(stream, error) { + stream._inFlightCloseRequest._reject(error); + stream._inFlightCloseRequest = undefined; + // Never execute sink abort() after sink close(). + if (stream._pendingAbortRequest !== undefined) { + stream._pendingAbortRequest._reject(error); + stream._pendingAbortRequest = undefined; + } + WritableStreamDealWithRejection(stream, error); + } + // TODO(ricea): Fix alphabetical order. + function WritableStreamCloseQueuedOrInFlight(stream) { + if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) { + return false; + } + return true; + } + function WritableStreamHasOperationMarkedInFlight(stream) { + if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) { + return false; + } + return true; + } + function WritableStreamMarkCloseRequestInFlight(stream) { + stream._inFlightCloseRequest = stream._closeRequest; + stream._closeRequest = undefined; + } + function WritableStreamMarkFirstWriteRequestInFlight(stream) { + stream._inFlightWriteRequest = stream._writeRequests.shift(); + } + function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) { + if (stream._closeRequest !== undefined) { + stream._closeRequest._reject(stream._storedError); + stream._closeRequest = undefined; + } + const writer = stream._writer; + if (writer !== undefined) { + defaultWriterClosedPromiseReject(writer, stream._storedError); + } + } + function WritableStreamUpdateBackpressure(stream, backpressure) { + const writer = stream._writer; + if (writer !== undefined && backpressure !== stream._backpressure) { + if (backpressure) { + defaultWriterReadyPromiseReset(writer); + } + else { + defaultWriterReadyPromiseResolve(writer); + } + } + stream._backpressure = backpressure; + } + /** + * A default writer vended by a {@link WritableStream}. + * + * @public + */ + class WritableStreamDefaultWriter { + constructor(stream) { + assertRequiredArgument(stream, 1, 'WritableStreamDefaultWriter'); + assertWritableStream(stream, 'First parameter'); + if (IsWritableStreamLocked(stream)) { + throw new TypeError('This stream has already been locked for exclusive writing by another writer'); + } + this._ownerWritableStream = stream; + stream._writer = this; + const state = stream._state; + if (state === 'writable') { + if (!WritableStreamCloseQueuedOrInFlight(stream) && stream._backpressure) { + defaultWriterReadyPromiseInitialize(this); + } + else { + defaultWriterReadyPromiseInitializeAsResolved(this); + } + defaultWriterClosedPromiseInitialize(this); + } + else if (state === 'erroring') { + defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError); + defaultWriterClosedPromiseInitialize(this); + } + else if (state === 'closed') { + defaultWriterReadyPromiseInitializeAsResolved(this); + defaultWriterClosedPromiseInitializeAsResolved(this); + } + else { + const storedError = stream._storedError; + defaultWriterReadyPromiseInitializeAsRejected(this, storedError); + defaultWriterClosedPromiseInitializeAsRejected(this, storedError); + } + } + /** + * Returns a promise that will be fulfilled when the stream becomes closed, or rejected if the stream ever errors or + * the writer’s lock is released before the stream finishes closing. + */ + get closed() { + if (!IsWritableStreamDefaultWriter(this)) { + return promiseRejectedWith(defaultWriterBrandCheckException('closed')); + } + return this._closedPromise; + } + /** + * Returns the desired size to fill the stream’s internal queue. It can be negative, if the queue is over-full. + * A producer can use this information to determine the right amount of data to write. + * + * It will be `null` if the stream cannot be successfully written to (due to either being errored, or having an abort + * queued up). It will return zero if the stream is closed. And the getter will throw an exception if invoked when + * the writer’s lock is released. + */ + get desiredSize() { + if (!IsWritableStreamDefaultWriter(this)) { + throw defaultWriterBrandCheckException('desiredSize'); + } + if (this._ownerWritableStream === undefined) { + throw defaultWriterLockException('desiredSize'); + } + return WritableStreamDefaultWriterGetDesiredSize(this); + } + /** + * Returns a promise that will be fulfilled when the desired size to fill the stream’s internal queue transitions + * from non-positive to positive, signaling that it is no longer applying backpressure. Once the desired size dips + * back to zero or below, the getter will return a new promise that stays pending until the next transition. + * + * If the stream becomes errored or aborted, or the writer’s lock is released, the returned promise will become + * rejected. + */ + get ready() { + if (!IsWritableStreamDefaultWriter(this)) { + return promiseRejectedWith(defaultWriterBrandCheckException('ready')); + } + return this._readyPromise; + } + /** + * If the reader is active, behaves the same as {@link WritableStream.abort | stream.abort(reason)}. + */ + abort(reason = undefined) { + if (!IsWritableStreamDefaultWriter(this)) { + return promiseRejectedWith(defaultWriterBrandCheckException('abort')); + } + if (this._ownerWritableStream === undefined) { + return promiseRejectedWith(defaultWriterLockException('abort')); + } + return WritableStreamDefaultWriterAbort(this, reason); + } + /** + * If the reader is active, behaves the same as {@link WritableStream.close | stream.close()}. + */ + close() { + if (!IsWritableStreamDefaultWriter(this)) { + return promiseRejectedWith(defaultWriterBrandCheckException('close')); + } + const stream = this._ownerWritableStream; + if (stream === undefined) { + return promiseRejectedWith(defaultWriterLockException('close')); + } + if (WritableStreamCloseQueuedOrInFlight(stream)) { + return promiseRejectedWith(new TypeError('Cannot close an already-closing stream')); + } + return WritableStreamDefaultWriterClose(this); + } + /** + * Releases the writer’s lock on the corresponding stream. After the lock is released, the writer is no longer active. + * If the associated stream is errored when the lock is released, the writer will appear errored in the same way from + * now on; otherwise, the writer will appear closed. + * + * Note that the lock can still be released even if some ongoing writes have not yet finished (i.e. even if the + * promises returned from previous calls to {@link WritableStreamDefaultWriter.write | write()} have not yet settled). + * It’s not necessary to hold the lock on the writer for the duration of the write; the lock instead simply prevents + * other producers from writing in an interleaved manner. + */ + releaseLock() { + if (!IsWritableStreamDefaultWriter(this)) { + throw defaultWriterBrandCheckException('releaseLock'); + } + const stream = this._ownerWritableStream; + if (stream === undefined) { + return; + } + WritableStreamDefaultWriterRelease(this); + } + write(chunk = undefined) { + if (!IsWritableStreamDefaultWriter(this)) { + return promiseRejectedWith(defaultWriterBrandCheckException('write')); + } + if (this._ownerWritableStream === undefined) { + return promiseRejectedWith(defaultWriterLockException('write to')); + } + return WritableStreamDefaultWriterWrite(this, chunk); + } + } + Object.defineProperties(WritableStreamDefaultWriter.prototype, { + abort: { enumerable: true }, + close: { enumerable: true }, + releaseLock: { enumerable: true }, + write: { enumerable: true }, + closed: { enumerable: true }, + desiredSize: { enumerable: true }, + ready: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(WritableStreamDefaultWriter.prototype, SymbolPolyfill.toStringTag, { + value: 'WritableStreamDefaultWriter', + configurable: true + }); + } + // Abstract operations for the WritableStreamDefaultWriter. + function IsWritableStreamDefaultWriter(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) { + return false; + } + return x instanceof WritableStreamDefaultWriter; + } + // A client of WritableStreamDefaultWriter may use these functions directly to bypass state check. + function WritableStreamDefaultWriterAbort(writer, reason) { + const stream = writer._ownerWritableStream; + return WritableStreamAbort(stream, reason); + } + function WritableStreamDefaultWriterClose(writer) { + const stream = writer._ownerWritableStream; + return WritableStreamClose(stream); + } + function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) { + const stream = writer._ownerWritableStream; + const state = stream._state; + if (WritableStreamCloseQueuedOrInFlight(stream) || state === 'closed') { + return promiseResolvedWith(undefined); + } + if (state === 'errored') { + return promiseRejectedWith(stream._storedError); + } + return WritableStreamDefaultWriterClose(writer); + } + function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) { + if (writer._closedPromiseState === 'pending') { + defaultWriterClosedPromiseReject(writer, error); + } + else { + defaultWriterClosedPromiseResetToRejected(writer, error); + } + } + function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) { + if (writer._readyPromiseState === 'pending') { + defaultWriterReadyPromiseReject(writer, error); + } + else { + defaultWriterReadyPromiseResetToRejected(writer, error); + } + } + function WritableStreamDefaultWriterGetDesiredSize(writer) { + const stream = writer._ownerWritableStream; + const state = stream._state; + if (state === 'errored' || state === 'erroring') { + return null; + } + if (state === 'closed') { + return 0; + } + return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController); + } + function WritableStreamDefaultWriterRelease(writer) { + const stream = writer._ownerWritableStream; + const releasedError = new TypeError(`Writer was released and can no longer be used to monitor the stream's closedness`); + WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError); + // The state transitions to "errored" before the sink abort() method runs, but the writer.closed promise is not + // rejected until afterwards. This means that simply testing state will not work. + WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError); + stream._writer = undefined; + writer._ownerWritableStream = undefined; + } + function WritableStreamDefaultWriterWrite(writer, chunk) { + const stream = writer._ownerWritableStream; + const controller = stream._writableStreamController; + const chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk); + if (stream !== writer._ownerWritableStream) { + return promiseRejectedWith(defaultWriterLockException('write to')); + } + const state = stream._state; + if (state === 'errored') { + return promiseRejectedWith(stream._storedError); + } + if (WritableStreamCloseQueuedOrInFlight(stream) || state === 'closed') { + return promiseRejectedWith(new TypeError('The stream is closing or closed and cannot be written to')); + } + if (state === 'erroring') { + return promiseRejectedWith(stream._storedError); + } + const promise = WritableStreamAddWriteRequest(stream); + WritableStreamDefaultControllerWrite(controller, chunk, chunkSize); + return promise; + } + const closeSentinel = {}; + /** + * Allows control of a {@link WritableStream | writable stream}'s state and internal queue. + * + * @public + */ + class WritableStreamDefaultController { + constructor() { + throw new TypeError('Illegal constructor'); + } + /** + * The reason which was passed to `WritableStream.abort(reason)` when the stream was aborted. + * + * @deprecated + * This property has been removed from the specification, see https://github.com/whatwg/streams/pull/1177. + * Use {@link WritableStreamDefaultController.signal}'s `reason` instead. + */ + get abortReason() { + if (!IsWritableStreamDefaultController(this)) { + throw defaultControllerBrandCheckException$2('abortReason'); + } + return this._abortReason; + } + /** + * An `AbortSignal` that can be used to abort the pending write or close operation when the stream is aborted. + */ + get signal() { + if (!IsWritableStreamDefaultController(this)) { + throw defaultControllerBrandCheckException$2('signal'); + } + if (this._abortController === undefined) { + // Older browsers or older Node versions may not support `AbortController` or `AbortSignal`. + // We don't want to bundle and ship an `AbortController` polyfill together with our polyfill, + // so instead we only implement support for `signal` if we find a global `AbortController` constructor. + throw new TypeError('WritableStreamDefaultController.prototype.signal is not supported'); + } + return this._abortController.signal; + } + /** + * Closes the controlled writable stream, making all future interactions with it fail with the given error `e`. + * + * This method is rarely used, since usually it suffices to return a rejected promise from one of the underlying + * sink's methods. However, it can be useful for suddenly shutting down a stream in response to an event outside the + * normal lifecycle of interactions with the underlying sink. + */ + error(e = undefined) { + if (!IsWritableStreamDefaultController(this)) { + throw defaultControllerBrandCheckException$2('error'); + } + const state = this._controlledWritableStream._state; + if (state !== 'writable') { + // The stream is closed, errored or will be soon. The sink can't do anything useful if it gets an error here, so + // just treat it as a no-op. + return; + } + WritableStreamDefaultControllerError(this, e); + } + /** @internal */ + [AbortSteps](reason) { + const result = this._abortAlgorithm(reason); + WritableStreamDefaultControllerClearAlgorithms(this); + return result; + } + /** @internal */ + [ErrorSteps]() { + ResetQueue(this); + } + } + Object.defineProperties(WritableStreamDefaultController.prototype, { + abortReason: { enumerable: true }, + signal: { enumerable: true }, + error: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(WritableStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { + value: 'WritableStreamDefaultController', + configurable: true + }); + } + // Abstract operations implementing interface required by the WritableStream. + function IsWritableStreamDefaultController(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_controlledWritableStream')) { + return false; + } + return x instanceof WritableStreamDefaultController; + } + function SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm) { + controller._controlledWritableStream = stream; + stream._writableStreamController = controller; + // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly. + controller._queue = undefined; + controller._queueTotalSize = undefined; + ResetQueue(controller); + controller._abortReason = undefined; + controller._abortController = createAbortController(); + controller._started = false; + controller._strategySizeAlgorithm = sizeAlgorithm; + controller._strategyHWM = highWaterMark; + controller._writeAlgorithm = writeAlgorithm; + controller._closeAlgorithm = closeAlgorithm; + controller._abortAlgorithm = abortAlgorithm; + const backpressure = WritableStreamDefaultControllerGetBackpressure(controller); + WritableStreamUpdateBackpressure(stream, backpressure); + const startResult = startAlgorithm(); + const startPromise = promiseResolvedWith(startResult); + uponPromise(startPromise, () => { + controller._started = true; + WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); + }, r => { + controller._started = true; + WritableStreamDealWithRejection(stream, r); + }); + } + function SetUpWritableStreamDefaultControllerFromUnderlyingSink(stream, underlyingSink, highWaterMark, sizeAlgorithm) { + const controller = Object.create(WritableStreamDefaultController.prototype); + let startAlgorithm = () => undefined; + let writeAlgorithm = () => promiseResolvedWith(undefined); + let closeAlgorithm = () => promiseResolvedWith(undefined); + let abortAlgorithm = () => promiseResolvedWith(undefined); + if (underlyingSink.start !== undefined) { + startAlgorithm = () => underlyingSink.start(controller); + } + if (underlyingSink.write !== undefined) { + writeAlgorithm = chunk => underlyingSink.write(chunk, controller); + } + if (underlyingSink.close !== undefined) { + closeAlgorithm = () => underlyingSink.close(); + } + if (underlyingSink.abort !== undefined) { + abortAlgorithm = reason => underlyingSink.abort(reason); + } + SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm); + } + // ClearAlgorithms may be called twice. Erroring the same stream in multiple ways will often result in redundant calls. + function WritableStreamDefaultControllerClearAlgorithms(controller) { + controller._writeAlgorithm = undefined; + controller._closeAlgorithm = undefined; + controller._abortAlgorithm = undefined; + controller._strategySizeAlgorithm = undefined; + } + function WritableStreamDefaultControllerClose(controller) { + EnqueueValueWithSize(controller, closeSentinel, 0); + WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); + } + function WritableStreamDefaultControllerGetChunkSize(controller, chunk) { + try { + return controller._strategySizeAlgorithm(chunk); + } + catch (chunkSizeE) { + WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE); + return 1; + } + } + function WritableStreamDefaultControllerGetDesiredSize(controller) { + return controller._strategyHWM - controller._queueTotalSize; + } + function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) { + try { + EnqueueValueWithSize(controller, chunk, chunkSize); + } + catch (enqueueE) { + WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE); + return; + } + const stream = controller._controlledWritableStream; + if (!WritableStreamCloseQueuedOrInFlight(stream) && stream._state === 'writable') { + const backpressure = WritableStreamDefaultControllerGetBackpressure(controller); + WritableStreamUpdateBackpressure(stream, backpressure); + } + WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); + } + // Abstract operations for the WritableStreamDefaultController. + function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) { + const stream = controller._controlledWritableStream; + if (!controller._started) { + return; + } + if (stream._inFlightWriteRequest !== undefined) { + return; + } + const state = stream._state; + if (state === 'erroring') { + WritableStreamFinishErroring(stream); + return; + } + if (controller._queue.length === 0) { + return; + } + const value = PeekQueueValue(controller); + if (value === closeSentinel) { + WritableStreamDefaultControllerProcessClose(controller); + } + else { + WritableStreamDefaultControllerProcessWrite(controller, value); + } + } + function WritableStreamDefaultControllerErrorIfNeeded(controller, error) { + if (controller._controlledWritableStream._state === 'writable') { + WritableStreamDefaultControllerError(controller, error); + } + } + function WritableStreamDefaultControllerProcessClose(controller) { + const stream = controller._controlledWritableStream; + WritableStreamMarkCloseRequestInFlight(stream); + DequeueValue(controller); + const sinkClosePromise = controller._closeAlgorithm(); + WritableStreamDefaultControllerClearAlgorithms(controller); + uponPromise(sinkClosePromise, () => { + WritableStreamFinishInFlightClose(stream); + }, reason => { + WritableStreamFinishInFlightCloseWithError(stream, reason); + }); + } + function WritableStreamDefaultControllerProcessWrite(controller, chunk) { + const stream = controller._controlledWritableStream; + WritableStreamMarkFirstWriteRequestInFlight(stream); + const sinkWritePromise = controller._writeAlgorithm(chunk); + uponPromise(sinkWritePromise, () => { + WritableStreamFinishInFlightWrite(stream); + const state = stream._state; + DequeueValue(controller); + if (!WritableStreamCloseQueuedOrInFlight(stream) && state === 'writable') { + const backpressure = WritableStreamDefaultControllerGetBackpressure(controller); + WritableStreamUpdateBackpressure(stream, backpressure); + } + WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); + }, reason => { + if (stream._state === 'writable') { + WritableStreamDefaultControllerClearAlgorithms(controller); + } + WritableStreamFinishInFlightWriteWithError(stream, reason); + }); + } + function WritableStreamDefaultControllerGetBackpressure(controller) { + const desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller); + return desiredSize <= 0; + } + // A client of WritableStreamDefaultController may use these functions directly to bypass state check. + function WritableStreamDefaultControllerError(controller, error) { + const stream = controller._controlledWritableStream; + WritableStreamDefaultControllerClearAlgorithms(controller); + WritableStreamStartErroring(stream, error); + } + // Helper functions for the WritableStream. + function streamBrandCheckException$2(name) { + return new TypeError(`WritableStream.prototype.${name} can only be used on a WritableStream`); + } + // Helper functions for the WritableStreamDefaultController. + function defaultControllerBrandCheckException$2(name) { + return new TypeError(`WritableStreamDefaultController.prototype.${name} can only be used on a WritableStreamDefaultController`); + } + // Helper functions for the WritableStreamDefaultWriter. + function defaultWriterBrandCheckException(name) { + return new TypeError(`WritableStreamDefaultWriter.prototype.${name} can only be used on a WritableStreamDefaultWriter`); + } + function defaultWriterLockException(name) { + return new TypeError('Cannot ' + name + ' a stream using a released writer'); + } + function defaultWriterClosedPromiseInitialize(writer) { + writer._closedPromise = newPromise((resolve, reject) => { + writer._closedPromise_resolve = resolve; + writer._closedPromise_reject = reject; + writer._closedPromiseState = 'pending'; + }); + } + function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) { + defaultWriterClosedPromiseInitialize(writer); + defaultWriterClosedPromiseReject(writer, reason); + } + function defaultWriterClosedPromiseInitializeAsResolved(writer) { + defaultWriterClosedPromiseInitialize(writer); + defaultWriterClosedPromiseResolve(writer); + } + function defaultWriterClosedPromiseReject(writer, reason) { + if (writer._closedPromise_reject === undefined) { + return; + } + setPromiseIsHandledToTrue(writer._closedPromise); + writer._closedPromise_reject(reason); + writer._closedPromise_resolve = undefined; + writer._closedPromise_reject = undefined; + writer._closedPromiseState = 'rejected'; + } + function defaultWriterClosedPromiseResetToRejected(writer, reason) { + defaultWriterClosedPromiseInitializeAsRejected(writer, reason); + } + function defaultWriterClosedPromiseResolve(writer) { + if (writer._closedPromise_resolve === undefined) { + return; + } + writer._closedPromise_resolve(undefined); + writer._closedPromise_resolve = undefined; + writer._closedPromise_reject = undefined; + writer._closedPromiseState = 'resolved'; + } + function defaultWriterReadyPromiseInitialize(writer) { + writer._readyPromise = newPromise((resolve, reject) => { + writer._readyPromise_resolve = resolve; + writer._readyPromise_reject = reject; + }); + writer._readyPromiseState = 'pending'; + } + function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) { + defaultWriterReadyPromiseInitialize(writer); + defaultWriterReadyPromiseReject(writer, reason); + } + function defaultWriterReadyPromiseInitializeAsResolved(writer) { + defaultWriterReadyPromiseInitialize(writer); + defaultWriterReadyPromiseResolve(writer); + } + function defaultWriterReadyPromiseReject(writer, reason) { + if (writer._readyPromise_reject === undefined) { + return; + } + setPromiseIsHandledToTrue(writer._readyPromise); + writer._readyPromise_reject(reason); + writer._readyPromise_resolve = undefined; + writer._readyPromise_reject = undefined; + writer._readyPromiseState = 'rejected'; + } + function defaultWriterReadyPromiseReset(writer) { + defaultWriterReadyPromiseInitialize(writer); + } + function defaultWriterReadyPromiseResetToRejected(writer, reason) { + defaultWriterReadyPromiseInitializeAsRejected(writer, reason); + } + function defaultWriterReadyPromiseResolve(writer) { + if (writer._readyPromise_resolve === undefined) { + return; + } + writer._readyPromise_resolve(undefined); + writer._readyPromise_resolve = undefined; + writer._readyPromise_reject = undefined; + writer._readyPromiseState = 'fulfilled'; + } + + /// + const NativeDOMException = typeof DOMException !== 'undefined' ? DOMException : undefined; + + /// + function isDOMExceptionConstructor(ctor) { + if (!(typeof ctor === 'function' || typeof ctor === 'object')) { + return false; + } + try { + new ctor(); + return true; + } + catch (_a) { + return false; + } + } + function createDOMExceptionPolyfill() { + // eslint-disable-next-line no-shadow + const ctor = function DOMException(message, name) { + this.message = message || ''; + this.name = name || 'Error'; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + }; + ctor.prototype = Object.create(Error.prototype); + Object.defineProperty(ctor.prototype, 'constructor', { value: ctor, writable: true, configurable: true }); + return ctor; + } + // eslint-disable-next-line no-redeclare + const DOMException$1 = isDOMExceptionConstructor(NativeDOMException) ? NativeDOMException : createDOMExceptionPolyfill(); + + function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventCancel, signal) { + const reader = AcquireReadableStreamDefaultReader(source); + const writer = AcquireWritableStreamDefaultWriter(dest); + source._disturbed = true; + let shuttingDown = false; + // This is used to keep track of the spec's requirement that we wait for ongoing writes during shutdown. + let currentWrite = promiseResolvedWith(undefined); + return newPromise((resolve, reject) => { + let abortAlgorithm; + if (signal !== undefined) { + abortAlgorithm = () => { + const error = new DOMException$1('Aborted', 'AbortError'); + const actions = []; + if (!preventAbort) { + actions.push(() => { + if (dest._state === 'writable') { + return WritableStreamAbort(dest, error); + } + return promiseResolvedWith(undefined); + }); + } + if (!preventCancel) { + actions.push(() => { + if (source._state === 'readable') { + return ReadableStreamCancel(source, error); + } + return promiseResolvedWith(undefined); + }); + } + shutdownWithAction(() => Promise.all(actions.map(action => action())), true, error); + }; + if (signal.aborted) { + abortAlgorithm(); + return; + } + signal.addEventListener('abort', abortAlgorithm); + } + // Using reader and writer, read all chunks from this and write them to dest + // - Backpressure must be enforced + // - Shutdown must stop all activity + function pipeLoop() { + return newPromise((resolveLoop, rejectLoop) => { + function next(done) { + if (done) { + resolveLoop(); + } + else { + // Use `PerformPromiseThen` instead of `uponPromise` to avoid + // adding unnecessary `.catch(rethrowAssertionErrorRejection)` handlers + PerformPromiseThen(pipeStep(), next, rejectLoop); + } + } + next(false); + }); + } + function pipeStep() { + if (shuttingDown) { + return promiseResolvedWith(true); + } + return PerformPromiseThen(writer._readyPromise, () => { + return newPromise((resolveRead, rejectRead) => { + ReadableStreamDefaultReaderRead(reader, { + _chunkSteps: chunk => { + currentWrite = PerformPromiseThen(WritableStreamDefaultWriterWrite(writer, chunk), undefined, noop); + resolveRead(false); + }, + _closeSteps: () => resolveRead(true), + _errorSteps: rejectRead + }); + }); + }); + } + // Errors must be propagated forward + isOrBecomesErrored(source, reader._closedPromise, storedError => { + if (!preventAbort) { + shutdownWithAction(() => WritableStreamAbort(dest, storedError), true, storedError); + } + else { + shutdown(true, storedError); + } + }); + // Errors must be propagated backward + isOrBecomesErrored(dest, writer._closedPromise, storedError => { + if (!preventCancel) { + shutdownWithAction(() => ReadableStreamCancel(source, storedError), true, storedError); + } + else { + shutdown(true, storedError); + } + }); + // Closing must be propagated forward + isOrBecomesClosed(source, reader._closedPromise, () => { + if (!preventClose) { + shutdownWithAction(() => WritableStreamDefaultWriterCloseWithErrorPropagation(writer)); + } + else { + shutdown(); + } + }); + // Closing must be propagated backward + if (WritableStreamCloseQueuedOrInFlight(dest) || dest._state === 'closed') { + const destClosed = new TypeError('the destination writable stream closed before all data could be piped to it'); + if (!preventCancel) { + shutdownWithAction(() => ReadableStreamCancel(source, destClosed), true, destClosed); + } + else { + shutdown(true, destClosed); + } + } + setPromiseIsHandledToTrue(pipeLoop()); + function waitForWritesToFinish() { + // Another write may have started while we were waiting on this currentWrite, so we have to be sure to wait + // for that too. + const oldCurrentWrite = currentWrite; + return PerformPromiseThen(currentWrite, () => oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined); + } + function isOrBecomesErrored(stream, promise, action) { + if (stream._state === 'errored') { + action(stream._storedError); + } + else { + uponRejection(promise, action); + } + } + function isOrBecomesClosed(stream, promise, action) { + if (stream._state === 'closed') { + action(); + } + else { + uponFulfillment(promise, action); + } + } + function shutdownWithAction(action, originalIsError, originalError) { + if (shuttingDown) { + return; + } + shuttingDown = true; + if (dest._state === 'writable' && !WritableStreamCloseQueuedOrInFlight(dest)) { + uponFulfillment(waitForWritesToFinish(), doTheRest); + } + else { + doTheRest(); + } + function doTheRest() { + uponPromise(action(), () => finalize(originalIsError, originalError), newError => finalize(true, newError)); + } + } + function shutdown(isError, error) { + if (shuttingDown) { + return; + } + shuttingDown = true; + if (dest._state === 'writable' && !WritableStreamCloseQueuedOrInFlight(dest)) { + uponFulfillment(waitForWritesToFinish(), () => finalize(isError, error)); + } + else { + finalize(isError, error); + } + } + function finalize(isError, error) { + WritableStreamDefaultWriterRelease(writer); + ReadableStreamReaderGenericRelease(reader); + if (signal !== undefined) { + signal.removeEventListener('abort', abortAlgorithm); + } + if (isError) { + reject(error); + } + else { + resolve(undefined); + } + } + }); + } + + /** + * Allows control of a {@link ReadableStream | readable stream}'s state and internal queue. + * + * @public + */ + class ReadableStreamDefaultController { + constructor() { + throw new TypeError('Illegal constructor'); + } + /** + * Returns the desired size to fill the controlled stream's internal queue. It can be negative, if the queue is + * over-full. An underlying source ought to use this information to determine when and how to apply backpressure. + */ + get desiredSize() { + if (!IsReadableStreamDefaultController(this)) { + throw defaultControllerBrandCheckException$1('desiredSize'); + } + return ReadableStreamDefaultControllerGetDesiredSize(this); + } + /** + * Closes the controlled readable stream. Consumers will still be able to read any previously-enqueued chunks from + * the stream, but once those are read, the stream will become closed. + */ + close() { + if (!IsReadableStreamDefaultController(this)) { + throw defaultControllerBrandCheckException$1('close'); + } + if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(this)) { + throw new TypeError('The stream is not in a state that permits close'); + } + ReadableStreamDefaultControllerClose(this); + } + enqueue(chunk = undefined) { + if (!IsReadableStreamDefaultController(this)) { + throw defaultControllerBrandCheckException$1('enqueue'); + } + if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(this)) { + throw new TypeError('The stream is not in a state that permits enqueue'); + } + return ReadableStreamDefaultControllerEnqueue(this, chunk); + } + /** + * Errors the controlled readable stream, making all future interactions with it fail with the given error `e`. + */ + error(e = undefined) { + if (!IsReadableStreamDefaultController(this)) { + throw defaultControllerBrandCheckException$1('error'); + } + ReadableStreamDefaultControllerError(this, e); + } + /** @internal */ + [CancelSteps](reason) { + ResetQueue(this); + const result = this._cancelAlgorithm(reason); + ReadableStreamDefaultControllerClearAlgorithms(this); + return result; + } + /** @internal */ + [PullSteps](readRequest) { + const stream = this._controlledReadableStream; + if (this._queue.length > 0) { + const chunk = DequeueValue(this); + if (this._closeRequested && this._queue.length === 0) { + ReadableStreamDefaultControllerClearAlgorithms(this); + ReadableStreamClose(stream); + } + else { + ReadableStreamDefaultControllerCallPullIfNeeded(this); + } + readRequest._chunkSteps(chunk); + } + else { + ReadableStreamAddReadRequest(stream, readRequest); + ReadableStreamDefaultControllerCallPullIfNeeded(this); + } + } + } + Object.defineProperties(ReadableStreamDefaultController.prototype, { + close: { enumerable: true }, + enqueue: { enumerable: true }, + error: { enumerable: true }, + desiredSize: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { + value: 'ReadableStreamDefaultController', + configurable: true + }); + } + // Abstract operations for the ReadableStreamDefaultController. + function IsReadableStreamDefaultController(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_controlledReadableStream')) { + return false; + } + return x instanceof ReadableStreamDefaultController; + } + function ReadableStreamDefaultControllerCallPullIfNeeded(controller) { + const shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller); + if (!shouldPull) { + return; + } + if (controller._pulling) { + controller._pullAgain = true; + return; + } + controller._pulling = true; + const pullPromise = controller._pullAlgorithm(); + uponPromise(pullPromise, () => { + controller._pulling = false; + if (controller._pullAgain) { + controller._pullAgain = false; + ReadableStreamDefaultControllerCallPullIfNeeded(controller); + } + }, e => { + ReadableStreamDefaultControllerError(controller, e); + }); + } + function ReadableStreamDefaultControllerShouldCallPull(controller) { + const stream = controller._controlledReadableStream; + if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { + return false; + } + if (!controller._started) { + return false; + } + if (IsReadableStreamLocked(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { + return true; + } + const desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller); + if (desiredSize > 0) { + return true; + } + return false; + } + function ReadableStreamDefaultControllerClearAlgorithms(controller) { + controller._pullAlgorithm = undefined; + controller._cancelAlgorithm = undefined; + controller._strategySizeAlgorithm = undefined; + } + // A client of ReadableStreamDefaultController may use these functions directly to bypass state check. + function ReadableStreamDefaultControllerClose(controller) { + if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { + return; + } + const stream = controller._controlledReadableStream; + controller._closeRequested = true; + if (controller._queue.length === 0) { + ReadableStreamDefaultControllerClearAlgorithms(controller); + ReadableStreamClose(stream); + } + } + function ReadableStreamDefaultControllerEnqueue(controller, chunk) { + if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { + return; + } + const stream = controller._controlledReadableStream; + if (IsReadableStreamLocked(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { + ReadableStreamFulfillReadRequest(stream, chunk, false); + } + else { + let chunkSize; + try { + chunkSize = controller._strategySizeAlgorithm(chunk); + } + catch (chunkSizeE) { + ReadableStreamDefaultControllerError(controller, chunkSizeE); + throw chunkSizeE; + } + try { + EnqueueValueWithSize(controller, chunk, chunkSize); + } + catch (enqueueE) { + ReadableStreamDefaultControllerError(controller, enqueueE); + throw enqueueE; + } + } + ReadableStreamDefaultControllerCallPullIfNeeded(controller); + } + function ReadableStreamDefaultControllerError(controller, e) { + const stream = controller._controlledReadableStream; + if (stream._state !== 'readable') { + return; + } + ResetQueue(controller); + ReadableStreamDefaultControllerClearAlgorithms(controller); + ReadableStreamError(stream, e); + } + function ReadableStreamDefaultControllerGetDesiredSize(controller) { + const state = controller._controlledReadableStream._state; + if (state === 'errored') { + return null; + } + if (state === 'closed') { + return 0; + } + return controller._strategyHWM - controller._queueTotalSize; + } + // This is used in the implementation of TransformStream. + function ReadableStreamDefaultControllerHasBackpressure(controller) { + if (ReadableStreamDefaultControllerShouldCallPull(controller)) { + return false; + } + return true; + } + function ReadableStreamDefaultControllerCanCloseOrEnqueue(controller) { + const state = controller._controlledReadableStream._state; + if (!controller._closeRequested && state === 'readable') { + return true; + } + return false; + } + function SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm) { + controller._controlledReadableStream = stream; + controller._queue = undefined; + controller._queueTotalSize = undefined; + ResetQueue(controller); + controller._started = false; + controller._closeRequested = false; + controller._pullAgain = false; + controller._pulling = false; + controller._strategySizeAlgorithm = sizeAlgorithm; + controller._strategyHWM = highWaterMark; + controller._pullAlgorithm = pullAlgorithm; + controller._cancelAlgorithm = cancelAlgorithm; + stream._readableStreamController = controller; + const startResult = startAlgorithm(); + uponPromise(promiseResolvedWith(startResult), () => { + controller._started = true; + ReadableStreamDefaultControllerCallPullIfNeeded(controller); + }, r => { + ReadableStreamDefaultControllerError(controller, r); + }); + } + function SetUpReadableStreamDefaultControllerFromUnderlyingSource(stream, underlyingSource, highWaterMark, sizeAlgorithm) { + const controller = Object.create(ReadableStreamDefaultController.prototype); + let startAlgorithm = () => undefined; + let pullAlgorithm = () => promiseResolvedWith(undefined); + let cancelAlgorithm = () => promiseResolvedWith(undefined); + if (underlyingSource.start !== undefined) { + startAlgorithm = () => underlyingSource.start(controller); + } + if (underlyingSource.pull !== undefined) { + pullAlgorithm = () => underlyingSource.pull(controller); + } + if (underlyingSource.cancel !== undefined) { + cancelAlgorithm = reason => underlyingSource.cancel(reason); + } + SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm); + } + // Helper functions for the ReadableStreamDefaultController. + function defaultControllerBrandCheckException$1(name) { + return new TypeError(`ReadableStreamDefaultController.prototype.${name} can only be used on a ReadableStreamDefaultController`); + } + + function ReadableStreamTee(stream, cloneForBranch2) { + if (IsReadableByteStreamController(stream._readableStreamController)) { + return ReadableByteStreamTee(stream); + } + return ReadableStreamDefaultTee(stream); + } + function ReadableStreamDefaultTee(stream, cloneForBranch2) { + const reader = AcquireReadableStreamDefaultReader(stream); + let reading = false; + let readAgain = false; + let canceled1 = false; + let canceled2 = false; + let reason1; + let reason2; + let branch1; + let branch2; + let resolveCancelPromise; + const cancelPromise = newPromise(resolve => { + resolveCancelPromise = resolve; + }); + function pullAlgorithm() { + if (reading) { + readAgain = true; + return promiseResolvedWith(undefined); + } + reading = true; + const readRequest = { + _chunkSteps: chunk => { + // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using + // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let + // successful synchronously-available reads get ahead of asynchronously-available errors. + queueMicrotask(() => { + readAgain = false; + const chunk1 = chunk; + const chunk2 = chunk; + // There is no way to access the cloning code right now in the reference implementation. + // If we add one then we'll need an implementation for serializable objects. + // if (!canceled2 && cloneForBranch2) { + // chunk2 = StructuredDeserialize(StructuredSerialize(chunk2)); + // } + if (!canceled1) { + ReadableStreamDefaultControllerEnqueue(branch1._readableStreamController, chunk1); + } + if (!canceled2) { + ReadableStreamDefaultControllerEnqueue(branch2._readableStreamController, chunk2); + } + reading = false; + if (readAgain) { + pullAlgorithm(); + } + }); + }, + _closeSteps: () => { + reading = false; + if (!canceled1) { + ReadableStreamDefaultControllerClose(branch1._readableStreamController); + } + if (!canceled2) { + ReadableStreamDefaultControllerClose(branch2._readableStreamController); + } + if (!canceled1 || !canceled2) { + resolveCancelPromise(undefined); + } + }, + _errorSteps: () => { + reading = false; + } + }; + ReadableStreamDefaultReaderRead(reader, readRequest); + return promiseResolvedWith(undefined); + } + function cancel1Algorithm(reason) { + canceled1 = true; + reason1 = reason; + if (canceled2) { + const compositeReason = CreateArrayFromList([reason1, reason2]); + const cancelResult = ReadableStreamCancel(stream, compositeReason); + resolveCancelPromise(cancelResult); + } + return cancelPromise; + } + function cancel2Algorithm(reason) { + canceled2 = true; + reason2 = reason; + if (canceled1) { + const compositeReason = CreateArrayFromList([reason1, reason2]); + const cancelResult = ReadableStreamCancel(stream, compositeReason); + resolveCancelPromise(cancelResult); + } + return cancelPromise; + } + function startAlgorithm() { + // do nothing + } + branch1 = CreateReadableStream(startAlgorithm, pullAlgorithm, cancel1Algorithm); + branch2 = CreateReadableStream(startAlgorithm, pullAlgorithm, cancel2Algorithm); + uponRejection(reader._closedPromise, (r) => { + ReadableStreamDefaultControllerError(branch1._readableStreamController, r); + ReadableStreamDefaultControllerError(branch2._readableStreamController, r); + if (!canceled1 || !canceled2) { + resolveCancelPromise(undefined); + } + }); + return [branch1, branch2]; + } + function ReadableByteStreamTee(stream) { + let reader = AcquireReadableStreamDefaultReader(stream); + let reading = false; + let readAgainForBranch1 = false; + let readAgainForBranch2 = false; + let canceled1 = false; + let canceled2 = false; + let reason1; + let reason2; + let branch1; + let branch2; + let resolveCancelPromise; + const cancelPromise = newPromise(resolve => { + resolveCancelPromise = resolve; + }); + function forwardReaderError(thisReader) { + uponRejection(thisReader._closedPromise, r => { + if (thisReader !== reader) { + return; + } + ReadableByteStreamControllerError(branch1._readableStreamController, r); + ReadableByteStreamControllerError(branch2._readableStreamController, r); + if (!canceled1 || !canceled2) { + resolveCancelPromise(undefined); + } + }); + } + function pullWithDefaultReader() { + if (IsReadableStreamBYOBReader(reader)) { + ReadableStreamReaderGenericRelease(reader); + reader = AcquireReadableStreamDefaultReader(stream); + forwardReaderError(reader); + } + const readRequest = { + _chunkSteps: chunk => { + // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using + // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let + // successful synchronously-available reads get ahead of asynchronously-available errors. + queueMicrotask(() => { + readAgainForBranch1 = false; + readAgainForBranch2 = false; + const chunk1 = chunk; + let chunk2 = chunk; + if (!canceled1 && !canceled2) { + try { + chunk2 = CloneAsUint8Array(chunk); + } + catch (cloneE) { + ReadableByteStreamControllerError(branch1._readableStreamController, cloneE); + ReadableByteStreamControllerError(branch2._readableStreamController, cloneE); + resolveCancelPromise(ReadableStreamCancel(stream, cloneE)); + return; + } + } + if (!canceled1) { + ReadableByteStreamControllerEnqueue(branch1._readableStreamController, chunk1); + } + if (!canceled2) { + ReadableByteStreamControllerEnqueue(branch2._readableStreamController, chunk2); + } + reading = false; + if (readAgainForBranch1) { + pull1Algorithm(); + } + else if (readAgainForBranch2) { + pull2Algorithm(); + } + }); + }, + _closeSteps: () => { + reading = false; + if (!canceled1) { + ReadableByteStreamControllerClose(branch1._readableStreamController); + } + if (!canceled2) { + ReadableByteStreamControllerClose(branch2._readableStreamController); + } + if (branch1._readableStreamController._pendingPullIntos.length > 0) { + ReadableByteStreamControllerRespond(branch1._readableStreamController, 0); + } + if (branch2._readableStreamController._pendingPullIntos.length > 0) { + ReadableByteStreamControllerRespond(branch2._readableStreamController, 0); + } + if (!canceled1 || !canceled2) { + resolveCancelPromise(undefined); + } + }, + _errorSteps: () => { + reading = false; + } + }; + ReadableStreamDefaultReaderRead(reader, readRequest); + } + function pullWithBYOBReader(view, forBranch2) { + if (IsReadableStreamDefaultReader(reader)) { + ReadableStreamReaderGenericRelease(reader); + reader = AcquireReadableStreamBYOBReader(stream); + forwardReaderError(reader); + } + const byobBranch = forBranch2 ? branch2 : branch1; + const otherBranch = forBranch2 ? branch1 : branch2; + const readIntoRequest = { + _chunkSteps: chunk => { + // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using + // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let + // successful synchronously-available reads get ahead of asynchronously-available errors. + queueMicrotask(() => { + readAgainForBranch1 = false; + readAgainForBranch2 = false; + const byobCanceled = forBranch2 ? canceled2 : canceled1; + const otherCanceled = forBranch2 ? canceled1 : canceled2; + if (!otherCanceled) { + let clonedChunk; + try { + clonedChunk = CloneAsUint8Array(chunk); + } + catch (cloneE) { + ReadableByteStreamControllerError(byobBranch._readableStreamController, cloneE); + ReadableByteStreamControllerError(otherBranch._readableStreamController, cloneE); + resolveCancelPromise(ReadableStreamCancel(stream, cloneE)); + return; + } + if (!byobCanceled) { + ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); + } + ReadableByteStreamControllerEnqueue(otherBranch._readableStreamController, clonedChunk); + } + else if (!byobCanceled) { + ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); + } + reading = false; + if (readAgainForBranch1) { + pull1Algorithm(); + } + else if (readAgainForBranch2) { + pull2Algorithm(); + } + }); + }, + _closeSteps: chunk => { + reading = false; + const byobCanceled = forBranch2 ? canceled2 : canceled1; + const otherCanceled = forBranch2 ? canceled1 : canceled2; + if (!byobCanceled) { + ReadableByteStreamControllerClose(byobBranch._readableStreamController); + } + if (!otherCanceled) { + ReadableByteStreamControllerClose(otherBranch._readableStreamController); + } + if (chunk !== undefined) { + if (!byobCanceled) { + ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); + } + if (!otherCanceled && otherBranch._readableStreamController._pendingPullIntos.length > 0) { + ReadableByteStreamControllerRespond(otherBranch._readableStreamController, 0); + } + } + if (!byobCanceled || !otherCanceled) { + resolveCancelPromise(undefined); + } + }, + _errorSteps: () => { + reading = false; + } + }; + ReadableStreamBYOBReaderRead(reader, view, readIntoRequest); + } + function pull1Algorithm() { + if (reading) { + readAgainForBranch1 = true; + return promiseResolvedWith(undefined); + } + reading = true; + const byobRequest = ReadableByteStreamControllerGetBYOBRequest(branch1._readableStreamController); + if (byobRequest === null) { + pullWithDefaultReader(); + } + else { + pullWithBYOBReader(byobRequest._view, false); + } + return promiseResolvedWith(undefined); + } + function pull2Algorithm() { + if (reading) { + readAgainForBranch2 = true; + return promiseResolvedWith(undefined); + } + reading = true; + const byobRequest = ReadableByteStreamControllerGetBYOBRequest(branch2._readableStreamController); + if (byobRequest === null) { + pullWithDefaultReader(); + } + else { + pullWithBYOBReader(byobRequest._view, true); + } + return promiseResolvedWith(undefined); + } + function cancel1Algorithm(reason) { + canceled1 = true; + reason1 = reason; + if (canceled2) { + const compositeReason = CreateArrayFromList([reason1, reason2]); + const cancelResult = ReadableStreamCancel(stream, compositeReason); + resolveCancelPromise(cancelResult); + } + return cancelPromise; + } + function cancel2Algorithm(reason) { + canceled2 = true; + reason2 = reason; + if (canceled1) { + const compositeReason = CreateArrayFromList([reason1, reason2]); + const cancelResult = ReadableStreamCancel(stream, compositeReason); + resolveCancelPromise(cancelResult); + } + return cancelPromise; + } + function startAlgorithm() { + return; + } + branch1 = CreateReadableByteStream(startAlgorithm, pull1Algorithm, cancel1Algorithm); + branch2 = CreateReadableByteStream(startAlgorithm, pull2Algorithm, cancel2Algorithm); + forwardReaderError(reader); + return [branch1, branch2]; + } + + function convertUnderlyingDefaultOrByteSource(source, context) { + assertDictionary(source, context); + const original = source; + const autoAllocateChunkSize = original === null || original === void 0 ? void 0 : original.autoAllocateChunkSize; + const cancel = original === null || original === void 0 ? void 0 : original.cancel; + const pull = original === null || original === void 0 ? void 0 : original.pull; + const start = original === null || original === void 0 ? void 0 : original.start; + const type = original === null || original === void 0 ? void 0 : original.type; + return { + autoAllocateChunkSize: autoAllocateChunkSize === undefined ? + undefined : + convertUnsignedLongLongWithEnforceRange(autoAllocateChunkSize, `${context} has member 'autoAllocateChunkSize' that`), + cancel: cancel === undefined ? + undefined : + convertUnderlyingSourceCancelCallback(cancel, original, `${context} has member 'cancel' that`), + pull: pull === undefined ? + undefined : + convertUnderlyingSourcePullCallback(pull, original, `${context} has member 'pull' that`), + start: start === undefined ? + undefined : + convertUnderlyingSourceStartCallback(start, original, `${context} has member 'start' that`), + type: type === undefined ? undefined : convertReadableStreamType(type, `${context} has member 'type' that`) + }; + } + function convertUnderlyingSourceCancelCallback(fn, original, context) { + assertFunction(fn, context); + return (reason) => promiseCall(fn, original, [reason]); + } + function convertUnderlyingSourcePullCallback(fn, original, context) { + assertFunction(fn, context); + return (controller) => promiseCall(fn, original, [controller]); + } + function convertUnderlyingSourceStartCallback(fn, original, context) { + assertFunction(fn, context); + return (controller) => reflectCall(fn, original, [controller]); + } + function convertReadableStreamType(type, context) { + type = `${type}`; + if (type !== 'bytes') { + throw new TypeError(`${context} '${type}' is not a valid enumeration value for ReadableStreamType`); + } + return type; + } + + function convertReaderOptions(options, context) { + assertDictionary(options, context); + const mode = options === null || options === void 0 ? void 0 : options.mode; + return { + mode: mode === undefined ? undefined : convertReadableStreamReaderMode(mode, `${context} has member 'mode' that`) + }; + } + function convertReadableStreamReaderMode(mode, context) { + mode = `${mode}`; + if (mode !== 'byob') { + throw new TypeError(`${context} '${mode}' is not a valid enumeration value for ReadableStreamReaderMode`); + } + return mode; + } + + function convertIteratorOptions(options, context) { + assertDictionary(options, context); + const preventCancel = options === null || options === void 0 ? void 0 : options.preventCancel; + return { preventCancel: Boolean(preventCancel) }; + } + + function convertPipeOptions(options, context) { + assertDictionary(options, context); + const preventAbort = options === null || options === void 0 ? void 0 : options.preventAbort; + const preventCancel = options === null || options === void 0 ? void 0 : options.preventCancel; + const preventClose = options === null || options === void 0 ? void 0 : options.preventClose; + const signal = options === null || options === void 0 ? void 0 : options.signal; + if (signal !== undefined) { + assertAbortSignal(signal, `${context} has member 'signal' that`); + } + return { + preventAbort: Boolean(preventAbort), + preventCancel: Boolean(preventCancel), + preventClose: Boolean(preventClose), + signal + }; + } + function assertAbortSignal(signal, context) { + if (!isAbortSignal(signal)) { + throw new TypeError(`${context} is not an AbortSignal.`); + } + } + + function convertReadableWritablePair(pair, context) { + assertDictionary(pair, context); + const readable = pair === null || pair === void 0 ? void 0 : pair.readable; + assertRequiredField(readable, 'readable', 'ReadableWritablePair'); + assertReadableStream(readable, `${context} has member 'readable' that`); + const writable = pair === null || pair === void 0 ? void 0 : pair.writable; + assertRequiredField(writable, 'writable', 'ReadableWritablePair'); + assertWritableStream(writable, `${context} has member 'writable' that`); + return { readable, writable }; + } + + /** + * A readable stream represents a source of data, from which you can read. + * + * @public + */ + class ReadableStream { + constructor(rawUnderlyingSource = {}, rawStrategy = {}) { + if (rawUnderlyingSource === undefined) { + rawUnderlyingSource = null; + } + else { + assertObject(rawUnderlyingSource, 'First parameter'); + } + const strategy = convertQueuingStrategy(rawStrategy, 'Second parameter'); + const underlyingSource = convertUnderlyingDefaultOrByteSource(rawUnderlyingSource, 'First parameter'); + InitializeReadableStream(this); + if (underlyingSource.type === 'bytes') { + if (strategy.size !== undefined) { + throw new RangeError('The strategy for a byte stream cannot have a size function'); + } + const highWaterMark = ExtractHighWaterMark(strategy, 0); + SetUpReadableByteStreamControllerFromUnderlyingSource(this, underlyingSource, highWaterMark); + } + else { + const sizeAlgorithm = ExtractSizeAlgorithm(strategy); + const highWaterMark = ExtractHighWaterMark(strategy, 1); + SetUpReadableStreamDefaultControllerFromUnderlyingSource(this, underlyingSource, highWaterMark, sizeAlgorithm); + } + } + /** + * Whether or not the readable stream is locked to a {@link ReadableStreamDefaultReader | reader}. + */ + get locked() { + if (!IsReadableStream(this)) { + throw streamBrandCheckException$1('locked'); + } + return IsReadableStreamLocked(this); + } + /** + * Cancels the stream, signaling a loss of interest in the stream by a consumer. + * + * The supplied `reason` argument will be given to the underlying source's {@link UnderlyingSource.cancel | cancel()} + * method, which might or might not use it. + */ + cancel(reason = undefined) { + if (!IsReadableStream(this)) { + return promiseRejectedWith(streamBrandCheckException$1('cancel')); + } + if (IsReadableStreamLocked(this)) { + return promiseRejectedWith(new TypeError('Cannot cancel a stream that already has a reader')); + } + return ReadableStreamCancel(this, reason); + } + getReader(rawOptions = undefined) { + if (!IsReadableStream(this)) { + throw streamBrandCheckException$1('getReader'); + } + const options = convertReaderOptions(rawOptions, 'First parameter'); + if (options.mode === undefined) { + return AcquireReadableStreamDefaultReader(this); + } + return AcquireReadableStreamBYOBReader(this); + } + pipeThrough(rawTransform, rawOptions = {}) { + if (!IsReadableStream(this)) { + throw streamBrandCheckException$1('pipeThrough'); + } + assertRequiredArgument(rawTransform, 1, 'pipeThrough'); + const transform = convertReadableWritablePair(rawTransform, 'First parameter'); + const options = convertPipeOptions(rawOptions, 'Second parameter'); + if (IsReadableStreamLocked(this)) { + throw new TypeError('ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream'); + } + if (IsWritableStreamLocked(transform.writable)) { + throw new TypeError('ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream'); + } + const promise = ReadableStreamPipeTo(this, transform.writable, options.preventClose, options.preventAbort, options.preventCancel, options.signal); + setPromiseIsHandledToTrue(promise); + return transform.readable; + } + pipeTo(destination, rawOptions = {}) { + if (!IsReadableStream(this)) { + return promiseRejectedWith(streamBrandCheckException$1('pipeTo')); + } + if (destination === undefined) { + return promiseRejectedWith(`Parameter 1 is required in 'pipeTo'.`); + } + if (!IsWritableStream(destination)) { + return promiseRejectedWith(new TypeError(`ReadableStream.prototype.pipeTo's first argument must be a WritableStream`)); + } + let options; + try { + options = convertPipeOptions(rawOptions, 'Second parameter'); + } + catch (e) { + return promiseRejectedWith(e); + } + if (IsReadableStreamLocked(this)) { + return promiseRejectedWith(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream')); + } + if (IsWritableStreamLocked(destination)) { + return promiseRejectedWith(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream')); + } + return ReadableStreamPipeTo(this, destination, options.preventClose, options.preventAbort, options.preventCancel, options.signal); + } + /** + * Tees this readable stream, returning a two-element array containing the two resulting branches as + * new {@link ReadableStream} instances. + * + * Teeing a stream will lock it, preventing any other consumer from acquiring a reader. + * To cancel the stream, cancel both of the resulting branches; a composite cancellation reason will then be + * propagated to the stream's underlying source. + * + * Note that the chunks seen in each branch will be the same object. If the chunks are not immutable, + * this could allow interference between the two branches. + */ + tee() { + if (!IsReadableStream(this)) { + throw streamBrandCheckException$1('tee'); + } + const branches = ReadableStreamTee(this); + return CreateArrayFromList(branches); + } + values(rawOptions = undefined) { + if (!IsReadableStream(this)) { + throw streamBrandCheckException$1('values'); + } + const options = convertIteratorOptions(rawOptions, 'First parameter'); + return AcquireReadableStreamAsyncIterator(this, options.preventCancel); + } + } + Object.defineProperties(ReadableStream.prototype, { + cancel: { enumerable: true }, + getReader: { enumerable: true }, + pipeThrough: { enumerable: true }, + pipeTo: { enumerable: true }, + tee: { enumerable: true }, + values: { enumerable: true }, + locked: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(ReadableStream.prototype, SymbolPolyfill.toStringTag, { + value: 'ReadableStream', + configurable: true + }); + } + if (typeof SymbolPolyfill.asyncIterator === 'symbol') { + Object.defineProperty(ReadableStream.prototype, SymbolPolyfill.asyncIterator, { + value: ReadableStream.prototype.values, + writable: true, + configurable: true + }); + } + // Abstract operations for the ReadableStream. + // Throws if and only if startAlgorithm throws. + function CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark = 1, sizeAlgorithm = () => 1) { + const stream = Object.create(ReadableStream.prototype); + InitializeReadableStream(stream); + const controller = Object.create(ReadableStreamDefaultController.prototype); + SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm); + return stream; + } + // Throws if and only if startAlgorithm throws. + function CreateReadableByteStream(startAlgorithm, pullAlgorithm, cancelAlgorithm) { + const stream = Object.create(ReadableStream.prototype); + InitializeReadableStream(stream); + const controller = Object.create(ReadableByteStreamController.prototype); + SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, 0, undefined); + return stream; + } + function InitializeReadableStream(stream) { + stream._state = 'readable'; + stream._reader = undefined; + stream._storedError = undefined; + stream._disturbed = false; + } + function IsReadableStream(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) { + return false; + } + return x instanceof ReadableStream; + } + function IsReadableStreamLocked(stream) { + if (stream._reader === undefined) { + return false; + } + return true; + } + // ReadableStream API exposed for controllers. + function ReadableStreamCancel(stream, reason) { + stream._disturbed = true; + if (stream._state === 'closed') { + return promiseResolvedWith(undefined); + } + if (stream._state === 'errored') { + return promiseRejectedWith(stream._storedError); + } + ReadableStreamClose(stream); + const reader = stream._reader; + if (reader !== undefined && IsReadableStreamBYOBReader(reader)) { + reader._readIntoRequests.forEach(readIntoRequest => { + readIntoRequest._closeSteps(undefined); + }); + reader._readIntoRequests = new SimpleQueue(); + } + const sourceCancelPromise = stream._readableStreamController[CancelSteps](reason); + return transformPromiseWith(sourceCancelPromise, noop); + } + function ReadableStreamClose(stream) { + stream._state = 'closed'; + const reader = stream._reader; + if (reader === undefined) { + return; + } + defaultReaderClosedPromiseResolve(reader); + if (IsReadableStreamDefaultReader(reader)) { + reader._readRequests.forEach(readRequest => { + readRequest._closeSteps(); + }); + reader._readRequests = new SimpleQueue(); + } + } + function ReadableStreamError(stream, e) { + stream._state = 'errored'; + stream._storedError = e; + const reader = stream._reader; + if (reader === undefined) { + return; + } + defaultReaderClosedPromiseReject(reader, e); + if (IsReadableStreamDefaultReader(reader)) { + reader._readRequests.forEach(readRequest => { + readRequest._errorSteps(e); + }); + reader._readRequests = new SimpleQueue(); + } + else { + reader._readIntoRequests.forEach(readIntoRequest => { + readIntoRequest._errorSteps(e); + }); + reader._readIntoRequests = new SimpleQueue(); + } + } + // Helper functions for the ReadableStream. + function streamBrandCheckException$1(name) { + return new TypeError(`ReadableStream.prototype.${name} can only be used on a ReadableStream`); + } + + function convertQueuingStrategyInit(init, context) { + assertDictionary(init, context); + const highWaterMark = init === null || init === void 0 ? void 0 : init.highWaterMark; + assertRequiredField(highWaterMark, 'highWaterMark', 'QueuingStrategyInit'); + return { + highWaterMark: convertUnrestrictedDouble(highWaterMark) + }; + } + + // The size function must not have a prototype property nor be a constructor + const byteLengthSizeFunction = (chunk) => { + return chunk.byteLength; + }; + try { + Object.defineProperty(byteLengthSizeFunction, 'name', { + value: 'size', + configurable: true + }); + } + catch (_a) { + // This property is non-configurable in older browsers, so ignore if this throws. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility + } + /** + * A queuing strategy that counts the number of bytes in each chunk. + * + * @public + */ + class ByteLengthQueuingStrategy { + constructor(options) { + assertRequiredArgument(options, 1, 'ByteLengthQueuingStrategy'); + options = convertQueuingStrategyInit(options, 'First parameter'); + this._byteLengthQueuingStrategyHighWaterMark = options.highWaterMark; + } + /** + * Returns the high water mark provided to the constructor. + */ + get highWaterMark() { + if (!IsByteLengthQueuingStrategy(this)) { + throw byteLengthBrandCheckException('highWaterMark'); + } + return this._byteLengthQueuingStrategyHighWaterMark; + } + /** + * Measures the size of `chunk` by returning the value of its `byteLength` property. + */ + get size() { + if (!IsByteLengthQueuingStrategy(this)) { + throw byteLengthBrandCheckException('size'); + } + return byteLengthSizeFunction; + } + } + Object.defineProperties(ByteLengthQueuingStrategy.prototype, { + highWaterMark: { enumerable: true }, + size: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(ByteLengthQueuingStrategy.prototype, SymbolPolyfill.toStringTag, { + value: 'ByteLengthQueuingStrategy', + configurable: true + }); + } + // Helper functions for the ByteLengthQueuingStrategy. + function byteLengthBrandCheckException(name) { + return new TypeError(`ByteLengthQueuingStrategy.prototype.${name} can only be used on a ByteLengthQueuingStrategy`); + } + function IsByteLengthQueuingStrategy(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_byteLengthQueuingStrategyHighWaterMark')) { + return false; + } + return x instanceof ByteLengthQueuingStrategy; + } + + // The size function must not have a prototype property nor be a constructor + const countSizeFunction = () => { + return 1; + }; + try { + Object.defineProperty(countSizeFunction, 'name', { + value: 'size', + configurable: true + }); + } + catch (_a) { + // This property is non-configurable in older browsers, so ignore if this throws. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility + } + /** + * A queuing strategy that counts the number of chunks. + * + * @public + */ + class CountQueuingStrategy { + constructor(options) { + assertRequiredArgument(options, 1, 'CountQueuingStrategy'); + options = convertQueuingStrategyInit(options, 'First parameter'); + this._countQueuingStrategyHighWaterMark = options.highWaterMark; + } + /** + * Returns the high water mark provided to the constructor. + */ + get highWaterMark() { + if (!IsCountQueuingStrategy(this)) { + throw countBrandCheckException('highWaterMark'); + } + return this._countQueuingStrategyHighWaterMark; + } + /** + * Measures the size of `chunk` by always returning 1. + * This ensures that the total queue size is a count of the number of chunks in the queue. + */ + get size() { + if (!IsCountQueuingStrategy(this)) { + throw countBrandCheckException('size'); + } + return countSizeFunction; + } + } + Object.defineProperties(CountQueuingStrategy.prototype, { + highWaterMark: { enumerable: true }, + size: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(CountQueuingStrategy.prototype, SymbolPolyfill.toStringTag, { + value: 'CountQueuingStrategy', + configurable: true + }); + } + // Helper functions for the CountQueuingStrategy. + function countBrandCheckException(name) { + return new TypeError(`CountQueuingStrategy.prototype.${name} can only be used on a CountQueuingStrategy`); + } + function IsCountQueuingStrategy(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_countQueuingStrategyHighWaterMark')) { + return false; + } + return x instanceof CountQueuingStrategy; + } + + function convertTransformer(original, context) { + assertDictionary(original, context); + const flush = original === null || original === void 0 ? void 0 : original.flush; + const readableType = original === null || original === void 0 ? void 0 : original.readableType; + const start = original === null || original === void 0 ? void 0 : original.start; + const transform = original === null || original === void 0 ? void 0 : original.transform; + const writableType = original === null || original === void 0 ? void 0 : original.writableType; + return { + flush: flush === undefined ? + undefined : + convertTransformerFlushCallback(flush, original, `${context} has member 'flush' that`), + readableType, + start: start === undefined ? + undefined : + convertTransformerStartCallback(start, original, `${context} has member 'start' that`), + transform: transform === undefined ? + undefined : + convertTransformerTransformCallback(transform, original, `${context} has member 'transform' that`), + writableType + }; + } + function convertTransformerFlushCallback(fn, original, context) { + assertFunction(fn, context); + return (controller) => promiseCall(fn, original, [controller]); + } + function convertTransformerStartCallback(fn, original, context) { + assertFunction(fn, context); + return (controller) => reflectCall(fn, original, [controller]); + } + function convertTransformerTransformCallback(fn, original, context) { + assertFunction(fn, context); + return (chunk, controller) => promiseCall(fn, original, [chunk, controller]); + } + + // Class TransformStream + /** + * A transform stream consists of a pair of streams: a {@link WritableStream | writable stream}, + * known as its writable side, and a {@link ReadableStream | readable stream}, known as its readable side. + * In a manner specific to the transform stream in question, writes to the writable side result in new data being + * made available for reading from the readable side. + * + * @public + */ + class TransformStream { + constructor(rawTransformer = {}, rawWritableStrategy = {}, rawReadableStrategy = {}) { + if (rawTransformer === undefined) { + rawTransformer = null; + } + const writableStrategy = convertQueuingStrategy(rawWritableStrategy, 'Second parameter'); + const readableStrategy = convertQueuingStrategy(rawReadableStrategy, 'Third parameter'); + const transformer = convertTransformer(rawTransformer, 'First parameter'); + if (transformer.readableType !== undefined) { + throw new RangeError('Invalid readableType specified'); + } + if (transformer.writableType !== undefined) { + throw new RangeError('Invalid writableType specified'); + } + const readableHighWaterMark = ExtractHighWaterMark(readableStrategy, 0); + const readableSizeAlgorithm = ExtractSizeAlgorithm(readableStrategy); + const writableHighWaterMark = ExtractHighWaterMark(writableStrategy, 1); + const writableSizeAlgorithm = ExtractSizeAlgorithm(writableStrategy); + let startPromise_resolve; + const startPromise = newPromise(resolve => { + startPromise_resolve = resolve; + }); + InitializeTransformStream(this, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm); + SetUpTransformStreamDefaultControllerFromTransformer(this, transformer); + if (transformer.start !== undefined) { + startPromise_resolve(transformer.start(this._transformStreamController)); + } + else { + startPromise_resolve(undefined); + } + } + /** + * The readable side of the transform stream. + */ + get readable() { + if (!IsTransformStream(this)) { + throw streamBrandCheckException('readable'); + } + return this._readable; + } + /** + * The writable side of the transform stream. + */ + get writable() { + if (!IsTransformStream(this)) { + throw streamBrandCheckException('writable'); + } + return this._writable; + } + } + Object.defineProperties(TransformStream.prototype, { + readable: { enumerable: true }, + writable: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(TransformStream.prototype, SymbolPolyfill.toStringTag, { + value: 'TransformStream', + configurable: true + }); + } + function InitializeTransformStream(stream, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm) { + function startAlgorithm() { + return startPromise; + } + function writeAlgorithm(chunk) { + return TransformStreamDefaultSinkWriteAlgorithm(stream, chunk); + } + function abortAlgorithm(reason) { + return TransformStreamDefaultSinkAbortAlgorithm(stream, reason); + } + function closeAlgorithm() { + return TransformStreamDefaultSinkCloseAlgorithm(stream); + } + stream._writable = CreateWritableStream(startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, writableHighWaterMark, writableSizeAlgorithm); + function pullAlgorithm() { + return TransformStreamDefaultSourcePullAlgorithm(stream); + } + function cancelAlgorithm(reason) { + TransformStreamErrorWritableAndUnblockWrite(stream, reason); + return promiseResolvedWith(undefined); + } + stream._readable = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, readableHighWaterMark, readableSizeAlgorithm); + // The [[backpressure]] slot is set to undefined so that it can be initialised by TransformStreamSetBackpressure. + stream._backpressure = undefined; + stream._backpressureChangePromise = undefined; + stream._backpressureChangePromise_resolve = undefined; + TransformStreamSetBackpressure(stream, true); + stream._transformStreamController = undefined; + } + function IsTransformStream(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) { + return false; + } + return x instanceof TransformStream; + } + // This is a no-op if both sides are already errored. + function TransformStreamError(stream, e) { + ReadableStreamDefaultControllerError(stream._readable._readableStreamController, e); + TransformStreamErrorWritableAndUnblockWrite(stream, e); + } + function TransformStreamErrorWritableAndUnblockWrite(stream, e) { + TransformStreamDefaultControllerClearAlgorithms(stream._transformStreamController); + WritableStreamDefaultControllerErrorIfNeeded(stream._writable._writableStreamController, e); + if (stream._backpressure) { + // Pretend that pull() was called to permit any pending write() calls to complete. TransformStreamSetBackpressure() + // cannot be called from enqueue() or pull() once the ReadableStream is errored, so this will will be the final time + // _backpressure is set. + TransformStreamSetBackpressure(stream, false); + } + } + function TransformStreamSetBackpressure(stream, backpressure) { + // Passes also when called during construction. + if (stream._backpressureChangePromise !== undefined) { + stream._backpressureChangePromise_resolve(); + } + stream._backpressureChangePromise = newPromise(resolve => { + stream._backpressureChangePromise_resolve = resolve; + }); + stream._backpressure = backpressure; + } + // Class TransformStreamDefaultController + /** + * Allows control of the {@link ReadableStream} and {@link WritableStream} of the associated {@link TransformStream}. + * + * @public + */ + class TransformStreamDefaultController { + constructor() { + throw new TypeError('Illegal constructor'); + } + /** + * Returns the desired size to fill the readable side’s internal queue. It can be negative, if the queue is over-full. + */ + get desiredSize() { + if (!IsTransformStreamDefaultController(this)) { + throw defaultControllerBrandCheckException('desiredSize'); + } + const readableController = this._controlledTransformStream._readable._readableStreamController; + return ReadableStreamDefaultControllerGetDesiredSize(readableController); + } + enqueue(chunk = undefined) { + if (!IsTransformStreamDefaultController(this)) { + throw defaultControllerBrandCheckException('enqueue'); + } + TransformStreamDefaultControllerEnqueue(this, chunk); + } + /** + * Errors both the readable side and the writable side of the controlled transform stream, making all future + * interactions with it fail with the given error `e`. Any chunks queued for transformation will be discarded. + */ + error(reason = undefined) { + if (!IsTransformStreamDefaultController(this)) { + throw defaultControllerBrandCheckException('error'); + } + TransformStreamDefaultControllerError(this, reason); + } + /** + * Closes the readable side and errors the writable side of the controlled transform stream. This is useful when the + * transformer only needs to consume a portion of the chunks written to the writable side. + */ + terminate() { + if (!IsTransformStreamDefaultController(this)) { + throw defaultControllerBrandCheckException('terminate'); + } + TransformStreamDefaultControllerTerminate(this); + } + } + Object.defineProperties(TransformStreamDefaultController.prototype, { + enqueue: { enumerable: true }, + error: { enumerable: true }, + terminate: { enumerable: true }, + desiredSize: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(TransformStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { + value: 'TransformStreamDefaultController', + configurable: true + }); + } + // Transform Stream Default Controller Abstract Operations + function IsTransformStreamDefaultController(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) { + return false; + } + return x instanceof TransformStreamDefaultController; + } + function SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm) { + controller._controlledTransformStream = stream; + stream._transformStreamController = controller; + controller._transformAlgorithm = transformAlgorithm; + controller._flushAlgorithm = flushAlgorithm; + } + function SetUpTransformStreamDefaultControllerFromTransformer(stream, transformer) { + const controller = Object.create(TransformStreamDefaultController.prototype); + let transformAlgorithm = (chunk) => { + try { + TransformStreamDefaultControllerEnqueue(controller, chunk); + return promiseResolvedWith(undefined); + } + catch (transformResultE) { + return promiseRejectedWith(transformResultE); + } + }; + let flushAlgorithm = () => promiseResolvedWith(undefined); + if (transformer.transform !== undefined) { + transformAlgorithm = chunk => transformer.transform(chunk, controller); + } + if (transformer.flush !== undefined) { + flushAlgorithm = () => transformer.flush(controller); + } + SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm); + } + function TransformStreamDefaultControllerClearAlgorithms(controller) { + controller._transformAlgorithm = undefined; + controller._flushAlgorithm = undefined; + } + function TransformStreamDefaultControllerEnqueue(controller, chunk) { + const stream = controller._controlledTransformStream; + const readableController = stream._readable._readableStreamController; + if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(readableController)) { + throw new TypeError('Readable side is not in a state that permits enqueue'); + } + // We throttle transform invocations based on the backpressure of the ReadableStream, but we still + // accept TransformStreamDefaultControllerEnqueue() calls. + try { + ReadableStreamDefaultControllerEnqueue(readableController, chunk); + } + catch (e) { + // This happens when readableStrategy.size() throws. + TransformStreamErrorWritableAndUnblockWrite(stream, e); + throw stream._readable._storedError; + } + const backpressure = ReadableStreamDefaultControllerHasBackpressure(readableController); + if (backpressure !== stream._backpressure) { + TransformStreamSetBackpressure(stream, true); + } + } + function TransformStreamDefaultControllerError(controller, e) { + TransformStreamError(controller._controlledTransformStream, e); + } + function TransformStreamDefaultControllerPerformTransform(controller, chunk) { + const transformPromise = controller._transformAlgorithm(chunk); + return transformPromiseWith(transformPromise, undefined, r => { + TransformStreamError(controller._controlledTransformStream, r); + throw r; + }); + } + function TransformStreamDefaultControllerTerminate(controller) { + const stream = controller._controlledTransformStream; + const readableController = stream._readable._readableStreamController; + ReadableStreamDefaultControllerClose(readableController); + const error = new TypeError('TransformStream terminated'); + TransformStreamErrorWritableAndUnblockWrite(stream, error); + } + // TransformStreamDefaultSink Algorithms + function TransformStreamDefaultSinkWriteAlgorithm(stream, chunk) { + const controller = stream._transformStreamController; + if (stream._backpressure) { + const backpressureChangePromise = stream._backpressureChangePromise; + return transformPromiseWith(backpressureChangePromise, () => { + const writable = stream._writable; + const state = writable._state; + if (state === 'erroring') { + throw writable._storedError; + } + return TransformStreamDefaultControllerPerformTransform(controller, chunk); + }); + } + return TransformStreamDefaultControllerPerformTransform(controller, chunk); + } + function TransformStreamDefaultSinkAbortAlgorithm(stream, reason) { + // abort() is not called synchronously, so it is possible for abort() to be called when the stream is already + // errored. + TransformStreamError(stream, reason); + return promiseResolvedWith(undefined); + } + function TransformStreamDefaultSinkCloseAlgorithm(stream) { + // stream._readable cannot change after construction, so caching it across a call to user code is safe. + const readable = stream._readable; + const controller = stream._transformStreamController; + const flushPromise = controller._flushAlgorithm(); + TransformStreamDefaultControllerClearAlgorithms(controller); + // Return a promise that is fulfilled with undefined on success. + return transformPromiseWith(flushPromise, () => { + if (readable._state === 'errored') { + throw readable._storedError; + } + ReadableStreamDefaultControllerClose(readable._readableStreamController); + }, r => { + TransformStreamError(stream, r); + throw readable._storedError; + }); + } + // TransformStreamDefaultSource Algorithms + function TransformStreamDefaultSourcePullAlgorithm(stream) { + // Invariant. Enforced by the promises returned by start() and pull(). + TransformStreamSetBackpressure(stream, false); + // Prevent the next pull() call until there is backpressure. + return stream._backpressureChangePromise; + } + // Helper functions for the TransformStreamDefaultController. + function defaultControllerBrandCheckException(name) { + return new TypeError(`TransformStreamDefaultController.prototype.${name} can only be used on a TransformStreamDefaultController`); + } + // Helper functions for the TransformStream. + function streamBrandCheckException(name) { + return new TypeError(`TransformStream.prototype.${name} can only be used on a TransformStream`); + } + + exports.ByteLengthQueuingStrategy = ByteLengthQueuingStrategy; + exports.CountQueuingStrategy = CountQueuingStrategy; + exports.ReadableByteStreamController = ReadableByteStreamController; + exports.ReadableStream = ReadableStream; + exports.ReadableStreamBYOBReader = ReadableStreamBYOBReader; + exports.ReadableStreamBYOBRequest = ReadableStreamBYOBRequest; + exports.ReadableStreamDefaultController = ReadableStreamDefaultController; + exports.ReadableStreamDefaultReader = ReadableStreamDefaultReader; + exports.TransformStream = TransformStream; + exports.TransformStreamDefaultController = TransformStreamDefaultController; + exports.WritableStream = WritableStream; + exports.WritableStreamDefaultController = WritableStreamDefaultController; + exports.WritableStreamDefaultWriter = WritableStreamDefaultWriter; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=ponyfill.es2018.js.map + + +/***/ }), + +/***/ 2940: +/***/ ((module) => { + +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} + + +/***/ }), + +/***/ 2644: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +// Import GitHub toolkit and Octokit REST client +const github_1 = __nccwpck_require__(5438); +const openai_1 = __importDefault(__nccwpck_require__(47)); +// @ts-ignore - process is not imported +const OpenAI = new openai_1.default({ apiKey: process.env.OPENAI_API_KEY }); +async function handleIssueCommentCreated(octokit, labelNames) { + const payload = github_1.context.payload; + // @ts-ignore - process is not imported + const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; + // check if the issue is opened and the has all passed labels + if (payload.issue?.state === 'open' && labelNames.every((labelName) => payload.issue?.labels.some((issueLabel) => issueLabel.name === labelName))) { + if (!OPENAI_ASSISTANT_ID) { + console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); + return; + } + // 1, check if comment is proposal and if proposal template is followed + const content = `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment?.body}`; + // create thread with first user message and run it + const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ + assistant_id: OPENAI_ASSISTANT_ID ?? '', + thread: { messages: [{ role: 'user', content }] }, + }); + // count calls for debug purposes + let count = 0; + // poll for run completion + const intervalID = setInterval(() => { + OpenAI.beta.threads.runs + .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) + .then((run) => { + // return if run is not completed + if (run.status !== 'completed') { + return; + } + // get assistant response + OpenAI.beta.threads.messages + .list(createAndRunResponse.thread_id) + .then((threadMessages) => { + // list thread messages content + threadMessages.data.forEach((message, index) => { + // @ts-ignore - we do have text value in content[0] but typescript doesn't know that + // this is a 'openai' package type issue + let assistantResponse = message.content?.[index]?.text?.value; + console.log('issue_comment.created - assistantResponse', assistantResponse); + if (!assistantResponse) { + return console.log('issue_comment.created - assistantResponse is empty'); + } + // check if assistant response is either NO_ACTION or "NO_ACTION" strings + // as sometimes the assistant response varies + const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; + // if assistant response is NO_ACTION or message role is 'user', do nothing + if (isNoAction || threadMessages.data?.[index]?.role === 'user') { + if (threadMessages.data?.[index]?.role === 'user') { + return; + } + return console.log('issue_comment.created - NO_ACTION'); + } + // if the assistant responded with no action but there's some context in the response + if (assistantResponse.includes('[NO_ACTION]')) { + // extract the text after [NO_ACTION] from assistantResponse since this is a + // bot related action keyword + const noActionContext = assistantResponse.split('[NO_ACTION] ')?.[1]?.replace('"', ''); + console.log('issue_comment.created - [NO_ACTION] w/ context: ', noActionContext); + return; + } + // replace {user} from response template with @username + assistantResponse = assistantResponse.replace('{user}', `@${payload.comment?.user.login}`); + // replace {proposalLink} from response template with the link to the comment + assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment?.html_url); + // remove any double quotes from the final comment because sometimes the assistant's + // response contains double quotes / sometimes it doesn't + assistantResponse = assistantResponse.replace('"', ''); + // create a comment with the assistant's response + console.log('issue_comment.created - proposal-police posts comment'); + return octokit.issues.createComment({ + ...github_1.context.repo, + issue_number: payload.issue?.number, + body: assistantResponse, + }); + }); + }) + .catch((err) => console.log('threads.messages.list - err', err)); + // stop polling + clearInterval(intervalID); + }) + .catch((err) => console.log('threads.runs.retrieve - err', err)); + // increment count for every threads.runs.retrieve call + count++; + console.log('threads.runs.retrieve - called:', count); + }, 1500); + } + // return so that the script doesn't hang + return false; +} +// Main function to process the workflow event +async function run() { + // @ts-ignore - process is not imported + const octokit = (0, github_1.getOctokit)(process.env.GITHUB_TOKEN); + await handleIssueCommentCreated(octokit, ['Help Wanted']); +} +run().catch((error) => { + console.error(error); + // @ts-ignore - process is not imported + process.exit(1); +}); + + +/***/ }), + +/***/ 2877: +/***/ ((module) => { + +module.exports = eval("require")("encoding"); + + +/***/ }), + +/***/ 9491: +/***/ ((module) => { + +"use strict"; +module.exports = require("assert"); + +/***/ }), + +/***/ 2361: +/***/ ((module) => { + +"use strict"; +module.exports = require("events"); + +/***/ }), + +/***/ 7147: +/***/ ((module) => { + +"use strict"; +module.exports = require("fs"); + +/***/ }), + +/***/ 3685: +/***/ ((module) => { + +"use strict"; +module.exports = require("http"); + +/***/ }), + +/***/ 5687: +/***/ ((module) => { + +"use strict"; +module.exports = require("https"); + +/***/ }), + +/***/ 1808: +/***/ ((module) => { + +"use strict"; +module.exports = require("net"); + +/***/ }), + +/***/ 7561: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:fs"); + +/***/ }), + +/***/ 4492: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:stream"); + +/***/ }), + +/***/ 2037: +/***/ ((module) => { + +"use strict"; +module.exports = require("os"); + +/***/ }), + +/***/ 1017: +/***/ ((module) => { + +"use strict"; +module.exports = require("path"); + +/***/ }), + +/***/ 5477: +/***/ ((module) => { + +"use strict"; +module.exports = require("punycode"); + +/***/ }), + +/***/ 2781: +/***/ ((module) => { + +"use strict"; +module.exports = require("stream"); + +/***/ }), + +/***/ 4404: +/***/ ((module) => { + +"use strict"; +module.exports = require("tls"); + +/***/ }), + +/***/ 7310: +/***/ ((module) => { + +"use strict"; +module.exports = require("url"); + +/***/ }), + +/***/ 3837: +/***/ ((module) => { + +"use strict"; +module.exports = require("util"); + +/***/ }), + +/***/ 1267: +/***/ ((module) => { + +"use strict"; +module.exports = require("worker_threads"); + +/***/ }), + +/***/ 9796: +/***/ ((module) => { + +"use strict"; +module.exports = require("zlib"); + +/***/ }), + +/***/ 1778: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 5860: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var _FormDataEncoder_instances, _FormDataEncoder_CRLF, _FormDataEncoder_CRLF_BYTES, _FormDataEncoder_CRLF_BYTES_LENGTH, _FormDataEncoder_DASHES, _FormDataEncoder_encoder, _FormDataEncoder_footer, _FormDataEncoder_form, _FormDataEncoder_options, _FormDataEncoder_getFieldHeader; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Encoder = exports.FormDataEncoder = void 0; +const createBoundary_1 = __importDefault(__nccwpck_require__(7956)); +const isPlainObject_1 = __importDefault(__nccwpck_require__(5240)); +const normalizeValue_1 = __importDefault(__nccwpck_require__(1391)); +const escapeName_1 = __importDefault(__nccwpck_require__(3864)); +const isFileLike_1 = __nccwpck_require__(6860); +const isFormData_1 = __nccwpck_require__(1633); +const defaultOptions = { + enableAdditionalHeaders: false +}; +class FormDataEncoder { + constructor(form, boundaryOrOptions, options) { + _FormDataEncoder_instances.add(this); + _FormDataEncoder_CRLF.set(this, "\r\n"); + _FormDataEncoder_CRLF_BYTES.set(this, void 0); + _FormDataEncoder_CRLF_BYTES_LENGTH.set(this, void 0); + _FormDataEncoder_DASHES.set(this, "-".repeat(2)); + _FormDataEncoder_encoder.set(this, new TextEncoder()); + _FormDataEncoder_footer.set(this, void 0); + _FormDataEncoder_form.set(this, void 0); + _FormDataEncoder_options.set(this, void 0); + if (!(0, isFormData_1.isFormData)(form)) { + throw new TypeError("Expected first argument to be a FormData instance."); + } + let boundary; + if ((0, isPlainObject_1.default)(boundaryOrOptions)) { + options = boundaryOrOptions; + } + else { + boundary = boundaryOrOptions; + } + if (!boundary) { + boundary = (0, createBoundary_1.default)(); + } + if (typeof boundary !== "string") { + throw new TypeError("Expected boundary argument to be a string."); + } + if (options && !(0, isPlainObject_1.default)(options)) { + throw new TypeError("Expected options argument to be an object."); + } + __classPrivateFieldSet(this, _FormDataEncoder_form, form, "f"); + __classPrivateFieldSet(this, _FormDataEncoder_options, { ...defaultOptions, ...options }, "f"); + __classPrivateFieldSet(this, _FormDataEncoder_CRLF_BYTES, __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode(__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")), "f"); + __classPrivateFieldSet(this, _FormDataEncoder_CRLF_BYTES_LENGTH, __classPrivateFieldGet(this, _FormDataEncoder_CRLF_BYTES, "f").byteLength, "f"); + this.boundary = `form-data-boundary-${boundary}`; + this.contentType = `multipart/form-data; boundary=${this.boundary}`; + __classPrivateFieldSet(this, _FormDataEncoder_footer, __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode(`${__classPrivateFieldGet(this, _FormDataEncoder_DASHES, "f")}${this.boundary}${__classPrivateFieldGet(this, _FormDataEncoder_DASHES, "f")}${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f").repeat(2)}`), "f"); + this.contentLength = String(this.getContentLength()); + this.headers = Object.freeze({ + "Content-Type": this.contentType, + "Content-Length": this.contentLength + }); + Object.defineProperties(this, { + boundary: { writable: false, configurable: false }, + contentType: { writable: false, configurable: false }, + contentLength: { writable: false, configurable: false }, + headers: { writable: false, configurable: false } + }); + } + getContentLength() { + let length = 0; + for (const [name, raw] of __classPrivateFieldGet(this, _FormDataEncoder_form, "f")) { + const value = (0, isFileLike_1.isFileLike)(raw) ? raw : __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode((0, normalizeValue_1.default)(raw)); + length += __classPrivateFieldGet(this, _FormDataEncoder_instances, "m", _FormDataEncoder_getFieldHeader).call(this, name, value).byteLength; + length += (0, isFileLike_1.isFileLike)(value) ? value.size : value.byteLength; + length += __classPrivateFieldGet(this, _FormDataEncoder_CRLF_BYTES_LENGTH, "f"); + } + return length + __classPrivateFieldGet(this, _FormDataEncoder_footer, "f").byteLength; + } + *values() { + for (const [name, raw] of __classPrivateFieldGet(this, _FormDataEncoder_form, "f").entries()) { + const value = (0, isFileLike_1.isFileLike)(raw) ? raw : __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode((0, normalizeValue_1.default)(raw)); + yield __classPrivateFieldGet(this, _FormDataEncoder_instances, "m", _FormDataEncoder_getFieldHeader).call(this, name, value); + yield value; + yield __classPrivateFieldGet(this, _FormDataEncoder_CRLF_BYTES, "f"); + } + yield __classPrivateFieldGet(this, _FormDataEncoder_footer, "f"); + } + async *encode() { + for (const part of this.values()) { + if ((0, isFileLike_1.isFileLike)(part)) { + yield* part.stream(); + } + else { + yield part; + } + } + } + [(_FormDataEncoder_CRLF = new WeakMap(), _FormDataEncoder_CRLF_BYTES = new WeakMap(), _FormDataEncoder_CRLF_BYTES_LENGTH = new WeakMap(), _FormDataEncoder_DASHES = new WeakMap(), _FormDataEncoder_encoder = new WeakMap(), _FormDataEncoder_footer = new WeakMap(), _FormDataEncoder_form = new WeakMap(), _FormDataEncoder_options = new WeakMap(), _FormDataEncoder_instances = new WeakSet(), _FormDataEncoder_getFieldHeader = function _FormDataEncoder_getFieldHeader(name, value) { + let header = ""; + header += `${__classPrivateFieldGet(this, _FormDataEncoder_DASHES, "f")}${this.boundary}${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")}`; + header += `Content-Disposition: form-data; name="${(0, escapeName_1.default)(name)}"`; + if ((0, isFileLike_1.isFileLike)(value)) { + header += `; filename="${(0, escapeName_1.default)(value.name)}"${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")}`; + header += `Content-Type: ${value.type || "application/octet-stream"}`; + } + if (__classPrivateFieldGet(this, _FormDataEncoder_options, "f").enableAdditionalHeaders === true) { + header += `${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")}Content-Length: ${(0, isFileLike_1.isFileLike)(value) ? value.size : value.byteLength}`; + } + return __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode(`${header}${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f").repeat(2)}`); + }, Symbol.iterator)]() { + return this.values(); + } + [Symbol.asyncIterator]() { + return this.encode(); + } +} +exports.FormDataEncoder = FormDataEncoder; +exports.Encoder = FormDataEncoder; + + +/***/ }), + +/***/ 6921: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 8824: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +__exportStar(__nccwpck_require__(5860), exports); +__exportStar(__nccwpck_require__(1778), exports); +__exportStar(__nccwpck_require__(6921), exports); +__exportStar(__nccwpck_require__(6860), exports); +__exportStar(__nccwpck_require__(1633), exports); + + +/***/ }), + +/***/ 7956: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"; +function createBoundary() { + let size = 16; + let res = ""; + while (size--) { + res += alphabet[(Math.random() * alphabet.length) << 0]; + } + return res; +} +exports["default"] = createBoundary; + + +/***/ }), + +/***/ 3864: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const escapeName = (name) => String(name) + .replace(/\r/g, "%0D") + .replace(/\n/g, "%0A") + .replace(/"/g, "%22"); +exports["default"] = escapeName; + + +/***/ }), + +/***/ 6860: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isFileLike = void 0; +const isFunction_1 = __importDefault(__nccwpck_require__(2498)); +const isFileLike = (value) => Boolean(value + && typeof value === "object" + && (0, isFunction_1.default)(value.constructor) + && value[Symbol.toStringTag] === "File" + && (0, isFunction_1.default)(value.stream) + && value.name != null + && value.size != null + && value.lastModified != null); +exports.isFileLike = isFileLike; + + +/***/ }), + +/***/ 1633: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isFormDataLike = exports.isFormData = void 0; +const isFunction_1 = __importDefault(__nccwpck_require__(2498)); +const isFormData = (value) => Boolean(value + && (0, isFunction_1.default)(value.constructor) + && value[Symbol.toStringTag] === "FormData" + && (0, isFunction_1.default)(value.append) + && (0, isFunction_1.default)(value.getAll) + && (0, isFunction_1.default)(value.entries) + && (0, isFunction_1.default)(value[Symbol.iterator])); +exports.isFormData = isFormData; +exports.isFormDataLike = exports.isFormData; + + +/***/ }), + +/***/ 2498: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const isFunction = (value) => (typeof value === "function"); +exports["default"] = isFunction; + + +/***/ }), + +/***/ 5240: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const getType = (value) => (Object.prototype.toString.call(value).slice(8, -1).toLowerCase()); +function isPlainObject(value) { + if (getType(value) !== "object") { + return false; + } + const pp = Object.getPrototypeOf(value); + if (pp === null || pp === undefined) { + return true; + } + const Ctor = pp.constructor && pp.constructor.toString(); + return Ctor === Object.toString(); +} +exports["default"] = isPlainObject; + + +/***/ }), + +/***/ 1391: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const normalizeValue = (value) => String(value) + .replace(/\r|\n/g, (match, i, str) => { + if ((match === "\r" && str[i + 1] !== "\n") + || (match === "\n" && str[i - 1] !== "\r")) { + return "\r\n"; + } + return match; +}); +exports["default"] = normalizeValue; + + +/***/ }), + +/***/ 6637: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +/*! Based on fetch-blob. MIT License. Jimmy Wärting & David Frank */ +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var _Blob_parts, _Blob_type, _Blob_size; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Blob = void 0; +const web_streams_polyfill_1 = __nccwpck_require__(6993); +const isFunction_1 = __nccwpck_require__(4245); +const blobHelpers_1 = __nccwpck_require__(7058); +class Blob { + constructor(blobParts = [], options = {}) { + _Blob_parts.set(this, []); + _Blob_type.set(this, ""); + _Blob_size.set(this, 0); + options !== null && options !== void 0 ? options : (options = {}); + if (typeof blobParts !== "object" || blobParts === null) { + throw new TypeError("Failed to construct 'Blob': " + + "The provided value cannot be converted to a sequence."); + } + if (!(0, isFunction_1.isFunction)(blobParts[Symbol.iterator])) { + throw new TypeError("Failed to construct 'Blob': " + + "The object must have a callable @@iterator property."); + } + if (typeof options !== "object" && !(0, isFunction_1.isFunction)(options)) { + throw new TypeError("Failed to construct 'Blob': parameter 2 cannot convert to dictionary."); + } + const encoder = new TextEncoder(); + for (const raw of blobParts) { + let part; + if (ArrayBuffer.isView(raw)) { + part = new Uint8Array(raw.buffer.slice(raw.byteOffset, raw.byteOffset + raw.byteLength)); + } + else if (raw instanceof ArrayBuffer) { + part = new Uint8Array(raw.slice(0)); + } + else if (raw instanceof Blob) { + part = raw; + } + else { + part = encoder.encode(String(raw)); + } + __classPrivateFieldSet(this, _Blob_size, __classPrivateFieldGet(this, _Blob_size, "f") + (ArrayBuffer.isView(part) ? part.byteLength : part.size), "f"); + __classPrivateFieldGet(this, _Blob_parts, "f").push(part); + } + const type = options.type === undefined ? "" : String(options.type); + __classPrivateFieldSet(this, _Blob_type, /^[\x20-\x7E]*$/.test(type) ? type : "", "f"); + } + static [(_Blob_parts = new WeakMap(), _Blob_type = new WeakMap(), _Blob_size = new WeakMap(), Symbol.hasInstance)](value) { + return Boolean(value + && typeof value === "object" + && (0, isFunction_1.isFunction)(value.constructor) + && ((0, isFunction_1.isFunction)(value.stream) + || (0, isFunction_1.isFunction)(value.arrayBuffer)) + && /^(Blob|File)$/.test(value[Symbol.toStringTag])); + } + get type() { + return __classPrivateFieldGet(this, _Blob_type, "f"); + } + get size() { + return __classPrivateFieldGet(this, _Blob_size, "f"); + } + slice(start, end, contentType) { + return new Blob((0, blobHelpers_1.sliceBlob)(__classPrivateFieldGet(this, _Blob_parts, "f"), this.size, start, end), { + type: contentType + }); + } + async text() { + const decoder = new TextDecoder(); + let result = ""; + for await (const chunk of (0, blobHelpers_1.consumeBlobParts)(__classPrivateFieldGet(this, _Blob_parts, "f"))) { + result += decoder.decode(chunk, { stream: true }); + } + result += decoder.decode(); + return result; + } + async arrayBuffer() { + const view = new Uint8Array(this.size); + let offset = 0; + for await (const chunk of (0, blobHelpers_1.consumeBlobParts)(__classPrivateFieldGet(this, _Blob_parts, "f"))) { + view.set(chunk, offset); + offset += chunk.length; + } + return view.buffer; + } + stream() { + const iterator = (0, blobHelpers_1.consumeBlobParts)(__classPrivateFieldGet(this, _Blob_parts, "f"), true); + return new web_streams_polyfill_1.ReadableStream({ + async pull(controller) { + const { value, done } = await iterator.next(); + if (done) { + return queueMicrotask(() => controller.close()); + } + controller.enqueue(value); + }, + async cancel() { + await iterator.return(); + } + }); + } + get [Symbol.toStringTag]() { + return "Blob"; + } +} +exports.Blob = Blob; +Object.defineProperties(Blob.prototype, { + type: { enumerable: true }, + size: { enumerable: true }, + slice: { enumerable: true }, + stream: { enumerable: true }, + text: { enumerable: true }, + arrayBuffer: { enumerable: true } +}); + + +/***/ }), + +/***/ 3637: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _File_name, _File_lastModified; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.File = void 0; +const Blob_1 = __nccwpck_require__(6637); +class File extends Blob_1.Blob { + constructor(fileBits, name, options = {}) { + super(fileBits, options); + _File_name.set(this, void 0); + _File_lastModified.set(this, 0); + if (arguments.length < 2) { + throw new TypeError("Failed to construct 'File': 2 arguments required, " + + `but only ${arguments.length} present.`); + } + __classPrivateFieldSet(this, _File_name, String(name), "f"); + const lastModified = options.lastModified === undefined + ? Date.now() + : Number(options.lastModified); + if (!Number.isNaN(lastModified)) { + __classPrivateFieldSet(this, _File_lastModified, lastModified, "f"); + } + } + static [(_File_name = new WeakMap(), _File_lastModified = new WeakMap(), Symbol.hasInstance)](value) { + return value instanceof Blob_1.Blob + && value[Symbol.toStringTag] === "File" + && typeof value.name === "string"; + } + get name() { + return __classPrivateFieldGet(this, _File_name, "f"); + } + get lastModified() { + return __classPrivateFieldGet(this, _File_lastModified, "f"); + } + get webkitRelativePath() { + return ""; + } + get [Symbol.toStringTag]() { + return "File"; + } +} +exports.File = File; + + +/***/ }), + +/***/ 7268: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _FormData_instances, _FormData_entries, _FormData_setEntry; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FormData = void 0; +const util_1 = __nccwpck_require__(3837); +const File_1 = __nccwpck_require__(3637); +const isFile_1 = __nccwpck_require__(4529); +const isBlob_1 = __nccwpck_require__(5493); +const isFunction_1 = __nccwpck_require__(4245); +const deprecateConstructorEntries_1 = __nccwpck_require__(2689); +class FormData { + constructor(entries) { + _FormData_instances.add(this); + _FormData_entries.set(this, new Map()); + if (entries) { + (0, deprecateConstructorEntries_1.deprecateConstructorEntries)(); + entries.forEach(({ name, value, fileName }) => this.append(name, value, fileName)); + } + } + static [(_FormData_entries = new WeakMap(), _FormData_instances = new WeakSet(), Symbol.hasInstance)](value) { + return Boolean(value + && (0, isFunction_1.isFunction)(value.constructor) + && value[Symbol.toStringTag] === "FormData" + && (0, isFunction_1.isFunction)(value.append) + && (0, isFunction_1.isFunction)(value.set) + && (0, isFunction_1.isFunction)(value.get) + && (0, isFunction_1.isFunction)(value.getAll) + && (0, isFunction_1.isFunction)(value.has) + && (0, isFunction_1.isFunction)(value.delete) + && (0, isFunction_1.isFunction)(value.entries) + && (0, isFunction_1.isFunction)(value.values) + && (0, isFunction_1.isFunction)(value.keys) + && (0, isFunction_1.isFunction)(value[Symbol.iterator]) + && (0, isFunction_1.isFunction)(value.forEach)); + } + append(name, value, fileName) { + __classPrivateFieldGet(this, _FormData_instances, "m", _FormData_setEntry).call(this, { + name, + fileName, + append: true, + rawValue: value, + argsLength: arguments.length + }); + } + set(name, value, fileName) { + __classPrivateFieldGet(this, _FormData_instances, "m", _FormData_setEntry).call(this, { + name, + fileName, + append: false, + rawValue: value, + argsLength: arguments.length + }); + } + get(name) { + const field = __classPrivateFieldGet(this, _FormData_entries, "f").get(String(name)); + if (!field) { + return null; + } + return field[0]; + } + getAll(name) { + const field = __classPrivateFieldGet(this, _FormData_entries, "f").get(String(name)); + if (!field) { + return []; + } + return field.slice(); + } + has(name) { + return __classPrivateFieldGet(this, _FormData_entries, "f").has(String(name)); + } + delete(name) { + __classPrivateFieldGet(this, _FormData_entries, "f").delete(String(name)); + } + *keys() { + for (const key of __classPrivateFieldGet(this, _FormData_entries, "f").keys()) { + yield key; + } + } + *entries() { + for (const name of this.keys()) { + const values = this.getAll(name); + for (const value of values) { + yield [name, value]; + } + } + } + *values() { + for (const [, value] of this) { + yield value; + } + } + [(_FormData_setEntry = function _FormData_setEntry({ name, rawValue, append, fileName, argsLength }) { + const methodName = append ? "append" : "set"; + if (argsLength < 2) { + throw new TypeError(`Failed to execute '${methodName}' on 'FormData': ` + + `2 arguments required, but only ${argsLength} present.`); + } + name = String(name); + let value; + if ((0, isFile_1.isFile)(rawValue)) { + value = fileName === undefined + ? rawValue + : new File_1.File([rawValue], fileName, { + type: rawValue.type, + lastModified: rawValue.lastModified + }); + } + else if ((0, isBlob_1.isBlob)(rawValue)) { + value = new File_1.File([rawValue], fileName === undefined ? "blob" : fileName, { + type: rawValue.type + }); + } + else if (fileName) { + throw new TypeError(`Failed to execute '${methodName}' on 'FormData': ` + + "parameter 2 is not of type 'Blob'."); + } + else { + value = String(rawValue); + } + const values = __classPrivateFieldGet(this, _FormData_entries, "f").get(name); + if (!values) { + return void __classPrivateFieldGet(this, _FormData_entries, "f").set(name, [value]); + } + if (!append) { + return void __classPrivateFieldGet(this, _FormData_entries, "f").set(name, [value]); + } + values.push(value); + }, Symbol.iterator)]() { + return this.entries(); + } + forEach(callback, thisArg) { + for (const [name, value] of this) { + callback.call(thisArg, value, name, this); + } + } + get [Symbol.toStringTag]() { + return "FormData"; + } + [util_1.inspect.custom]() { + return this[Symbol.toStringTag]; + } +} +exports.FormData = FormData; + + +/***/ }), + +/***/ 7058: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +/*! Based on fetch-blob. MIT License. Jimmy Wärting & David Frank */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.sliceBlob = exports.consumeBlobParts = void 0; +const isFunction_1 = __nccwpck_require__(4245); +const CHUNK_SIZE = 65536; +async function* clonePart(part) { + const end = part.byteOffset + part.byteLength; + let position = part.byteOffset; + while (position !== end) { + const size = Math.min(end - position, CHUNK_SIZE); + const chunk = part.buffer.slice(position, position + size); + position += chunk.byteLength; + yield new Uint8Array(chunk); + } +} +async function* consumeNodeBlob(blob) { + let position = 0; + while (position !== blob.size) { + const chunk = blob.slice(position, Math.min(blob.size, position + CHUNK_SIZE)); + const buffer = await chunk.arrayBuffer(); + position += buffer.byteLength; + yield new Uint8Array(buffer); + } +} +async function* consumeBlobParts(parts, clone = false) { + for (const part of parts) { + if (ArrayBuffer.isView(part)) { + if (clone) { + yield* clonePart(part); + } + else { + yield part; + } + } + else if ((0, isFunction_1.isFunction)(part.stream)) { + yield* part.stream(); + } + else { + yield* consumeNodeBlob(part); + } + } +} +exports.consumeBlobParts = consumeBlobParts; +function* sliceBlob(blobParts, blobSize, start = 0, end) { + end !== null && end !== void 0 ? end : (end = blobSize); + let relativeStart = start < 0 + ? Math.max(blobSize + start, 0) + : Math.min(start, blobSize); + let relativeEnd = end < 0 + ? Math.max(blobSize + end, 0) + : Math.min(end, blobSize); + const span = Math.max(relativeEnd - relativeStart, 0); + let added = 0; + for (const part of blobParts) { + if (added >= span) { + break; + } + const partSize = ArrayBuffer.isView(part) ? part.byteLength : part.size; + if (relativeStart && partSize <= relativeStart) { + relativeStart -= partSize; + relativeEnd -= partSize; + } + else { + let chunk; + if (ArrayBuffer.isView(part)) { + chunk = part.subarray(relativeStart, Math.min(partSize, relativeEnd)); + added += chunk.byteLength; + } + else { + chunk = part.slice(relativeStart, Math.min(partSize, relativeEnd)); + added += chunk.size; + } + relativeEnd -= partSize; + relativeStart = 0; + yield chunk; + } + } +} +exports.sliceBlob = sliceBlob; + + +/***/ }), + +/***/ 2689: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.deprecateConstructorEntries = void 0; +const util_1 = __nccwpck_require__(3837); +exports.deprecateConstructorEntries = (0, util_1.deprecate)(() => { }, "Constructor \"entries\" argument is not spec-compliant " + + "and will be removed in next major release."); + + +/***/ }), + +/***/ 8735: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var _FileFromPath_path, _FileFromPath_start; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fileFromPath = exports.fileFromPathSync = void 0; +const fs_1 = __nccwpck_require__(7147); +const path_1 = __nccwpck_require__(1017); +const node_domexception_1 = __importDefault(__nccwpck_require__(7760)); +const File_1 = __nccwpck_require__(3637); +const isPlainObject_1 = __importDefault(__nccwpck_require__(4722)); +__exportStar(__nccwpck_require__(4529), exports); +const MESSAGE = "The requested file could not be read, " + + "typically due to permission problems that have occurred after a reference " + + "to a file was acquired."; +class FileFromPath { + constructor(input) { + _FileFromPath_path.set(this, void 0); + _FileFromPath_start.set(this, void 0); + __classPrivateFieldSet(this, _FileFromPath_path, input.path, "f"); + __classPrivateFieldSet(this, _FileFromPath_start, input.start || 0, "f"); + this.name = (0, path_1.basename)(__classPrivateFieldGet(this, _FileFromPath_path, "f")); + this.size = input.size; + this.lastModified = input.lastModified; + } + slice(start, end) { + return new FileFromPath({ + path: __classPrivateFieldGet(this, _FileFromPath_path, "f"), + lastModified: this.lastModified, + size: end - start, + start + }); + } + async *stream() { + const { mtimeMs } = await fs_1.promises.stat(__classPrivateFieldGet(this, _FileFromPath_path, "f")); + if (mtimeMs > this.lastModified) { + throw new node_domexception_1.default(MESSAGE, "NotReadableError"); + } + if (this.size) { + yield* (0, fs_1.createReadStream)(__classPrivateFieldGet(this, _FileFromPath_path, "f"), { + start: __classPrivateFieldGet(this, _FileFromPath_start, "f"), + end: __classPrivateFieldGet(this, _FileFromPath_start, "f") + this.size - 1 + }); + } + } + get [(_FileFromPath_path = new WeakMap(), _FileFromPath_start = new WeakMap(), Symbol.toStringTag)]() { + return "File"; + } +} +function createFileFromPath(path, { mtimeMs, size }, filenameOrOptions, options = {}) { + let filename; + if ((0, isPlainObject_1.default)(filenameOrOptions)) { + [options, filename] = [filenameOrOptions, undefined]; + } + else { + filename = filenameOrOptions; + } + const file = new FileFromPath({ path, size, lastModified: mtimeMs }); + if (!filename) { + filename = file.name; + } + return new File_1.File([file], filename, { + ...options, lastModified: file.lastModified + }); +} +function fileFromPathSync(path, filenameOrOptions, options = {}) { + const stats = (0, fs_1.statSync)(path); + return createFileFromPath(path, stats, filenameOrOptions, options); +} +exports.fileFromPathSync = fileFromPathSync; +async function fileFromPath(path, filenameOrOptions, options) { + const stats = await fs_1.promises.stat(path); + return createFileFromPath(path, stats, filenameOrOptions, options); +} +exports.fileFromPath = fileFromPath; + + +/***/ }), + +/***/ 880: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +__exportStar(__nccwpck_require__(7268), exports); +__exportStar(__nccwpck_require__(6637), exports); +__exportStar(__nccwpck_require__(3637), exports); + + +/***/ }), + +/***/ 5493: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isBlob = void 0; +const Blob_1 = __nccwpck_require__(6637); +const isBlob = (value) => value instanceof Blob_1.Blob; +exports.isBlob = isBlob; + + +/***/ }), + +/***/ 4529: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isFile = void 0; +const File_1 = __nccwpck_require__(3637); +const isFile = (value) => value instanceof File_1.File; +exports.isFile = isFile; + + +/***/ }), + +/***/ 4245: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isFunction = void 0; +const isFunction = (value) => (typeof value === "function"); +exports.isFunction = isFunction; + + +/***/ }), + +/***/ 4722: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const getType = (value) => (Object.prototype.toString.call(value).slice(8, -1).toLowerCase()); +function isPlainObject(value) { + if (getType(value) !== "object") { + return false; + } + const pp = Object.getPrototypeOf(value); + if (pp === null || pp === undefined) { + return true; + } + const Ctor = pp.constructor && pp.constructor.toString(); + return Ctor === Object.toString(); +} +exports["default"] = isPlainObject; + + +/***/ }), + +/***/ 4595: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.MultipartBody = void 0; +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +class MultipartBody { + constructor(body) { + this.body = body; + } + get [Symbol.toStringTag]() { + return 'MultipartBody'; + } +} +exports.MultipartBody = MultipartBody; +//# sourceMappingURL=MultipartBody.js.map + +/***/ }), + +/***/ 3506: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +__exportStar(__nccwpck_require__(1749), exports); +//# sourceMappingURL=runtime-node.js.map + +/***/ }), + +/***/ 6678: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +const shims = __nccwpck_require__(4437); +const auto = __nccwpck_require__(3506); +if (!shims.kind) shims.setShims(auto.getRuntime(), { auto: true }); +for (const property of Object.keys(shims)) { + Object.defineProperty(exports, property, { + get() { + return shims[property]; + }, + }); +} + + +/***/ }), + +/***/ 1749: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getRuntime = void 0; +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +const nf = __importStar(__nccwpck_require__(467)); +const fd = __importStar(__nccwpck_require__(880)); +const agentkeepalive_1 = __importDefault(__nccwpck_require__(4623)); +const abort_controller_1 = __nccwpck_require__(1659); +const node_fs_1 = __nccwpck_require__(7561); +const form_data_encoder_1 = __nccwpck_require__(8824); +const node_stream_1 = __nccwpck_require__(4492); +const MultipartBody_1 = __nccwpck_require__(4595); +// @ts-ignore (this package does not have proper export maps for this export) +const ponyfill_es2018_js_1 = __nccwpck_require__(1452); +let fileFromPathWarned = false; +async function fileFromPath(path, ...args) { + // this import fails in environments that don't handle export maps correctly, like old versions of Jest + const { fileFromPath: _fileFromPath } = await Promise.resolve().then(() => __importStar(__nccwpck_require__(8735))); + if (!fileFromPathWarned) { + console.warn(`fileFromPath is deprecated; use fs.createReadStream(${JSON.stringify(path)}) instead`); + fileFromPathWarned = true; + } + // @ts-ignore + return await _fileFromPath(path, ...args); +} +const defaultHttpAgent = new agentkeepalive_1.default({ keepAlive: true, timeout: 5 * 60 * 1000 }); +const defaultHttpsAgent = new agentkeepalive_1.default.HttpsAgent({ keepAlive: true, timeout: 5 * 60 * 1000 }); +async function getMultipartRequestOptions(form, opts) { + const encoder = new form_data_encoder_1.FormDataEncoder(form); + const readable = node_stream_1.Readable.from(encoder); + const body = new MultipartBody_1.MultipartBody(readable); + const headers = { + ...opts.headers, + ...encoder.headers, + 'Content-Length': encoder.contentLength, + }; + return { ...opts, body: body, headers }; +} +function getRuntime() { + // Polyfill global object if needed. + if (typeof AbortController === 'undefined') { + // @ts-expect-error (the types are subtly different, but compatible in practice) + globalThis.AbortController = abort_controller_1.AbortController; + } + return { + kind: 'node', + fetch: nf.default, + Request: nf.Request, + Response: nf.Response, + Headers: nf.Headers, + FormData: fd.FormData, + Blob: fd.Blob, + File: fd.File, + ReadableStream: ponyfill_es2018_js_1.ReadableStream, + getMultipartRequestOptions, + getDefaultAgent: (url) => (url.startsWith('https') ? defaultHttpsAgent : defaultHttpAgent), + fileFromPath, + isFsReadStream: (value) => value instanceof node_fs_1.ReadStream, + }; +} +exports.getRuntime = getRuntime; +//# sourceMappingURL=node-runtime.js.map + +/***/ }), + +/***/ 4437: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.setShims = exports.isFsReadStream = exports.fileFromPath = exports.getDefaultAgent = exports.getMultipartRequestOptions = exports.ReadableStream = exports.File = exports.Blob = exports.FormData = exports.Headers = exports.Response = exports.Request = exports.fetch = exports.kind = exports.auto = void 0; +exports.auto = false; +exports.kind = undefined; +exports.fetch = undefined; +exports.Request = undefined; +exports.Response = undefined; +exports.Headers = undefined; +exports.FormData = undefined; +exports.Blob = undefined; +exports.File = undefined; +exports.ReadableStream = undefined; +exports.getMultipartRequestOptions = undefined; +exports.getDefaultAgent = undefined; +exports.fileFromPath = undefined; +exports.isFsReadStream = undefined; +function setShims(shims, options = { auto: false }) { + if (exports.auto) { + throw new Error(`you must \`import 'openai/shims/${shims.kind}'\` before importing anything else from openai`); + } + if (exports.kind) { + throw new Error(`can't \`import 'openai/shims/${shims.kind}'\` after \`import 'openai/shims/${exports.kind}'\``); + } + exports.auto = options.auto; + exports.kind = shims.kind; + exports.fetch = shims.fetch; + exports.Request = shims.Request; + exports.Response = shims.Response; + exports.Headers = shims.Headers; + exports.FormData = shims.FormData; + exports.Blob = shims.Blob; + exports.File = shims.File; + exports.ReadableStream = shims.ReadableStream; + exports.getMultipartRequestOptions = shims.getMultipartRequestOptions; + exports.getDefaultAgent = shims.getDefaultAgent; + exports.fileFromPath = shims.fileFromPath; + exports.isFsReadStream = shims.isFsReadStream; +} +exports.setShims = setShims; +//# sourceMappingURL=registry.js.map + +/***/ }), + +/***/ 1798: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _AbstractPage_client; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isObj = exports.toBase64 = exports.getRequiredHeader = exports.isHeadersProtocol = exports.isRunningInBrowser = exports.debug = exports.hasOwn = exports.isEmptyObj = exports.maybeCoerceBoolean = exports.maybeCoerceFloat = exports.maybeCoerceInteger = exports.coerceBoolean = exports.coerceFloat = exports.coerceInteger = exports.readEnv = exports.ensurePresent = exports.castToError = exports.sleep = exports.safeJSON = exports.isRequestOptions = exports.createResponseHeaders = exports.PagePromise = exports.AbstractPage = exports.APIClient = exports.APIPromise = exports.createForm = exports.multipartFormRequestOptions = exports.maybeMultipartFormRequestOptions = void 0; +const version_1 = __nccwpck_require__(6417); +const streaming_1 = __nccwpck_require__(884); +const error_1 = __nccwpck_require__(8905); +const index_1 = __nccwpck_require__(6678); +const uploads_1 = __nccwpck_require__(3394); +var uploads_2 = __nccwpck_require__(3394); +Object.defineProperty(exports, "maybeMultipartFormRequestOptions", ({ enumerable: true, get: function () { return uploads_2.maybeMultipartFormRequestOptions; } })); +Object.defineProperty(exports, "multipartFormRequestOptions", ({ enumerable: true, get: function () { return uploads_2.multipartFormRequestOptions; } })); +Object.defineProperty(exports, "createForm", ({ enumerable: true, get: function () { return uploads_2.createForm; } })); +async function defaultParseResponse(props) { + const { response } = props; + if (props.options.stream) { + debug('response', response.status, response.url, response.headers, response.body); + // Note: there is an invariant here that isn't represented in the type system + // that if you set `stream: true` the response type must also be `Stream` + if (props.options.__streamClass) { + return props.options.__streamClass.fromSSEResponse(response, props.controller); + } + return streaming_1.Stream.fromSSEResponse(response, props.controller); + } + // fetch refuses to read the body when the status code is 204. + if (response.status === 204) { + return null; + } + if (props.options.__binaryResponse) { + return response; + } + const contentType = response.headers.get('content-type'); + const isJSON = contentType?.includes('application/json') || contentType?.includes('application/vnd.api+json'); + if (isJSON) { + const json = await response.json(); + debug('response', response.status, response.url, response.headers, json); + return json; + } + const text = await response.text(); + debug('response', response.status, response.url, response.headers, text); + // TODO handle blob, arraybuffer, other content types, etc. + return text; +} +/** + * A subclass of `Promise` providing additional helper methods + * for interacting with the SDK. + */ +class APIPromise extends Promise { + constructor(responsePromise, parseResponse = defaultParseResponse) { + super((resolve) => { + // this is maybe a bit weird but this has to be a no-op to not implicitly + // parse the response body; instead .then, .catch, .finally are overridden + // to parse the response + resolve(null); + }); + this.responsePromise = responsePromise; + this.parseResponse = parseResponse; + } + _thenUnwrap(transform) { + return new APIPromise(this.responsePromise, async (props) => transform(await this.parseResponse(props))); + } + /** + * Gets the raw `Response` instance instead of parsing the response + * data. + * + * If you want to parse the response body but still get the `Response` + * instance, you can use {@link withResponse()}. + * + * 👋 Getting the wrong TypeScript type for `Response`? + * Try setting `"moduleResolution": "NodeNext"` if you can, + * or add one of these imports before your first `import … from 'openai'`: + * - `import 'openai/shims/node'` (if you're running on Node) + * - `import 'openai/shims/web'` (otherwise) + */ + asResponse() { + return this.responsePromise.then((p) => p.response); + } + /** + * Gets the parsed response data and the raw `Response` instance. + * + * If you just want to get the raw `Response` instance without parsing it, + * you can use {@link asResponse()}. + * + * + * 👋 Getting the wrong TypeScript type for `Response`? + * Try setting `"moduleResolution": "NodeNext"` if you can, + * or add one of these imports before your first `import … from 'openai'`: + * - `import 'openai/shims/node'` (if you're running on Node) + * - `import 'openai/shims/web'` (otherwise) + */ + async withResponse() { + const [data, response] = await Promise.all([this.parse(), this.asResponse()]); + return { data, response }; + } + parse() { + if (!this.parsedPromise) { + this.parsedPromise = this.responsePromise.then(this.parseResponse); + } + return this.parsedPromise; + } + then(onfulfilled, onrejected) { + return this.parse().then(onfulfilled, onrejected); + } + catch(onrejected) { + return this.parse().catch(onrejected); + } + finally(onfinally) { + return this.parse().finally(onfinally); + } +} +exports.APIPromise = APIPromise; +class APIClient { + constructor({ baseURL, maxRetries = 2, timeout = 600000, // 10 minutes + httpAgent, fetch: overridenFetch, }) { + this.baseURL = baseURL; + this.maxRetries = validatePositiveInteger('maxRetries', maxRetries); + this.timeout = validatePositiveInteger('timeout', timeout); + this.httpAgent = httpAgent; + this.fetch = overridenFetch ?? index_1.fetch; + } + authHeaders(opts) { + return {}; + } + /** + * Override this to add your own default headers, for example: + * + * { + * ...super.defaultHeaders(), + * Authorization: 'Bearer 123', + * } + */ + defaultHeaders(opts) { + return { + Accept: 'application/json', + 'Content-Type': 'application/json', + 'User-Agent': this.getUserAgent(), + ...getPlatformHeaders(), + ...this.authHeaders(opts), + }; + } + /** + * Override this to add your own headers validation: + */ + validateHeaders(headers, customHeaders) { } + defaultIdempotencyKey() { + return `stainless-node-retry-${uuid4()}`; + } + get(path, opts) { + return this.methodRequest('get', path, opts); + } + post(path, opts) { + return this.methodRequest('post', path, opts); + } + patch(path, opts) { + return this.methodRequest('patch', path, opts); + } + put(path, opts) { + return this.methodRequest('put', path, opts); + } + delete(path, opts) { + return this.methodRequest('delete', path, opts); + } + methodRequest(method, path, opts) { + return this.request(Promise.resolve(opts).then((opts) => ({ method, path, ...opts }))); + } + getAPIList(path, Page, opts) { + return this.requestAPIList(Page, { method: 'get', path, ...opts }); + } + calculateContentLength(body) { + if (typeof body === 'string') { + if (typeof Buffer !== 'undefined') { + return Buffer.byteLength(body, 'utf8').toString(); + } + if (typeof TextEncoder !== 'undefined') { + const encoder = new TextEncoder(); + const encoded = encoder.encode(body); + return encoded.length.toString(); + } + } + return null; + } + buildRequest(options) { + const { method, path, query, headers: headers = {} } = options; + const body = (0, uploads_1.isMultipartBody)(options.body) ? options.body.body + : options.body ? JSON.stringify(options.body, null, 2) + : null; + const contentLength = this.calculateContentLength(body); + const url = this.buildURL(path, query); + if ('timeout' in options) + validatePositiveInteger('timeout', options.timeout); + const timeout = options.timeout ?? this.timeout; + const httpAgent = options.httpAgent ?? this.httpAgent ?? (0, index_1.getDefaultAgent)(url); + const minAgentTimeout = timeout + 1000; + if (typeof httpAgent?.options?.timeout === 'number' && + minAgentTimeout > (httpAgent.options.timeout ?? 0)) { + // Allow any given request to bump our agent active socket timeout. + // This may seem strange, but leaking active sockets should be rare and not particularly problematic, + // and without mutating agent we would need to create more of them. + // This tradeoff optimizes for performance. + httpAgent.options.timeout = minAgentTimeout; + } + if (this.idempotencyHeader && method !== 'get') { + if (!options.idempotencyKey) + options.idempotencyKey = this.defaultIdempotencyKey(); + headers[this.idempotencyHeader] = options.idempotencyKey; + } + const reqHeaders = this.buildHeaders({ options, headers, contentLength }); + const req = { + method, + ...(body && { body: body }), + headers: reqHeaders, + ...(httpAgent && { agent: httpAgent }), + // @ts-ignore node-fetch uses a custom AbortSignal type that is + // not compatible with standard web types + signal: options.signal ?? null, + }; + return { req, url, timeout }; + } + buildHeaders({ options, headers, contentLength, }) { + const reqHeaders = {}; + if (contentLength) { + reqHeaders['content-length'] = contentLength; + } + const defaultHeaders = this.defaultHeaders(options); + applyHeadersMut(reqHeaders, defaultHeaders); + applyHeadersMut(reqHeaders, headers); + // let builtin fetch set the Content-Type for multipart bodies + if ((0, uploads_1.isMultipartBody)(options.body) && index_1.kind !== 'node') { + delete reqHeaders['content-type']; + } + this.validateHeaders(reqHeaders, headers); + return reqHeaders; + } + /** + * Used as a callback for mutating the given `FinalRequestOptions` object. + */ + async prepareOptions(options) { } + /** + * Used as a callback for mutating the given `RequestInit` object. + * + * This is useful for cases where you want to add certain headers based off of + * the request properties, e.g. `method` or `url`. + */ + async prepareRequest(request, { url, options }) { } + parseHeaders(headers) { + return (!headers ? {} + : Symbol.iterator in headers ? + Object.fromEntries(Array.from(headers).map((header) => [...header])) + : { ...headers }); + } + makeStatusError(status, error, message, headers) { + return error_1.APIError.generate(status, error, message, headers); + } + request(options, remainingRetries = null) { + return new APIPromise(this.makeRequest(options, remainingRetries)); + } + async makeRequest(optionsInput, retriesRemaining) { + const options = await optionsInput; + if (retriesRemaining == null) { + retriesRemaining = options.maxRetries ?? this.maxRetries; + } + await this.prepareOptions(options); + const { req, url, timeout } = this.buildRequest(options); + await this.prepareRequest(req, { url, options }); + debug('request', url, options, req.headers); + if (options.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + const controller = new AbortController(); + const response = await this.fetchWithTimeout(url, req, timeout, controller).catch(exports.castToError); + if (response instanceof Error) { + if (options.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + if (retriesRemaining) { + return this.retryRequest(options, retriesRemaining); + } + if (response.name === 'AbortError') { + throw new error_1.APIConnectionTimeoutError(); + } + throw new error_1.APIConnectionError({ cause: response }); + } + const responseHeaders = (0, exports.createResponseHeaders)(response.headers); + if (!response.ok) { + if (retriesRemaining && this.shouldRetry(response)) { + const retryMessage = `retrying, ${retriesRemaining} attempts remaining`; + debug(`response (error; ${retryMessage})`, response.status, url, responseHeaders); + return this.retryRequest(options, retriesRemaining, responseHeaders); + } + const errText = await response.text().catch((e) => (0, exports.castToError)(e).message); + const errJSON = (0, exports.safeJSON)(errText); + const errMessage = errJSON ? undefined : errText; + const retryMessage = retriesRemaining ? `(error; no more retries left)` : `(error; not retryable)`; + debug(`response (error; ${retryMessage})`, response.status, url, responseHeaders, errMessage); + const err = this.makeStatusError(response.status, errJSON, errMessage, responseHeaders); + throw err; + } + return { response, options, controller }; + } + requestAPIList(Page, options) { + const request = this.makeRequest(options, null); + return new PagePromise(this, request, Page); + } + buildURL(path, query) { + const url = isAbsoluteURL(path) ? + new URL(path) + : new URL(this.baseURL + (this.baseURL.endsWith('/') && path.startsWith('/') ? path.slice(1) : path)); + const defaultQuery = this.defaultQuery(); + if (!isEmptyObj(defaultQuery)) { + query = { ...defaultQuery, ...query }; + } + if (typeof query === 'object' && query && !Array.isArray(query)) { + url.search = this.stringifyQuery(query); + } + return url.toString(); + } + stringifyQuery(query) { + return Object.entries(query) + .filter(([_, value]) => typeof value !== 'undefined') + .map(([key, value]) => { + if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { + return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`; + } + if (value === null) { + return `${encodeURIComponent(key)}=`; + } + throw new error_1.OpenAIError(`Cannot stringify type ${typeof value}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`); + }) + .join('&'); + } + async fetchWithTimeout(url, init, ms, controller) { + const { signal, ...options } = init || {}; + if (signal) + signal.addEventListener('abort', () => controller.abort()); + const timeout = setTimeout(() => controller.abort(), ms); + return (this.getRequestClient() + // use undefined this binding; fetch errors if bound to something else in browser/cloudflare + .fetch.call(undefined, url, { signal: controller.signal, ...options }) + .finally(() => { + clearTimeout(timeout); + })); + } + getRequestClient() { + return { fetch: this.fetch }; + } + shouldRetry(response) { + // Note this is not a standard header. + const shouldRetryHeader = response.headers.get('x-should-retry'); + // If the server explicitly says whether or not to retry, obey. + if (shouldRetryHeader === 'true') + return true; + if (shouldRetryHeader === 'false') + return false; + // Retry on request timeouts. + if (response.status === 408) + return true; + // Retry on lock timeouts. + if (response.status === 409) + return true; + // Retry on rate limits. + if (response.status === 429) + return true; + // Retry internal errors. + if (response.status >= 500) + return true; + return false; + } + async retryRequest(options, retriesRemaining, responseHeaders) { + let timeoutMillis; + // Note the `retry-after-ms` header may not be standard, but is a good idea and we'd like proactive support for it. + const retryAfterMillisHeader = responseHeaders?.['retry-after-ms']; + if (retryAfterMillisHeader) { + const timeoutMs = parseFloat(retryAfterMillisHeader); + if (!Number.isNaN(timeoutMs)) { + timeoutMillis = timeoutMs; + } + } + // About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After + const retryAfterHeader = responseHeaders?.['retry-after']; + if (retryAfterHeader && !timeoutMillis) { + const timeoutSeconds = parseFloat(retryAfterHeader); + if (!Number.isNaN(timeoutSeconds)) { + timeoutMillis = timeoutSeconds * 1000; + } + else { + timeoutMillis = Date.parse(retryAfterHeader) - Date.now(); + } + } + // If the API asks us to wait a certain amount of time (and it's a reasonable amount), + // just do what it says, but otherwise calculate a default + if (!(timeoutMillis && 0 <= timeoutMillis && timeoutMillis < 60 * 1000)) { + const maxRetries = options.maxRetries ?? this.maxRetries; + timeoutMillis = this.calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries); + } + await (0, exports.sleep)(timeoutMillis); + return this.makeRequest(options, retriesRemaining - 1); + } + calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries) { + const initialRetryDelay = 0.5; + const maxRetryDelay = 8.0; + const numRetries = maxRetries - retriesRemaining; + // Apply exponential backoff, but not more than the max. + const sleepSeconds = Math.min(initialRetryDelay * Math.pow(2, numRetries), maxRetryDelay); + // Apply some jitter, take up to at most 25 percent of the retry time. + const jitter = 1 - Math.random() * 0.25; + return sleepSeconds * jitter * 1000; + } + getUserAgent() { + return `${this.constructor.name}/JS ${version_1.VERSION}`; + } +} +exports.APIClient = APIClient; +class AbstractPage { + constructor(client, response, body, options) { + _AbstractPage_client.set(this, void 0); + __classPrivateFieldSet(this, _AbstractPage_client, client, "f"); + this.options = options; + this.response = response; + this.body = body; + } + hasNextPage() { + const items = this.getPaginatedItems(); + if (!items.length) + return false; + return this.nextPageInfo() != null; + } + async getNextPage() { + const nextInfo = this.nextPageInfo(); + if (!nextInfo) { + throw new error_1.OpenAIError('No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.'); + } + const nextOptions = { ...this.options }; + if ('params' in nextInfo && typeof nextOptions.query === 'object') { + nextOptions.query = { ...nextOptions.query, ...nextInfo.params }; + } + else if ('url' in nextInfo) { + const params = [...Object.entries(nextOptions.query || {}), ...nextInfo.url.searchParams.entries()]; + for (const [key, value] of params) { + nextInfo.url.searchParams.set(key, value); + } + nextOptions.query = undefined; + nextOptions.path = nextInfo.url.toString(); + } + return await __classPrivateFieldGet(this, _AbstractPage_client, "f").requestAPIList(this.constructor, nextOptions); + } + async *iterPages() { + // eslint-disable-next-line @typescript-eslint/no-this-alias + let page = this; + yield page; + while (page.hasNextPage()) { + page = await page.getNextPage(); + yield page; + } + } + async *[(_AbstractPage_client = new WeakMap(), Symbol.asyncIterator)]() { + for await (const page of this.iterPages()) { + for (const item of page.getPaginatedItems()) { + yield item; + } + } + } +} +exports.AbstractPage = AbstractPage; +/** + * This subclass of Promise will resolve to an instantiated Page once the request completes. + * + * It also implements AsyncIterable to allow auto-paginating iteration on an unawaited list call, eg: + * + * for await (const item of client.items.list()) { + * console.log(item) + * } + */ +class PagePromise extends APIPromise { + constructor(client, request, Page) { + super(request, async (props) => new Page(client, props.response, await defaultParseResponse(props), props.options)); + } + /** + * Allow auto-paginating iteration on an unawaited list call, eg: + * + * for await (const item of client.items.list()) { + * console.log(item) + * } + */ + async *[Symbol.asyncIterator]() { + const page = await this; + for await (const item of page) { + yield item; + } + } +} +exports.PagePromise = PagePromise; +const createResponseHeaders = (headers) => { + return new Proxy(Object.fromEntries( + // @ts-ignore + headers.entries()), { + get(target, name) { + const key = name.toString(); + return target[key.toLowerCase()] || target[key]; + }, + }); +}; +exports.createResponseHeaders = createResponseHeaders; +// This is required so that we can determine if a given object matches the RequestOptions +// type at runtime. While this requires duplication, it is enforced by the TypeScript +// compiler such that any missing / extraneous keys will cause an error. +const requestOptionsKeys = { + method: true, + path: true, + query: true, + body: true, + headers: true, + maxRetries: true, + stream: true, + timeout: true, + httpAgent: true, + signal: true, + idempotencyKey: true, + __binaryResponse: true, + __streamClass: true, +}; +const isRequestOptions = (obj) => { + return (typeof obj === 'object' && + obj !== null && + !isEmptyObj(obj) && + Object.keys(obj).every((k) => hasOwn(requestOptionsKeys, k))); +}; +exports.isRequestOptions = isRequestOptions; +const getPlatformProperties = () => { + if (typeof Deno !== 'undefined' && Deno.build != null) { + return { + 'X-Stainless-Lang': 'js', + 'X-Stainless-Package-Version': version_1.VERSION, + 'X-Stainless-OS': normalizePlatform(Deno.build.os), + 'X-Stainless-Arch': normalizeArch(Deno.build.arch), + 'X-Stainless-Runtime': 'deno', + 'X-Stainless-Runtime-Version': typeof Deno.version === 'string' ? Deno.version : Deno.version?.deno ?? 'unknown', + }; + } + if (typeof EdgeRuntime !== 'undefined') { + return { + 'X-Stainless-Lang': 'js', + 'X-Stainless-Package-Version': version_1.VERSION, + 'X-Stainless-OS': 'Unknown', + 'X-Stainless-Arch': `other:${EdgeRuntime}`, + 'X-Stainless-Runtime': 'edge', + 'X-Stainless-Runtime-Version': process.version, + }; + } + // Check if Node.js + if (Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]') { + return { + 'X-Stainless-Lang': 'js', + 'X-Stainless-Package-Version': version_1.VERSION, + 'X-Stainless-OS': normalizePlatform(process.platform), + 'X-Stainless-Arch': normalizeArch(process.arch), + 'X-Stainless-Runtime': 'node', + 'X-Stainless-Runtime-Version': process.version, + }; + } + const browserInfo = getBrowserInfo(); + if (browserInfo) { + return { + 'X-Stainless-Lang': 'js', + 'X-Stainless-Package-Version': version_1.VERSION, + 'X-Stainless-OS': 'Unknown', + 'X-Stainless-Arch': 'unknown', + 'X-Stainless-Runtime': `browser:${browserInfo.browser}`, + 'X-Stainless-Runtime-Version': browserInfo.version, + }; + } + // TODO add support for Cloudflare workers, etc. + return { + 'X-Stainless-Lang': 'js', + 'X-Stainless-Package-Version': version_1.VERSION, + 'X-Stainless-OS': 'Unknown', + 'X-Stainless-Arch': 'unknown', + 'X-Stainless-Runtime': 'unknown', + 'X-Stainless-Runtime-Version': 'unknown', + }; +}; +// Note: modified from https://github.com/JS-DevTools/host-environment/blob/b1ab79ecde37db5d6e163c050e54fe7d287d7c92/src/isomorphic.browser.ts +function getBrowserInfo() { + if (typeof navigator === 'undefined' || !navigator) { + return null; + } + // NOTE: The order matters here! + const browserPatterns = [ + { key: 'edge', pattern: /Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, + { key: 'ie', pattern: /MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, + { key: 'ie', pattern: /Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/ }, + { key: 'chrome', pattern: /Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, + { key: 'firefox', pattern: /Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, + { key: 'safari', pattern: /(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/ }, + ]; + // Find the FIRST matching browser + for (const { key, pattern } of browserPatterns) { + const match = pattern.exec(navigator.userAgent); + if (match) { + const major = match[1] || 0; + const minor = match[2] || 0; + const patch = match[3] || 0; + return { browser: key, version: `${major}.${minor}.${patch}` }; + } + } + return null; +} +const normalizeArch = (arch) => { + // Node docs: + // - https://nodejs.org/api/process.html#processarch + // Deno docs: + // - https://doc.deno.land/deno/stable/~/Deno.build + if (arch === 'x32') + return 'x32'; + if (arch === 'x86_64' || arch === 'x64') + return 'x64'; + if (arch === 'arm') + return 'arm'; + if (arch === 'aarch64' || arch === 'arm64') + return 'arm64'; + if (arch) + return `other:${arch}`; + return 'unknown'; +}; +const normalizePlatform = (platform) => { + // Node platforms: + // - https://nodejs.org/api/process.html#processplatform + // Deno platforms: + // - https://doc.deno.land/deno/stable/~/Deno.build + // - https://github.com/denoland/deno/issues/14799 + platform = platform.toLowerCase(); + // NOTE: this iOS check is untested and may not work + // Node does not work natively on IOS, there is a fork at + // https://github.com/nodejs-mobile/nodejs-mobile + // however it is unknown at the time of writing how to detect if it is running + if (platform.includes('ios')) + return 'iOS'; + if (platform === 'android') + return 'Android'; + if (platform === 'darwin') + return 'MacOS'; + if (platform === 'win32') + return 'Windows'; + if (platform === 'freebsd') + return 'FreeBSD'; + if (platform === 'openbsd') + return 'OpenBSD'; + if (platform === 'linux') + return 'Linux'; + if (platform) + return `Other:${platform}`; + return 'Unknown'; +}; +let _platformHeaders; +const getPlatformHeaders = () => { + return (_platformHeaders ?? (_platformHeaders = getPlatformProperties())); +}; +const safeJSON = (text) => { + try { + return JSON.parse(text); + } + catch (err) { + return undefined; + } +}; +exports.safeJSON = safeJSON; +// https://stackoverflow.com/a/19709846 +const startsWithSchemeRegexp = new RegExp('^(?:[a-z]+:)?//', 'i'); +const isAbsoluteURL = (url) => { + return startsWithSchemeRegexp.test(url); +}; +const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); +exports.sleep = sleep; +const validatePositiveInteger = (name, n) => { + if (typeof n !== 'number' || !Number.isInteger(n)) { + throw new error_1.OpenAIError(`${name} must be an integer`); + } + if (n < 0) { + throw new error_1.OpenAIError(`${name} must be a positive integer`); + } + return n; +}; +const castToError = (err) => { + if (err instanceof Error) + return err; + return new Error(err); +}; +exports.castToError = castToError; +const ensurePresent = (value) => { + if (value == null) + throw new error_1.OpenAIError(`Expected a value to be given but received ${value} instead.`); + return value; +}; +exports.ensurePresent = ensurePresent; +/** + * Read an environment variable. + * + * Trims beginning and trailing whitespace. + * + * Will return undefined if the environment variable doesn't exist or cannot be accessed. + */ +const readEnv = (env) => { + if (typeof process !== 'undefined') { + return process.env?.[env]?.trim() ?? undefined; + } + if (typeof Deno !== 'undefined') { + return Deno.env?.get?.(env)?.trim(); + } + return undefined; +}; +exports.readEnv = readEnv; +const coerceInteger = (value) => { + if (typeof value === 'number') + return Math.round(value); + if (typeof value === 'string') + return parseInt(value, 10); + throw new error_1.OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`); +}; +exports.coerceInteger = coerceInteger; +const coerceFloat = (value) => { + if (typeof value === 'number') + return value; + if (typeof value === 'string') + return parseFloat(value); + throw new error_1.OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`); +}; +exports.coerceFloat = coerceFloat; +const coerceBoolean = (value) => { + if (typeof value === 'boolean') + return value; + if (typeof value === 'string') + return value === 'true'; + return Boolean(value); +}; +exports.coerceBoolean = coerceBoolean; +const maybeCoerceInteger = (value) => { + if (value === undefined) { + return undefined; + } + return (0, exports.coerceInteger)(value); +}; +exports.maybeCoerceInteger = maybeCoerceInteger; +const maybeCoerceFloat = (value) => { + if (value === undefined) { + return undefined; + } + return (0, exports.coerceFloat)(value); +}; +exports.maybeCoerceFloat = maybeCoerceFloat; +const maybeCoerceBoolean = (value) => { + if (value === undefined) { + return undefined; + } + return (0, exports.coerceBoolean)(value); +}; +exports.maybeCoerceBoolean = maybeCoerceBoolean; +// https://stackoverflow.com/a/34491287 +function isEmptyObj(obj) { + if (!obj) + return true; + for (const _k in obj) + return false; + return true; +} +exports.isEmptyObj = isEmptyObj; +// https://eslint.org/docs/latest/rules/no-prototype-builtins +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} +exports.hasOwn = hasOwn; +/** + * Copies headers from "newHeaders" onto "targetHeaders", + * using lower-case for all properties, + * ignoring any keys with undefined values, + * and deleting any keys with null values. + */ +function applyHeadersMut(targetHeaders, newHeaders) { + for (const k in newHeaders) { + if (!hasOwn(newHeaders, k)) + continue; + const lowerKey = k.toLowerCase(); + if (!lowerKey) + continue; + const val = newHeaders[k]; + if (val === null) { + delete targetHeaders[lowerKey]; + } + else if (val !== undefined) { + targetHeaders[lowerKey] = val; + } + } +} +function debug(action, ...args) { + if (typeof process !== 'undefined' && process?.env?.['DEBUG'] === 'true') { + console.log(`OpenAI:DEBUG:${action}`, ...args); + } +} +exports.debug = debug; +/** + * https://stackoverflow.com/a/2117523 + */ +const uuid4 = () => { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { + const r = (Math.random() * 16) | 0; + const v = c === 'x' ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); +}; +const isRunningInBrowser = () => { + return ( + // @ts-ignore + typeof window !== 'undefined' && + // @ts-ignore + typeof window.document !== 'undefined' && + // @ts-ignore + typeof navigator !== 'undefined'); +}; +exports.isRunningInBrowser = isRunningInBrowser; +const isHeadersProtocol = (headers) => { + return typeof headers?.get === 'function'; +}; +exports.isHeadersProtocol = isHeadersProtocol; +const getRequiredHeader = (headers, header) => { + const lowerCasedHeader = header.toLowerCase(); + if ((0, exports.isHeadersProtocol)(headers)) { + // to deal with the case where the header looks like Stainless-Event-Id + const intercapsHeader = header[0]?.toUpperCase() + + header.substring(1).replace(/([^\w])(\w)/g, (_m, g1, g2) => g1 + g2.toUpperCase()); + for (const key of [header, lowerCasedHeader, header.toUpperCase(), intercapsHeader]) { + const value = headers.get(key); + if (value) { + return value; + } + } + } + for (const [key, value] of Object.entries(headers)) { + if (key.toLowerCase() === lowerCasedHeader) { + if (Array.isArray(value)) { + if (value.length <= 1) + return value[0]; + console.warn(`Received ${value.length} entries for the ${header} header, using the first entry.`); + return value[0]; + } + return value; + } + } + throw new Error(`Could not find ${header} header`); +}; +exports.getRequiredHeader = getRequiredHeader; +/** + * Encodes a string to Base64 format. + */ +const toBase64 = (str) => { + if (!str) + return ''; + if (typeof Buffer !== 'undefined') { + return Buffer.from(str).toString('base64'); + } + if (typeof btoa !== 'undefined') { + return btoa(str); + } + throw new error_1.OpenAIError('Cannot generate b64 string; Expected `Buffer` or `btoa` to be defined'); +}; +exports.toBase64 = toBase64; +function isObj(obj) { + return obj != null && typeof obj === 'object' && !Array.isArray(obj); +} +exports.isObj = isObj; +//# sourceMappingURL=core.js.map + +/***/ }), + +/***/ 8905: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.InternalServerError = exports.RateLimitError = exports.UnprocessableEntityError = exports.ConflictError = exports.NotFoundError = exports.PermissionDeniedError = exports.AuthenticationError = exports.BadRequestError = exports.APIConnectionTimeoutError = exports.APIConnectionError = exports.APIUserAbortError = exports.APIError = exports.OpenAIError = void 0; +const core_1 = __nccwpck_require__(1798); +class OpenAIError extends Error { +} +exports.OpenAIError = OpenAIError; +class APIError extends OpenAIError { + constructor(status, error, message, headers) { + super(`${APIError.makeMessage(status, error, message)}`); + this.status = status; + this.headers = headers; + this.request_id = headers?.['x-request-id']; + const data = error; + this.error = data; + this.code = data?.['code']; + this.param = data?.['param']; + this.type = data?.['type']; + } + static makeMessage(status, error, message) { + const msg = error?.message ? + typeof error.message === 'string' ? + error.message + : JSON.stringify(error.message) + : error ? JSON.stringify(error) + : message; + if (status && msg) { + return `${status} ${msg}`; + } + if (status) { + return `${status} status code (no body)`; + } + if (msg) { + return msg; + } + return '(no status code or body)'; + } + static generate(status, errorResponse, message, headers) { + if (!status) { + return new APIConnectionError({ cause: (0, core_1.castToError)(errorResponse) }); + } + const error = errorResponse?.['error']; + if (status === 400) { + return new BadRequestError(status, error, message, headers); + } + if (status === 401) { + return new AuthenticationError(status, error, message, headers); + } + if (status === 403) { + return new PermissionDeniedError(status, error, message, headers); + } + if (status === 404) { + return new NotFoundError(status, error, message, headers); + } + if (status === 409) { + return new ConflictError(status, error, message, headers); + } + if (status === 422) { + return new UnprocessableEntityError(status, error, message, headers); + } + if (status === 429) { + return new RateLimitError(status, error, message, headers); + } + if (status >= 500) { + return new InternalServerError(status, error, message, headers); + } + return new APIError(status, error, message, headers); + } +} +exports.APIError = APIError; +class APIUserAbortError extends APIError { + constructor({ message } = {}) { + super(undefined, undefined, message || 'Request was aborted.', undefined); + this.status = undefined; + } +} +exports.APIUserAbortError = APIUserAbortError; +class APIConnectionError extends APIError { + constructor({ message, cause }) { + super(undefined, undefined, message || 'Connection error.', undefined); + this.status = undefined; + // in some environments the 'cause' property is already declared + // @ts-ignore + if (cause) + this.cause = cause; + } +} +exports.APIConnectionError = APIConnectionError; +class APIConnectionTimeoutError extends APIConnectionError { + constructor({ message } = {}) { + super({ message: message ?? 'Request timed out.' }); + } +} +exports.APIConnectionTimeoutError = APIConnectionTimeoutError; +class BadRequestError extends APIError { + constructor() { + super(...arguments); + this.status = 400; + } +} +exports.BadRequestError = BadRequestError; +class AuthenticationError extends APIError { + constructor() { + super(...arguments); + this.status = 401; + } +} +exports.AuthenticationError = AuthenticationError; +class PermissionDeniedError extends APIError { + constructor() { + super(...arguments); + this.status = 403; + } +} +exports.PermissionDeniedError = PermissionDeniedError; +class NotFoundError extends APIError { + constructor() { + super(...arguments); + this.status = 404; + } +} +exports.NotFoundError = NotFoundError; +class ConflictError extends APIError { + constructor() { + super(...arguments); + this.status = 409; + } +} +exports.ConflictError = ConflictError; +class UnprocessableEntityError extends APIError { + constructor() { + super(...arguments); + this.status = 422; + } +} +exports.UnprocessableEntityError = UnprocessableEntityError; +class RateLimitError extends APIError { + constructor() { + super(...arguments); + this.status = 429; + } +} +exports.RateLimitError = RateLimitError; +class InternalServerError extends APIError { +} +exports.InternalServerError = InternalServerError; +//# sourceMappingURL=error.js.map + +/***/ }), + +/***/ 47: +/***/ (function(module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var _a; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fileFromPath = exports.toFile = exports.UnprocessableEntityError = exports.PermissionDeniedError = exports.InternalServerError = exports.AuthenticationError = exports.BadRequestError = exports.RateLimitError = exports.ConflictError = exports.NotFoundError = exports.APIUserAbortError = exports.APIConnectionTimeoutError = exports.APIConnectionError = exports.APIError = exports.OpenAIError = exports.OpenAI = void 0; +const Core = __importStar(__nccwpck_require__(1798)); +const Errors = __importStar(__nccwpck_require__(8905)); +const Uploads = __importStar(__nccwpck_require__(3394)); +const Pagination = __importStar(__nccwpck_require__(7401)); +const API = __importStar(__nccwpck_require__(5690)); +/** API Client for interfacing with the OpenAI API. */ +class OpenAI extends Core.APIClient { + /** + * API Client for interfacing with the OpenAI API. + * + * @param {string | undefined} [opts.apiKey=process.env['OPENAI_API_KEY'] ?? undefined] + * @param {string | null | undefined} [opts.organization=process.env['OPENAI_ORG_ID'] ?? null] + * @param {string | null | undefined} [opts.project=process.env['OPENAI_PROJECT_ID'] ?? null] + * @param {string} [opts.baseURL=process.env['OPENAI_BASE_URL'] ?? https://api.openai.com/v1] - Override the default base URL for the API. + * @param {number} [opts.timeout=10 minutes] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out. + * @param {number} [opts.httpAgent] - An HTTP agent used to manage HTTP(s) connections. + * @param {Core.Fetch} [opts.fetch] - Specify a custom `fetch` function implementation. + * @param {number} [opts.maxRetries=2] - The maximum number of times the client will retry a request. + * @param {Core.Headers} opts.defaultHeaders - Default headers to include with every request to the API. + * @param {Core.DefaultQuery} opts.defaultQuery - Default query parameters to include with every request to the API. + * @param {boolean} [opts.dangerouslyAllowBrowser=false] - By default, client-side use of this library is not allowed, as it risks exposing your secret API credentials to attackers. + */ + constructor({ baseURL = Core.readEnv('OPENAI_BASE_URL'), apiKey = Core.readEnv('OPENAI_API_KEY'), organization = Core.readEnv('OPENAI_ORG_ID') ?? null, project = Core.readEnv('OPENAI_PROJECT_ID') ?? null, ...opts } = {}) { + if (apiKey === undefined) { + throw new Errors.OpenAIError("The OPENAI_API_KEY environment variable is missing or empty; either provide it, or instantiate the OpenAI client with an apiKey option, like new OpenAI({ apiKey: 'My API Key' })."); + } + const options = { + apiKey, + organization, + project, + ...opts, + baseURL: baseURL || `https://api.openai.com/v1`, + }; + if (!options.dangerouslyAllowBrowser && Core.isRunningInBrowser()) { + throw new Errors.OpenAIError("It looks like you're running in a browser-like environment.\n\nThis is disabled by default, as it risks exposing your secret API credentials to attackers.\nIf you understand the risks and have appropriate mitigations in place,\nyou can set the `dangerouslyAllowBrowser` option to `true`, e.g.,\n\nnew OpenAI({ apiKey, dangerouslyAllowBrowser: true });\n\nhttps://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety\n"); + } + super({ + baseURL: options.baseURL, + timeout: options.timeout ?? 600000 /* 10 minutes */, + httpAgent: options.httpAgent, + maxRetries: options.maxRetries, + fetch: options.fetch, + }); + this.completions = new API.Completions(this); + this.chat = new API.Chat(this); + this.embeddings = new API.Embeddings(this); + this.files = new API.Files(this); + this.images = new API.Images(this); + this.audio = new API.Audio(this); + this.moderations = new API.Moderations(this); + this.models = new API.Models(this); + this.fineTuning = new API.FineTuning(this); + this.beta = new API.Beta(this); + this.batches = new API.Batches(this); + this._options = options; + this.apiKey = apiKey; + this.organization = organization; + this.project = project; + } + defaultQuery() { + return this._options.defaultQuery; + } + defaultHeaders(opts) { + return { + ...super.defaultHeaders(opts), + 'OpenAI-Organization': this.organization, + 'OpenAI-Project': this.project, + ...this._options.defaultHeaders, + }; + } + authHeaders(opts) { + return { Authorization: `Bearer ${this.apiKey}` }; + } +} +exports.OpenAI = OpenAI; +_a = OpenAI; +OpenAI.OpenAI = _a; +OpenAI.OpenAIError = Errors.OpenAIError; +OpenAI.APIError = Errors.APIError; +OpenAI.APIConnectionError = Errors.APIConnectionError; +OpenAI.APIConnectionTimeoutError = Errors.APIConnectionTimeoutError; +OpenAI.APIUserAbortError = Errors.APIUserAbortError; +OpenAI.NotFoundError = Errors.NotFoundError; +OpenAI.ConflictError = Errors.ConflictError; +OpenAI.RateLimitError = Errors.RateLimitError; +OpenAI.BadRequestError = Errors.BadRequestError; +OpenAI.AuthenticationError = Errors.AuthenticationError; +OpenAI.InternalServerError = Errors.InternalServerError; +OpenAI.PermissionDeniedError = Errors.PermissionDeniedError; +OpenAI.UnprocessableEntityError = Errors.UnprocessableEntityError; +OpenAI.toFile = Uploads.toFile; +OpenAI.fileFromPath = Uploads.fileFromPath; +exports.OpenAIError = Errors.OpenAIError, exports.APIError = Errors.APIError, exports.APIConnectionError = Errors.APIConnectionError, exports.APIConnectionTimeoutError = Errors.APIConnectionTimeoutError, exports.APIUserAbortError = Errors.APIUserAbortError, exports.NotFoundError = Errors.NotFoundError, exports.ConflictError = Errors.ConflictError, exports.RateLimitError = Errors.RateLimitError, exports.BadRequestError = Errors.BadRequestError, exports.AuthenticationError = Errors.AuthenticationError, exports.InternalServerError = Errors.InternalServerError, exports.PermissionDeniedError = Errors.PermissionDeniedError, exports.UnprocessableEntityError = Errors.UnprocessableEntityError; +exports.toFile = Uploads.toFile; +exports.fileFromPath = Uploads.fileFromPath; +(function (OpenAI) { + OpenAI.Page = Pagination.Page; + OpenAI.CursorPage = Pagination.CursorPage; + OpenAI.Completions = API.Completions; + OpenAI.Chat = API.Chat; + OpenAI.Embeddings = API.Embeddings; + OpenAI.Files = API.Files; + OpenAI.FileObjectsPage = API.FileObjectsPage; + OpenAI.Images = API.Images; + OpenAI.Audio = API.Audio; + OpenAI.Moderations = API.Moderations; + OpenAI.Models = API.Models; + OpenAI.ModelsPage = API.ModelsPage; + OpenAI.FineTuning = API.FineTuning; + OpenAI.Beta = API.Beta; + OpenAI.Batches = API.Batches; + OpenAI.BatchesPage = API.BatchesPage; +})(OpenAI = exports.OpenAI || (exports.OpenAI = {})); +exports = module.exports = OpenAI; +exports["default"] = OpenAI; +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ 9365: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _AbstractAssistantStreamRunner_connectedPromise, _AbstractAssistantStreamRunner_resolveConnectedPromise, _AbstractAssistantStreamRunner_rejectConnectedPromise, _AbstractAssistantStreamRunner_endPromise, _AbstractAssistantStreamRunner_resolveEndPromise, _AbstractAssistantStreamRunner_rejectEndPromise, _AbstractAssistantStreamRunner_listeners, _AbstractAssistantStreamRunner_ended, _AbstractAssistantStreamRunner_errored, _AbstractAssistantStreamRunner_aborted, _AbstractAssistantStreamRunner_catchingPromiseCreated, _AbstractAssistantStreamRunner_handleError; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AbstractAssistantStreamRunner = void 0; +const error_1 = __nccwpck_require__(8905); +class AbstractAssistantStreamRunner { + constructor() { + this.controller = new AbortController(); + _AbstractAssistantStreamRunner_connectedPromise.set(this, void 0); + _AbstractAssistantStreamRunner_resolveConnectedPromise.set(this, () => { }); + _AbstractAssistantStreamRunner_rejectConnectedPromise.set(this, () => { }); + _AbstractAssistantStreamRunner_endPromise.set(this, void 0); + _AbstractAssistantStreamRunner_resolveEndPromise.set(this, () => { }); + _AbstractAssistantStreamRunner_rejectEndPromise.set(this, () => { }); + _AbstractAssistantStreamRunner_listeners.set(this, {}); + _AbstractAssistantStreamRunner_ended.set(this, false); + _AbstractAssistantStreamRunner_errored.set(this, false); + _AbstractAssistantStreamRunner_aborted.set(this, false); + _AbstractAssistantStreamRunner_catchingPromiseCreated.set(this, false); + _AbstractAssistantStreamRunner_handleError.set(this, (error) => { + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_errored, true, "f"); + if (error instanceof Error && error.name === 'AbortError') { + error = new error_1.APIUserAbortError(); + } + if (error instanceof error_1.APIUserAbortError) { + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_aborted, true, "f"); + return this._emit('abort', error); + } + if (error instanceof error_1.OpenAIError) { + return this._emit('error', error); + } + if (error instanceof Error) { + const openAIError = new error_1.OpenAIError(error.message); + // @ts-ignore + openAIError.cause = error; + return this._emit('error', openAIError); + } + return this._emit('error', new error_1.OpenAIError(String(error))); + }); + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_connectedPromise, new Promise((resolve, reject) => { + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_resolveConnectedPromise, resolve, "f"); + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_rejectConnectedPromise, reject, "f"); + }), "f"); + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_endPromise, new Promise((resolve, reject) => { + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_resolveEndPromise, resolve, "f"); + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_rejectEndPromise, reject, "f"); + }), "f"); + // Don't let these promises cause unhandled rejection errors. + // we will manually cause an unhandled rejection error later + // if the user hasn't registered any error listener or called + // any promise-returning method. + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_connectedPromise, "f").catch(() => { }); + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_endPromise, "f").catch(() => { }); + } + _run(executor) { + // Unfortunately if we call `executor()` immediately we get runtime errors about + // references to `this` before the `super()` constructor call returns. + setTimeout(() => { + executor().then(() => { + // this._emitFinal(); + this._emit('end'); + }, __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_handleError, "f")); + }, 0); + } + _addRun(run) { + return run; + } + _connected() { + if (this.ended) + return; + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_resolveConnectedPromise, "f").call(this); + this._emit('connect'); + } + get ended() { + return __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_ended, "f"); + } + get errored() { + return __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_errored, "f"); + } + get aborted() { + return __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_aborted, "f"); + } + abort() { + this.controller.abort(); + } + /** + * Adds the listener function to the end of the listeners array for the event. + * No checks are made to see if the listener has already been added. Multiple calls passing + * the same combination of event and listener will result in the listener being added, and + * called, multiple times. + * @returns this ChatCompletionStream, so that calls can be chained + */ + on(event, listener) { + const listeners = __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] || (__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] = []); + listeners.push({ listener }); + return this; + } + /** + * Removes the specified listener from the listener array for the event. + * off() will remove, at most, one instance of a listener from the listener array. If any single + * listener has been added multiple times to the listener array for the specified event, then + * off() must be called multiple times to remove each instance. + * @returns this ChatCompletionStream, so that calls can be chained + */ + off(event, listener) { + const listeners = __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event]; + if (!listeners) + return this; + const index = listeners.findIndex((l) => l.listener === listener); + if (index >= 0) + listeners.splice(index, 1); + return this; + } + /** + * Adds a one-time listener function for the event. The next time the event is triggered, + * this listener is removed and then invoked. + * @returns this ChatCompletionStream, so that calls can be chained + */ + once(event, listener) { + const listeners = __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] || (__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] = []); + listeners.push({ listener, once: true }); + return this; + } + /** + * This is similar to `.once()`, but returns a Promise that resolves the next time + * the event is triggered, instead of calling a listener callback. + * @returns a Promise that resolves the next time given event is triggered, + * or rejects if an error is emitted. (If you request the 'error' event, + * returns a promise that resolves with the error). + * + * Example: + * + * const message = await stream.emitted('message') // rejects if the stream errors + */ + emitted(event) { + return new Promise((resolve, reject) => { + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_catchingPromiseCreated, true, "f"); + if (event !== 'error') + this.once('error', reject); + this.once(event, resolve); + }); + } + async done() { + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_catchingPromiseCreated, true, "f"); + await __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_endPromise, "f"); + } + _emit(event, ...args) { + // make sure we don't emit any events after end + if (__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_ended, "f")) { + return; + } + if (event === 'end') { + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_ended, true, "f"); + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_resolveEndPromise, "f").call(this); + } + const listeners = __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event]; + if (listeners) { + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] = listeners.filter((l) => !l.once); + listeners.forEach(({ listener }) => listener(...args)); + } + if (event === 'abort') { + const error = args[0]; + if (!__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_catchingPromiseCreated, "f") && !listeners?.length) { + Promise.reject(error); + } + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_rejectConnectedPromise, "f").call(this, error); + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_rejectEndPromise, "f").call(this, error); + this._emit('end'); + return; + } + if (event === 'error') { + // NOTE: _emit('error', error) should only be called from #handleError(). + const error = args[0]; + if (!__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_catchingPromiseCreated, "f") && !listeners?.length) { + // Trigger an unhandled rejection if the user hasn't registered any error handlers. + // If you are seeing stack traces here, make sure to handle errors via either: + // - runner.on('error', () => ...) + // - await runner.done() + // - await runner.finalChatCompletion() + // - etc. + Promise.reject(error); + } + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_rejectConnectedPromise, "f").call(this, error); + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_rejectEndPromise, "f").call(this, error); + this._emit('end'); + } + } + async _threadAssistantStream(body, thread, options) { + return await this._createThreadAssistantStream(thread, body, options); + } + async _runAssistantStream(threadId, runs, params, options) { + return await this._createAssistantStream(runs, threadId, params, options); + } + async _runToolAssistantStream(threadId, runId, runs, params, options) { + return await this._createToolAssistantStream(runs, threadId, runId, params, options); + } + async _createThreadAssistantStream(thread, body, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + // this.#validateParams(params); + const runResult = await thread.createAndRun({ ...body, stream: false }, { ...options, signal: this.controller.signal }); + this._connected(); + return this._addRun(runResult); + } + async _createToolAssistantStream(run, threadId, runId, params, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + const runResult = await run.submitToolOutputs(threadId, runId, { ...params, stream: false }, { ...options, signal: this.controller.signal }); + this._connected(); + return this._addRun(runResult); + } + async _createAssistantStream(run, threadId, params, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + // this.#validateParams(params); + const runResult = await run.create(threadId, { ...params, stream: false }, { ...options, signal: this.controller.signal }); + this._connected(); + return this._addRun(runResult); + } +} +exports.AbstractAssistantStreamRunner = AbstractAssistantStreamRunner; +_AbstractAssistantStreamRunner_connectedPromise = new WeakMap(), _AbstractAssistantStreamRunner_resolveConnectedPromise = new WeakMap(), _AbstractAssistantStreamRunner_rejectConnectedPromise = new WeakMap(), _AbstractAssistantStreamRunner_endPromise = new WeakMap(), _AbstractAssistantStreamRunner_resolveEndPromise = new WeakMap(), _AbstractAssistantStreamRunner_rejectEndPromise = new WeakMap(), _AbstractAssistantStreamRunner_listeners = new WeakMap(), _AbstractAssistantStreamRunner_ended = new WeakMap(), _AbstractAssistantStreamRunner_errored = new WeakMap(), _AbstractAssistantStreamRunner_aborted = new WeakMap(), _AbstractAssistantStreamRunner_catchingPromiseCreated = new WeakMap(), _AbstractAssistantStreamRunner_handleError = new WeakMap(); +//# sourceMappingURL=AbstractAssistantStreamRunner.js.map + +/***/ }), + +/***/ 8398: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _AbstractChatCompletionRunner_instances, _AbstractChatCompletionRunner_connectedPromise, _AbstractChatCompletionRunner_resolveConnectedPromise, _AbstractChatCompletionRunner_rejectConnectedPromise, _AbstractChatCompletionRunner_endPromise, _AbstractChatCompletionRunner_resolveEndPromise, _AbstractChatCompletionRunner_rejectEndPromise, _AbstractChatCompletionRunner_listeners, _AbstractChatCompletionRunner_ended, _AbstractChatCompletionRunner_errored, _AbstractChatCompletionRunner_aborted, _AbstractChatCompletionRunner_catchingPromiseCreated, _AbstractChatCompletionRunner_getFinalContent, _AbstractChatCompletionRunner_getFinalMessage, _AbstractChatCompletionRunner_getFinalFunctionCall, _AbstractChatCompletionRunner_getFinalFunctionCallResult, _AbstractChatCompletionRunner_calculateTotalUsage, _AbstractChatCompletionRunner_handleError, _AbstractChatCompletionRunner_validateParams, _AbstractChatCompletionRunner_stringifyFunctionCallResult; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AbstractChatCompletionRunner = void 0; +const error_1 = __nccwpck_require__(8905); +const RunnableFunction_1 = __nccwpck_require__(5464); +const chatCompletionUtils_1 = __nccwpck_require__(7858); +const DEFAULT_MAX_CHAT_COMPLETIONS = 10; +class AbstractChatCompletionRunner { + constructor() { + _AbstractChatCompletionRunner_instances.add(this); + this.controller = new AbortController(); + _AbstractChatCompletionRunner_connectedPromise.set(this, void 0); + _AbstractChatCompletionRunner_resolveConnectedPromise.set(this, () => { }); + _AbstractChatCompletionRunner_rejectConnectedPromise.set(this, () => { }); + _AbstractChatCompletionRunner_endPromise.set(this, void 0); + _AbstractChatCompletionRunner_resolveEndPromise.set(this, () => { }); + _AbstractChatCompletionRunner_rejectEndPromise.set(this, () => { }); + _AbstractChatCompletionRunner_listeners.set(this, {}); + this._chatCompletions = []; + this.messages = []; + _AbstractChatCompletionRunner_ended.set(this, false); + _AbstractChatCompletionRunner_errored.set(this, false); + _AbstractChatCompletionRunner_aborted.set(this, false); + _AbstractChatCompletionRunner_catchingPromiseCreated.set(this, false); + _AbstractChatCompletionRunner_handleError.set(this, (error) => { + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_errored, true, "f"); + if (error instanceof Error && error.name === 'AbortError') { + error = new error_1.APIUserAbortError(); + } + if (error instanceof error_1.APIUserAbortError) { + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_aborted, true, "f"); + return this._emit('abort', error); + } + if (error instanceof error_1.OpenAIError) { + return this._emit('error', error); + } + if (error instanceof Error) { + const openAIError = new error_1.OpenAIError(error.message); + // @ts-ignore + openAIError.cause = error; + return this._emit('error', openAIError); + } + return this._emit('error', new error_1.OpenAIError(String(error))); + }); + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_connectedPromise, new Promise((resolve, reject) => { + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_resolveConnectedPromise, resolve, "f"); + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_rejectConnectedPromise, reject, "f"); + }), "f"); + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_endPromise, new Promise((resolve, reject) => { + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_resolveEndPromise, resolve, "f"); + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_rejectEndPromise, reject, "f"); + }), "f"); + // Don't let these promises cause unhandled rejection errors. + // we will manually cause an unhandled rejection error later + // if the user hasn't registered any error listener or called + // any promise-returning method. + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_connectedPromise, "f").catch(() => { }); + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_endPromise, "f").catch(() => { }); + } + _run(executor) { + // Unfortunately if we call `executor()` immediately we get runtime errors about + // references to `this` before the `super()` constructor call returns. + setTimeout(() => { + executor().then(() => { + this._emitFinal(); + this._emit('end'); + }, __classPrivateFieldGet(this, _AbstractChatCompletionRunner_handleError, "f")); + }, 0); + } + _addChatCompletion(chatCompletion) { + this._chatCompletions.push(chatCompletion); + this._emit('chatCompletion', chatCompletion); + const message = chatCompletion.choices[0]?.message; + if (message) + this._addMessage(message); + return chatCompletion; + } + _addMessage(message, emit = true) { + if (!('content' in message)) + message.content = null; + this.messages.push(message); + if (emit) { + this._emit('message', message); + if (((0, chatCompletionUtils_1.isFunctionMessage)(message) || (0, chatCompletionUtils_1.isToolMessage)(message)) && message.content) { + // Note, this assumes that {role: 'tool', content: …} is always the result of a call of tool of type=function. + this._emit('functionCallResult', message.content); + } + else if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message.function_call) { + this._emit('functionCall', message.function_call); + } + else if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message.tool_calls) { + for (const tool_call of message.tool_calls) { + if (tool_call.type === 'function') { + this._emit('functionCall', tool_call.function); + } + } + } + } + } + _connected() { + if (this.ended) + return; + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_resolveConnectedPromise, "f").call(this); + this._emit('connect'); + } + get ended() { + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_ended, "f"); + } + get errored() { + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_errored, "f"); + } + get aborted() { + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_aborted, "f"); + } + abort() { + this.controller.abort(); + } + /** + * Adds the listener function to the end of the listeners array for the event. + * No checks are made to see if the listener has already been added. Multiple calls passing + * the same combination of event and listener will result in the listener being added, and + * called, multiple times. + * @returns this ChatCompletionStream, so that calls can be chained + */ + on(event, listener) { + const listeners = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] || (__classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] = []); + listeners.push({ listener }); + return this; + } + /** + * Removes the specified listener from the listener array for the event. + * off() will remove, at most, one instance of a listener from the listener array. If any single + * listener has been added multiple times to the listener array for the specified event, then + * off() must be called multiple times to remove each instance. + * @returns this ChatCompletionStream, so that calls can be chained + */ + off(event, listener) { + const listeners = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event]; + if (!listeners) + return this; + const index = listeners.findIndex((l) => l.listener === listener); + if (index >= 0) + listeners.splice(index, 1); + return this; + } + /** + * Adds a one-time listener function for the event. The next time the event is triggered, + * this listener is removed and then invoked. + * @returns this ChatCompletionStream, so that calls can be chained + */ + once(event, listener) { + const listeners = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] || (__classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] = []); + listeners.push({ listener, once: true }); + return this; + } + /** + * This is similar to `.once()`, but returns a Promise that resolves the next time + * the event is triggered, instead of calling a listener callback. + * @returns a Promise that resolves the next time given event is triggered, + * or rejects if an error is emitted. (If you request the 'error' event, + * returns a promise that resolves with the error). + * + * Example: + * + * const message = await stream.emitted('message') // rejects if the stream errors + */ + emitted(event) { + return new Promise((resolve, reject) => { + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_catchingPromiseCreated, true, "f"); + if (event !== 'error') + this.once('error', reject); + this.once(event, resolve); + }); + } + async done() { + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_catchingPromiseCreated, true, "f"); + await __classPrivateFieldGet(this, _AbstractChatCompletionRunner_endPromise, "f"); + } + /** + * @returns a promise that resolves with the final ChatCompletion, or rejects + * if an error occurred or the stream ended prematurely without producing a ChatCompletion. + */ + async finalChatCompletion() { + await this.done(); + const completion = this._chatCompletions[this._chatCompletions.length - 1]; + if (!completion) + throw new error_1.OpenAIError('stream ended without producing a ChatCompletion'); + return completion; + } + /** + * @returns a promise that resolves with the content of the final ChatCompletionMessage, or rejects + * if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage. + */ + async finalContent() { + await this.done(); + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalContent).call(this); + } + /** + * @returns a promise that resolves with the the final assistant ChatCompletionMessage response, + * or rejects if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage. + */ + async finalMessage() { + await this.done(); + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalMessage).call(this); + } + /** + * @returns a promise that resolves with the content of the final FunctionCall, or rejects + * if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage. + */ + async finalFunctionCall() { + await this.done(); + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalFunctionCall).call(this); + } + async finalFunctionCallResult() { + await this.done(); + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalFunctionCallResult).call(this); + } + async totalUsage() { + await this.done(); + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_calculateTotalUsage).call(this); + } + allChatCompletions() { + return [...this._chatCompletions]; + } + _emit(event, ...args) { + // make sure we don't emit any events after end + if (__classPrivateFieldGet(this, _AbstractChatCompletionRunner_ended, "f")) { + return; + } + if (event === 'end') { + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_ended, true, "f"); + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_resolveEndPromise, "f").call(this); + } + const listeners = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event]; + if (listeners) { + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] = listeners.filter((l) => !l.once); + listeners.forEach(({ listener }) => listener(...args)); + } + if (event === 'abort') { + const error = args[0]; + if (!__classPrivateFieldGet(this, _AbstractChatCompletionRunner_catchingPromiseCreated, "f") && !listeners?.length) { + Promise.reject(error); + } + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_rejectConnectedPromise, "f").call(this, error); + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_rejectEndPromise, "f").call(this, error); + this._emit('end'); + return; + } + if (event === 'error') { + // NOTE: _emit('error', error) should only be called from #handleError(). + const error = args[0]; + if (!__classPrivateFieldGet(this, _AbstractChatCompletionRunner_catchingPromiseCreated, "f") && !listeners?.length) { + // Trigger an unhandled rejection if the user hasn't registered any error handlers. + // If you are seeing stack traces here, make sure to handle errors via either: + // - runner.on('error', () => ...) + // - await runner.done() + // - await runner.finalChatCompletion() + // - etc. + Promise.reject(error); + } + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_rejectConnectedPromise, "f").call(this, error); + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_rejectEndPromise, "f").call(this, error); + this._emit('end'); + } + } + _emitFinal() { + const completion = this._chatCompletions[this._chatCompletions.length - 1]; + if (completion) + this._emit('finalChatCompletion', completion); + const finalMessage = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalMessage).call(this); + if (finalMessage) + this._emit('finalMessage', finalMessage); + const finalContent = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalContent).call(this); + if (finalContent) + this._emit('finalContent', finalContent); + const finalFunctionCall = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalFunctionCall).call(this); + if (finalFunctionCall) + this._emit('finalFunctionCall', finalFunctionCall); + const finalFunctionCallResult = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalFunctionCallResult).call(this); + if (finalFunctionCallResult != null) + this._emit('finalFunctionCallResult', finalFunctionCallResult); + if (this._chatCompletions.some((c) => c.usage)) { + this._emit('totalUsage', __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_calculateTotalUsage).call(this)); + } + } + async _createChatCompletion(completions, params, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_validateParams).call(this, params); + const chatCompletion = await completions.create({ ...params, stream: false }, { ...options, signal: this.controller.signal }); + this._connected(); + return this._addChatCompletion(chatCompletion); + } + async _runChatCompletion(completions, params, options) { + for (const message of params.messages) { + this._addMessage(message, false); + } + return await this._createChatCompletion(completions, params, options); + } + async _runFunctions(completions, params, options) { + const role = 'function'; + const { function_call = 'auto', stream, ...restParams } = params; + const singleFunctionToCall = typeof function_call !== 'string' && function_call?.name; + const { maxChatCompletions = DEFAULT_MAX_CHAT_COMPLETIONS } = options || {}; + const functionsByName = {}; + for (const f of params.functions) { + functionsByName[f.name || f.function.name] = f; + } + const functions = params.functions.map((f) => ({ + name: f.name || f.function.name, + parameters: f.parameters, + description: f.description, + })); + for (const message of params.messages) { + this._addMessage(message, false); + } + for (let i = 0; i < maxChatCompletions; ++i) { + const chatCompletion = await this._createChatCompletion(completions, { + ...restParams, + function_call, + functions, + messages: [...this.messages], + }, options); + const message = chatCompletion.choices[0]?.message; + if (!message) { + throw new error_1.OpenAIError(`missing message in ChatCompletion response`); + } + if (!message.function_call) + return; + const { name, arguments: args } = message.function_call; + const fn = functionsByName[name]; + if (!fn) { + const content = `Invalid function_call: ${JSON.stringify(name)}. Available options are: ${functions + .map((f) => JSON.stringify(f.name)) + .join(', ')}. Please try again`; + this._addMessage({ role, name, content }); + continue; + } + else if (singleFunctionToCall && singleFunctionToCall !== name) { + const content = `Invalid function_call: ${JSON.stringify(name)}. ${JSON.stringify(singleFunctionToCall)} requested. Please try again`; + this._addMessage({ role, name, content }); + continue; + } + let parsed; + try { + parsed = (0, RunnableFunction_1.isRunnableFunctionWithParse)(fn) ? await fn.parse(args) : args; + } + catch (error) { + this._addMessage({ + role, + name, + content: error instanceof Error ? error.message : String(error), + }); + continue; + } + // @ts-expect-error it can't rule out `never` type. + const rawContent = await fn.function(parsed, this); + const content = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_stringifyFunctionCallResult).call(this, rawContent); + this._addMessage({ role, name, content }); + if (singleFunctionToCall) + return; + } + } + async _runTools(completions, params, options) { + const role = 'tool'; + const { tool_choice = 'auto', stream, ...restParams } = params; + const singleFunctionToCall = typeof tool_choice !== 'string' && tool_choice?.function?.name; + const { maxChatCompletions = DEFAULT_MAX_CHAT_COMPLETIONS } = options || {}; + const functionsByName = {}; + for (const f of params.tools) { + if (f.type === 'function') { + functionsByName[f.function.name || f.function.function.name] = f.function; + } + } + const tools = 'tools' in params ? + params.tools.map((t) => t.type === 'function' ? + { + type: 'function', + function: { + name: t.function.name || t.function.function.name, + parameters: t.function.parameters, + description: t.function.description, + }, + } + : t) + : undefined; + for (const message of params.messages) { + this._addMessage(message, false); + } + for (let i = 0; i < maxChatCompletions; ++i) { + const chatCompletion = await this._createChatCompletion(completions, { + ...restParams, + tool_choice, + tools, + messages: [...this.messages], + }, options); + const message = chatCompletion.choices[0]?.message; + if (!message) { + throw new error_1.OpenAIError(`missing message in ChatCompletion response`); + } + if (!message.tool_calls) { + return; + } + for (const tool_call of message.tool_calls) { + if (tool_call.type !== 'function') + continue; + const tool_call_id = tool_call.id; + const { name, arguments: args } = tool_call.function; + const fn = functionsByName[name]; + if (!fn) { + const content = `Invalid tool_call: ${JSON.stringify(name)}. Available options are: ${tools + .map((f) => JSON.stringify(f.function.name)) + .join(', ')}. Please try again`; + this._addMessage({ role, tool_call_id, content }); + continue; + } + else if (singleFunctionToCall && singleFunctionToCall !== name) { + const content = `Invalid tool_call: ${JSON.stringify(name)}. ${JSON.stringify(singleFunctionToCall)} requested. Please try again`; + this._addMessage({ role, tool_call_id, content }); + continue; + } + let parsed; + try { + parsed = (0, RunnableFunction_1.isRunnableFunctionWithParse)(fn) ? await fn.parse(args) : args; + } + catch (error) { + const content = error instanceof Error ? error.message : String(error); + this._addMessage({ role, tool_call_id, content }); + continue; + } + // @ts-expect-error it can't rule out `never` type. + const rawContent = await fn.function(parsed, this); + const content = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_stringifyFunctionCallResult).call(this, rawContent); + this._addMessage({ role, tool_call_id, content }); + if (singleFunctionToCall) { + return; + } + } + } + return; + } +} +exports.AbstractChatCompletionRunner = AbstractChatCompletionRunner; +_AbstractChatCompletionRunner_connectedPromise = new WeakMap(), _AbstractChatCompletionRunner_resolveConnectedPromise = new WeakMap(), _AbstractChatCompletionRunner_rejectConnectedPromise = new WeakMap(), _AbstractChatCompletionRunner_endPromise = new WeakMap(), _AbstractChatCompletionRunner_resolveEndPromise = new WeakMap(), _AbstractChatCompletionRunner_rejectEndPromise = new WeakMap(), _AbstractChatCompletionRunner_listeners = new WeakMap(), _AbstractChatCompletionRunner_ended = new WeakMap(), _AbstractChatCompletionRunner_errored = new WeakMap(), _AbstractChatCompletionRunner_aborted = new WeakMap(), _AbstractChatCompletionRunner_catchingPromiseCreated = new WeakMap(), _AbstractChatCompletionRunner_handleError = new WeakMap(), _AbstractChatCompletionRunner_instances = new WeakSet(), _AbstractChatCompletionRunner_getFinalContent = function _AbstractChatCompletionRunner_getFinalContent() { + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalMessage).call(this).content ?? null; +}, _AbstractChatCompletionRunner_getFinalMessage = function _AbstractChatCompletionRunner_getFinalMessage() { + let i = this.messages.length; + while (i-- > 0) { + const message = this.messages[i]; + if ((0, chatCompletionUtils_1.isAssistantMessage)(message)) { + return { ...message, content: message.content ?? null }; + } + } + throw new error_1.OpenAIError('stream ended without producing a ChatCompletionMessage with role=assistant'); +}, _AbstractChatCompletionRunner_getFinalFunctionCall = function _AbstractChatCompletionRunner_getFinalFunctionCall() { + for (let i = this.messages.length - 1; i >= 0; i--) { + const message = this.messages[i]; + if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message?.function_call) { + return message.function_call; + } + if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message?.tool_calls?.length) { + return message.tool_calls.at(-1)?.function; + } + } + return; +}, _AbstractChatCompletionRunner_getFinalFunctionCallResult = function _AbstractChatCompletionRunner_getFinalFunctionCallResult() { + for (let i = this.messages.length - 1; i >= 0; i--) { + const message = this.messages[i]; + if ((0, chatCompletionUtils_1.isFunctionMessage)(message) && message.content != null) { + return message.content; + } + if ((0, chatCompletionUtils_1.isToolMessage)(message) && + message.content != null && + this.messages.some((x) => x.role === 'assistant' && + x.tool_calls?.some((y) => y.type === 'function' && y.id === message.tool_call_id))) { + return message.content; + } + } + return; +}, _AbstractChatCompletionRunner_calculateTotalUsage = function _AbstractChatCompletionRunner_calculateTotalUsage() { + const total = { + completion_tokens: 0, + prompt_tokens: 0, + total_tokens: 0, + }; + for (const { usage } of this._chatCompletions) { + if (usage) { + total.completion_tokens += usage.completion_tokens; + total.prompt_tokens += usage.prompt_tokens; + total.total_tokens += usage.total_tokens; + } + } + return total; +}, _AbstractChatCompletionRunner_validateParams = function _AbstractChatCompletionRunner_validateParams(params) { + if (params.n != null && params.n > 1) { + throw new error_1.OpenAIError('ChatCompletion convenience helpers only support n=1 at this time. To use n>1, please use chat.completions.create() directly.'); + } +}, _AbstractChatCompletionRunner_stringifyFunctionCallResult = function _AbstractChatCompletionRunner_stringifyFunctionCallResult(rawContent) { + return (typeof rawContent === 'string' ? rawContent + : rawContent === undefined ? 'undefined' + : JSON.stringify(rawContent)); +}; +//# sourceMappingURL=AbstractChatCompletionRunner.js.map + +/***/ }), + +/***/ 7514: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var _AssistantStream_instances, _AssistantStream_events, _AssistantStream_runStepSnapshots, _AssistantStream_messageSnapshots, _AssistantStream_messageSnapshot, _AssistantStream_finalRun, _AssistantStream_currentContentIndex, _AssistantStream_currentContent, _AssistantStream_currentToolCallIndex, _AssistantStream_currentToolCall, _AssistantStream_currentEvent, _AssistantStream_currentRunSnapshot, _AssistantStream_currentRunStepSnapshot, _AssistantStream_addEvent, _AssistantStream_endRequest, _AssistantStream_handleMessage, _AssistantStream_handleRunStep, _AssistantStream_handleEvent, _AssistantStream_accumulateRunStep, _AssistantStream_accumulateMessage, _AssistantStream_accumulateContent, _AssistantStream_handleRun; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AssistantStream = void 0; +const Core = __importStar(__nccwpck_require__(1798)); +const AbstractAssistantStreamRunner_1 = __nccwpck_require__(9365); +const streaming_1 = __nccwpck_require__(884); +const error_1 = __nccwpck_require__(8905); +class AssistantStream extends AbstractAssistantStreamRunner_1.AbstractAssistantStreamRunner { + constructor() { + super(...arguments); + _AssistantStream_instances.add(this); + //Track all events in a single list for reference + _AssistantStream_events.set(this, []); + //Used to accumulate deltas + //We are accumulating many types so the value here is not strict + _AssistantStream_runStepSnapshots.set(this, {}); + _AssistantStream_messageSnapshots.set(this, {}); + _AssistantStream_messageSnapshot.set(this, void 0); + _AssistantStream_finalRun.set(this, void 0); + _AssistantStream_currentContentIndex.set(this, void 0); + _AssistantStream_currentContent.set(this, void 0); + _AssistantStream_currentToolCallIndex.set(this, void 0); + _AssistantStream_currentToolCall.set(this, void 0); + //For current snapshot methods + _AssistantStream_currentEvent.set(this, void 0); + _AssistantStream_currentRunSnapshot.set(this, void 0); + _AssistantStream_currentRunStepSnapshot.set(this, void 0); + } + [(_AssistantStream_events = new WeakMap(), _AssistantStream_runStepSnapshots = new WeakMap(), _AssistantStream_messageSnapshots = new WeakMap(), _AssistantStream_messageSnapshot = new WeakMap(), _AssistantStream_finalRun = new WeakMap(), _AssistantStream_currentContentIndex = new WeakMap(), _AssistantStream_currentContent = new WeakMap(), _AssistantStream_currentToolCallIndex = new WeakMap(), _AssistantStream_currentToolCall = new WeakMap(), _AssistantStream_currentEvent = new WeakMap(), _AssistantStream_currentRunSnapshot = new WeakMap(), _AssistantStream_currentRunStepSnapshot = new WeakMap(), _AssistantStream_instances = new WeakSet(), Symbol.asyncIterator)]() { + const pushQueue = []; + const readQueue = []; + let done = false; + //Catch all for passing along all events + this.on('event', (event) => { + const reader = readQueue.shift(); + if (reader) { + reader.resolve(event); + } + else { + pushQueue.push(event); + } + }); + this.on('end', () => { + done = true; + for (const reader of readQueue) { + reader.resolve(undefined); + } + readQueue.length = 0; + }); + this.on('abort', (err) => { + done = true; + for (const reader of readQueue) { + reader.reject(err); + } + readQueue.length = 0; + }); + this.on('error', (err) => { + done = true; + for (const reader of readQueue) { + reader.reject(err); + } + readQueue.length = 0; + }); + return { + next: async () => { + if (!pushQueue.length) { + if (done) { + return { value: undefined, done: true }; + } + return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true })); + } + const chunk = pushQueue.shift(); + return { value: chunk, done: false }; + }, + return: async () => { + this.abort(); + return { value: undefined, done: true }; + }, + }; + } + static fromReadableStream(stream) { + const runner = new AssistantStream(); + runner._run(() => runner._fromReadableStream(stream)); + return runner; + } + async _fromReadableStream(readableStream, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + this._connected(); + const stream = streaming_1.Stream.fromReadableStream(readableStream, this.controller); + for await (const event of stream) { + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event); + } + if (stream.controller.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this)); + } + toReadableStream() { + const stream = new streaming_1.Stream(this[Symbol.asyncIterator].bind(this), this.controller); + return stream.toReadableStream(); + } + static createToolAssistantStream(threadId, runId, runs, body, options) { + const runner = new AssistantStream(); + runner._run(() => runner._runToolAssistantStream(threadId, runId, runs, body, { + ...options, + headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' }, + })); + return runner; + } + async _createToolAssistantStream(run, threadId, runId, params, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + const body = { ...params, stream: true }; + const stream = await run.submitToolOutputs(threadId, runId, body, { + ...options, + signal: this.controller.signal, + }); + this._connected(); + for await (const event of stream) { + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event); + } + if (stream.controller.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this)); + } + static createThreadAssistantStream(body, thread, options) { + const runner = new AssistantStream(); + runner._run(() => runner._threadAssistantStream(body, thread, { + ...options, + headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' }, + })); + return runner; + } + static createAssistantStream(threadId, runs, params, options) { + const runner = new AssistantStream(); + runner._run(() => runner._runAssistantStream(threadId, runs, params, { + ...options, + headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' }, + })); + return runner; + } + currentEvent() { + return __classPrivateFieldGet(this, _AssistantStream_currentEvent, "f"); + } + currentRun() { + return __classPrivateFieldGet(this, _AssistantStream_currentRunSnapshot, "f"); + } + currentMessageSnapshot() { + return __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f"); + } + currentRunStepSnapshot() { + return __classPrivateFieldGet(this, _AssistantStream_currentRunStepSnapshot, "f"); + } + async finalRunSteps() { + await this.done(); + return Object.values(__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")); + } + async finalMessages() { + await this.done(); + return Object.values(__classPrivateFieldGet(this, _AssistantStream_messageSnapshots, "f")); + } + async finalRun() { + await this.done(); + if (!__classPrivateFieldGet(this, _AssistantStream_finalRun, "f")) + throw Error('Final run was not received.'); + return __classPrivateFieldGet(this, _AssistantStream_finalRun, "f"); + } + async _createThreadAssistantStream(thread, params, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + const body = { ...params, stream: true }; + const stream = await thread.createAndRun(body, { ...options, signal: this.controller.signal }); + this._connected(); + for await (const event of stream) { + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event); + } + if (stream.controller.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this)); + } + async _createAssistantStream(run, threadId, params, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + const body = { ...params, stream: true }; + const stream = await run.create(threadId, body, { ...options, signal: this.controller.signal }); + this._connected(); + for await (const event of stream) { + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event); + } + if (stream.controller.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this)); + } + static accumulateDelta(acc, delta) { + for (const [key, deltaValue] of Object.entries(delta)) { + if (!acc.hasOwnProperty(key)) { + acc[key] = deltaValue; + continue; + } + let accValue = acc[key]; + if (accValue === null || accValue === undefined) { + acc[key] = deltaValue; + continue; + } + // We don't accumulate these special properties + if (key === 'index' || key === 'type') { + acc[key] = deltaValue; + continue; + } + // Type-specific accumulation logic + if (typeof accValue === 'string' && typeof deltaValue === 'string') { + accValue += deltaValue; + } + else if (typeof accValue === 'number' && typeof deltaValue === 'number') { + accValue += deltaValue; + } + else if (Core.isObj(accValue) && Core.isObj(deltaValue)) { + accValue = this.accumulateDelta(accValue, deltaValue); + } + else if (Array.isArray(accValue) && Array.isArray(deltaValue)) { + if (accValue.every((x) => typeof x === 'string' || typeof x === 'number')) { + accValue.push(...deltaValue); // Use spread syntax for efficient addition + continue; + } + } + else { + throw Error(`Unhandled record type: ${key}, deltaValue: ${deltaValue}, accValue: ${accValue}`); + } + acc[key] = accValue; + } + return acc; + } +} +exports.AssistantStream = AssistantStream; +_AssistantStream_addEvent = function _AssistantStream_addEvent(event) { + if (this.ended) + return; + __classPrivateFieldSet(this, _AssistantStream_currentEvent, event, "f"); + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleEvent).call(this, event); + switch (event.event) { + case 'thread.created': + //No action on this event. + break; + case 'thread.run.created': + case 'thread.run.queued': + case 'thread.run.in_progress': + case 'thread.run.requires_action': + case 'thread.run.completed': + case 'thread.run.failed': + case 'thread.run.cancelling': + case 'thread.run.cancelled': + case 'thread.run.expired': + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleRun).call(this, event); + break; + case 'thread.run.step.created': + case 'thread.run.step.in_progress': + case 'thread.run.step.delta': + case 'thread.run.step.completed': + case 'thread.run.step.failed': + case 'thread.run.step.cancelled': + case 'thread.run.step.expired': + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleRunStep).call(this, event); + break; + case 'thread.message.created': + case 'thread.message.in_progress': + case 'thread.message.delta': + case 'thread.message.completed': + case 'thread.message.incomplete': + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleMessage).call(this, event); + break; + case 'error': + //This is included for completeness, but errors are processed in the SSE event processing so this should not occur + throw new Error('Encountered an error event in event processing - errors should be processed earlier'); + } +}, _AssistantStream_endRequest = function _AssistantStream_endRequest() { + if (this.ended) { + throw new error_1.OpenAIError(`stream has ended, this shouldn't happen`); + } + if (!__classPrivateFieldGet(this, _AssistantStream_finalRun, "f")) + throw Error('Final run has not been received'); + return __classPrivateFieldGet(this, _AssistantStream_finalRun, "f"); +}, _AssistantStream_handleMessage = function _AssistantStream_handleMessage(event) { + const [accumulatedMessage, newContent] = __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_accumulateMessage).call(this, event, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); + __classPrivateFieldSet(this, _AssistantStream_messageSnapshot, accumulatedMessage, "f"); + __classPrivateFieldGet(this, _AssistantStream_messageSnapshots, "f")[accumulatedMessage.id] = accumulatedMessage; + for (const content of newContent) { + const snapshotContent = accumulatedMessage.content[content.index]; + if (snapshotContent?.type == 'text') { + this._emit('textCreated', snapshotContent.text); + } + } + switch (event.event) { + case 'thread.message.created': + this._emit('messageCreated', event.data); + break; + case 'thread.message.in_progress': + break; + case 'thread.message.delta': + this._emit('messageDelta', event.data.delta, accumulatedMessage); + if (event.data.delta.content) { + for (const content of event.data.delta.content) { + //If it is text delta, emit a text delta event + if (content.type == 'text' && content.text) { + let textDelta = content.text; + let snapshot = accumulatedMessage.content[content.index]; + if (snapshot && snapshot.type == 'text') { + this._emit('textDelta', textDelta, snapshot.text); + } + else { + throw Error('The snapshot associated with this text delta is not text or missing'); + } + } + if (content.index != __classPrivateFieldGet(this, _AssistantStream_currentContentIndex, "f")) { + //See if we have in progress content + if (__classPrivateFieldGet(this, _AssistantStream_currentContent, "f")) { + switch (__classPrivateFieldGet(this, _AssistantStream_currentContent, "f").type) { + case 'text': + this._emit('textDone', __classPrivateFieldGet(this, _AssistantStream_currentContent, "f").text, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); + break; + case 'image_file': + this._emit('imageFileDone', __classPrivateFieldGet(this, _AssistantStream_currentContent, "f").image_file, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); + break; + } + } + __classPrivateFieldSet(this, _AssistantStream_currentContentIndex, content.index, "f"); + } + __classPrivateFieldSet(this, _AssistantStream_currentContent, accumulatedMessage.content[content.index], "f"); + } + } + break; + case 'thread.message.completed': + case 'thread.message.incomplete': + //We emit the latest content we were working on on completion (including incomplete) + if (__classPrivateFieldGet(this, _AssistantStream_currentContentIndex, "f") !== undefined) { + const currentContent = event.data.content[__classPrivateFieldGet(this, _AssistantStream_currentContentIndex, "f")]; + if (currentContent) { + switch (currentContent.type) { + case 'image_file': + this._emit('imageFileDone', currentContent.image_file, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); + break; + case 'text': + this._emit('textDone', currentContent.text, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); + break; + } + } + } + if (__classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")) { + this._emit('messageDone', event.data); + } + __classPrivateFieldSet(this, _AssistantStream_messageSnapshot, undefined, "f"); + } +}, _AssistantStream_handleRunStep = function _AssistantStream_handleRunStep(event) { + const accumulatedRunStep = __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_accumulateRunStep).call(this, event); + __classPrivateFieldSet(this, _AssistantStream_currentRunStepSnapshot, accumulatedRunStep, "f"); + switch (event.event) { + case 'thread.run.step.created': + this._emit('runStepCreated', event.data); + break; + case 'thread.run.step.delta': + const delta = event.data.delta; + if (delta.step_details && + delta.step_details.type == 'tool_calls' && + delta.step_details.tool_calls && + accumulatedRunStep.step_details.type == 'tool_calls') { + for (const toolCall of delta.step_details.tool_calls) { + if (toolCall.index == __classPrivateFieldGet(this, _AssistantStream_currentToolCallIndex, "f")) { + this._emit('toolCallDelta', toolCall, accumulatedRunStep.step_details.tool_calls[toolCall.index]); + } + else { + if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) { + this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")); + } + __classPrivateFieldSet(this, _AssistantStream_currentToolCallIndex, toolCall.index, "f"); + __classPrivateFieldSet(this, _AssistantStream_currentToolCall, accumulatedRunStep.step_details.tool_calls[toolCall.index], "f"); + if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) + this._emit('toolCallCreated', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")); + } + } + } + this._emit('runStepDelta', event.data.delta, accumulatedRunStep); + break; + case 'thread.run.step.completed': + case 'thread.run.step.failed': + case 'thread.run.step.cancelled': + case 'thread.run.step.expired': + __classPrivateFieldSet(this, _AssistantStream_currentRunStepSnapshot, undefined, "f"); + const details = event.data.step_details; + if (details.type == 'tool_calls') { + if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) { + this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")); + __classPrivateFieldSet(this, _AssistantStream_currentToolCall, undefined, "f"); + } + } + this._emit('runStepDone', event.data, accumulatedRunStep); + break; + case 'thread.run.step.in_progress': + break; + } +}, _AssistantStream_handleEvent = function _AssistantStream_handleEvent(event) { + __classPrivateFieldGet(this, _AssistantStream_events, "f").push(event); + this._emit('event', event); +}, _AssistantStream_accumulateRunStep = function _AssistantStream_accumulateRunStep(event) { + switch (event.event) { + case 'thread.run.step.created': + __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = event.data; + return event.data; + case 'thread.run.step.delta': + let snapshot = __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; + if (!snapshot) { + throw Error('Received a RunStepDelta before creation of a snapshot'); + } + let data = event.data; + if (data.delta) { + const accumulated = AssistantStream.accumulateDelta(snapshot, data.delta); + __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = accumulated; + } + return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; + case 'thread.run.step.completed': + case 'thread.run.step.failed': + case 'thread.run.step.cancelled': + case 'thread.run.step.expired': + case 'thread.run.step.in_progress': + __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = event.data; + break; + } + if (__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]) + return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; + throw new Error('No snapshot available'); +}, _AssistantStream_accumulateMessage = function _AssistantStream_accumulateMessage(event, snapshot) { + let newContent = []; + switch (event.event) { + case 'thread.message.created': + //On creation the snapshot is just the initial message + return [event.data, newContent]; + case 'thread.message.delta': + if (!snapshot) { + throw Error('Received a delta with no existing snapshot (there should be one from message creation)'); + } + let data = event.data; + //If this delta does not have content, nothing to process + if (data.delta.content) { + for (const contentElement of data.delta.content) { + if (contentElement.index in snapshot.content) { + let currentContent = snapshot.content[contentElement.index]; + snapshot.content[contentElement.index] = __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_accumulateContent).call(this, contentElement, currentContent); + } + else { + snapshot.content[contentElement.index] = contentElement; + //This is a new element + newContent.push(contentElement); + } + } + } + return [snapshot, newContent]; + case 'thread.message.in_progress': + case 'thread.message.completed': + case 'thread.message.incomplete': + //No changes on other thread events + if (snapshot) { + return [snapshot, newContent]; + } + else { + throw Error('Received thread message event with no existing snapshot'); + } + } + throw Error('Tried to accumulate a non-message event'); +}, _AssistantStream_accumulateContent = function _AssistantStream_accumulateContent(contentElement, currentContent) { + return AssistantStream.accumulateDelta(currentContent, contentElement); +}, _AssistantStream_handleRun = function _AssistantStream_handleRun(event) { + __classPrivateFieldSet(this, _AssistantStream_currentRunSnapshot, event.data, "f"); + switch (event.event) { + case 'thread.run.created': + break; + case 'thread.run.queued': + break; + case 'thread.run.in_progress': + break; + case 'thread.run.requires_action': + case 'thread.run.cancelled': + case 'thread.run.failed': + case 'thread.run.completed': + case 'thread.run.expired': + __classPrivateFieldSet(this, _AssistantStream_finalRun, event.data, "f"); + if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) { + this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")); + __classPrivateFieldSet(this, _AssistantStream_currentToolCall, undefined, "f"); + } + break; + case 'thread.run.cancelling': + break; + } +}; +//# sourceMappingURL=AssistantStream.js.map + +/***/ }), + +/***/ 5575: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ChatCompletionRunner = void 0; +const AbstractChatCompletionRunner_1 = __nccwpck_require__(8398); +const chatCompletionUtils_1 = __nccwpck_require__(7858); +class ChatCompletionRunner extends AbstractChatCompletionRunner_1.AbstractChatCompletionRunner { + /** @deprecated - please use `runTools` instead. */ + static runFunctions(completions, params, options) { + const runner = new ChatCompletionRunner(); + const opts = { + ...options, + headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runFunctions' }, + }; + runner._run(() => runner._runFunctions(completions, params, opts)); + return runner; + } + static runTools(completions, params, options) { + const runner = new ChatCompletionRunner(); + const opts = { + ...options, + headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runTools' }, + }; + runner._run(() => runner._runTools(completions, params, opts)); + return runner; + } + _addMessage(message) { + super._addMessage(message); + if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message.content) { + this._emit('content', message.content); + } + } +} +exports.ChatCompletionRunner = ChatCompletionRunner; +//# sourceMappingURL=ChatCompletionRunner.js.map + +/***/ }), + +/***/ 7823: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var _ChatCompletionStream_instances, _ChatCompletionStream_currentChatCompletionSnapshot, _ChatCompletionStream_beginRequest, _ChatCompletionStream_addChunk, _ChatCompletionStream_endRequest, _ChatCompletionStream_accumulateChatCompletion; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ChatCompletionStream = void 0; +const error_1 = __nccwpck_require__(8905); +const AbstractChatCompletionRunner_1 = __nccwpck_require__(8398); +const streaming_1 = __nccwpck_require__(884); +class ChatCompletionStream extends AbstractChatCompletionRunner_1.AbstractChatCompletionRunner { + constructor() { + super(...arguments); + _ChatCompletionStream_instances.add(this); + _ChatCompletionStream_currentChatCompletionSnapshot.set(this, void 0); + } + get currentChatCompletionSnapshot() { + return __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); + } + /** + * Intended for use on the frontend, consuming a stream produced with + * `.toReadableStream()` on the backend. + * + * Note that messages sent to the model do not appear in `.on('message')` + * in this context. + */ + static fromReadableStream(stream) { + const runner = new ChatCompletionStream(); + runner._run(() => runner._fromReadableStream(stream)); + return runner; + } + static createChatCompletion(completions, params, options) { + const runner = new ChatCompletionStream(); + runner._run(() => runner._runChatCompletion(completions, { ...params, stream: true }, { ...options, headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' } })); + return runner; + } + async _createChatCompletion(completions, params, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_beginRequest).call(this); + const stream = await completions.create({ ...params, stream: true }, { ...options, signal: this.controller.signal }); + this._connected(); + for await (const chunk of stream) { + __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_addChunk).call(this, chunk); + } + if (stream.controller.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + return this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_endRequest).call(this)); + } + async _fromReadableStream(readableStream, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_beginRequest).call(this); + this._connected(); + const stream = streaming_1.Stream.fromReadableStream(readableStream, this.controller); + let chatId; + for await (const chunk of stream) { + if (chatId && chatId !== chunk.id) { + // A new request has been made. + this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_endRequest).call(this)); + } + __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_addChunk).call(this, chunk); + chatId = chunk.id; + } + if (stream.controller.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + return this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_endRequest).call(this)); + } + [(_ChatCompletionStream_currentChatCompletionSnapshot = new WeakMap(), _ChatCompletionStream_instances = new WeakSet(), _ChatCompletionStream_beginRequest = function _ChatCompletionStream_beginRequest() { + if (this.ended) + return; + __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, "f"); + }, _ChatCompletionStream_addChunk = function _ChatCompletionStream_addChunk(chunk) { + if (this.ended) + return; + const completion = __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_accumulateChatCompletion).call(this, chunk); + this._emit('chunk', chunk, completion); + const delta = chunk.choices[0]?.delta?.content; + const snapshot = completion.choices[0]?.message; + if (delta != null && snapshot?.role === 'assistant' && snapshot?.content) { + this._emit('content', delta, snapshot.content); + } + }, _ChatCompletionStream_endRequest = function _ChatCompletionStream_endRequest() { + if (this.ended) { + throw new error_1.OpenAIError(`stream has ended, this shouldn't happen`); + } + const snapshot = __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); + if (!snapshot) { + throw new error_1.OpenAIError(`request ended without sending any chunks`); + } + __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, "f"); + return finalizeChatCompletion(snapshot); + }, _ChatCompletionStream_accumulateChatCompletion = function _ChatCompletionStream_accumulateChatCompletion(chunk) { + var _a, _b, _c; + let snapshot = __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); + const { choices, ...rest } = chunk; + if (!snapshot) { + snapshot = __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, { + ...rest, + choices: [], + }, "f"); + } + else { + Object.assign(snapshot, rest); + } + for (const { delta, finish_reason, index, logprobs = null, ...other } of chunk.choices) { + let choice = snapshot.choices[index]; + if (!choice) { + choice = snapshot.choices[index] = { finish_reason, index, message: {}, logprobs, ...other }; + } + if (logprobs) { + if (!choice.logprobs) { + choice.logprobs = Object.assign({}, logprobs); + } + else { + const { content, ...rest } = logprobs; + Object.assign(choice.logprobs, rest); + if (content) { + (_a = choice.logprobs).content ?? (_a.content = []); + choice.logprobs.content.push(...content); + } + } + } + if (finish_reason) + choice.finish_reason = finish_reason; + Object.assign(choice, other); + if (!delta) + continue; // Shouldn't happen; just in case. + const { content, function_call, role, tool_calls, ...rest } = delta; + Object.assign(choice.message, rest); + if (content) + choice.message.content = (choice.message.content || '') + content; + if (role) + choice.message.role = role; + if (function_call) { + if (!choice.message.function_call) { + choice.message.function_call = function_call; + } + else { + if (function_call.name) + choice.message.function_call.name = function_call.name; + if (function_call.arguments) { + (_b = choice.message.function_call).arguments ?? (_b.arguments = ''); + choice.message.function_call.arguments += function_call.arguments; + } + } + } + if (tool_calls) { + if (!choice.message.tool_calls) + choice.message.tool_calls = []; + for (const { index, id, type, function: fn, ...rest } of tool_calls) { + const tool_call = ((_c = choice.message.tool_calls)[index] ?? (_c[index] = {})); + Object.assign(tool_call, rest); + if (id) + tool_call.id = id; + if (type) + tool_call.type = type; + if (fn) + tool_call.function ?? (tool_call.function = { arguments: '' }); + if (fn?.name) + tool_call.function.name = fn.name; + if (fn?.arguments) + tool_call.function.arguments += fn.arguments; + } + } + } + return snapshot; + }, Symbol.asyncIterator)]() { + const pushQueue = []; + const readQueue = []; + let done = false; + this.on('chunk', (chunk) => { + const reader = readQueue.shift(); + if (reader) { + reader.resolve(chunk); + } + else { + pushQueue.push(chunk); + } + }); + this.on('end', () => { + done = true; + for (const reader of readQueue) { + reader.resolve(undefined); + } + readQueue.length = 0; + }); + this.on('abort', (err) => { + done = true; + for (const reader of readQueue) { + reader.reject(err); + } + readQueue.length = 0; + }); + this.on('error', (err) => { + done = true; + for (const reader of readQueue) { + reader.reject(err); + } + readQueue.length = 0; + }); + return { + next: async () => { + if (!pushQueue.length) { + if (done) { + return { value: undefined, done: true }; + } + return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true })); + } + const chunk = pushQueue.shift(); + return { value: chunk, done: false }; + }, + return: async () => { + this.abort(); + return { value: undefined, done: true }; + }, + }; + } + toReadableStream() { + const stream = new streaming_1.Stream(this[Symbol.asyncIterator].bind(this), this.controller); + return stream.toReadableStream(); + } +} +exports.ChatCompletionStream = ChatCompletionStream; +function finalizeChatCompletion(snapshot) { + const { id, choices, created, model, system_fingerprint, ...rest } = snapshot; + return { + ...rest, + id, + choices: choices.map(({ message, finish_reason, index, logprobs, ...choiceRest }) => { + if (!finish_reason) + throw new error_1.OpenAIError(`missing finish_reason for choice ${index}`); + const { content = null, function_call, tool_calls, ...messageRest } = message; + const role = message.role; // this is what we expect; in theory it could be different which would make our types a slight lie but would be fine. + if (!role) + throw new error_1.OpenAIError(`missing role for choice ${index}`); + if (function_call) { + const { arguments: args, name } = function_call; + if (args == null) + throw new error_1.OpenAIError(`missing function_call.arguments for choice ${index}`); + if (!name) + throw new error_1.OpenAIError(`missing function_call.name for choice ${index}`); + return { + ...choiceRest, + message: { content, function_call: { arguments: args, name }, role }, + finish_reason, + index, + logprobs, + }; + } + if (tool_calls) { + return { + ...choiceRest, + index, + finish_reason, + logprobs, + message: { + ...messageRest, + role, + content, + tool_calls: tool_calls.map((tool_call, i) => { + const { function: fn, type, id, ...toolRest } = tool_call; + const { arguments: args, name, ...fnRest } = fn || {}; + if (id == null) + throw new error_1.OpenAIError(`missing choices[${index}].tool_calls[${i}].id\n${str(snapshot)}`); + if (type == null) + throw new error_1.OpenAIError(`missing choices[${index}].tool_calls[${i}].type\n${str(snapshot)}`); + if (name == null) + throw new error_1.OpenAIError(`missing choices[${index}].tool_calls[${i}].function.name\n${str(snapshot)}`); + if (args == null) + throw new error_1.OpenAIError(`missing choices[${index}].tool_calls[${i}].function.arguments\n${str(snapshot)}`); + return { ...toolRest, id, type, function: { ...fnRest, name, arguments: args } }; + }), + }, + }; + } + return { + ...choiceRest, + message: { ...messageRest, content, role }, + finish_reason, + index, + logprobs, + }; + }), + created, + model, + object: 'chat.completion', + ...(system_fingerprint ? { system_fingerprint } : {}), + }; +} +function str(x) { + return JSON.stringify(x); +} +//# sourceMappingURL=ChatCompletionStream.js.map + +/***/ }), + +/***/ 794: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ChatCompletionStreamingRunner = void 0; +const ChatCompletionStream_1 = __nccwpck_require__(7823); +class ChatCompletionStreamingRunner extends ChatCompletionStream_1.ChatCompletionStream { + static fromReadableStream(stream) { + const runner = new ChatCompletionStreamingRunner(); + runner._run(() => runner._fromReadableStream(stream)); + return runner; + } + /** @deprecated - please use `runTools` instead. */ + static runFunctions(completions, params, options) { + const runner = new ChatCompletionStreamingRunner(); + const opts = { + ...options, + headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runFunctions' }, + }; + runner._run(() => runner._runFunctions(completions, params, opts)); + return runner; + } + static runTools(completions, params, options) { + const runner = new ChatCompletionStreamingRunner(); + const opts = { + ...options, + headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runTools' }, + }; + runner._run(() => runner._runTools(completions, params, opts)); + return runner; + } +} +exports.ChatCompletionStreamingRunner = ChatCompletionStreamingRunner; +//# sourceMappingURL=ChatCompletionStreamingRunner.js.map + +/***/ }), + +/***/ 5464: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ParsingToolFunction = exports.ParsingFunction = exports.isRunnableFunctionWithParse = void 0; +function isRunnableFunctionWithParse(fn) { + return typeof fn.parse === 'function'; +} +exports.isRunnableFunctionWithParse = isRunnableFunctionWithParse; +/** + * This is helper class for passing a `function` and `parse` where the `function` + * argument type matches the `parse` return type. + * + * @deprecated - please use ParsingToolFunction instead. + */ +class ParsingFunction { + constructor(input) { + this.function = input.function; + this.parse = input.parse; + this.parameters = input.parameters; + this.description = input.description; + this.name = input.name; + } +} +exports.ParsingFunction = ParsingFunction; +/** + * This is helper class for passing a `function` and `parse` where the `function` + * argument type matches the `parse` return type. + */ +class ParsingToolFunction { + constructor(input) { + this.type = 'function'; + this.function = input; + } +} +exports.ParsingToolFunction = ParsingToolFunction; +//# sourceMappingURL=RunnableFunction.js.map + +/***/ }), + +/***/ 2626: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.allSettledWithThrow = void 0; +/** + * Like `Promise.allSettled()` but throws an error if any promises are rejected. + */ +const allSettledWithThrow = async (promises) => { + const results = await Promise.allSettled(promises); + const rejected = results.filter((result) => result.status === 'rejected'); + if (rejected.length) { + for (const result of rejected) { + console.error(result.reason); + } + throw new Error(`${rejected.length} promise(s) failed - see the above errors`); + } + // Note: TS was complaining about using `.filter().map()` here for some reason + const values = []; + for (const result of results) { + if (result.status === 'fulfilled') { + values.push(result.value); + } + } + return values; +}; +exports.allSettledWithThrow = allSettledWithThrow; +//# sourceMappingURL=Util.js.map + +/***/ }), + +/***/ 7858: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isPresent = exports.isToolMessage = exports.isFunctionMessage = exports.isAssistantMessage = void 0; +const isAssistantMessage = (message) => { + return message?.role === 'assistant'; +}; +exports.isAssistantMessage = isAssistantMessage; +const isFunctionMessage = (message) => { + return message?.role === 'function'; +}; +exports.isFunctionMessage = isFunctionMessage; +const isToolMessage = (message) => { + return message?.role === 'tool'; +}; +exports.isToolMessage = isToolMessage; +function isPresent(obj) { + return obj != null; +} +exports.isPresent = isPresent; +//# sourceMappingURL=chatCompletionUtils.js.map + +/***/ }), + +/***/ 7401: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CursorPage = exports.Page = void 0; +const core_1 = __nccwpck_require__(1798); +/** + * Note: no pagination actually occurs yet, this is for forwards-compatibility. + */ +class Page extends core_1.AbstractPage { + constructor(client, response, body, options) { + super(client, response, body, options); + this.data = body.data || []; + this.object = body.object; + } + getPaginatedItems() { + return this.data ?? []; + } + // @deprecated Please use `nextPageInfo()` instead + /** + * This page represents a response that isn't actually paginated at the API level + * so there will never be any next page params. + */ + nextPageParams() { + return null; + } + nextPageInfo() { + return null; + } +} +exports.Page = Page; +class CursorPage extends core_1.AbstractPage { + constructor(client, response, body, options) { + super(client, response, body, options); + this.data = body.data || []; + } + getPaginatedItems() { + return this.data ?? []; + } + // @deprecated Please use `nextPageInfo()` instead + nextPageParams() { + const info = this.nextPageInfo(); + if (!info) + return null; + if ('params' in info) + return info.params; + const params = Object.fromEntries(info.url.searchParams); + if (!Object.keys(params).length) + return null; + return params; + } + nextPageInfo() { + const data = this.getPaginatedItems(); + if (!data.length) { + return null; + } + const id = data[data.length - 1]?.id; + if (!id) { + return null; + } + return { params: { after: id } }; + } +} +exports.CursorPage = CursorPage; +//# sourceMappingURL=pagination.js.map + +/***/ }), + +/***/ 9593: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.APIResource = void 0; +class APIResource { + constructor(client) { + this._client = client; + } +} +exports.APIResource = APIResource; +//# sourceMappingURL=resource.js.map + +/***/ }), + +/***/ 6376: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Audio = void 0; +const resource_1 = __nccwpck_require__(9593); +const SpeechAPI = __importStar(__nccwpck_require__(4117)); +const TranscriptionsAPI = __importStar(__nccwpck_require__(5622)); +const TranslationsAPI = __importStar(__nccwpck_require__(7735)); +class Audio extends resource_1.APIResource { + constructor() { + super(...arguments); + this.transcriptions = new TranscriptionsAPI.Transcriptions(this._client); + this.translations = new TranslationsAPI.Translations(this._client); + this.speech = new SpeechAPI.Speech(this._client); + } +} +exports.Audio = Audio; +(function (Audio) { + Audio.Transcriptions = TranscriptionsAPI.Transcriptions; + Audio.Translations = TranslationsAPI.Translations; + Audio.Speech = SpeechAPI.Speech; +})(Audio = exports.Audio || (exports.Audio = {})); +//# sourceMappingURL=audio.js.map + +/***/ }), + +/***/ 4117: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Speech = void 0; +const resource_1 = __nccwpck_require__(9593); +class Speech extends resource_1.APIResource { + /** + * Generates audio from the input text. + */ + create(body, options) { + return this._client.post('/audio/speech', { body, ...options, __binaryResponse: true }); + } +} +exports.Speech = Speech; +(function (Speech) { +})(Speech = exports.Speech || (exports.Speech = {})); +//# sourceMappingURL=speech.js.map + +/***/ }), + +/***/ 5622: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Transcriptions = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +class Transcriptions extends resource_1.APIResource { + /** + * Transcribes audio into the input language. + */ + create(body, options) { + return this._client.post('/audio/transcriptions', (0, core_1.multipartFormRequestOptions)({ body, ...options })); + } +} +exports.Transcriptions = Transcriptions; +(function (Transcriptions) { +})(Transcriptions = exports.Transcriptions || (exports.Transcriptions = {})); +//# sourceMappingURL=transcriptions.js.map + +/***/ }), + +/***/ 7735: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Translations = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +class Translations extends resource_1.APIResource { + /** + * Translates audio into English. + */ + create(body, options) { + return this._client.post('/audio/translations', (0, core_1.multipartFormRequestOptions)({ body, ...options })); + } +} +exports.Translations = Translations; +(function (Translations) { +})(Translations = exports.Translations || (exports.Translations = {})); +//# sourceMappingURL=translations.js.map + +/***/ }), + +/***/ 341: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BatchesPage = exports.Batches = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const BatchesAPI = __importStar(__nccwpck_require__(341)); +const pagination_1 = __nccwpck_require__(7401); +class Batches extends resource_1.APIResource { + /** + * Creates and executes a batch from an uploaded file of requests + */ + create(body, options) { + return this._client.post('/batches', { body, ...options }); + } + /** + * Retrieves a batch. + */ + retrieve(batchId, options) { + return this._client.get(`/batches/${batchId}`, options); + } + list(query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list({}, query); + } + return this._client.getAPIList('/batches', BatchesPage, { query, ...options }); + } + /** + * Cancels an in-progress batch. + */ + cancel(batchId, options) { + return this._client.post(`/batches/${batchId}/cancel`, options); + } +} +exports.Batches = Batches; +class BatchesPage extends pagination_1.CursorPage { +} +exports.BatchesPage = BatchesPage; +(function (Batches) { + Batches.BatchesPage = BatchesAPI.BatchesPage; +})(Batches = exports.Batches || (exports.Batches = {})); +//# sourceMappingURL=batches.js.map + +/***/ }), + +/***/ 616: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AssistantsPage = exports.Assistants = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const AssistantsAPI = __importStar(__nccwpck_require__(616)); +const pagination_1 = __nccwpck_require__(7401); +class Assistants extends resource_1.APIResource { + /** + * Create an assistant with a model and instructions. + */ + create(body, options) { + return this._client.post('/assistants', { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Retrieves an assistant. + */ + retrieve(assistantId, options) { + return this._client.get(`/assistants/${assistantId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Modifies an assistant. + */ + update(assistantId, body, options) { + return this._client.post(`/assistants/${assistantId}`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + list(query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list({}, query); + } + return this._client.getAPIList('/assistants', AssistantsPage, { + query, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Delete an assistant. + */ + del(assistantId, options) { + return this._client.delete(`/assistants/${assistantId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } +} +exports.Assistants = Assistants; +class AssistantsPage extends pagination_1.CursorPage { +} +exports.AssistantsPage = AssistantsPage; +(function (Assistants) { + Assistants.AssistantsPage = AssistantsAPI.AssistantsPage; +})(Assistants = exports.Assistants || (exports.Assistants = {})); +//# sourceMappingURL=assistants.js.map + +/***/ }), + +/***/ 853: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Beta = void 0; +const resource_1 = __nccwpck_require__(9593); +const AssistantsAPI = __importStar(__nccwpck_require__(616)); +const ChatAPI = __importStar(__nccwpck_require__(8691)); +const ThreadsAPI = __importStar(__nccwpck_require__(1931)); +const VectorStoresAPI = __importStar(__nccwpck_require__(5822)); +class Beta extends resource_1.APIResource { + constructor() { + super(...arguments); + this.vectorStores = new VectorStoresAPI.VectorStores(this._client); + this.chat = new ChatAPI.Chat(this._client); + this.assistants = new AssistantsAPI.Assistants(this._client); + this.threads = new ThreadsAPI.Threads(this._client); + } +} +exports.Beta = Beta; +(function (Beta) { + Beta.VectorStores = VectorStoresAPI.VectorStores; + Beta.VectorStoresPage = VectorStoresAPI.VectorStoresPage; + Beta.Chat = ChatAPI.Chat; + Beta.Assistants = AssistantsAPI.Assistants; + Beta.AssistantsPage = AssistantsAPI.AssistantsPage; + Beta.Threads = ThreadsAPI.Threads; +})(Beta = exports.Beta || (exports.Beta = {})); +//# sourceMappingURL=beta.js.map + +/***/ }), + +/***/ 8691: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Chat = void 0; +const resource_1 = __nccwpck_require__(9593); +const CompletionsAPI = __importStar(__nccwpck_require__(559)); +class Chat extends resource_1.APIResource { + constructor() { + super(...arguments); + this.completions = new CompletionsAPI.Completions(this._client); + } +} +exports.Chat = Chat; +(function (Chat) { + Chat.Completions = CompletionsAPI.Completions; +})(Chat = exports.Chat || (exports.Chat = {})); +//# sourceMappingURL=chat.js.map + +/***/ }), + +/***/ 559: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Completions = exports.ChatCompletionStream = exports.ParsingToolFunction = exports.ParsingFunction = exports.ChatCompletionStreamingRunner = exports.ChatCompletionRunner = void 0; +const resource_1 = __nccwpck_require__(9593); +const ChatCompletionRunner_1 = __nccwpck_require__(5575); +var ChatCompletionRunner_2 = __nccwpck_require__(5575); +Object.defineProperty(exports, "ChatCompletionRunner", ({ enumerable: true, get: function () { return ChatCompletionRunner_2.ChatCompletionRunner; } })); +const ChatCompletionStreamingRunner_1 = __nccwpck_require__(794); +var ChatCompletionStreamingRunner_2 = __nccwpck_require__(794); +Object.defineProperty(exports, "ChatCompletionStreamingRunner", ({ enumerable: true, get: function () { return ChatCompletionStreamingRunner_2.ChatCompletionStreamingRunner; } })); +var RunnableFunction_1 = __nccwpck_require__(5464); +Object.defineProperty(exports, "ParsingFunction", ({ enumerable: true, get: function () { return RunnableFunction_1.ParsingFunction; } })); +Object.defineProperty(exports, "ParsingToolFunction", ({ enumerable: true, get: function () { return RunnableFunction_1.ParsingToolFunction; } })); +const ChatCompletionStream_1 = __nccwpck_require__(7823); +var ChatCompletionStream_2 = __nccwpck_require__(7823); +Object.defineProperty(exports, "ChatCompletionStream", ({ enumerable: true, get: function () { return ChatCompletionStream_2.ChatCompletionStream; } })); +class Completions extends resource_1.APIResource { + runFunctions(body, options) { + if (body.stream) { + return ChatCompletionStreamingRunner_1.ChatCompletionStreamingRunner.runFunctions(this._client.chat.completions, body, options); + } + return ChatCompletionRunner_1.ChatCompletionRunner.runFunctions(this._client.chat.completions, body, options); + } + runTools(body, options) { + if (body.stream) { + return ChatCompletionStreamingRunner_1.ChatCompletionStreamingRunner.runTools(this._client.chat.completions, body, options); + } + return ChatCompletionRunner_1.ChatCompletionRunner.runTools(this._client.chat.completions, body, options); + } + /** + * Creates a chat completion stream + */ + stream(body, options) { + return ChatCompletionStream_1.ChatCompletionStream.createChatCompletion(this._client.chat.completions, body, options); + } +} +exports.Completions = Completions; +//# sourceMappingURL=completions.js.map + +/***/ }), + +/***/ 1787: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.MessagesPage = exports.Messages = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const MessagesAPI = __importStar(__nccwpck_require__(1787)); +const pagination_1 = __nccwpck_require__(7401); +class Messages extends resource_1.APIResource { + /** + * Create a message. + */ + create(threadId, body, options) { + return this._client.post(`/threads/${threadId}/messages`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Retrieve a message. + */ + retrieve(threadId, messageId, options) { + return this._client.get(`/threads/${threadId}/messages/${messageId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Modifies a message. + */ + update(threadId, messageId, body, options) { + return this._client.post(`/threads/${threadId}/messages/${messageId}`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + list(threadId, query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list(threadId, {}, query); + } + return this._client.getAPIList(`/threads/${threadId}/messages`, MessagesPage, { + query, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } +} +exports.Messages = Messages; +class MessagesPage extends pagination_1.CursorPage { +} +exports.MessagesPage = MessagesPage; +(function (Messages) { + Messages.MessagesPage = MessagesAPI.MessagesPage; +})(Messages = exports.Messages || (exports.Messages = {})); +//# sourceMappingURL=messages.js.map + +/***/ }), + +/***/ 3187: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RunsPage = exports.Runs = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const AssistantStream_1 = __nccwpck_require__(7514); +const core_2 = __nccwpck_require__(1798); +const RunsAPI = __importStar(__nccwpck_require__(3187)); +const StepsAPI = __importStar(__nccwpck_require__(2630)); +const pagination_1 = __nccwpck_require__(7401); +class Runs extends resource_1.APIResource { + constructor() { + super(...arguments); + this.steps = new StepsAPI.Steps(this._client); + } + create(threadId, body, options) { + return this._client.post(`/threads/${threadId}/runs`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + stream: body.stream ?? false, + }); + } + /** + * Retrieves a run. + */ + retrieve(threadId, runId, options) { + return this._client.get(`/threads/${threadId}/runs/${runId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Modifies a run. + */ + update(threadId, runId, body, options) { + return this._client.post(`/threads/${threadId}/runs/${runId}`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + list(threadId, query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list(threadId, {}, query); + } + return this._client.getAPIList(`/threads/${threadId}/runs`, RunsPage, { + query, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Cancels a run that is `in_progress`. + */ + cancel(threadId, runId, options) { + return this._client.post(`/threads/${threadId}/runs/${runId}/cancel`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * A helper to create a run an poll for a terminal state. More information on Run + * lifecycles can be found here: + * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps + */ + async createAndPoll(threadId, body, options) { + const run = await this.create(threadId, body, options); + return await this.poll(threadId, run.id, options); + } + /** + * Create a Run stream + * + * @deprecated use `stream` instead + */ + createAndStream(threadId, body, options) { + return AssistantStream_1.AssistantStream.createAssistantStream(threadId, this._client.beta.threads.runs, body, options); + } + /** + * A helper to poll a run status until it reaches a terminal state. More + * information on Run lifecycles can be found here: + * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps + */ + async poll(threadId, runId, options) { + const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' }; + if (options?.pollIntervalMs) { + headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString(); + } + while (true) { + const { data: run, response } = await this.retrieve(threadId, runId, { + ...options, + headers: { ...options?.headers, ...headers }, + }).withResponse(); + switch (run.status) { + //If we are in any sort of intermediate state we poll + case 'queued': + case 'in_progress': + case 'cancelling': + let sleepInterval = 5000; + if (options?.pollIntervalMs) { + sleepInterval = options.pollIntervalMs; + } + else { + const headerInterval = response.headers.get('openai-poll-after-ms'); + if (headerInterval) { + const headerIntervalMs = parseInt(headerInterval); + if (!isNaN(headerIntervalMs)) { + sleepInterval = headerIntervalMs; + } + } + } + await (0, core_2.sleep)(sleepInterval); + break; + //We return the run in any terminal state. + case 'requires_action': + case 'cancelled': + case 'completed': + case 'failed': + case 'expired': + return run; + } + } + } + /** + * Create a Run stream + */ + stream(threadId, body, options) { + return AssistantStream_1.AssistantStream.createAssistantStream(threadId, this._client.beta.threads.runs, body, options); + } + submitToolOutputs(threadId, runId, body, options) { + return this._client.post(`/threads/${threadId}/runs/${runId}/submit_tool_outputs`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + stream: body.stream ?? false, + }); + } + /** + * A helper to submit a tool output to a run and poll for a terminal run state. + * More information on Run lifecycles can be found here: + * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps + */ + async submitToolOutputsAndPoll(threadId, runId, body, options) { + const run = await this.submitToolOutputs(threadId, runId, body, options); + return await this.poll(threadId, run.id, options); + } + /** + * Submit the tool outputs from a previous run and stream the run to a terminal + * state. More information on Run lifecycles can be found here: + * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps + */ + submitToolOutputsStream(threadId, runId, body, options) { + return AssistantStream_1.AssistantStream.createToolAssistantStream(threadId, runId, this._client.beta.threads.runs, body, options); + } +} +exports.Runs = Runs; +class RunsPage extends pagination_1.CursorPage { +} +exports.RunsPage = RunsPage; +(function (Runs) { + Runs.RunsPage = RunsAPI.RunsPage; + Runs.Steps = StepsAPI.Steps; + Runs.RunStepsPage = StepsAPI.RunStepsPage; +})(Runs = exports.Runs || (exports.Runs = {})); +//# sourceMappingURL=runs.js.map + +/***/ }), + +/***/ 2630: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RunStepsPage = exports.Steps = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const StepsAPI = __importStar(__nccwpck_require__(2630)); +const pagination_1 = __nccwpck_require__(7401); +class Steps extends resource_1.APIResource { + /** + * Retrieves a run step. + */ + retrieve(threadId, runId, stepId, options) { + return this._client.get(`/threads/${threadId}/runs/${runId}/steps/${stepId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + list(threadId, runId, query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list(threadId, runId, {}, query); + } + return this._client.getAPIList(`/threads/${threadId}/runs/${runId}/steps`, RunStepsPage, { + query, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } +} +exports.Steps = Steps; +class RunStepsPage extends pagination_1.CursorPage { +} +exports.RunStepsPage = RunStepsPage; +(function (Steps) { + Steps.RunStepsPage = StepsAPI.RunStepsPage; +})(Steps = exports.Steps || (exports.Steps = {})); +//# sourceMappingURL=steps.js.map + +/***/ }), + +/***/ 1931: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Threads = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const AssistantStream_1 = __nccwpck_require__(7514); +const MessagesAPI = __importStar(__nccwpck_require__(1787)); +const RunsAPI = __importStar(__nccwpck_require__(3187)); +class Threads extends resource_1.APIResource { + constructor() { + super(...arguments); + this.runs = new RunsAPI.Runs(this._client); + this.messages = new MessagesAPI.Messages(this._client); + } + create(body = {}, options) { + if ((0, core_1.isRequestOptions)(body)) { + return this.create({}, body); + } + return this._client.post('/threads', { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Retrieves a thread. + */ + retrieve(threadId, options) { + return this._client.get(`/threads/${threadId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Modifies a thread. + */ + update(threadId, body, options) { + return this._client.post(`/threads/${threadId}`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Delete a thread. + */ + del(threadId, options) { + return this._client.delete(`/threads/${threadId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + createAndRun(body, options) { + return this._client.post('/threads/runs', { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + stream: body.stream ?? false, + }); + } + /** + * A helper to create a thread, start a run and then poll for a terminal state. + * More information on Run lifecycles can be found here: + * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps + */ + async createAndRunPoll(body, options) { + const run = await this.createAndRun(body, options); + return await this.runs.poll(run.thread_id, run.id, options); + } + /** + * Create a thread and stream the run back + */ + createAndRunStream(body, options) { + return AssistantStream_1.AssistantStream.createThreadAssistantStream(body, this._client.beta.threads, options); + } +} +exports.Threads = Threads; +(function (Threads) { + Threads.Runs = RunsAPI.Runs; + Threads.RunsPage = RunsAPI.RunsPage; + Threads.Messages = MessagesAPI.Messages; + Threads.MessagesPage = MessagesAPI.MessagesPage; +})(Threads = exports.Threads || (exports.Threads = {})); +//# sourceMappingURL=threads.js.map + +/***/ }), + +/***/ 3922: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VectorStoreFilesPage = exports.FileBatches = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const core_2 = __nccwpck_require__(1798); +const Util_1 = __nccwpck_require__(2626); +const files_1 = __nccwpck_require__(9180); +Object.defineProperty(exports, "VectorStoreFilesPage", ({ enumerable: true, get: function () { return files_1.VectorStoreFilesPage; } })); +class FileBatches extends resource_1.APIResource { + /** + * Create a vector store file batch. + */ + create(vectorStoreId, body, options) { + return this._client.post(`/vector_stores/${vectorStoreId}/file_batches`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Retrieves a vector store file batch. + */ + retrieve(vectorStoreId, batchId, options) { + return this._client.get(`/vector_stores/${vectorStoreId}/file_batches/${batchId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Cancel a vector store file batch. This attempts to cancel the processing of + * files in this batch as soon as possible. + */ + cancel(vectorStoreId, batchId, options) { + return this._client.post(`/vector_stores/${vectorStoreId}/file_batches/${batchId}/cancel`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Create a vector store batch and poll until all files have been processed. + */ + async createAndPoll(vectorStoreId, body, options) { + const batch = await this.create(vectorStoreId, body); + return await this.poll(vectorStoreId, batch.id, options); + } + listFiles(vectorStoreId, batchId, query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.listFiles(vectorStoreId, batchId, {}, query); + } + return this._client.getAPIList(`/vector_stores/${vectorStoreId}/file_batches/${batchId}/files`, files_1.VectorStoreFilesPage, { query, ...options, headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers } }); + } + /** + * Wait for the given file batch to be processed. + * + * Note: this will return even if one of the files failed to process, you need to + * check batch.file_counts.failed_count to handle this case. + */ + async poll(vectorStoreId, batchId, options) { + const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' }; + if (options?.pollIntervalMs) { + headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString(); + } + while (true) { + const { data: batch, response } = await this.retrieve(vectorStoreId, batchId, { + ...options, + headers, + }).withResponse(); + switch (batch.status) { + case 'in_progress': + let sleepInterval = 5000; + if (options?.pollIntervalMs) { + sleepInterval = options.pollIntervalMs; + } + else { + const headerInterval = response.headers.get('openai-poll-after-ms'); + if (headerInterval) { + const headerIntervalMs = parseInt(headerInterval); + if (!isNaN(headerIntervalMs)) { + sleepInterval = headerIntervalMs; + } + } + } + await (0, core_2.sleep)(sleepInterval); + break; + case 'failed': + case 'completed': + return batch; + } + } + } + /** + * Uploads the given files concurrently and then creates a vector store file batch. + * + * The concurrency limit is configurable using the `maxConcurrency` parameter. + */ + async uploadAndPoll(vectorStoreId, { files, fileIds = [] }, options) { + if (files === null || files.length == 0) { + throw new Error('No files provided to process.'); + } + const configuredConcurrency = options?.maxConcurrency ?? 5; + //We cap the number of workers at the number of files (so we don't start any unnecessary workers) + const concurrencyLimit = Math.min(configuredConcurrency, files.length); + const client = this._client; + const fileIterator = files.values(); + const allFileIds = [...fileIds]; + //This code is based on this design. The libraries don't accommodate our environment limits. + // https://stackoverflow.com/questions/40639432/what-is-the-best-way-to-limit-concurrency-when-using-es6s-promise-all + async function processFiles(iterator) { + for (let item of iterator) { + const fileObj = await client.files.create({ file: item, purpose: 'assistants' }, options); + allFileIds.push(fileObj.id); + } + } + //Start workers to process results + const workers = Array(concurrencyLimit).fill(fileIterator).map(processFiles); + //Wait for all processing to complete. + await (0, Util_1.allSettledWithThrow)(workers); + return await this.createAndPoll(vectorStoreId, { + file_ids: allFileIds, + }); + } +} +exports.FileBatches = FileBatches; +(function (FileBatches) { +})(FileBatches = exports.FileBatches || (exports.FileBatches = {})); +//# sourceMappingURL=file-batches.js.map + +/***/ }), + +/***/ 9180: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VectorStoreFilesPage = exports.Files = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const core_2 = __nccwpck_require__(1798); +const FilesAPI = __importStar(__nccwpck_require__(9180)); +const pagination_1 = __nccwpck_require__(7401); +class Files extends resource_1.APIResource { + /** + * Create a vector store file by attaching a + * [File](https://platform.openai.com/docs/api-reference/files) to a + * [vector store](https://platform.openai.com/docs/api-reference/vector-stores/object). + */ + create(vectorStoreId, body, options) { + return this._client.post(`/vector_stores/${vectorStoreId}/files`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Retrieves a vector store file. + */ + retrieve(vectorStoreId, fileId, options) { + return this._client.get(`/vector_stores/${vectorStoreId}/files/${fileId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + list(vectorStoreId, query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list(vectorStoreId, {}, query); + } + return this._client.getAPIList(`/vector_stores/${vectorStoreId}/files`, VectorStoreFilesPage, { + query, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Delete a vector store file. This will remove the file from the vector store but + * the file itself will not be deleted. To delete the file, use the + * [delete file](https://platform.openai.com/docs/api-reference/files/delete) + * endpoint. + */ + del(vectorStoreId, fileId, options) { + return this._client.delete(`/vector_stores/${vectorStoreId}/files/${fileId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Attach a file to the given vector store and wait for it to be processed. + */ + async createAndPoll(vectorStoreId, body, options) { + const file = await this.create(vectorStoreId, body, options); + return await this.poll(vectorStoreId, file.id, options); + } + /** + * Wait for the vector store file to finish processing. + * + * Note: this will return even if the file failed to process, you need to check + * file.last_error and file.status to handle these cases + */ + async poll(vectorStoreId, fileId, options) { + const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' }; + if (options?.pollIntervalMs) { + headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString(); + } + while (true) { + const fileResponse = await this.retrieve(vectorStoreId, fileId, { + ...options, + headers, + }).withResponse(); + const file = fileResponse.data; + switch (file.status) { + case 'in_progress': + let sleepInterval = 5000; + if (options?.pollIntervalMs) { + sleepInterval = options.pollIntervalMs; + } + else { + const headerInterval = fileResponse.response.headers.get('openai-poll-after-ms'); + if (headerInterval) { + const headerIntervalMs = parseInt(headerInterval); + if (!isNaN(headerIntervalMs)) { + sleepInterval = headerIntervalMs; + } + } + } + await (0, core_2.sleep)(sleepInterval); + break; + case 'failed': + case 'completed': + return file; + } + } + } + /** + * Upload a file to the `files` API and then attach it to the given vector store. + * Note the file will be asynchronously processed (you can use the alternative + * polling helper method to wait for processing to complete). + */ + async upload(vectorStoreId, file, options) { + const fileInfo = await this._client.files.create({ file: file, purpose: 'assistants' }, options); + return this.create(vectorStoreId, { file_id: fileInfo.id }, options); + } + /** + * Add a file to a vector store and poll until processing is complete. + */ + async uploadAndPoll(vectorStoreId, file, options) { + const fileInfo = await this._client.files.create({ file: file, purpose: 'assistants' }, options); + return await this.poll(vectorStoreId, fileInfo.id, options); + } +} +exports.Files = Files; +class VectorStoreFilesPage extends pagination_1.CursorPage { +} +exports.VectorStoreFilesPage = VectorStoreFilesPage; +(function (Files) { + Files.VectorStoreFilesPage = FilesAPI.VectorStoreFilesPage; +})(Files = exports.Files || (exports.Files = {})); +//# sourceMappingURL=files.js.map + +/***/ }), + +/***/ 5822: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VectorStoresPage = exports.VectorStores = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const VectorStoresAPI = __importStar(__nccwpck_require__(5822)); +const FileBatchesAPI = __importStar(__nccwpck_require__(3922)); +const FilesAPI = __importStar(__nccwpck_require__(9180)); +const pagination_1 = __nccwpck_require__(7401); +class VectorStores extends resource_1.APIResource { + constructor() { + super(...arguments); + this.files = new FilesAPI.Files(this._client); + this.fileBatches = new FileBatchesAPI.FileBatches(this._client); + } + /** + * Create a vector store. + */ + create(body, options) { + return this._client.post('/vector_stores', { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Retrieves a vector store. + */ + retrieve(vectorStoreId, options) { + return this._client.get(`/vector_stores/${vectorStoreId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Modifies a vector store. + */ + update(vectorStoreId, body, options) { + return this._client.post(`/vector_stores/${vectorStoreId}`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + list(query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list({}, query); + } + return this._client.getAPIList('/vector_stores', VectorStoresPage, { + query, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Delete a vector store. + */ + del(vectorStoreId, options) { + return this._client.delete(`/vector_stores/${vectorStoreId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } +} +exports.VectorStores = VectorStores; +class VectorStoresPage extends pagination_1.CursorPage { +} +exports.VectorStoresPage = VectorStoresPage; +(function (VectorStores) { + VectorStores.VectorStoresPage = VectorStoresAPI.VectorStoresPage; + VectorStores.Files = FilesAPI.Files; + VectorStores.VectorStoreFilesPage = FilesAPI.VectorStoreFilesPage; + VectorStores.FileBatches = FileBatchesAPI.FileBatches; +})(VectorStores = exports.VectorStores || (exports.VectorStores = {})); +//# sourceMappingURL=vector-stores.js.map + +/***/ }), + +/***/ 7670: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Chat = void 0; +const resource_1 = __nccwpck_require__(9593); +const CompletionsAPI = __importStar(__nccwpck_require__(2875)); +class Chat extends resource_1.APIResource { + constructor() { + super(...arguments); + this.completions = new CompletionsAPI.Completions(this._client); + } +} +exports.Chat = Chat; +(function (Chat) { + Chat.Completions = CompletionsAPI.Completions; +})(Chat = exports.Chat || (exports.Chat = {})); +//# sourceMappingURL=chat.js.map + +/***/ }), + +/***/ 2875: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Completions = void 0; +const resource_1 = __nccwpck_require__(9593); +class Completions extends resource_1.APIResource { + create(body, options) { + return this._client.post('/chat/completions', { body, ...options, stream: body.stream ?? false }); + } +} +exports.Completions = Completions; +(function (Completions) { +})(Completions = exports.Completions || (exports.Completions = {})); +//# sourceMappingURL=completions.js.map + +/***/ }), + +/***/ 8240: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Chat = exports.Completions = void 0; +var completions_1 = __nccwpck_require__(2875); +Object.defineProperty(exports, "Completions", ({ enumerable: true, get: function () { return completions_1.Completions; } })); +var chat_1 = __nccwpck_require__(7670); +Object.defineProperty(exports, "Chat", ({ enumerable: true, get: function () { return chat_1.Chat; } })); +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ 9327: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Completions = void 0; +const resource_1 = __nccwpck_require__(9593); +class Completions extends resource_1.APIResource { + create(body, options) { + return this._client.post('/completions', { body, ...options, stream: body.stream ?? false }); + } +} +exports.Completions = Completions; +(function (Completions) { +})(Completions = exports.Completions || (exports.Completions = {})); +//# sourceMappingURL=completions.js.map + +/***/ }), + +/***/ 8064: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Embeddings = void 0; +const resource_1 = __nccwpck_require__(9593); +class Embeddings extends resource_1.APIResource { + /** + * Creates an embedding vector representing the input text. + */ + create(body, options) { + return this._client.post('/embeddings', { body, ...options }); + } +} +exports.Embeddings = Embeddings; +(function (Embeddings) { +})(Embeddings = exports.Embeddings || (exports.Embeddings = {})); +//# sourceMappingURL=embeddings.js.map + +/***/ }), + +/***/ 3873: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FileObjectsPage = exports.Files = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const core_2 = __nccwpck_require__(1798); +const error_1 = __nccwpck_require__(8905); +const FilesAPI = __importStar(__nccwpck_require__(3873)); +const core_3 = __nccwpck_require__(1798); +const pagination_1 = __nccwpck_require__(7401); +class Files extends resource_1.APIResource { + /** + * Upload a file that can be used across various endpoints. The size of all the + * files uploaded by one organization can be up to 100 GB. + * + * The size of individual files can be a maximum of 512 MB or 2 million tokens for + * Assistants. See the + * [Assistants Tools guide](https://platform.openai.com/docs/assistants/tools) to + * learn more about the types of files supported. The Fine-tuning API only supports + * `.jsonl` files. + * + * Please [contact us](https://help.openai.com/) if you need to increase these + * storage limits. + */ + create(body, options) { + return this._client.post('/files', (0, core_3.multipartFormRequestOptions)({ body, ...options })); + } + /** + * Returns information about a specific file. + */ + retrieve(fileId, options) { + return this._client.get(`/files/${fileId}`, options); + } + list(query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list({}, query); + } + return this._client.getAPIList('/files', FileObjectsPage, { query, ...options }); + } + /** + * Delete a file. + */ + del(fileId, options) { + return this._client.delete(`/files/${fileId}`, options); + } + /** + * Returns the contents of the specified file. + */ + content(fileId, options) { + return this._client.get(`/files/${fileId}/content`, { ...options, __binaryResponse: true }); + } + /** + * Returns the contents of the specified file. + * + * @deprecated The `.content()` method should be used instead + */ + retrieveContent(fileId, options) { + return this._client.get(`/files/${fileId}/content`, { + ...options, + headers: { Accept: 'application/json', ...options?.headers }, + }); + } + /** + * Waits for the given file to be processed, default timeout is 30 mins. + */ + async waitForProcessing(id, { pollInterval = 5000, maxWait = 30 * 60 * 1000 } = {}) { + const TERMINAL_STATES = new Set(['processed', 'error', 'deleted']); + const start = Date.now(); + let file = await this.retrieve(id); + while (!file.status || !TERMINAL_STATES.has(file.status)) { + await (0, core_2.sleep)(pollInterval); + file = await this.retrieve(id); + if (Date.now() - start > maxWait) { + throw new error_1.APIConnectionTimeoutError({ + message: `Giving up on waiting for file ${id} to finish processing after ${maxWait} milliseconds.`, + }); + } + } + return file; + } +} +exports.Files = Files; +/** + * Note: no pagination actually occurs yet, this is for forwards-compatibility. + */ +class FileObjectsPage extends pagination_1.Page { +} +exports.FileObjectsPage = FileObjectsPage; +(function (Files) { + Files.FileObjectsPage = FilesAPI.FileObjectsPage; +})(Files = exports.Files || (exports.Files = {})); +//# sourceMappingURL=files.js.map + +/***/ }), + +/***/ 1364: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FineTuning = void 0; +const resource_1 = __nccwpck_require__(9593); +const JobsAPI = __importStar(__nccwpck_require__(816)); +class FineTuning extends resource_1.APIResource { + constructor() { + super(...arguments); + this.jobs = new JobsAPI.Jobs(this._client); + } +} +exports.FineTuning = FineTuning; +(function (FineTuning) { + FineTuning.Jobs = JobsAPI.Jobs; + FineTuning.FineTuningJobsPage = JobsAPI.FineTuningJobsPage; + FineTuning.FineTuningJobEventsPage = JobsAPI.FineTuningJobEventsPage; +})(FineTuning = exports.FineTuning || (exports.FineTuning = {})); +//# sourceMappingURL=fine-tuning.js.map + +/***/ }), + +/***/ 3104: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FineTuningJobCheckpointsPage = exports.Checkpoints = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const CheckpointsAPI = __importStar(__nccwpck_require__(3104)); +const pagination_1 = __nccwpck_require__(7401); +class Checkpoints extends resource_1.APIResource { + list(fineTuningJobId, query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list(fineTuningJobId, {}, query); + } + return this._client.getAPIList(`/fine_tuning/jobs/${fineTuningJobId}/checkpoints`, FineTuningJobCheckpointsPage, { query, ...options }); + } +} +exports.Checkpoints = Checkpoints; +class FineTuningJobCheckpointsPage extends pagination_1.CursorPage { +} +exports.FineTuningJobCheckpointsPage = FineTuningJobCheckpointsPage; +(function (Checkpoints) { + Checkpoints.FineTuningJobCheckpointsPage = CheckpointsAPI.FineTuningJobCheckpointsPage; +})(Checkpoints = exports.Checkpoints || (exports.Checkpoints = {})); +//# sourceMappingURL=checkpoints.js.map + +/***/ }), + +/***/ 816: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FineTuningJobEventsPage = exports.FineTuningJobsPage = exports.Jobs = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const JobsAPI = __importStar(__nccwpck_require__(816)); +const CheckpointsAPI = __importStar(__nccwpck_require__(3104)); +const pagination_1 = __nccwpck_require__(7401); +class Jobs extends resource_1.APIResource { + constructor() { + super(...arguments); + this.checkpoints = new CheckpointsAPI.Checkpoints(this._client); + } + /** + * Creates a fine-tuning job which begins the process of creating a new model from + * a given dataset. + * + * Response includes details of the enqueued job including job status and the name + * of the fine-tuned models once complete. + * + * [Learn more about fine-tuning](https://platform.openai.com/docs/guides/fine-tuning) + */ + create(body, options) { + return this._client.post('/fine_tuning/jobs', { body, ...options }); + } + /** + * Get info about a fine-tuning job. + * + * [Learn more about fine-tuning](https://platform.openai.com/docs/guides/fine-tuning) + */ + retrieve(fineTuningJobId, options) { + return this._client.get(`/fine_tuning/jobs/${fineTuningJobId}`, options); + } + list(query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list({}, query); + } + return this._client.getAPIList('/fine_tuning/jobs', FineTuningJobsPage, { query, ...options }); + } + /** + * Immediately cancel a fine-tune job. + */ + cancel(fineTuningJobId, options) { + return this._client.post(`/fine_tuning/jobs/${fineTuningJobId}/cancel`, options); + } + listEvents(fineTuningJobId, query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.listEvents(fineTuningJobId, {}, query); + } + return this._client.getAPIList(`/fine_tuning/jobs/${fineTuningJobId}/events`, FineTuningJobEventsPage, { + query, + ...options, + }); + } +} +exports.Jobs = Jobs; +class FineTuningJobsPage extends pagination_1.CursorPage { +} +exports.FineTuningJobsPage = FineTuningJobsPage; +class FineTuningJobEventsPage extends pagination_1.CursorPage { +} +exports.FineTuningJobEventsPage = FineTuningJobEventsPage; +(function (Jobs) { + Jobs.FineTuningJobsPage = JobsAPI.FineTuningJobsPage; + Jobs.FineTuningJobEventsPage = JobsAPI.FineTuningJobEventsPage; + Jobs.Checkpoints = CheckpointsAPI.Checkpoints; + Jobs.FineTuningJobCheckpointsPage = CheckpointsAPI.FineTuningJobCheckpointsPage; +})(Jobs = exports.Jobs || (exports.Jobs = {})); +//# sourceMappingURL=jobs.js.map + +/***/ }), + +/***/ 2621: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Images = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +class Images extends resource_1.APIResource { + /** + * Creates a variation of a given image. + */ + createVariation(body, options) { + return this._client.post('/images/variations', (0, core_1.multipartFormRequestOptions)({ body, ...options })); + } + /** + * Creates an edited or extended image given an original image and a prompt. + */ + edit(body, options) { + return this._client.post('/images/edits', (0, core_1.multipartFormRequestOptions)({ body, ...options })); + } + /** + * Creates an image given a prompt. + */ + generate(body, options) { + return this._client.post('/images/generations', { body, ...options }); + } +} +exports.Images = Images; +(function (Images) { +})(Images = exports.Images || (exports.Images = {})); +//# sourceMappingURL=images.js.map + +/***/ }), + +/***/ 5690: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Moderations = exports.Models = exports.ModelsPage = exports.Images = exports.FineTuning = exports.Files = exports.FileObjectsPage = exports.Embeddings = exports.Completions = exports.Beta = exports.Batches = exports.BatchesPage = exports.Audio = void 0; +__exportStar(__nccwpck_require__(8240), exports); +__exportStar(__nccwpck_require__(4866), exports); +var audio_1 = __nccwpck_require__(6376); +Object.defineProperty(exports, "Audio", ({ enumerable: true, get: function () { return audio_1.Audio; } })); +var batches_1 = __nccwpck_require__(341); +Object.defineProperty(exports, "BatchesPage", ({ enumerable: true, get: function () { return batches_1.BatchesPage; } })); +Object.defineProperty(exports, "Batches", ({ enumerable: true, get: function () { return batches_1.Batches; } })); +var beta_1 = __nccwpck_require__(853); +Object.defineProperty(exports, "Beta", ({ enumerable: true, get: function () { return beta_1.Beta; } })); +var completions_1 = __nccwpck_require__(9327); +Object.defineProperty(exports, "Completions", ({ enumerable: true, get: function () { return completions_1.Completions; } })); +var embeddings_1 = __nccwpck_require__(8064); +Object.defineProperty(exports, "Embeddings", ({ enumerable: true, get: function () { return embeddings_1.Embeddings; } })); +var files_1 = __nccwpck_require__(3873); +Object.defineProperty(exports, "FileObjectsPage", ({ enumerable: true, get: function () { return files_1.FileObjectsPage; } })); +Object.defineProperty(exports, "Files", ({ enumerable: true, get: function () { return files_1.Files; } })); +var fine_tuning_1 = __nccwpck_require__(1364); +Object.defineProperty(exports, "FineTuning", ({ enumerable: true, get: function () { return fine_tuning_1.FineTuning; } })); +var images_1 = __nccwpck_require__(2621); +Object.defineProperty(exports, "Images", ({ enumerable: true, get: function () { return images_1.Images; } })); +var models_1 = __nccwpck_require__(6467); +Object.defineProperty(exports, "ModelsPage", ({ enumerable: true, get: function () { return models_1.ModelsPage; } })); +Object.defineProperty(exports, "Models", ({ enumerable: true, get: function () { return models_1.Models; } })); +var moderations_1 = __nccwpck_require__(2085); +Object.defineProperty(exports, "Moderations", ({ enumerable: true, get: function () { return moderations_1.Moderations; } })); +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ 6467: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ModelsPage = exports.Models = void 0; +const resource_1 = __nccwpck_require__(9593); +const ModelsAPI = __importStar(__nccwpck_require__(6467)); +const pagination_1 = __nccwpck_require__(7401); +class Models extends resource_1.APIResource { + /** + * Retrieves a model instance, providing basic information about the model such as + * the owner and permissioning. + */ + retrieve(model, options) { + return this._client.get(`/models/${model}`, options); + } + /** + * Lists the currently available models, and provides basic information about each + * one such as the owner and availability. + */ + list(options) { + return this._client.getAPIList('/models', ModelsPage, options); + } + /** + * Delete a fine-tuned model. You must have the Owner role in your organization to + * delete a model. + */ + del(model, options) { + return this._client.delete(`/models/${model}`, options); + } +} +exports.Models = Models; +/** + * Note: no pagination actually occurs yet, this is for forwards-compatibility. + */ +class ModelsPage extends pagination_1.Page { +} +exports.ModelsPage = ModelsPage; +(function (Models) { + Models.ModelsPage = ModelsAPI.ModelsPage; +})(Models = exports.Models || (exports.Models = {})); +//# sourceMappingURL=models.js.map + +/***/ }), + +/***/ 2085: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Moderations = void 0; +const resource_1 = __nccwpck_require__(9593); +class Moderations extends resource_1.APIResource { + /** + * Classifies if text is potentially harmful. + */ + create(body, options) { + return this._client.post('/moderations', { body, ...options }); + } +} +exports.Moderations = Moderations; +(function (Moderations) { +})(Moderations = exports.Moderations || (exports.Moderations = {})); +//# sourceMappingURL=moderations.js.map + +/***/ }), + +/***/ 4866: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +//# sourceMappingURL=shared.js.map + +/***/ }), + +/***/ 884: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.readableStreamAsyncIterable = exports._decodeChunks = exports._iterSSEMessages = exports.Stream = void 0; +const index_1 = __nccwpck_require__(6678); +const error_1 = __nccwpck_require__(8905); +const error_2 = __nccwpck_require__(8905); +class Stream { + constructor(iterator, controller) { + this.iterator = iterator; + this.controller = controller; + } + static fromSSEResponse(response, controller) { + let consumed = false; + async function* iterator() { + if (consumed) { + throw new Error('Cannot iterate over a consumed stream, use `.tee()` to split the stream.'); + } + consumed = true; + let done = false; + try { + for await (const sse of _iterSSEMessages(response, controller)) { + if (done) + continue; + if (sse.data.startsWith('[DONE]')) { + done = true; + continue; + } + if (sse.event === null) { + let data; + try { + data = JSON.parse(sse.data); + } + catch (e) { + console.error(`Could not parse message into JSON:`, sse.data); + console.error(`From chunk:`, sse.raw); + throw e; + } + if (data && data.error) { + throw new error_2.APIError(undefined, data.error, undefined, undefined); + } + yield data; + } + else { + let data; + try { + data = JSON.parse(sse.data); + } + catch (e) { + console.error(`Could not parse message into JSON:`, sse.data); + console.error(`From chunk:`, sse.raw); + throw e; + } + // TODO: Is this where the error should be thrown? + if (sse.event == 'error') { + throw new error_2.APIError(undefined, data.error, data.message, undefined); + } + yield { event: sse.event, data: data }; + } + } + done = true; + } + catch (e) { + // If the user calls `stream.controller.abort()`, we should exit without throwing. + if (e instanceof Error && e.name === 'AbortError') + return; + throw e; + } + finally { + // If the user `break`s, abort the ongoing request. + if (!done) + controller.abort(); + } + } + return new Stream(iterator, controller); + } + /** + * Generates a Stream from a newline-separated ReadableStream + * where each item is a JSON value. + */ + static fromReadableStream(readableStream, controller) { + let consumed = false; + async function* iterLines() { + const lineDecoder = new LineDecoder(); + const iter = readableStreamAsyncIterable(readableStream); + for await (const chunk of iter) { + for (const line of lineDecoder.decode(chunk)) { + yield line; + } + } + for (const line of lineDecoder.flush()) { + yield line; + } + } + async function* iterator() { + if (consumed) { + throw new Error('Cannot iterate over a consumed stream, use `.tee()` to split the stream.'); + } + consumed = true; + let done = false; + try { + for await (const line of iterLines()) { + if (done) + continue; + if (line) + yield JSON.parse(line); + } + done = true; + } + catch (e) { + // If the user calls `stream.controller.abort()`, we should exit without throwing. + if (e instanceof Error && e.name === 'AbortError') + return; + throw e; + } + finally { + // If the user `break`s, abort the ongoing request. + if (!done) + controller.abort(); + } + } + return new Stream(iterator, controller); + } + [Symbol.asyncIterator]() { + return this.iterator(); + } + /** + * Splits the stream into two streams which can be + * independently read from at different speeds. + */ + tee() { + const left = []; + const right = []; + const iterator = this.iterator(); + const teeIterator = (queue) => { + return { + next: () => { + if (queue.length === 0) { + const result = iterator.next(); + left.push(result); + right.push(result); + } + return queue.shift(); + }, + }; + }; + return [ + new Stream(() => teeIterator(left), this.controller), + new Stream(() => teeIterator(right), this.controller), + ]; + } + /** + * Converts this stream to a newline-separated ReadableStream of + * JSON stringified values in the stream + * which can be turned back into a Stream with `Stream.fromReadableStream()`. + */ + toReadableStream() { + const self = this; + let iter; + const encoder = new TextEncoder(); + return new index_1.ReadableStream({ + async start() { + iter = self[Symbol.asyncIterator](); + }, + async pull(ctrl) { + try { + const { value, done } = await iter.next(); + if (done) + return ctrl.close(); + const bytes = encoder.encode(JSON.stringify(value) + '\n'); + ctrl.enqueue(bytes); + } + catch (err) { + ctrl.error(err); + } + }, + async cancel() { + await iter.return?.(); + }, + }); + } +} +exports.Stream = Stream; +async function* _iterSSEMessages(response, controller) { + if (!response.body) { + controller.abort(); + throw new error_1.OpenAIError(`Attempted to iterate over a response with no body`); + } + const sseDecoder = new SSEDecoder(); + const lineDecoder = new LineDecoder(); + const iter = readableStreamAsyncIterable(response.body); + for await (const sseChunk of iterSSEChunks(iter)) { + for (const line of lineDecoder.decode(sseChunk)) { + const sse = sseDecoder.decode(line); + if (sse) + yield sse; + } + } + for (const line of lineDecoder.flush()) { + const sse = sseDecoder.decode(line); + if (sse) + yield sse; + } +} +exports._iterSSEMessages = _iterSSEMessages; +/** + * Given an async iterable iterator, iterates over it and yields full + * SSE chunks, i.e. yields when a double new-line is encountered. + */ +async function* iterSSEChunks(iterator) { + let data = new Uint8Array(); + for await (const chunk of iterator) { + if (chunk == null) { + continue; + } + const binaryChunk = chunk instanceof ArrayBuffer ? new Uint8Array(chunk) + : typeof chunk === 'string' ? new TextEncoder().encode(chunk) + : chunk; + let newData = new Uint8Array(data.length + binaryChunk.length); + newData.set(data); + newData.set(binaryChunk, data.length); + data = newData; + let patternIndex; + while ((patternIndex = findDoubleNewlineIndex(data)) !== -1) { + yield data.slice(0, patternIndex); + data = data.slice(patternIndex); + } + } + if (data.length > 0) { + yield data; + } +} +function findDoubleNewlineIndex(buffer) { + // This function searches the buffer for the end patterns (\r\r, \n\n, \r\n\r\n) + // and returns the index right after the first occurrence of any pattern, + // or -1 if none of the patterns are found. + const newline = 0x0a; // \n + const carriage = 0x0d; // \r + for (let i = 0; i < buffer.length - 2; i++) { + if (buffer[i] === newline && buffer[i + 1] === newline) { + // \n\n + return i + 2; + } + if (buffer[i] === carriage && buffer[i + 1] === carriage) { + // \r\r + return i + 2; + } + if (buffer[i] === carriage && + buffer[i + 1] === newline && + i + 3 < buffer.length && + buffer[i + 2] === carriage && + buffer[i + 3] === newline) { + // \r\n\r\n + return i + 4; + } + } + return -1; +} +class SSEDecoder { + constructor() { + this.event = null; + this.data = []; + this.chunks = []; + } + decode(line) { + if (line.endsWith('\r')) { + line = line.substring(0, line.length - 1); + } + if (!line) { + // empty line and we didn't previously encounter any messages + if (!this.event && !this.data.length) + return null; + const sse = { + event: this.event, + data: this.data.join('\n'), + raw: this.chunks, + }; + this.event = null; + this.data = []; + this.chunks = []; + return sse; + } + this.chunks.push(line); + if (line.startsWith(':')) { + return null; + } + let [fieldname, _, value] = partition(line, ':'); + if (value.startsWith(' ')) { + value = value.substring(1); + } + if (fieldname === 'event') { + this.event = value; + } + else if (fieldname === 'data') { + this.data.push(value); + } + return null; + } +} +/** + * A re-implementation of httpx's `LineDecoder` in Python that handles incrementally + * reading lines from text. + * + * https://github.com/encode/httpx/blob/920333ea98118e9cf617f246905d7b202510941c/httpx/_decoders.py#L258 + */ +class LineDecoder { + constructor() { + this.buffer = []; + this.trailingCR = false; + } + decode(chunk) { + let text = this.decodeText(chunk); + if (this.trailingCR) { + text = '\r' + text; + this.trailingCR = false; + } + if (text.endsWith('\r')) { + this.trailingCR = true; + text = text.slice(0, -1); + } + if (!text) { + return []; + } + const trailingNewline = LineDecoder.NEWLINE_CHARS.has(text[text.length - 1] || ''); + let lines = text.split(LineDecoder.NEWLINE_REGEXP); + // if there is a trailing new line then the last entry will be an empty + // string which we don't care about + if (trailingNewline) { + lines.pop(); + } + if (lines.length === 1 && !trailingNewline) { + this.buffer.push(lines[0]); + return []; + } + if (this.buffer.length > 0) { + lines = [this.buffer.join('') + lines[0], ...lines.slice(1)]; + this.buffer = []; + } + if (!trailingNewline) { + this.buffer = [lines.pop() || '']; + } + return lines; + } + decodeText(bytes) { + if (bytes == null) + return ''; + if (typeof bytes === 'string') + return bytes; + // Node: + if (typeof Buffer !== 'undefined') { + if (bytes instanceof Buffer) { + return bytes.toString(); + } + if (bytes instanceof Uint8Array) { + return Buffer.from(bytes).toString(); + } + throw new error_1.OpenAIError(`Unexpected: received non-Uint8Array (${bytes.constructor.name}) stream chunk in an environment with a global "Buffer" defined, which this library assumes to be Node. Please report this error.`); + } + // Browser + if (typeof TextDecoder !== 'undefined') { + if (bytes instanceof Uint8Array || bytes instanceof ArrayBuffer) { + this.textDecoder ?? (this.textDecoder = new TextDecoder('utf8')); + return this.textDecoder.decode(bytes); + } + throw new error_1.OpenAIError(`Unexpected: received non-Uint8Array/ArrayBuffer (${bytes.constructor.name}) in a web platform. Please report this error.`); + } + throw new error_1.OpenAIError(`Unexpected: neither Buffer nor TextDecoder are available as globals. Please report this error.`); + } + flush() { + if (!this.buffer.length && !this.trailingCR) { + return []; + } + const lines = [this.buffer.join('')]; + this.buffer = []; + this.trailingCR = false; + return lines; + } +} +// prettier-ignore +LineDecoder.NEWLINE_CHARS = new Set(['\n', '\r']); +LineDecoder.NEWLINE_REGEXP = /\r\n|[\n\r]/g; +/** This is an internal helper function that's just used for testing */ +function _decodeChunks(chunks) { + const decoder = new LineDecoder(); + const lines = []; + for (const chunk of chunks) { + lines.push(...decoder.decode(chunk)); + } + return lines; +} +exports._decodeChunks = _decodeChunks; +function partition(str, delimiter) { + const index = str.indexOf(delimiter); + if (index !== -1) { + return [str.substring(0, index), delimiter, str.substring(index + delimiter.length)]; + } + return [str, '', '']; +} +/** + * Most browsers don't yet have async iterable support for ReadableStream, + * and Node has a very different way of reading bytes from its "ReadableStream". + * + * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490 + */ +function readableStreamAsyncIterable(stream) { + if (stream[Symbol.asyncIterator]) + return stream; + const reader = stream.getReader(); + return { + async next() { + try { + const result = await reader.read(); + if (result?.done) + reader.releaseLock(); // release lock when stream becomes closed + return result; + } + catch (e) { + reader.releaseLock(); // release lock when stream becomes errored + throw e; + } + }, + async return() { + const cancelPromise = reader.cancel(); + reader.releaseLock(); + await cancelPromise; + return { done: true, value: undefined }; + }, + [Symbol.asyncIterator]() { + return this; + }, + }; +} +exports.readableStreamAsyncIterable = readableStreamAsyncIterable; +//# sourceMappingURL=streaming.js.map + +/***/ }), + +/***/ 3394: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.createForm = exports.multipartFormRequestOptions = exports.maybeMultipartFormRequestOptions = exports.isMultipartBody = exports.toFile = exports.isUploadable = exports.isBlobLike = exports.isFileLike = exports.isResponseLike = exports.fileFromPath = void 0; +const index_1 = __nccwpck_require__(6678); +var index_2 = __nccwpck_require__(6678); +Object.defineProperty(exports, "fileFromPath", ({ enumerable: true, get: function () { return index_2.fileFromPath; } })); +const isResponseLike = (value) => value != null && + typeof value === 'object' && + typeof value.url === 'string' && + typeof value.blob === 'function'; +exports.isResponseLike = isResponseLike; +const isFileLike = (value) => value != null && + typeof value === 'object' && + typeof value.name === 'string' && + typeof value.lastModified === 'number' && + (0, exports.isBlobLike)(value); +exports.isFileLike = isFileLike; +/** + * The BlobLike type omits arrayBuffer() because @types/node-fetch@^2.6.4 lacks it; but this check + * adds the arrayBuffer() method type because it is available and used at runtime + */ +const isBlobLike = (value) => value != null && + typeof value === 'object' && + typeof value.size === 'number' && + typeof value.type === 'string' && + typeof value.text === 'function' && + typeof value.slice === 'function' && + typeof value.arrayBuffer === 'function'; +exports.isBlobLike = isBlobLike; +const isUploadable = (value) => { + return (0, exports.isFileLike)(value) || (0, exports.isResponseLike)(value) || (0, index_1.isFsReadStream)(value); +}; +exports.isUploadable = isUploadable; +/** + * Helper for creating a {@link File} to pass to an SDK upload method from a variety of different data formats + * @param value the raw content of the file. Can be an {@link Uploadable}, {@link BlobLikePart}, or {@link AsyncIterable} of {@link BlobLikePart}s + * @param {string=} name the name of the file. If omitted, toFile will try to determine a file name from bits if possible + * @param {Object=} options additional properties + * @param {string=} options.type the MIME type of the content + * @param {number=} options.lastModified the last modified timestamp + * @returns a {@link File} with the given properties + */ +async function toFile(value, name, options) { + // If it's a promise, resolve it. + value = await value; + // Use the file's options if there isn't one provided + options ?? (options = (0, exports.isFileLike)(value) ? { lastModified: value.lastModified, type: value.type } : {}); + if ((0, exports.isResponseLike)(value)) { + const blob = await value.blob(); + name || (name = new URL(value.url).pathname.split(/[\\/]/).pop() ?? 'unknown_file'); + return new index_1.File([blob], name, options); + } + const bits = await getBytes(value); + name || (name = getName(value) ?? 'unknown_file'); + if (!options.type) { + const type = bits[0]?.type; + if (typeof type === 'string') { + options = { ...options, type }; + } + } + return new index_1.File(bits, name, options); +} +exports.toFile = toFile; +async function getBytes(value) { + let parts = []; + if (typeof value === 'string' || + ArrayBuffer.isView(value) || // includes Uint8Array, Buffer, etc. + value instanceof ArrayBuffer) { + parts.push(value); + } + else if ((0, exports.isBlobLike)(value)) { + parts.push(await value.arrayBuffer()); + } + else if (isAsyncIterableIterator(value) // includes Readable, ReadableStream, etc. + ) { + for await (const chunk of value) { + parts.push(chunk); // TODO, consider validating? + } + } + else { + throw new Error(`Unexpected data type: ${typeof value}; constructor: ${value?.constructor + ?.name}; props: ${propsForError(value)}`); + } + return parts; +} +function propsForError(value) { + const props = Object.getOwnPropertyNames(value); + return `[${props.map((p) => `"${p}"`).join(', ')}]`; +} +function getName(value) { + return (getStringFromMaybeBuffer(value.name) || + getStringFromMaybeBuffer(value.filename) || + // For fs.ReadStream + getStringFromMaybeBuffer(value.path)?.split(/[\\/]/).pop()); +} +const getStringFromMaybeBuffer = (x) => { + if (typeof x === 'string') + return x; + if (typeof Buffer !== 'undefined' && x instanceof Buffer) + return String(x); + return undefined; +}; +const isAsyncIterableIterator = (value) => value != null && typeof value === 'object' && typeof value[Symbol.asyncIterator] === 'function'; +const isMultipartBody = (body) => body && typeof body === 'object' && body.body && body[Symbol.toStringTag] === 'MultipartBody'; +exports.isMultipartBody = isMultipartBody; +/** + * Returns a multipart/form-data request if any part of the given request body contains a File / Blob value. + * Otherwise returns the request as is. + */ +const maybeMultipartFormRequestOptions = async (opts) => { + if (!hasUploadableValue(opts.body)) + return opts; + const form = await (0, exports.createForm)(opts.body); + return (0, index_1.getMultipartRequestOptions)(form, opts); +}; +exports.maybeMultipartFormRequestOptions = maybeMultipartFormRequestOptions; +const multipartFormRequestOptions = async (opts) => { + const form = await (0, exports.createForm)(opts.body); + return (0, index_1.getMultipartRequestOptions)(form, opts); +}; +exports.multipartFormRequestOptions = multipartFormRequestOptions; +const createForm = async (body) => { + const form = new index_1.FormData(); + await Promise.all(Object.entries(body || {}).map(([key, value]) => addFormValue(form, key, value))); + return form; +}; +exports.createForm = createForm; +const hasUploadableValue = (value) => { + if ((0, exports.isUploadable)(value)) + return true; + if (Array.isArray(value)) + return value.some(hasUploadableValue); + if (value && typeof value === 'object') { + for (const k in value) { + if (hasUploadableValue(value[k])) + return true; + } + } + return false; +}; +const addFormValue = async (form, key, value) => { + if (value === undefined) + return; + if (value == null) { + throw new TypeError(`Received null for "${key}"; to pass null in FormData, you must use the string 'null'`); + } + // TODO: make nested formats configurable + if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { + form.append(key, String(value)); + } + else if ((0, exports.isUploadable)(value)) { + const file = await toFile(value); + form.append(key, file); + } + else if (Array.isArray(value)) { + await Promise.all(value.map((entry) => addFormValue(form, key + '[]', entry))); + } + else if (typeof value === 'object') { + await Promise.all(Object.entries(value).map(([name, prop]) => addFormValue(form, `${key}[${name}]`, prop))); + } + else { + throw new TypeError(`Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${value} instead`); + } +}; +//# sourceMappingURL=uploads.js.map + +/***/ }), + +/***/ 6417: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VERSION = void 0; +exports.VERSION = '4.38.5'; // x-release-please-version +//# sourceMappingURL=version.js.map + +/***/ }), + +/***/ 1907: +/***/ ((module) => { + +"use strict"; +module.exports = JSON.parse('[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"],[[47,47],"disallowed_STD3_valid"],[[48,57],"valid"],[[58,64],"disallowed_STD3_valid"],[[65,65],"mapped",[97]],[[66,66],"mapped",[98]],[[67,67],"mapped",[99]],[[68,68],"mapped",[100]],[[69,69],"mapped",[101]],[[70,70],"mapped",[102]],[[71,71],"mapped",[103]],[[72,72],"mapped",[104]],[[73,73],"mapped",[105]],[[74,74],"mapped",[106]],[[75,75],"mapped",[107]],[[76,76],"mapped",[108]],[[77,77],"mapped",[109]],[[78,78],"mapped",[110]],[[79,79],"mapped",[111]],[[80,80],"mapped",[112]],[[81,81],"mapped",[113]],[[82,82],"mapped",[114]],[[83,83],"mapped",[115]],[[84,84],"mapped",[116]],[[85,85],"mapped",[117]],[[86,86],"mapped",[118]],[[87,87],"mapped",[119]],[[88,88],"mapped",[120]],[[89,89],"mapped",[121]],[[90,90],"mapped",[122]],[[91,96],"disallowed_STD3_valid"],[[97,122],"valid"],[[123,127],"disallowed_STD3_valid"],[[128,159],"disallowed"],[[160,160],"disallowed_STD3_mapped",[32]],[[161,167],"valid",[],"NV8"],[[168,168],"disallowed_STD3_mapped",[32,776]],[[169,169],"valid",[],"NV8"],[[170,170],"mapped",[97]],[[171,172],"valid",[],"NV8"],[[173,173],"ignored"],[[174,174],"valid",[],"NV8"],[[175,175],"disallowed_STD3_mapped",[32,772]],[[176,177],"valid",[],"NV8"],[[178,178],"mapped",[50]],[[179,179],"mapped",[51]],[[180,180],"disallowed_STD3_mapped",[32,769]],[[181,181],"mapped",[956]],[[182,182],"valid",[],"NV8"],[[183,183],"valid"],[[184,184],"disallowed_STD3_mapped",[32,807]],[[185,185],"mapped",[49]],[[186,186],"mapped",[111]],[[187,187],"valid",[],"NV8"],[[188,188],"mapped",[49,8260,52]],[[189,189],"mapped",[49,8260,50]],[[190,190],"mapped",[51,8260,52]],[[191,191],"valid",[],"NV8"],[[192,192],"mapped",[224]],[[193,193],"mapped",[225]],[[194,194],"mapped",[226]],[[195,195],"mapped",[227]],[[196,196],"mapped",[228]],[[197,197],"mapped",[229]],[[198,198],"mapped",[230]],[[199,199],"mapped",[231]],[[200,200],"mapped",[232]],[[201,201],"mapped",[233]],[[202,202],"mapped",[234]],[[203,203],"mapped",[235]],[[204,204],"mapped",[236]],[[205,205],"mapped",[237]],[[206,206],"mapped",[238]],[[207,207],"mapped",[239]],[[208,208],"mapped",[240]],[[209,209],"mapped",[241]],[[210,210],"mapped",[242]],[[211,211],"mapped",[243]],[[212,212],"mapped",[244]],[[213,213],"mapped",[245]],[[214,214],"mapped",[246]],[[215,215],"valid",[],"NV8"],[[216,216],"mapped",[248]],[[217,217],"mapped",[249]],[[218,218],"mapped",[250]],[[219,219],"mapped",[251]],[[220,220],"mapped",[252]],[[221,221],"mapped",[253]],[[222,222],"mapped",[254]],[[223,223],"deviation",[115,115]],[[224,246],"valid"],[[247,247],"valid",[],"NV8"],[[248,255],"valid"],[[256,256],"mapped",[257]],[[257,257],"valid"],[[258,258],"mapped",[259]],[[259,259],"valid"],[[260,260],"mapped",[261]],[[261,261],"valid"],[[262,262],"mapped",[263]],[[263,263],"valid"],[[264,264],"mapped",[265]],[[265,265],"valid"],[[266,266],"mapped",[267]],[[267,267],"valid"],[[268,268],"mapped",[269]],[[269,269],"valid"],[[270,270],"mapped",[271]],[[271,271],"valid"],[[272,272],"mapped",[273]],[[273,273],"valid"],[[274,274],"mapped",[275]],[[275,275],"valid"],[[276,276],"mapped",[277]],[[277,277],"valid"],[[278,278],"mapped",[279]],[[279,279],"valid"],[[280,280],"mapped",[281]],[[281,281],"valid"],[[282,282],"mapped",[283]],[[283,283],"valid"],[[284,284],"mapped",[285]],[[285,285],"valid"],[[286,286],"mapped",[287]],[[287,287],"valid"],[[288,288],"mapped",[289]],[[289,289],"valid"],[[290,290],"mapped",[291]],[[291,291],"valid"],[[292,292],"mapped",[293]],[[293,293],"valid"],[[294,294],"mapped",[295]],[[295,295],"valid"],[[296,296],"mapped",[297]],[[297,297],"valid"],[[298,298],"mapped",[299]],[[299,299],"valid"],[[300,300],"mapped",[301]],[[301,301],"valid"],[[302,302],"mapped",[303]],[[303,303],"valid"],[[304,304],"mapped",[105,775]],[[305,305],"valid"],[[306,307],"mapped",[105,106]],[[308,308],"mapped",[309]],[[309,309],"valid"],[[310,310],"mapped",[311]],[[311,312],"valid"],[[313,313],"mapped",[314]],[[314,314],"valid"],[[315,315],"mapped",[316]],[[316,316],"valid"],[[317,317],"mapped",[318]],[[318,318],"valid"],[[319,320],"mapped",[108,183]],[[321,321],"mapped",[322]],[[322,322],"valid"],[[323,323],"mapped",[324]],[[324,324],"valid"],[[325,325],"mapped",[326]],[[326,326],"valid"],[[327,327],"mapped",[328]],[[328,328],"valid"],[[329,329],"mapped",[700,110]],[[330,330],"mapped",[331]],[[331,331],"valid"],[[332,332],"mapped",[333]],[[333,333],"valid"],[[334,334],"mapped",[335]],[[335,335],"valid"],[[336,336],"mapped",[337]],[[337,337],"valid"],[[338,338],"mapped",[339]],[[339,339],"valid"],[[340,340],"mapped",[341]],[[341,341],"valid"],[[342,342],"mapped",[343]],[[343,343],"valid"],[[344,344],"mapped",[345]],[[345,345],"valid"],[[346,346],"mapped",[347]],[[347,347],"valid"],[[348,348],"mapped",[349]],[[349,349],"valid"],[[350,350],"mapped",[351]],[[351,351],"valid"],[[352,352],"mapped",[353]],[[353,353],"valid"],[[354,354],"mapped",[355]],[[355,355],"valid"],[[356,356],"mapped",[357]],[[357,357],"valid"],[[358,358],"mapped",[359]],[[359,359],"valid"],[[360,360],"mapped",[361]],[[361,361],"valid"],[[362,362],"mapped",[363]],[[363,363],"valid"],[[364,364],"mapped",[365]],[[365,365],"valid"],[[366,366],"mapped",[367]],[[367,367],"valid"],[[368,368],"mapped",[369]],[[369,369],"valid"],[[370,370],"mapped",[371]],[[371,371],"valid"],[[372,372],"mapped",[373]],[[373,373],"valid"],[[374,374],"mapped",[375]],[[375,375],"valid"],[[376,376],"mapped",[255]],[[377,377],"mapped",[378]],[[378,378],"valid"],[[379,379],"mapped",[380]],[[380,380],"valid"],[[381,381],"mapped",[382]],[[382,382],"valid"],[[383,383],"mapped",[115]],[[384,384],"valid"],[[385,385],"mapped",[595]],[[386,386],"mapped",[387]],[[387,387],"valid"],[[388,388],"mapped",[389]],[[389,389],"valid"],[[390,390],"mapped",[596]],[[391,391],"mapped",[392]],[[392,392],"valid"],[[393,393],"mapped",[598]],[[394,394],"mapped",[599]],[[395,395],"mapped",[396]],[[396,397],"valid"],[[398,398],"mapped",[477]],[[399,399],"mapped",[601]],[[400,400],"mapped",[603]],[[401,401],"mapped",[402]],[[402,402],"valid"],[[403,403],"mapped",[608]],[[404,404],"mapped",[611]],[[405,405],"valid"],[[406,406],"mapped",[617]],[[407,407],"mapped",[616]],[[408,408],"mapped",[409]],[[409,411],"valid"],[[412,412],"mapped",[623]],[[413,413],"mapped",[626]],[[414,414],"valid"],[[415,415],"mapped",[629]],[[416,416],"mapped",[417]],[[417,417],"valid"],[[418,418],"mapped",[419]],[[419,419],"valid"],[[420,420],"mapped",[421]],[[421,421],"valid"],[[422,422],"mapped",[640]],[[423,423],"mapped",[424]],[[424,424],"valid"],[[425,425],"mapped",[643]],[[426,427],"valid"],[[428,428],"mapped",[429]],[[429,429],"valid"],[[430,430],"mapped",[648]],[[431,431],"mapped",[432]],[[432,432],"valid"],[[433,433],"mapped",[650]],[[434,434],"mapped",[651]],[[435,435],"mapped",[436]],[[436,436],"valid"],[[437,437],"mapped",[438]],[[438,438],"valid"],[[439,439],"mapped",[658]],[[440,440],"mapped",[441]],[[441,443],"valid"],[[444,444],"mapped",[445]],[[445,451],"valid"],[[452,454],"mapped",[100,382]],[[455,457],"mapped",[108,106]],[[458,460],"mapped",[110,106]],[[461,461],"mapped",[462]],[[462,462],"valid"],[[463,463],"mapped",[464]],[[464,464],"valid"],[[465,465],"mapped",[466]],[[466,466],"valid"],[[467,467],"mapped",[468]],[[468,468],"valid"],[[469,469],"mapped",[470]],[[470,470],"valid"],[[471,471],"mapped",[472]],[[472,472],"valid"],[[473,473],"mapped",[474]],[[474,474],"valid"],[[475,475],"mapped",[476]],[[476,477],"valid"],[[478,478],"mapped",[479]],[[479,479],"valid"],[[480,480],"mapped",[481]],[[481,481],"valid"],[[482,482],"mapped",[483]],[[483,483],"valid"],[[484,484],"mapped",[485]],[[485,485],"valid"],[[486,486],"mapped",[487]],[[487,487],"valid"],[[488,488],"mapped",[489]],[[489,489],"valid"],[[490,490],"mapped",[491]],[[491,491],"valid"],[[492,492],"mapped",[493]],[[493,493],"valid"],[[494,494],"mapped",[495]],[[495,496],"valid"],[[497,499],"mapped",[100,122]],[[500,500],"mapped",[501]],[[501,501],"valid"],[[502,502],"mapped",[405]],[[503,503],"mapped",[447]],[[504,504],"mapped",[505]],[[505,505],"valid"],[[506,506],"mapped",[507]],[[507,507],"valid"],[[508,508],"mapped",[509]],[[509,509],"valid"],[[510,510],"mapped",[511]],[[511,511],"valid"],[[512,512],"mapped",[513]],[[513,513],"valid"],[[514,514],"mapped",[515]],[[515,515],"valid"],[[516,516],"mapped",[517]],[[517,517],"valid"],[[518,518],"mapped",[519]],[[519,519],"valid"],[[520,520],"mapped",[521]],[[521,521],"valid"],[[522,522],"mapped",[523]],[[523,523],"valid"],[[524,524],"mapped",[525]],[[525,525],"valid"],[[526,526],"mapped",[527]],[[527,527],"valid"],[[528,528],"mapped",[529]],[[529,529],"valid"],[[530,530],"mapped",[531]],[[531,531],"valid"],[[532,532],"mapped",[533]],[[533,533],"valid"],[[534,534],"mapped",[535]],[[535,535],"valid"],[[536,536],"mapped",[537]],[[537,537],"valid"],[[538,538],"mapped",[539]],[[539,539],"valid"],[[540,540],"mapped",[541]],[[541,541],"valid"],[[542,542],"mapped",[543]],[[543,543],"valid"],[[544,544],"mapped",[414]],[[545,545],"valid"],[[546,546],"mapped",[547]],[[547,547],"valid"],[[548,548],"mapped",[549]],[[549,549],"valid"],[[550,550],"mapped",[551]],[[551,551],"valid"],[[552,552],"mapped",[553]],[[553,553],"valid"],[[554,554],"mapped",[555]],[[555,555],"valid"],[[556,556],"mapped",[557]],[[557,557],"valid"],[[558,558],"mapped",[559]],[[559,559],"valid"],[[560,560],"mapped",[561]],[[561,561],"valid"],[[562,562],"mapped",[563]],[[563,563],"valid"],[[564,566],"valid"],[[567,569],"valid"],[[570,570],"mapped",[11365]],[[571,571],"mapped",[572]],[[572,572],"valid"],[[573,573],"mapped",[410]],[[574,574],"mapped",[11366]],[[575,576],"valid"],[[577,577],"mapped",[578]],[[578,578],"valid"],[[579,579],"mapped",[384]],[[580,580],"mapped",[649]],[[581,581],"mapped",[652]],[[582,582],"mapped",[583]],[[583,583],"valid"],[[584,584],"mapped",[585]],[[585,585],"valid"],[[586,586],"mapped",[587]],[[587,587],"valid"],[[588,588],"mapped",[589]],[[589,589],"valid"],[[590,590],"mapped",[591]],[[591,591],"valid"],[[592,680],"valid"],[[681,685],"valid"],[[686,687],"valid"],[[688,688],"mapped",[104]],[[689,689],"mapped",[614]],[[690,690],"mapped",[106]],[[691,691],"mapped",[114]],[[692,692],"mapped",[633]],[[693,693],"mapped",[635]],[[694,694],"mapped",[641]],[[695,695],"mapped",[119]],[[696,696],"mapped",[121]],[[697,705],"valid"],[[706,709],"valid",[],"NV8"],[[710,721],"valid"],[[722,727],"valid",[],"NV8"],[[728,728],"disallowed_STD3_mapped",[32,774]],[[729,729],"disallowed_STD3_mapped",[32,775]],[[730,730],"disallowed_STD3_mapped",[32,778]],[[731,731],"disallowed_STD3_mapped",[32,808]],[[732,732],"disallowed_STD3_mapped",[32,771]],[[733,733],"disallowed_STD3_mapped",[32,779]],[[734,734],"valid",[],"NV8"],[[735,735],"valid",[],"NV8"],[[736,736],"mapped",[611]],[[737,737],"mapped",[108]],[[738,738],"mapped",[115]],[[739,739],"mapped",[120]],[[740,740],"mapped",[661]],[[741,745],"valid",[],"NV8"],[[746,747],"valid",[],"NV8"],[[748,748],"valid"],[[749,749],"valid",[],"NV8"],[[750,750],"valid"],[[751,767],"valid",[],"NV8"],[[768,831],"valid"],[[832,832],"mapped",[768]],[[833,833],"mapped",[769]],[[834,834],"valid"],[[835,835],"mapped",[787]],[[836,836],"mapped",[776,769]],[[837,837],"mapped",[953]],[[838,846],"valid"],[[847,847],"ignored"],[[848,855],"valid"],[[856,860],"valid"],[[861,863],"valid"],[[864,865],"valid"],[[866,866],"valid"],[[867,879],"valid"],[[880,880],"mapped",[881]],[[881,881],"valid"],[[882,882],"mapped",[883]],[[883,883],"valid"],[[884,884],"mapped",[697]],[[885,885],"valid"],[[886,886],"mapped",[887]],[[887,887],"valid"],[[888,889],"disallowed"],[[890,890],"disallowed_STD3_mapped",[32,953]],[[891,893],"valid"],[[894,894],"disallowed_STD3_mapped",[59]],[[895,895],"mapped",[1011]],[[896,899],"disallowed"],[[900,900],"disallowed_STD3_mapped",[32,769]],[[901,901],"disallowed_STD3_mapped",[32,776,769]],[[902,902],"mapped",[940]],[[903,903],"mapped",[183]],[[904,904],"mapped",[941]],[[905,905],"mapped",[942]],[[906,906],"mapped",[943]],[[907,907],"disallowed"],[[908,908],"mapped",[972]],[[909,909],"disallowed"],[[910,910],"mapped",[973]],[[911,911],"mapped",[974]],[[912,912],"valid"],[[913,913],"mapped",[945]],[[914,914],"mapped",[946]],[[915,915],"mapped",[947]],[[916,916],"mapped",[948]],[[917,917],"mapped",[949]],[[918,918],"mapped",[950]],[[919,919],"mapped",[951]],[[920,920],"mapped",[952]],[[921,921],"mapped",[953]],[[922,922],"mapped",[954]],[[923,923],"mapped",[955]],[[924,924],"mapped",[956]],[[925,925],"mapped",[957]],[[926,926],"mapped",[958]],[[927,927],"mapped",[959]],[[928,928],"mapped",[960]],[[929,929],"mapped",[961]],[[930,930],"disallowed"],[[931,931],"mapped",[963]],[[932,932],"mapped",[964]],[[933,933],"mapped",[965]],[[934,934],"mapped",[966]],[[935,935],"mapped",[967]],[[936,936],"mapped",[968]],[[937,937],"mapped",[969]],[[938,938],"mapped",[970]],[[939,939],"mapped",[971]],[[940,961],"valid"],[[962,962],"deviation",[963]],[[963,974],"valid"],[[975,975],"mapped",[983]],[[976,976],"mapped",[946]],[[977,977],"mapped",[952]],[[978,978],"mapped",[965]],[[979,979],"mapped",[973]],[[980,980],"mapped",[971]],[[981,981],"mapped",[966]],[[982,982],"mapped",[960]],[[983,983],"valid"],[[984,984],"mapped",[985]],[[985,985],"valid"],[[986,986],"mapped",[987]],[[987,987],"valid"],[[988,988],"mapped",[989]],[[989,989],"valid"],[[990,990],"mapped",[991]],[[991,991],"valid"],[[992,992],"mapped",[993]],[[993,993],"valid"],[[994,994],"mapped",[995]],[[995,995],"valid"],[[996,996],"mapped",[997]],[[997,997],"valid"],[[998,998],"mapped",[999]],[[999,999],"valid"],[[1000,1000],"mapped",[1001]],[[1001,1001],"valid"],[[1002,1002],"mapped",[1003]],[[1003,1003],"valid"],[[1004,1004],"mapped",[1005]],[[1005,1005],"valid"],[[1006,1006],"mapped",[1007]],[[1007,1007],"valid"],[[1008,1008],"mapped",[954]],[[1009,1009],"mapped",[961]],[[1010,1010],"mapped",[963]],[[1011,1011],"valid"],[[1012,1012],"mapped",[952]],[[1013,1013],"mapped",[949]],[[1014,1014],"valid",[],"NV8"],[[1015,1015],"mapped",[1016]],[[1016,1016],"valid"],[[1017,1017],"mapped",[963]],[[1018,1018],"mapped",[1019]],[[1019,1019],"valid"],[[1020,1020],"valid"],[[1021,1021],"mapped",[891]],[[1022,1022],"mapped",[892]],[[1023,1023],"mapped",[893]],[[1024,1024],"mapped",[1104]],[[1025,1025],"mapped",[1105]],[[1026,1026],"mapped",[1106]],[[1027,1027],"mapped",[1107]],[[1028,1028],"mapped",[1108]],[[1029,1029],"mapped",[1109]],[[1030,1030],"mapped",[1110]],[[1031,1031],"mapped",[1111]],[[1032,1032],"mapped",[1112]],[[1033,1033],"mapped",[1113]],[[1034,1034],"mapped",[1114]],[[1035,1035],"mapped",[1115]],[[1036,1036],"mapped",[1116]],[[1037,1037],"mapped",[1117]],[[1038,1038],"mapped",[1118]],[[1039,1039],"mapped",[1119]],[[1040,1040],"mapped",[1072]],[[1041,1041],"mapped",[1073]],[[1042,1042],"mapped",[1074]],[[1043,1043],"mapped",[1075]],[[1044,1044],"mapped",[1076]],[[1045,1045],"mapped",[1077]],[[1046,1046],"mapped",[1078]],[[1047,1047],"mapped",[1079]],[[1048,1048],"mapped",[1080]],[[1049,1049],"mapped",[1081]],[[1050,1050],"mapped",[1082]],[[1051,1051],"mapped",[1083]],[[1052,1052],"mapped",[1084]],[[1053,1053],"mapped",[1085]],[[1054,1054],"mapped",[1086]],[[1055,1055],"mapped",[1087]],[[1056,1056],"mapped",[1088]],[[1057,1057],"mapped",[1089]],[[1058,1058],"mapped",[1090]],[[1059,1059],"mapped",[1091]],[[1060,1060],"mapped",[1092]],[[1061,1061],"mapped",[1093]],[[1062,1062],"mapped",[1094]],[[1063,1063],"mapped",[1095]],[[1064,1064],"mapped",[1096]],[[1065,1065],"mapped",[1097]],[[1066,1066],"mapped",[1098]],[[1067,1067],"mapped",[1099]],[[1068,1068],"mapped",[1100]],[[1069,1069],"mapped",[1101]],[[1070,1070],"mapped",[1102]],[[1071,1071],"mapped",[1103]],[[1072,1103],"valid"],[[1104,1104],"valid"],[[1105,1116],"valid"],[[1117,1117],"valid"],[[1118,1119],"valid"],[[1120,1120],"mapped",[1121]],[[1121,1121],"valid"],[[1122,1122],"mapped",[1123]],[[1123,1123],"valid"],[[1124,1124],"mapped",[1125]],[[1125,1125],"valid"],[[1126,1126],"mapped",[1127]],[[1127,1127],"valid"],[[1128,1128],"mapped",[1129]],[[1129,1129],"valid"],[[1130,1130],"mapped",[1131]],[[1131,1131],"valid"],[[1132,1132],"mapped",[1133]],[[1133,1133],"valid"],[[1134,1134],"mapped",[1135]],[[1135,1135],"valid"],[[1136,1136],"mapped",[1137]],[[1137,1137],"valid"],[[1138,1138],"mapped",[1139]],[[1139,1139],"valid"],[[1140,1140],"mapped",[1141]],[[1141,1141],"valid"],[[1142,1142],"mapped",[1143]],[[1143,1143],"valid"],[[1144,1144],"mapped",[1145]],[[1145,1145],"valid"],[[1146,1146],"mapped",[1147]],[[1147,1147],"valid"],[[1148,1148],"mapped",[1149]],[[1149,1149],"valid"],[[1150,1150],"mapped",[1151]],[[1151,1151],"valid"],[[1152,1152],"mapped",[1153]],[[1153,1153],"valid"],[[1154,1154],"valid",[],"NV8"],[[1155,1158],"valid"],[[1159,1159],"valid"],[[1160,1161],"valid",[],"NV8"],[[1162,1162],"mapped",[1163]],[[1163,1163],"valid"],[[1164,1164],"mapped",[1165]],[[1165,1165],"valid"],[[1166,1166],"mapped",[1167]],[[1167,1167],"valid"],[[1168,1168],"mapped",[1169]],[[1169,1169],"valid"],[[1170,1170],"mapped",[1171]],[[1171,1171],"valid"],[[1172,1172],"mapped",[1173]],[[1173,1173],"valid"],[[1174,1174],"mapped",[1175]],[[1175,1175],"valid"],[[1176,1176],"mapped",[1177]],[[1177,1177],"valid"],[[1178,1178],"mapped",[1179]],[[1179,1179],"valid"],[[1180,1180],"mapped",[1181]],[[1181,1181],"valid"],[[1182,1182],"mapped",[1183]],[[1183,1183],"valid"],[[1184,1184],"mapped",[1185]],[[1185,1185],"valid"],[[1186,1186],"mapped",[1187]],[[1187,1187],"valid"],[[1188,1188],"mapped",[1189]],[[1189,1189],"valid"],[[1190,1190],"mapped",[1191]],[[1191,1191],"valid"],[[1192,1192],"mapped",[1193]],[[1193,1193],"valid"],[[1194,1194],"mapped",[1195]],[[1195,1195],"valid"],[[1196,1196],"mapped",[1197]],[[1197,1197],"valid"],[[1198,1198],"mapped",[1199]],[[1199,1199],"valid"],[[1200,1200],"mapped",[1201]],[[1201,1201],"valid"],[[1202,1202],"mapped",[1203]],[[1203,1203],"valid"],[[1204,1204],"mapped",[1205]],[[1205,1205],"valid"],[[1206,1206],"mapped",[1207]],[[1207,1207],"valid"],[[1208,1208],"mapped",[1209]],[[1209,1209],"valid"],[[1210,1210],"mapped",[1211]],[[1211,1211],"valid"],[[1212,1212],"mapped",[1213]],[[1213,1213],"valid"],[[1214,1214],"mapped",[1215]],[[1215,1215],"valid"],[[1216,1216],"disallowed"],[[1217,1217],"mapped",[1218]],[[1218,1218],"valid"],[[1219,1219],"mapped",[1220]],[[1220,1220],"valid"],[[1221,1221],"mapped",[1222]],[[1222,1222],"valid"],[[1223,1223],"mapped",[1224]],[[1224,1224],"valid"],[[1225,1225],"mapped",[1226]],[[1226,1226],"valid"],[[1227,1227],"mapped",[1228]],[[1228,1228],"valid"],[[1229,1229],"mapped",[1230]],[[1230,1230],"valid"],[[1231,1231],"valid"],[[1232,1232],"mapped",[1233]],[[1233,1233],"valid"],[[1234,1234],"mapped",[1235]],[[1235,1235],"valid"],[[1236,1236],"mapped",[1237]],[[1237,1237],"valid"],[[1238,1238],"mapped",[1239]],[[1239,1239],"valid"],[[1240,1240],"mapped",[1241]],[[1241,1241],"valid"],[[1242,1242],"mapped",[1243]],[[1243,1243],"valid"],[[1244,1244],"mapped",[1245]],[[1245,1245],"valid"],[[1246,1246],"mapped",[1247]],[[1247,1247],"valid"],[[1248,1248],"mapped",[1249]],[[1249,1249],"valid"],[[1250,1250],"mapped",[1251]],[[1251,1251],"valid"],[[1252,1252],"mapped",[1253]],[[1253,1253],"valid"],[[1254,1254],"mapped",[1255]],[[1255,1255],"valid"],[[1256,1256],"mapped",[1257]],[[1257,1257],"valid"],[[1258,1258],"mapped",[1259]],[[1259,1259],"valid"],[[1260,1260],"mapped",[1261]],[[1261,1261],"valid"],[[1262,1262],"mapped",[1263]],[[1263,1263],"valid"],[[1264,1264],"mapped",[1265]],[[1265,1265],"valid"],[[1266,1266],"mapped",[1267]],[[1267,1267],"valid"],[[1268,1268],"mapped",[1269]],[[1269,1269],"valid"],[[1270,1270],"mapped",[1271]],[[1271,1271],"valid"],[[1272,1272],"mapped",[1273]],[[1273,1273],"valid"],[[1274,1274],"mapped",[1275]],[[1275,1275],"valid"],[[1276,1276],"mapped",[1277]],[[1277,1277],"valid"],[[1278,1278],"mapped",[1279]],[[1279,1279],"valid"],[[1280,1280],"mapped",[1281]],[[1281,1281],"valid"],[[1282,1282],"mapped",[1283]],[[1283,1283],"valid"],[[1284,1284],"mapped",[1285]],[[1285,1285],"valid"],[[1286,1286],"mapped",[1287]],[[1287,1287],"valid"],[[1288,1288],"mapped",[1289]],[[1289,1289],"valid"],[[1290,1290],"mapped",[1291]],[[1291,1291],"valid"],[[1292,1292],"mapped",[1293]],[[1293,1293],"valid"],[[1294,1294],"mapped",[1295]],[[1295,1295],"valid"],[[1296,1296],"mapped",[1297]],[[1297,1297],"valid"],[[1298,1298],"mapped",[1299]],[[1299,1299],"valid"],[[1300,1300],"mapped",[1301]],[[1301,1301],"valid"],[[1302,1302],"mapped",[1303]],[[1303,1303],"valid"],[[1304,1304],"mapped",[1305]],[[1305,1305],"valid"],[[1306,1306],"mapped",[1307]],[[1307,1307],"valid"],[[1308,1308],"mapped",[1309]],[[1309,1309],"valid"],[[1310,1310],"mapped",[1311]],[[1311,1311],"valid"],[[1312,1312],"mapped",[1313]],[[1313,1313],"valid"],[[1314,1314],"mapped",[1315]],[[1315,1315],"valid"],[[1316,1316],"mapped",[1317]],[[1317,1317],"valid"],[[1318,1318],"mapped",[1319]],[[1319,1319],"valid"],[[1320,1320],"mapped",[1321]],[[1321,1321],"valid"],[[1322,1322],"mapped",[1323]],[[1323,1323],"valid"],[[1324,1324],"mapped",[1325]],[[1325,1325],"valid"],[[1326,1326],"mapped",[1327]],[[1327,1327],"valid"],[[1328,1328],"disallowed"],[[1329,1329],"mapped",[1377]],[[1330,1330],"mapped",[1378]],[[1331,1331],"mapped",[1379]],[[1332,1332],"mapped",[1380]],[[1333,1333],"mapped",[1381]],[[1334,1334],"mapped",[1382]],[[1335,1335],"mapped",[1383]],[[1336,1336],"mapped",[1384]],[[1337,1337],"mapped",[1385]],[[1338,1338],"mapped",[1386]],[[1339,1339],"mapped",[1387]],[[1340,1340],"mapped",[1388]],[[1341,1341],"mapped",[1389]],[[1342,1342],"mapped",[1390]],[[1343,1343],"mapped",[1391]],[[1344,1344],"mapped",[1392]],[[1345,1345],"mapped",[1393]],[[1346,1346],"mapped",[1394]],[[1347,1347],"mapped",[1395]],[[1348,1348],"mapped",[1396]],[[1349,1349],"mapped",[1397]],[[1350,1350],"mapped",[1398]],[[1351,1351],"mapped",[1399]],[[1352,1352],"mapped",[1400]],[[1353,1353],"mapped",[1401]],[[1354,1354],"mapped",[1402]],[[1355,1355],"mapped",[1403]],[[1356,1356],"mapped",[1404]],[[1357,1357],"mapped",[1405]],[[1358,1358],"mapped",[1406]],[[1359,1359],"mapped",[1407]],[[1360,1360],"mapped",[1408]],[[1361,1361],"mapped",[1409]],[[1362,1362],"mapped",[1410]],[[1363,1363],"mapped",[1411]],[[1364,1364],"mapped",[1412]],[[1365,1365],"mapped",[1413]],[[1366,1366],"mapped",[1414]],[[1367,1368],"disallowed"],[[1369,1369],"valid"],[[1370,1375],"valid",[],"NV8"],[[1376,1376],"disallowed"],[[1377,1414],"valid"],[[1415,1415],"mapped",[1381,1410]],[[1416,1416],"disallowed"],[[1417,1417],"valid",[],"NV8"],[[1418,1418],"valid",[],"NV8"],[[1419,1420],"disallowed"],[[1421,1422],"valid",[],"NV8"],[[1423,1423],"valid",[],"NV8"],[[1424,1424],"disallowed"],[[1425,1441],"valid"],[[1442,1442],"valid"],[[1443,1455],"valid"],[[1456,1465],"valid"],[[1466,1466],"valid"],[[1467,1469],"valid"],[[1470,1470],"valid",[],"NV8"],[[1471,1471],"valid"],[[1472,1472],"valid",[],"NV8"],[[1473,1474],"valid"],[[1475,1475],"valid",[],"NV8"],[[1476,1476],"valid"],[[1477,1477],"valid"],[[1478,1478],"valid",[],"NV8"],[[1479,1479],"valid"],[[1480,1487],"disallowed"],[[1488,1514],"valid"],[[1515,1519],"disallowed"],[[1520,1524],"valid"],[[1525,1535],"disallowed"],[[1536,1539],"disallowed"],[[1540,1540],"disallowed"],[[1541,1541],"disallowed"],[[1542,1546],"valid",[],"NV8"],[[1547,1547],"valid",[],"NV8"],[[1548,1548],"valid",[],"NV8"],[[1549,1551],"valid",[],"NV8"],[[1552,1557],"valid"],[[1558,1562],"valid"],[[1563,1563],"valid",[],"NV8"],[[1564,1564],"disallowed"],[[1565,1565],"disallowed"],[[1566,1566],"valid",[],"NV8"],[[1567,1567],"valid",[],"NV8"],[[1568,1568],"valid"],[[1569,1594],"valid"],[[1595,1599],"valid"],[[1600,1600],"valid",[],"NV8"],[[1601,1618],"valid"],[[1619,1621],"valid"],[[1622,1624],"valid"],[[1625,1630],"valid"],[[1631,1631],"valid"],[[1632,1641],"valid"],[[1642,1645],"valid",[],"NV8"],[[1646,1647],"valid"],[[1648,1652],"valid"],[[1653,1653],"mapped",[1575,1652]],[[1654,1654],"mapped",[1608,1652]],[[1655,1655],"mapped",[1735,1652]],[[1656,1656],"mapped",[1610,1652]],[[1657,1719],"valid"],[[1720,1721],"valid"],[[1722,1726],"valid"],[[1727,1727],"valid"],[[1728,1742],"valid"],[[1743,1743],"valid"],[[1744,1747],"valid"],[[1748,1748],"valid",[],"NV8"],[[1749,1756],"valid"],[[1757,1757],"disallowed"],[[1758,1758],"valid",[],"NV8"],[[1759,1768],"valid"],[[1769,1769],"valid",[],"NV8"],[[1770,1773],"valid"],[[1774,1775],"valid"],[[1776,1785],"valid"],[[1786,1790],"valid"],[[1791,1791],"valid"],[[1792,1805],"valid",[],"NV8"],[[1806,1806],"disallowed"],[[1807,1807],"disallowed"],[[1808,1836],"valid"],[[1837,1839],"valid"],[[1840,1866],"valid"],[[1867,1868],"disallowed"],[[1869,1871],"valid"],[[1872,1901],"valid"],[[1902,1919],"valid"],[[1920,1968],"valid"],[[1969,1969],"valid"],[[1970,1983],"disallowed"],[[1984,2037],"valid"],[[2038,2042],"valid",[],"NV8"],[[2043,2047],"disallowed"],[[2048,2093],"valid"],[[2094,2095],"disallowed"],[[2096,2110],"valid",[],"NV8"],[[2111,2111],"disallowed"],[[2112,2139],"valid"],[[2140,2141],"disallowed"],[[2142,2142],"valid",[],"NV8"],[[2143,2207],"disallowed"],[[2208,2208],"valid"],[[2209,2209],"valid"],[[2210,2220],"valid"],[[2221,2226],"valid"],[[2227,2228],"valid"],[[2229,2274],"disallowed"],[[2275,2275],"valid"],[[2276,2302],"valid"],[[2303,2303],"valid"],[[2304,2304],"valid"],[[2305,2307],"valid"],[[2308,2308],"valid"],[[2309,2361],"valid"],[[2362,2363],"valid"],[[2364,2381],"valid"],[[2382,2382],"valid"],[[2383,2383],"valid"],[[2384,2388],"valid"],[[2389,2389],"valid"],[[2390,2391],"valid"],[[2392,2392],"mapped",[2325,2364]],[[2393,2393],"mapped",[2326,2364]],[[2394,2394],"mapped",[2327,2364]],[[2395,2395],"mapped",[2332,2364]],[[2396,2396],"mapped",[2337,2364]],[[2397,2397],"mapped",[2338,2364]],[[2398,2398],"mapped",[2347,2364]],[[2399,2399],"mapped",[2351,2364]],[[2400,2403],"valid"],[[2404,2405],"valid",[],"NV8"],[[2406,2415],"valid"],[[2416,2416],"valid",[],"NV8"],[[2417,2418],"valid"],[[2419,2423],"valid"],[[2424,2424],"valid"],[[2425,2426],"valid"],[[2427,2428],"valid"],[[2429,2429],"valid"],[[2430,2431],"valid"],[[2432,2432],"valid"],[[2433,2435],"valid"],[[2436,2436],"disallowed"],[[2437,2444],"valid"],[[2445,2446],"disallowed"],[[2447,2448],"valid"],[[2449,2450],"disallowed"],[[2451,2472],"valid"],[[2473,2473],"disallowed"],[[2474,2480],"valid"],[[2481,2481],"disallowed"],[[2482,2482],"valid"],[[2483,2485],"disallowed"],[[2486,2489],"valid"],[[2490,2491],"disallowed"],[[2492,2492],"valid"],[[2493,2493],"valid"],[[2494,2500],"valid"],[[2501,2502],"disallowed"],[[2503,2504],"valid"],[[2505,2506],"disallowed"],[[2507,2509],"valid"],[[2510,2510],"valid"],[[2511,2518],"disallowed"],[[2519,2519],"valid"],[[2520,2523],"disallowed"],[[2524,2524],"mapped",[2465,2492]],[[2525,2525],"mapped",[2466,2492]],[[2526,2526],"disallowed"],[[2527,2527],"mapped",[2479,2492]],[[2528,2531],"valid"],[[2532,2533],"disallowed"],[[2534,2545],"valid"],[[2546,2554],"valid",[],"NV8"],[[2555,2555],"valid",[],"NV8"],[[2556,2560],"disallowed"],[[2561,2561],"valid"],[[2562,2562],"valid"],[[2563,2563],"valid"],[[2564,2564],"disallowed"],[[2565,2570],"valid"],[[2571,2574],"disallowed"],[[2575,2576],"valid"],[[2577,2578],"disallowed"],[[2579,2600],"valid"],[[2601,2601],"disallowed"],[[2602,2608],"valid"],[[2609,2609],"disallowed"],[[2610,2610],"valid"],[[2611,2611],"mapped",[2610,2620]],[[2612,2612],"disallowed"],[[2613,2613],"valid"],[[2614,2614],"mapped",[2616,2620]],[[2615,2615],"disallowed"],[[2616,2617],"valid"],[[2618,2619],"disallowed"],[[2620,2620],"valid"],[[2621,2621],"disallowed"],[[2622,2626],"valid"],[[2627,2630],"disallowed"],[[2631,2632],"valid"],[[2633,2634],"disallowed"],[[2635,2637],"valid"],[[2638,2640],"disallowed"],[[2641,2641],"valid"],[[2642,2648],"disallowed"],[[2649,2649],"mapped",[2582,2620]],[[2650,2650],"mapped",[2583,2620]],[[2651,2651],"mapped",[2588,2620]],[[2652,2652],"valid"],[[2653,2653],"disallowed"],[[2654,2654],"mapped",[2603,2620]],[[2655,2661],"disallowed"],[[2662,2676],"valid"],[[2677,2677],"valid"],[[2678,2688],"disallowed"],[[2689,2691],"valid"],[[2692,2692],"disallowed"],[[2693,2699],"valid"],[[2700,2700],"valid"],[[2701,2701],"valid"],[[2702,2702],"disallowed"],[[2703,2705],"valid"],[[2706,2706],"disallowed"],[[2707,2728],"valid"],[[2729,2729],"disallowed"],[[2730,2736],"valid"],[[2737,2737],"disallowed"],[[2738,2739],"valid"],[[2740,2740],"disallowed"],[[2741,2745],"valid"],[[2746,2747],"disallowed"],[[2748,2757],"valid"],[[2758,2758],"disallowed"],[[2759,2761],"valid"],[[2762,2762],"disallowed"],[[2763,2765],"valid"],[[2766,2767],"disallowed"],[[2768,2768],"valid"],[[2769,2783],"disallowed"],[[2784,2784],"valid"],[[2785,2787],"valid"],[[2788,2789],"disallowed"],[[2790,2799],"valid"],[[2800,2800],"valid",[],"NV8"],[[2801,2801],"valid",[],"NV8"],[[2802,2808],"disallowed"],[[2809,2809],"valid"],[[2810,2816],"disallowed"],[[2817,2819],"valid"],[[2820,2820],"disallowed"],[[2821,2828],"valid"],[[2829,2830],"disallowed"],[[2831,2832],"valid"],[[2833,2834],"disallowed"],[[2835,2856],"valid"],[[2857,2857],"disallowed"],[[2858,2864],"valid"],[[2865,2865],"disallowed"],[[2866,2867],"valid"],[[2868,2868],"disallowed"],[[2869,2869],"valid"],[[2870,2873],"valid"],[[2874,2875],"disallowed"],[[2876,2883],"valid"],[[2884,2884],"valid"],[[2885,2886],"disallowed"],[[2887,2888],"valid"],[[2889,2890],"disallowed"],[[2891,2893],"valid"],[[2894,2901],"disallowed"],[[2902,2903],"valid"],[[2904,2907],"disallowed"],[[2908,2908],"mapped",[2849,2876]],[[2909,2909],"mapped",[2850,2876]],[[2910,2910],"disallowed"],[[2911,2913],"valid"],[[2914,2915],"valid"],[[2916,2917],"disallowed"],[[2918,2927],"valid"],[[2928,2928],"valid",[],"NV8"],[[2929,2929],"valid"],[[2930,2935],"valid",[],"NV8"],[[2936,2945],"disallowed"],[[2946,2947],"valid"],[[2948,2948],"disallowed"],[[2949,2954],"valid"],[[2955,2957],"disallowed"],[[2958,2960],"valid"],[[2961,2961],"disallowed"],[[2962,2965],"valid"],[[2966,2968],"disallowed"],[[2969,2970],"valid"],[[2971,2971],"disallowed"],[[2972,2972],"valid"],[[2973,2973],"disallowed"],[[2974,2975],"valid"],[[2976,2978],"disallowed"],[[2979,2980],"valid"],[[2981,2983],"disallowed"],[[2984,2986],"valid"],[[2987,2989],"disallowed"],[[2990,2997],"valid"],[[2998,2998],"valid"],[[2999,3001],"valid"],[[3002,3005],"disallowed"],[[3006,3010],"valid"],[[3011,3013],"disallowed"],[[3014,3016],"valid"],[[3017,3017],"disallowed"],[[3018,3021],"valid"],[[3022,3023],"disallowed"],[[3024,3024],"valid"],[[3025,3030],"disallowed"],[[3031,3031],"valid"],[[3032,3045],"disallowed"],[[3046,3046],"valid"],[[3047,3055],"valid"],[[3056,3058],"valid",[],"NV8"],[[3059,3066],"valid",[],"NV8"],[[3067,3071],"disallowed"],[[3072,3072],"valid"],[[3073,3075],"valid"],[[3076,3076],"disallowed"],[[3077,3084],"valid"],[[3085,3085],"disallowed"],[[3086,3088],"valid"],[[3089,3089],"disallowed"],[[3090,3112],"valid"],[[3113,3113],"disallowed"],[[3114,3123],"valid"],[[3124,3124],"valid"],[[3125,3129],"valid"],[[3130,3132],"disallowed"],[[3133,3133],"valid"],[[3134,3140],"valid"],[[3141,3141],"disallowed"],[[3142,3144],"valid"],[[3145,3145],"disallowed"],[[3146,3149],"valid"],[[3150,3156],"disallowed"],[[3157,3158],"valid"],[[3159,3159],"disallowed"],[[3160,3161],"valid"],[[3162,3162],"valid"],[[3163,3167],"disallowed"],[[3168,3169],"valid"],[[3170,3171],"valid"],[[3172,3173],"disallowed"],[[3174,3183],"valid"],[[3184,3191],"disallowed"],[[3192,3199],"valid",[],"NV8"],[[3200,3200],"disallowed"],[[3201,3201],"valid"],[[3202,3203],"valid"],[[3204,3204],"disallowed"],[[3205,3212],"valid"],[[3213,3213],"disallowed"],[[3214,3216],"valid"],[[3217,3217],"disallowed"],[[3218,3240],"valid"],[[3241,3241],"disallowed"],[[3242,3251],"valid"],[[3252,3252],"disallowed"],[[3253,3257],"valid"],[[3258,3259],"disallowed"],[[3260,3261],"valid"],[[3262,3268],"valid"],[[3269,3269],"disallowed"],[[3270,3272],"valid"],[[3273,3273],"disallowed"],[[3274,3277],"valid"],[[3278,3284],"disallowed"],[[3285,3286],"valid"],[[3287,3293],"disallowed"],[[3294,3294],"valid"],[[3295,3295],"disallowed"],[[3296,3297],"valid"],[[3298,3299],"valid"],[[3300,3301],"disallowed"],[[3302,3311],"valid"],[[3312,3312],"disallowed"],[[3313,3314],"valid"],[[3315,3328],"disallowed"],[[3329,3329],"valid"],[[3330,3331],"valid"],[[3332,3332],"disallowed"],[[3333,3340],"valid"],[[3341,3341],"disallowed"],[[3342,3344],"valid"],[[3345,3345],"disallowed"],[[3346,3368],"valid"],[[3369,3369],"valid"],[[3370,3385],"valid"],[[3386,3386],"valid"],[[3387,3388],"disallowed"],[[3389,3389],"valid"],[[3390,3395],"valid"],[[3396,3396],"valid"],[[3397,3397],"disallowed"],[[3398,3400],"valid"],[[3401,3401],"disallowed"],[[3402,3405],"valid"],[[3406,3406],"valid"],[[3407,3414],"disallowed"],[[3415,3415],"valid"],[[3416,3422],"disallowed"],[[3423,3423],"valid"],[[3424,3425],"valid"],[[3426,3427],"valid"],[[3428,3429],"disallowed"],[[3430,3439],"valid"],[[3440,3445],"valid",[],"NV8"],[[3446,3448],"disallowed"],[[3449,3449],"valid",[],"NV8"],[[3450,3455],"valid"],[[3456,3457],"disallowed"],[[3458,3459],"valid"],[[3460,3460],"disallowed"],[[3461,3478],"valid"],[[3479,3481],"disallowed"],[[3482,3505],"valid"],[[3506,3506],"disallowed"],[[3507,3515],"valid"],[[3516,3516],"disallowed"],[[3517,3517],"valid"],[[3518,3519],"disallowed"],[[3520,3526],"valid"],[[3527,3529],"disallowed"],[[3530,3530],"valid"],[[3531,3534],"disallowed"],[[3535,3540],"valid"],[[3541,3541],"disallowed"],[[3542,3542],"valid"],[[3543,3543],"disallowed"],[[3544,3551],"valid"],[[3552,3557],"disallowed"],[[3558,3567],"valid"],[[3568,3569],"disallowed"],[[3570,3571],"valid"],[[3572,3572],"valid",[],"NV8"],[[3573,3584],"disallowed"],[[3585,3634],"valid"],[[3635,3635],"mapped",[3661,3634]],[[3636,3642],"valid"],[[3643,3646],"disallowed"],[[3647,3647],"valid",[],"NV8"],[[3648,3662],"valid"],[[3663,3663],"valid",[],"NV8"],[[3664,3673],"valid"],[[3674,3675],"valid",[],"NV8"],[[3676,3712],"disallowed"],[[3713,3714],"valid"],[[3715,3715],"disallowed"],[[3716,3716],"valid"],[[3717,3718],"disallowed"],[[3719,3720],"valid"],[[3721,3721],"disallowed"],[[3722,3722],"valid"],[[3723,3724],"disallowed"],[[3725,3725],"valid"],[[3726,3731],"disallowed"],[[3732,3735],"valid"],[[3736,3736],"disallowed"],[[3737,3743],"valid"],[[3744,3744],"disallowed"],[[3745,3747],"valid"],[[3748,3748],"disallowed"],[[3749,3749],"valid"],[[3750,3750],"disallowed"],[[3751,3751],"valid"],[[3752,3753],"disallowed"],[[3754,3755],"valid"],[[3756,3756],"disallowed"],[[3757,3762],"valid"],[[3763,3763],"mapped",[3789,3762]],[[3764,3769],"valid"],[[3770,3770],"disallowed"],[[3771,3773],"valid"],[[3774,3775],"disallowed"],[[3776,3780],"valid"],[[3781,3781],"disallowed"],[[3782,3782],"valid"],[[3783,3783],"disallowed"],[[3784,3789],"valid"],[[3790,3791],"disallowed"],[[3792,3801],"valid"],[[3802,3803],"disallowed"],[[3804,3804],"mapped",[3755,3737]],[[3805,3805],"mapped",[3755,3745]],[[3806,3807],"valid"],[[3808,3839],"disallowed"],[[3840,3840],"valid"],[[3841,3850],"valid",[],"NV8"],[[3851,3851],"valid"],[[3852,3852],"mapped",[3851]],[[3853,3863],"valid",[],"NV8"],[[3864,3865],"valid"],[[3866,3871],"valid",[],"NV8"],[[3872,3881],"valid"],[[3882,3892],"valid",[],"NV8"],[[3893,3893],"valid"],[[3894,3894],"valid",[],"NV8"],[[3895,3895],"valid"],[[3896,3896],"valid",[],"NV8"],[[3897,3897],"valid"],[[3898,3901],"valid",[],"NV8"],[[3902,3906],"valid"],[[3907,3907],"mapped",[3906,4023]],[[3908,3911],"valid"],[[3912,3912],"disallowed"],[[3913,3916],"valid"],[[3917,3917],"mapped",[3916,4023]],[[3918,3921],"valid"],[[3922,3922],"mapped",[3921,4023]],[[3923,3926],"valid"],[[3927,3927],"mapped",[3926,4023]],[[3928,3931],"valid"],[[3932,3932],"mapped",[3931,4023]],[[3933,3944],"valid"],[[3945,3945],"mapped",[3904,4021]],[[3946,3946],"valid"],[[3947,3948],"valid"],[[3949,3952],"disallowed"],[[3953,3954],"valid"],[[3955,3955],"mapped",[3953,3954]],[[3956,3956],"valid"],[[3957,3957],"mapped",[3953,3956]],[[3958,3958],"mapped",[4018,3968]],[[3959,3959],"mapped",[4018,3953,3968]],[[3960,3960],"mapped",[4019,3968]],[[3961,3961],"mapped",[4019,3953,3968]],[[3962,3968],"valid"],[[3969,3969],"mapped",[3953,3968]],[[3970,3972],"valid"],[[3973,3973],"valid",[],"NV8"],[[3974,3979],"valid"],[[3980,3983],"valid"],[[3984,3986],"valid"],[[3987,3987],"mapped",[3986,4023]],[[3988,3989],"valid"],[[3990,3990],"valid"],[[3991,3991],"valid"],[[3992,3992],"disallowed"],[[3993,3996],"valid"],[[3997,3997],"mapped",[3996,4023]],[[3998,4001],"valid"],[[4002,4002],"mapped",[4001,4023]],[[4003,4006],"valid"],[[4007,4007],"mapped",[4006,4023]],[[4008,4011],"valid"],[[4012,4012],"mapped",[4011,4023]],[[4013,4013],"valid"],[[4014,4016],"valid"],[[4017,4023],"valid"],[[4024,4024],"valid"],[[4025,4025],"mapped",[3984,4021]],[[4026,4028],"valid"],[[4029,4029],"disallowed"],[[4030,4037],"valid",[],"NV8"],[[4038,4038],"valid"],[[4039,4044],"valid",[],"NV8"],[[4045,4045],"disallowed"],[[4046,4046],"valid",[],"NV8"],[[4047,4047],"valid",[],"NV8"],[[4048,4049],"valid",[],"NV8"],[[4050,4052],"valid",[],"NV8"],[[4053,4056],"valid",[],"NV8"],[[4057,4058],"valid",[],"NV8"],[[4059,4095],"disallowed"],[[4096,4129],"valid"],[[4130,4130],"valid"],[[4131,4135],"valid"],[[4136,4136],"valid"],[[4137,4138],"valid"],[[4139,4139],"valid"],[[4140,4146],"valid"],[[4147,4149],"valid"],[[4150,4153],"valid"],[[4154,4159],"valid"],[[4160,4169],"valid"],[[4170,4175],"valid",[],"NV8"],[[4176,4185],"valid"],[[4186,4249],"valid"],[[4250,4253],"valid"],[[4254,4255],"valid",[],"NV8"],[[4256,4293],"disallowed"],[[4294,4294],"disallowed"],[[4295,4295],"mapped",[11559]],[[4296,4300],"disallowed"],[[4301,4301],"mapped",[11565]],[[4302,4303],"disallowed"],[[4304,4342],"valid"],[[4343,4344],"valid"],[[4345,4346],"valid"],[[4347,4347],"valid",[],"NV8"],[[4348,4348],"mapped",[4316]],[[4349,4351],"valid"],[[4352,4441],"valid",[],"NV8"],[[4442,4446],"valid",[],"NV8"],[[4447,4448],"disallowed"],[[4449,4514],"valid",[],"NV8"],[[4515,4519],"valid",[],"NV8"],[[4520,4601],"valid",[],"NV8"],[[4602,4607],"valid",[],"NV8"],[[4608,4614],"valid"],[[4615,4615],"valid"],[[4616,4678],"valid"],[[4679,4679],"valid"],[[4680,4680],"valid"],[[4681,4681],"disallowed"],[[4682,4685],"valid"],[[4686,4687],"disallowed"],[[4688,4694],"valid"],[[4695,4695],"disallowed"],[[4696,4696],"valid"],[[4697,4697],"disallowed"],[[4698,4701],"valid"],[[4702,4703],"disallowed"],[[4704,4742],"valid"],[[4743,4743],"valid"],[[4744,4744],"valid"],[[4745,4745],"disallowed"],[[4746,4749],"valid"],[[4750,4751],"disallowed"],[[4752,4782],"valid"],[[4783,4783],"valid"],[[4784,4784],"valid"],[[4785,4785],"disallowed"],[[4786,4789],"valid"],[[4790,4791],"disallowed"],[[4792,4798],"valid"],[[4799,4799],"disallowed"],[[4800,4800],"valid"],[[4801,4801],"disallowed"],[[4802,4805],"valid"],[[4806,4807],"disallowed"],[[4808,4814],"valid"],[[4815,4815],"valid"],[[4816,4822],"valid"],[[4823,4823],"disallowed"],[[4824,4846],"valid"],[[4847,4847],"valid"],[[4848,4878],"valid"],[[4879,4879],"valid"],[[4880,4880],"valid"],[[4881,4881],"disallowed"],[[4882,4885],"valid"],[[4886,4887],"disallowed"],[[4888,4894],"valid"],[[4895,4895],"valid"],[[4896,4934],"valid"],[[4935,4935],"valid"],[[4936,4954],"valid"],[[4955,4956],"disallowed"],[[4957,4958],"valid"],[[4959,4959],"valid"],[[4960,4960],"valid",[],"NV8"],[[4961,4988],"valid",[],"NV8"],[[4989,4991],"disallowed"],[[4992,5007],"valid"],[[5008,5017],"valid",[],"NV8"],[[5018,5023],"disallowed"],[[5024,5108],"valid"],[[5109,5109],"valid"],[[5110,5111],"disallowed"],[[5112,5112],"mapped",[5104]],[[5113,5113],"mapped",[5105]],[[5114,5114],"mapped",[5106]],[[5115,5115],"mapped",[5107]],[[5116,5116],"mapped",[5108]],[[5117,5117],"mapped",[5109]],[[5118,5119],"disallowed"],[[5120,5120],"valid",[],"NV8"],[[5121,5740],"valid"],[[5741,5742],"valid",[],"NV8"],[[5743,5750],"valid"],[[5751,5759],"valid"],[[5760,5760],"disallowed"],[[5761,5786],"valid"],[[5787,5788],"valid",[],"NV8"],[[5789,5791],"disallowed"],[[5792,5866],"valid"],[[5867,5872],"valid",[],"NV8"],[[5873,5880],"valid"],[[5881,5887],"disallowed"],[[5888,5900],"valid"],[[5901,5901],"disallowed"],[[5902,5908],"valid"],[[5909,5919],"disallowed"],[[5920,5940],"valid"],[[5941,5942],"valid",[],"NV8"],[[5943,5951],"disallowed"],[[5952,5971],"valid"],[[5972,5983],"disallowed"],[[5984,5996],"valid"],[[5997,5997],"disallowed"],[[5998,6000],"valid"],[[6001,6001],"disallowed"],[[6002,6003],"valid"],[[6004,6015],"disallowed"],[[6016,6067],"valid"],[[6068,6069],"disallowed"],[[6070,6099],"valid"],[[6100,6102],"valid",[],"NV8"],[[6103,6103],"valid"],[[6104,6107],"valid",[],"NV8"],[[6108,6108],"valid"],[[6109,6109],"valid"],[[6110,6111],"disallowed"],[[6112,6121],"valid"],[[6122,6127],"disallowed"],[[6128,6137],"valid",[],"NV8"],[[6138,6143],"disallowed"],[[6144,6149],"valid",[],"NV8"],[[6150,6150],"disallowed"],[[6151,6154],"valid",[],"NV8"],[[6155,6157],"ignored"],[[6158,6158],"disallowed"],[[6159,6159],"disallowed"],[[6160,6169],"valid"],[[6170,6175],"disallowed"],[[6176,6263],"valid"],[[6264,6271],"disallowed"],[[6272,6313],"valid"],[[6314,6314],"valid"],[[6315,6319],"disallowed"],[[6320,6389],"valid"],[[6390,6399],"disallowed"],[[6400,6428],"valid"],[[6429,6430],"valid"],[[6431,6431],"disallowed"],[[6432,6443],"valid"],[[6444,6447],"disallowed"],[[6448,6459],"valid"],[[6460,6463],"disallowed"],[[6464,6464],"valid",[],"NV8"],[[6465,6467],"disallowed"],[[6468,6469],"valid",[],"NV8"],[[6470,6509],"valid"],[[6510,6511],"disallowed"],[[6512,6516],"valid"],[[6517,6527],"disallowed"],[[6528,6569],"valid"],[[6570,6571],"valid"],[[6572,6575],"disallowed"],[[6576,6601],"valid"],[[6602,6607],"disallowed"],[[6608,6617],"valid"],[[6618,6618],"valid",[],"XV8"],[[6619,6621],"disallowed"],[[6622,6623],"valid",[],"NV8"],[[6624,6655],"valid",[],"NV8"],[[6656,6683],"valid"],[[6684,6685],"disallowed"],[[6686,6687],"valid",[],"NV8"],[[6688,6750],"valid"],[[6751,6751],"disallowed"],[[6752,6780],"valid"],[[6781,6782],"disallowed"],[[6783,6793],"valid"],[[6794,6799],"disallowed"],[[6800,6809],"valid"],[[6810,6815],"disallowed"],[[6816,6822],"valid",[],"NV8"],[[6823,6823],"valid"],[[6824,6829],"valid",[],"NV8"],[[6830,6831],"disallowed"],[[6832,6845],"valid"],[[6846,6846],"valid",[],"NV8"],[[6847,6911],"disallowed"],[[6912,6987],"valid"],[[6988,6991],"disallowed"],[[6992,7001],"valid"],[[7002,7018],"valid",[],"NV8"],[[7019,7027],"valid"],[[7028,7036],"valid",[],"NV8"],[[7037,7039],"disallowed"],[[7040,7082],"valid"],[[7083,7085],"valid"],[[7086,7097],"valid"],[[7098,7103],"valid"],[[7104,7155],"valid"],[[7156,7163],"disallowed"],[[7164,7167],"valid",[],"NV8"],[[7168,7223],"valid"],[[7224,7226],"disallowed"],[[7227,7231],"valid",[],"NV8"],[[7232,7241],"valid"],[[7242,7244],"disallowed"],[[7245,7293],"valid"],[[7294,7295],"valid",[],"NV8"],[[7296,7359],"disallowed"],[[7360,7367],"valid",[],"NV8"],[[7368,7375],"disallowed"],[[7376,7378],"valid"],[[7379,7379],"valid",[],"NV8"],[[7380,7410],"valid"],[[7411,7414],"valid"],[[7415,7415],"disallowed"],[[7416,7417],"valid"],[[7418,7423],"disallowed"],[[7424,7467],"valid"],[[7468,7468],"mapped",[97]],[[7469,7469],"mapped",[230]],[[7470,7470],"mapped",[98]],[[7471,7471],"valid"],[[7472,7472],"mapped",[100]],[[7473,7473],"mapped",[101]],[[7474,7474],"mapped",[477]],[[7475,7475],"mapped",[103]],[[7476,7476],"mapped",[104]],[[7477,7477],"mapped",[105]],[[7478,7478],"mapped",[106]],[[7479,7479],"mapped",[107]],[[7480,7480],"mapped",[108]],[[7481,7481],"mapped",[109]],[[7482,7482],"mapped",[110]],[[7483,7483],"valid"],[[7484,7484],"mapped",[111]],[[7485,7485],"mapped",[547]],[[7486,7486],"mapped",[112]],[[7487,7487],"mapped",[114]],[[7488,7488],"mapped",[116]],[[7489,7489],"mapped",[117]],[[7490,7490],"mapped",[119]],[[7491,7491],"mapped",[97]],[[7492,7492],"mapped",[592]],[[7493,7493],"mapped",[593]],[[7494,7494],"mapped",[7426]],[[7495,7495],"mapped",[98]],[[7496,7496],"mapped",[100]],[[7497,7497],"mapped",[101]],[[7498,7498],"mapped",[601]],[[7499,7499],"mapped",[603]],[[7500,7500],"mapped",[604]],[[7501,7501],"mapped",[103]],[[7502,7502],"valid"],[[7503,7503],"mapped",[107]],[[7504,7504],"mapped",[109]],[[7505,7505],"mapped",[331]],[[7506,7506],"mapped",[111]],[[7507,7507],"mapped",[596]],[[7508,7508],"mapped",[7446]],[[7509,7509],"mapped",[7447]],[[7510,7510],"mapped",[112]],[[7511,7511],"mapped",[116]],[[7512,7512],"mapped",[117]],[[7513,7513],"mapped",[7453]],[[7514,7514],"mapped",[623]],[[7515,7515],"mapped",[118]],[[7516,7516],"mapped",[7461]],[[7517,7517],"mapped",[946]],[[7518,7518],"mapped",[947]],[[7519,7519],"mapped",[948]],[[7520,7520],"mapped",[966]],[[7521,7521],"mapped",[967]],[[7522,7522],"mapped",[105]],[[7523,7523],"mapped",[114]],[[7524,7524],"mapped",[117]],[[7525,7525],"mapped",[118]],[[7526,7526],"mapped",[946]],[[7527,7527],"mapped",[947]],[[7528,7528],"mapped",[961]],[[7529,7529],"mapped",[966]],[[7530,7530],"mapped",[967]],[[7531,7531],"valid"],[[7532,7543],"valid"],[[7544,7544],"mapped",[1085]],[[7545,7578],"valid"],[[7579,7579],"mapped",[594]],[[7580,7580],"mapped",[99]],[[7581,7581],"mapped",[597]],[[7582,7582],"mapped",[240]],[[7583,7583],"mapped",[604]],[[7584,7584],"mapped",[102]],[[7585,7585],"mapped",[607]],[[7586,7586],"mapped",[609]],[[7587,7587],"mapped",[613]],[[7588,7588],"mapped",[616]],[[7589,7589],"mapped",[617]],[[7590,7590],"mapped",[618]],[[7591,7591],"mapped",[7547]],[[7592,7592],"mapped",[669]],[[7593,7593],"mapped",[621]],[[7594,7594],"mapped",[7557]],[[7595,7595],"mapped",[671]],[[7596,7596],"mapped",[625]],[[7597,7597],"mapped",[624]],[[7598,7598],"mapped",[626]],[[7599,7599],"mapped",[627]],[[7600,7600],"mapped",[628]],[[7601,7601],"mapped",[629]],[[7602,7602],"mapped",[632]],[[7603,7603],"mapped",[642]],[[7604,7604],"mapped",[643]],[[7605,7605],"mapped",[427]],[[7606,7606],"mapped",[649]],[[7607,7607],"mapped",[650]],[[7608,7608],"mapped",[7452]],[[7609,7609],"mapped",[651]],[[7610,7610],"mapped",[652]],[[7611,7611],"mapped",[122]],[[7612,7612],"mapped",[656]],[[7613,7613],"mapped",[657]],[[7614,7614],"mapped",[658]],[[7615,7615],"mapped",[952]],[[7616,7619],"valid"],[[7620,7626],"valid"],[[7627,7654],"valid"],[[7655,7669],"valid"],[[7670,7675],"disallowed"],[[7676,7676],"valid"],[[7677,7677],"valid"],[[7678,7679],"valid"],[[7680,7680],"mapped",[7681]],[[7681,7681],"valid"],[[7682,7682],"mapped",[7683]],[[7683,7683],"valid"],[[7684,7684],"mapped",[7685]],[[7685,7685],"valid"],[[7686,7686],"mapped",[7687]],[[7687,7687],"valid"],[[7688,7688],"mapped",[7689]],[[7689,7689],"valid"],[[7690,7690],"mapped",[7691]],[[7691,7691],"valid"],[[7692,7692],"mapped",[7693]],[[7693,7693],"valid"],[[7694,7694],"mapped",[7695]],[[7695,7695],"valid"],[[7696,7696],"mapped",[7697]],[[7697,7697],"valid"],[[7698,7698],"mapped",[7699]],[[7699,7699],"valid"],[[7700,7700],"mapped",[7701]],[[7701,7701],"valid"],[[7702,7702],"mapped",[7703]],[[7703,7703],"valid"],[[7704,7704],"mapped",[7705]],[[7705,7705],"valid"],[[7706,7706],"mapped",[7707]],[[7707,7707],"valid"],[[7708,7708],"mapped",[7709]],[[7709,7709],"valid"],[[7710,7710],"mapped",[7711]],[[7711,7711],"valid"],[[7712,7712],"mapped",[7713]],[[7713,7713],"valid"],[[7714,7714],"mapped",[7715]],[[7715,7715],"valid"],[[7716,7716],"mapped",[7717]],[[7717,7717],"valid"],[[7718,7718],"mapped",[7719]],[[7719,7719],"valid"],[[7720,7720],"mapped",[7721]],[[7721,7721],"valid"],[[7722,7722],"mapped",[7723]],[[7723,7723],"valid"],[[7724,7724],"mapped",[7725]],[[7725,7725],"valid"],[[7726,7726],"mapped",[7727]],[[7727,7727],"valid"],[[7728,7728],"mapped",[7729]],[[7729,7729],"valid"],[[7730,7730],"mapped",[7731]],[[7731,7731],"valid"],[[7732,7732],"mapped",[7733]],[[7733,7733],"valid"],[[7734,7734],"mapped",[7735]],[[7735,7735],"valid"],[[7736,7736],"mapped",[7737]],[[7737,7737],"valid"],[[7738,7738],"mapped",[7739]],[[7739,7739],"valid"],[[7740,7740],"mapped",[7741]],[[7741,7741],"valid"],[[7742,7742],"mapped",[7743]],[[7743,7743],"valid"],[[7744,7744],"mapped",[7745]],[[7745,7745],"valid"],[[7746,7746],"mapped",[7747]],[[7747,7747],"valid"],[[7748,7748],"mapped",[7749]],[[7749,7749],"valid"],[[7750,7750],"mapped",[7751]],[[7751,7751],"valid"],[[7752,7752],"mapped",[7753]],[[7753,7753],"valid"],[[7754,7754],"mapped",[7755]],[[7755,7755],"valid"],[[7756,7756],"mapped",[7757]],[[7757,7757],"valid"],[[7758,7758],"mapped",[7759]],[[7759,7759],"valid"],[[7760,7760],"mapped",[7761]],[[7761,7761],"valid"],[[7762,7762],"mapped",[7763]],[[7763,7763],"valid"],[[7764,7764],"mapped",[7765]],[[7765,7765],"valid"],[[7766,7766],"mapped",[7767]],[[7767,7767],"valid"],[[7768,7768],"mapped",[7769]],[[7769,7769],"valid"],[[7770,7770],"mapped",[7771]],[[7771,7771],"valid"],[[7772,7772],"mapped",[7773]],[[7773,7773],"valid"],[[7774,7774],"mapped",[7775]],[[7775,7775],"valid"],[[7776,7776],"mapped",[7777]],[[7777,7777],"valid"],[[7778,7778],"mapped",[7779]],[[7779,7779],"valid"],[[7780,7780],"mapped",[7781]],[[7781,7781],"valid"],[[7782,7782],"mapped",[7783]],[[7783,7783],"valid"],[[7784,7784],"mapped",[7785]],[[7785,7785],"valid"],[[7786,7786],"mapped",[7787]],[[7787,7787],"valid"],[[7788,7788],"mapped",[7789]],[[7789,7789],"valid"],[[7790,7790],"mapped",[7791]],[[7791,7791],"valid"],[[7792,7792],"mapped",[7793]],[[7793,7793],"valid"],[[7794,7794],"mapped",[7795]],[[7795,7795],"valid"],[[7796,7796],"mapped",[7797]],[[7797,7797],"valid"],[[7798,7798],"mapped",[7799]],[[7799,7799],"valid"],[[7800,7800],"mapped",[7801]],[[7801,7801],"valid"],[[7802,7802],"mapped",[7803]],[[7803,7803],"valid"],[[7804,7804],"mapped",[7805]],[[7805,7805],"valid"],[[7806,7806],"mapped",[7807]],[[7807,7807],"valid"],[[7808,7808],"mapped",[7809]],[[7809,7809],"valid"],[[7810,7810],"mapped",[7811]],[[7811,7811],"valid"],[[7812,7812],"mapped",[7813]],[[7813,7813],"valid"],[[7814,7814],"mapped",[7815]],[[7815,7815],"valid"],[[7816,7816],"mapped",[7817]],[[7817,7817],"valid"],[[7818,7818],"mapped",[7819]],[[7819,7819],"valid"],[[7820,7820],"mapped",[7821]],[[7821,7821],"valid"],[[7822,7822],"mapped",[7823]],[[7823,7823],"valid"],[[7824,7824],"mapped",[7825]],[[7825,7825],"valid"],[[7826,7826],"mapped",[7827]],[[7827,7827],"valid"],[[7828,7828],"mapped",[7829]],[[7829,7833],"valid"],[[7834,7834],"mapped",[97,702]],[[7835,7835],"mapped",[7777]],[[7836,7837],"valid"],[[7838,7838],"mapped",[115,115]],[[7839,7839],"valid"],[[7840,7840],"mapped",[7841]],[[7841,7841],"valid"],[[7842,7842],"mapped",[7843]],[[7843,7843],"valid"],[[7844,7844],"mapped",[7845]],[[7845,7845],"valid"],[[7846,7846],"mapped",[7847]],[[7847,7847],"valid"],[[7848,7848],"mapped",[7849]],[[7849,7849],"valid"],[[7850,7850],"mapped",[7851]],[[7851,7851],"valid"],[[7852,7852],"mapped",[7853]],[[7853,7853],"valid"],[[7854,7854],"mapped",[7855]],[[7855,7855],"valid"],[[7856,7856],"mapped",[7857]],[[7857,7857],"valid"],[[7858,7858],"mapped",[7859]],[[7859,7859],"valid"],[[7860,7860],"mapped",[7861]],[[7861,7861],"valid"],[[7862,7862],"mapped",[7863]],[[7863,7863],"valid"],[[7864,7864],"mapped",[7865]],[[7865,7865],"valid"],[[7866,7866],"mapped",[7867]],[[7867,7867],"valid"],[[7868,7868],"mapped",[7869]],[[7869,7869],"valid"],[[7870,7870],"mapped",[7871]],[[7871,7871],"valid"],[[7872,7872],"mapped",[7873]],[[7873,7873],"valid"],[[7874,7874],"mapped",[7875]],[[7875,7875],"valid"],[[7876,7876],"mapped",[7877]],[[7877,7877],"valid"],[[7878,7878],"mapped",[7879]],[[7879,7879],"valid"],[[7880,7880],"mapped",[7881]],[[7881,7881],"valid"],[[7882,7882],"mapped",[7883]],[[7883,7883],"valid"],[[7884,7884],"mapped",[7885]],[[7885,7885],"valid"],[[7886,7886],"mapped",[7887]],[[7887,7887],"valid"],[[7888,7888],"mapped",[7889]],[[7889,7889],"valid"],[[7890,7890],"mapped",[7891]],[[7891,7891],"valid"],[[7892,7892],"mapped",[7893]],[[7893,7893],"valid"],[[7894,7894],"mapped",[7895]],[[7895,7895],"valid"],[[7896,7896],"mapped",[7897]],[[7897,7897],"valid"],[[7898,7898],"mapped",[7899]],[[7899,7899],"valid"],[[7900,7900],"mapped",[7901]],[[7901,7901],"valid"],[[7902,7902],"mapped",[7903]],[[7903,7903],"valid"],[[7904,7904],"mapped",[7905]],[[7905,7905],"valid"],[[7906,7906],"mapped",[7907]],[[7907,7907],"valid"],[[7908,7908],"mapped",[7909]],[[7909,7909],"valid"],[[7910,7910],"mapped",[7911]],[[7911,7911],"valid"],[[7912,7912],"mapped",[7913]],[[7913,7913],"valid"],[[7914,7914],"mapped",[7915]],[[7915,7915],"valid"],[[7916,7916],"mapped",[7917]],[[7917,7917],"valid"],[[7918,7918],"mapped",[7919]],[[7919,7919],"valid"],[[7920,7920],"mapped",[7921]],[[7921,7921],"valid"],[[7922,7922],"mapped",[7923]],[[7923,7923],"valid"],[[7924,7924],"mapped",[7925]],[[7925,7925],"valid"],[[7926,7926],"mapped",[7927]],[[7927,7927],"valid"],[[7928,7928],"mapped",[7929]],[[7929,7929],"valid"],[[7930,7930],"mapped",[7931]],[[7931,7931],"valid"],[[7932,7932],"mapped",[7933]],[[7933,7933],"valid"],[[7934,7934],"mapped",[7935]],[[7935,7935],"valid"],[[7936,7943],"valid"],[[7944,7944],"mapped",[7936]],[[7945,7945],"mapped",[7937]],[[7946,7946],"mapped",[7938]],[[7947,7947],"mapped",[7939]],[[7948,7948],"mapped",[7940]],[[7949,7949],"mapped",[7941]],[[7950,7950],"mapped",[7942]],[[7951,7951],"mapped",[7943]],[[7952,7957],"valid"],[[7958,7959],"disallowed"],[[7960,7960],"mapped",[7952]],[[7961,7961],"mapped",[7953]],[[7962,7962],"mapped",[7954]],[[7963,7963],"mapped",[7955]],[[7964,7964],"mapped",[7956]],[[7965,7965],"mapped",[7957]],[[7966,7967],"disallowed"],[[7968,7975],"valid"],[[7976,7976],"mapped",[7968]],[[7977,7977],"mapped",[7969]],[[7978,7978],"mapped",[7970]],[[7979,7979],"mapped",[7971]],[[7980,7980],"mapped",[7972]],[[7981,7981],"mapped",[7973]],[[7982,7982],"mapped",[7974]],[[7983,7983],"mapped",[7975]],[[7984,7991],"valid"],[[7992,7992],"mapped",[7984]],[[7993,7993],"mapped",[7985]],[[7994,7994],"mapped",[7986]],[[7995,7995],"mapped",[7987]],[[7996,7996],"mapped",[7988]],[[7997,7997],"mapped",[7989]],[[7998,7998],"mapped",[7990]],[[7999,7999],"mapped",[7991]],[[8000,8005],"valid"],[[8006,8007],"disallowed"],[[8008,8008],"mapped",[8000]],[[8009,8009],"mapped",[8001]],[[8010,8010],"mapped",[8002]],[[8011,8011],"mapped",[8003]],[[8012,8012],"mapped",[8004]],[[8013,8013],"mapped",[8005]],[[8014,8015],"disallowed"],[[8016,8023],"valid"],[[8024,8024],"disallowed"],[[8025,8025],"mapped",[8017]],[[8026,8026],"disallowed"],[[8027,8027],"mapped",[8019]],[[8028,8028],"disallowed"],[[8029,8029],"mapped",[8021]],[[8030,8030],"disallowed"],[[8031,8031],"mapped",[8023]],[[8032,8039],"valid"],[[8040,8040],"mapped",[8032]],[[8041,8041],"mapped",[8033]],[[8042,8042],"mapped",[8034]],[[8043,8043],"mapped",[8035]],[[8044,8044],"mapped",[8036]],[[8045,8045],"mapped",[8037]],[[8046,8046],"mapped",[8038]],[[8047,8047],"mapped",[8039]],[[8048,8048],"valid"],[[8049,8049],"mapped",[940]],[[8050,8050],"valid"],[[8051,8051],"mapped",[941]],[[8052,8052],"valid"],[[8053,8053],"mapped",[942]],[[8054,8054],"valid"],[[8055,8055],"mapped",[943]],[[8056,8056],"valid"],[[8057,8057],"mapped",[972]],[[8058,8058],"valid"],[[8059,8059],"mapped",[973]],[[8060,8060],"valid"],[[8061,8061],"mapped",[974]],[[8062,8063],"disallowed"],[[8064,8064],"mapped",[7936,953]],[[8065,8065],"mapped",[7937,953]],[[8066,8066],"mapped",[7938,953]],[[8067,8067],"mapped",[7939,953]],[[8068,8068],"mapped",[7940,953]],[[8069,8069],"mapped",[7941,953]],[[8070,8070],"mapped",[7942,953]],[[8071,8071],"mapped",[7943,953]],[[8072,8072],"mapped",[7936,953]],[[8073,8073],"mapped",[7937,953]],[[8074,8074],"mapped",[7938,953]],[[8075,8075],"mapped",[7939,953]],[[8076,8076],"mapped",[7940,953]],[[8077,8077],"mapped",[7941,953]],[[8078,8078],"mapped",[7942,953]],[[8079,8079],"mapped",[7943,953]],[[8080,8080],"mapped",[7968,953]],[[8081,8081],"mapped",[7969,953]],[[8082,8082],"mapped",[7970,953]],[[8083,8083],"mapped",[7971,953]],[[8084,8084],"mapped",[7972,953]],[[8085,8085],"mapped",[7973,953]],[[8086,8086],"mapped",[7974,953]],[[8087,8087],"mapped",[7975,953]],[[8088,8088],"mapped",[7968,953]],[[8089,8089],"mapped",[7969,953]],[[8090,8090],"mapped",[7970,953]],[[8091,8091],"mapped",[7971,953]],[[8092,8092],"mapped",[7972,953]],[[8093,8093],"mapped",[7973,953]],[[8094,8094],"mapped",[7974,953]],[[8095,8095],"mapped",[7975,953]],[[8096,8096],"mapped",[8032,953]],[[8097,8097],"mapped",[8033,953]],[[8098,8098],"mapped",[8034,953]],[[8099,8099],"mapped",[8035,953]],[[8100,8100],"mapped",[8036,953]],[[8101,8101],"mapped",[8037,953]],[[8102,8102],"mapped",[8038,953]],[[8103,8103],"mapped",[8039,953]],[[8104,8104],"mapped",[8032,953]],[[8105,8105],"mapped",[8033,953]],[[8106,8106],"mapped",[8034,953]],[[8107,8107],"mapped",[8035,953]],[[8108,8108],"mapped",[8036,953]],[[8109,8109],"mapped",[8037,953]],[[8110,8110],"mapped",[8038,953]],[[8111,8111],"mapped",[8039,953]],[[8112,8113],"valid"],[[8114,8114],"mapped",[8048,953]],[[8115,8115],"mapped",[945,953]],[[8116,8116],"mapped",[940,953]],[[8117,8117],"disallowed"],[[8118,8118],"valid"],[[8119,8119],"mapped",[8118,953]],[[8120,8120],"mapped",[8112]],[[8121,8121],"mapped",[8113]],[[8122,8122],"mapped",[8048]],[[8123,8123],"mapped",[940]],[[8124,8124],"mapped",[945,953]],[[8125,8125],"disallowed_STD3_mapped",[32,787]],[[8126,8126],"mapped",[953]],[[8127,8127],"disallowed_STD3_mapped",[32,787]],[[8128,8128],"disallowed_STD3_mapped",[32,834]],[[8129,8129],"disallowed_STD3_mapped",[32,776,834]],[[8130,8130],"mapped",[8052,953]],[[8131,8131],"mapped",[951,953]],[[8132,8132],"mapped",[942,953]],[[8133,8133],"disallowed"],[[8134,8134],"valid"],[[8135,8135],"mapped",[8134,953]],[[8136,8136],"mapped",[8050]],[[8137,8137],"mapped",[941]],[[8138,8138],"mapped",[8052]],[[8139,8139],"mapped",[942]],[[8140,8140],"mapped",[951,953]],[[8141,8141],"disallowed_STD3_mapped",[32,787,768]],[[8142,8142],"disallowed_STD3_mapped",[32,787,769]],[[8143,8143],"disallowed_STD3_mapped",[32,787,834]],[[8144,8146],"valid"],[[8147,8147],"mapped",[912]],[[8148,8149],"disallowed"],[[8150,8151],"valid"],[[8152,8152],"mapped",[8144]],[[8153,8153],"mapped",[8145]],[[8154,8154],"mapped",[8054]],[[8155,8155],"mapped",[943]],[[8156,8156],"disallowed"],[[8157,8157],"disallowed_STD3_mapped",[32,788,768]],[[8158,8158],"disallowed_STD3_mapped",[32,788,769]],[[8159,8159],"disallowed_STD3_mapped",[32,788,834]],[[8160,8162],"valid"],[[8163,8163],"mapped",[944]],[[8164,8167],"valid"],[[8168,8168],"mapped",[8160]],[[8169,8169],"mapped",[8161]],[[8170,8170],"mapped",[8058]],[[8171,8171],"mapped",[973]],[[8172,8172],"mapped",[8165]],[[8173,8173],"disallowed_STD3_mapped",[32,776,768]],[[8174,8174],"disallowed_STD3_mapped",[32,776,769]],[[8175,8175],"disallowed_STD3_mapped",[96]],[[8176,8177],"disallowed"],[[8178,8178],"mapped",[8060,953]],[[8179,8179],"mapped",[969,953]],[[8180,8180],"mapped",[974,953]],[[8181,8181],"disallowed"],[[8182,8182],"valid"],[[8183,8183],"mapped",[8182,953]],[[8184,8184],"mapped",[8056]],[[8185,8185],"mapped",[972]],[[8186,8186],"mapped",[8060]],[[8187,8187],"mapped",[974]],[[8188,8188],"mapped",[969,953]],[[8189,8189],"disallowed_STD3_mapped",[32,769]],[[8190,8190],"disallowed_STD3_mapped",[32,788]],[[8191,8191],"disallowed"],[[8192,8202],"disallowed_STD3_mapped",[32]],[[8203,8203],"ignored"],[[8204,8205],"deviation",[]],[[8206,8207],"disallowed"],[[8208,8208],"valid",[],"NV8"],[[8209,8209],"mapped",[8208]],[[8210,8214],"valid",[],"NV8"],[[8215,8215],"disallowed_STD3_mapped",[32,819]],[[8216,8227],"valid",[],"NV8"],[[8228,8230],"disallowed"],[[8231,8231],"valid",[],"NV8"],[[8232,8238],"disallowed"],[[8239,8239],"disallowed_STD3_mapped",[32]],[[8240,8242],"valid",[],"NV8"],[[8243,8243],"mapped",[8242,8242]],[[8244,8244],"mapped",[8242,8242,8242]],[[8245,8245],"valid",[],"NV8"],[[8246,8246],"mapped",[8245,8245]],[[8247,8247],"mapped",[8245,8245,8245]],[[8248,8251],"valid",[],"NV8"],[[8252,8252],"disallowed_STD3_mapped",[33,33]],[[8253,8253],"valid",[],"NV8"],[[8254,8254],"disallowed_STD3_mapped",[32,773]],[[8255,8262],"valid",[],"NV8"],[[8263,8263],"disallowed_STD3_mapped",[63,63]],[[8264,8264],"disallowed_STD3_mapped",[63,33]],[[8265,8265],"disallowed_STD3_mapped",[33,63]],[[8266,8269],"valid",[],"NV8"],[[8270,8274],"valid",[],"NV8"],[[8275,8276],"valid",[],"NV8"],[[8277,8278],"valid",[],"NV8"],[[8279,8279],"mapped",[8242,8242,8242,8242]],[[8280,8286],"valid",[],"NV8"],[[8287,8287],"disallowed_STD3_mapped",[32]],[[8288,8288],"ignored"],[[8289,8291],"disallowed"],[[8292,8292],"ignored"],[[8293,8293],"disallowed"],[[8294,8297],"disallowed"],[[8298,8303],"disallowed"],[[8304,8304],"mapped",[48]],[[8305,8305],"mapped",[105]],[[8306,8307],"disallowed"],[[8308,8308],"mapped",[52]],[[8309,8309],"mapped",[53]],[[8310,8310],"mapped",[54]],[[8311,8311],"mapped",[55]],[[8312,8312],"mapped",[56]],[[8313,8313],"mapped",[57]],[[8314,8314],"disallowed_STD3_mapped",[43]],[[8315,8315],"mapped",[8722]],[[8316,8316],"disallowed_STD3_mapped",[61]],[[8317,8317],"disallowed_STD3_mapped",[40]],[[8318,8318],"disallowed_STD3_mapped",[41]],[[8319,8319],"mapped",[110]],[[8320,8320],"mapped",[48]],[[8321,8321],"mapped",[49]],[[8322,8322],"mapped",[50]],[[8323,8323],"mapped",[51]],[[8324,8324],"mapped",[52]],[[8325,8325],"mapped",[53]],[[8326,8326],"mapped",[54]],[[8327,8327],"mapped",[55]],[[8328,8328],"mapped",[56]],[[8329,8329],"mapped",[57]],[[8330,8330],"disallowed_STD3_mapped",[43]],[[8331,8331],"mapped",[8722]],[[8332,8332],"disallowed_STD3_mapped",[61]],[[8333,8333],"disallowed_STD3_mapped",[40]],[[8334,8334],"disallowed_STD3_mapped",[41]],[[8335,8335],"disallowed"],[[8336,8336],"mapped",[97]],[[8337,8337],"mapped",[101]],[[8338,8338],"mapped",[111]],[[8339,8339],"mapped",[120]],[[8340,8340],"mapped",[601]],[[8341,8341],"mapped",[104]],[[8342,8342],"mapped",[107]],[[8343,8343],"mapped",[108]],[[8344,8344],"mapped",[109]],[[8345,8345],"mapped",[110]],[[8346,8346],"mapped",[112]],[[8347,8347],"mapped",[115]],[[8348,8348],"mapped",[116]],[[8349,8351],"disallowed"],[[8352,8359],"valid",[],"NV8"],[[8360,8360],"mapped",[114,115]],[[8361,8362],"valid",[],"NV8"],[[8363,8363],"valid",[],"NV8"],[[8364,8364],"valid",[],"NV8"],[[8365,8367],"valid",[],"NV8"],[[8368,8369],"valid",[],"NV8"],[[8370,8373],"valid",[],"NV8"],[[8374,8376],"valid",[],"NV8"],[[8377,8377],"valid",[],"NV8"],[[8378,8378],"valid",[],"NV8"],[[8379,8381],"valid",[],"NV8"],[[8382,8382],"valid",[],"NV8"],[[8383,8399],"disallowed"],[[8400,8417],"valid",[],"NV8"],[[8418,8419],"valid",[],"NV8"],[[8420,8426],"valid",[],"NV8"],[[8427,8427],"valid",[],"NV8"],[[8428,8431],"valid",[],"NV8"],[[8432,8432],"valid",[],"NV8"],[[8433,8447],"disallowed"],[[8448,8448],"disallowed_STD3_mapped",[97,47,99]],[[8449,8449],"disallowed_STD3_mapped",[97,47,115]],[[8450,8450],"mapped",[99]],[[8451,8451],"mapped",[176,99]],[[8452,8452],"valid",[],"NV8"],[[8453,8453],"disallowed_STD3_mapped",[99,47,111]],[[8454,8454],"disallowed_STD3_mapped",[99,47,117]],[[8455,8455],"mapped",[603]],[[8456,8456],"valid",[],"NV8"],[[8457,8457],"mapped",[176,102]],[[8458,8458],"mapped",[103]],[[8459,8462],"mapped",[104]],[[8463,8463],"mapped",[295]],[[8464,8465],"mapped",[105]],[[8466,8467],"mapped",[108]],[[8468,8468],"valid",[],"NV8"],[[8469,8469],"mapped",[110]],[[8470,8470],"mapped",[110,111]],[[8471,8472],"valid",[],"NV8"],[[8473,8473],"mapped",[112]],[[8474,8474],"mapped",[113]],[[8475,8477],"mapped",[114]],[[8478,8479],"valid",[],"NV8"],[[8480,8480],"mapped",[115,109]],[[8481,8481],"mapped",[116,101,108]],[[8482,8482],"mapped",[116,109]],[[8483,8483],"valid",[],"NV8"],[[8484,8484],"mapped",[122]],[[8485,8485],"valid",[],"NV8"],[[8486,8486],"mapped",[969]],[[8487,8487],"valid",[],"NV8"],[[8488,8488],"mapped",[122]],[[8489,8489],"valid",[],"NV8"],[[8490,8490],"mapped",[107]],[[8491,8491],"mapped",[229]],[[8492,8492],"mapped",[98]],[[8493,8493],"mapped",[99]],[[8494,8494],"valid",[],"NV8"],[[8495,8496],"mapped",[101]],[[8497,8497],"mapped",[102]],[[8498,8498],"disallowed"],[[8499,8499],"mapped",[109]],[[8500,8500],"mapped",[111]],[[8501,8501],"mapped",[1488]],[[8502,8502],"mapped",[1489]],[[8503,8503],"mapped",[1490]],[[8504,8504],"mapped",[1491]],[[8505,8505],"mapped",[105]],[[8506,8506],"valid",[],"NV8"],[[8507,8507],"mapped",[102,97,120]],[[8508,8508],"mapped",[960]],[[8509,8510],"mapped",[947]],[[8511,8511],"mapped",[960]],[[8512,8512],"mapped",[8721]],[[8513,8516],"valid",[],"NV8"],[[8517,8518],"mapped",[100]],[[8519,8519],"mapped",[101]],[[8520,8520],"mapped",[105]],[[8521,8521],"mapped",[106]],[[8522,8523],"valid",[],"NV8"],[[8524,8524],"valid",[],"NV8"],[[8525,8525],"valid",[],"NV8"],[[8526,8526],"valid"],[[8527,8527],"valid",[],"NV8"],[[8528,8528],"mapped",[49,8260,55]],[[8529,8529],"mapped",[49,8260,57]],[[8530,8530],"mapped",[49,8260,49,48]],[[8531,8531],"mapped",[49,8260,51]],[[8532,8532],"mapped",[50,8260,51]],[[8533,8533],"mapped",[49,8260,53]],[[8534,8534],"mapped",[50,8260,53]],[[8535,8535],"mapped",[51,8260,53]],[[8536,8536],"mapped",[52,8260,53]],[[8537,8537],"mapped",[49,8260,54]],[[8538,8538],"mapped",[53,8260,54]],[[8539,8539],"mapped",[49,8260,56]],[[8540,8540],"mapped",[51,8260,56]],[[8541,8541],"mapped",[53,8260,56]],[[8542,8542],"mapped",[55,8260,56]],[[8543,8543],"mapped",[49,8260]],[[8544,8544],"mapped",[105]],[[8545,8545],"mapped",[105,105]],[[8546,8546],"mapped",[105,105,105]],[[8547,8547],"mapped",[105,118]],[[8548,8548],"mapped",[118]],[[8549,8549],"mapped",[118,105]],[[8550,8550],"mapped",[118,105,105]],[[8551,8551],"mapped",[118,105,105,105]],[[8552,8552],"mapped",[105,120]],[[8553,8553],"mapped",[120]],[[8554,8554],"mapped",[120,105]],[[8555,8555],"mapped",[120,105,105]],[[8556,8556],"mapped",[108]],[[8557,8557],"mapped",[99]],[[8558,8558],"mapped",[100]],[[8559,8559],"mapped",[109]],[[8560,8560],"mapped",[105]],[[8561,8561],"mapped",[105,105]],[[8562,8562],"mapped",[105,105,105]],[[8563,8563],"mapped",[105,118]],[[8564,8564],"mapped",[118]],[[8565,8565],"mapped",[118,105]],[[8566,8566],"mapped",[118,105,105]],[[8567,8567],"mapped",[118,105,105,105]],[[8568,8568],"mapped",[105,120]],[[8569,8569],"mapped",[120]],[[8570,8570],"mapped",[120,105]],[[8571,8571],"mapped",[120,105,105]],[[8572,8572],"mapped",[108]],[[8573,8573],"mapped",[99]],[[8574,8574],"mapped",[100]],[[8575,8575],"mapped",[109]],[[8576,8578],"valid",[],"NV8"],[[8579,8579],"disallowed"],[[8580,8580],"valid"],[[8581,8584],"valid",[],"NV8"],[[8585,8585],"mapped",[48,8260,51]],[[8586,8587],"valid",[],"NV8"],[[8588,8591],"disallowed"],[[8592,8682],"valid",[],"NV8"],[[8683,8691],"valid",[],"NV8"],[[8692,8703],"valid",[],"NV8"],[[8704,8747],"valid",[],"NV8"],[[8748,8748],"mapped",[8747,8747]],[[8749,8749],"mapped",[8747,8747,8747]],[[8750,8750],"valid",[],"NV8"],[[8751,8751],"mapped",[8750,8750]],[[8752,8752],"mapped",[8750,8750,8750]],[[8753,8799],"valid",[],"NV8"],[[8800,8800],"disallowed_STD3_valid"],[[8801,8813],"valid",[],"NV8"],[[8814,8815],"disallowed_STD3_valid"],[[8816,8945],"valid",[],"NV8"],[[8946,8959],"valid",[],"NV8"],[[8960,8960],"valid",[],"NV8"],[[8961,8961],"valid",[],"NV8"],[[8962,9000],"valid",[],"NV8"],[[9001,9001],"mapped",[12296]],[[9002,9002],"mapped",[12297]],[[9003,9082],"valid",[],"NV8"],[[9083,9083],"valid",[],"NV8"],[[9084,9084],"valid",[],"NV8"],[[9085,9114],"valid",[],"NV8"],[[9115,9166],"valid",[],"NV8"],[[9167,9168],"valid",[],"NV8"],[[9169,9179],"valid",[],"NV8"],[[9180,9191],"valid",[],"NV8"],[[9192,9192],"valid",[],"NV8"],[[9193,9203],"valid",[],"NV8"],[[9204,9210],"valid",[],"NV8"],[[9211,9215],"disallowed"],[[9216,9252],"valid",[],"NV8"],[[9253,9254],"valid",[],"NV8"],[[9255,9279],"disallowed"],[[9280,9290],"valid",[],"NV8"],[[9291,9311],"disallowed"],[[9312,9312],"mapped",[49]],[[9313,9313],"mapped",[50]],[[9314,9314],"mapped",[51]],[[9315,9315],"mapped",[52]],[[9316,9316],"mapped",[53]],[[9317,9317],"mapped",[54]],[[9318,9318],"mapped",[55]],[[9319,9319],"mapped",[56]],[[9320,9320],"mapped",[57]],[[9321,9321],"mapped",[49,48]],[[9322,9322],"mapped",[49,49]],[[9323,9323],"mapped",[49,50]],[[9324,9324],"mapped",[49,51]],[[9325,9325],"mapped",[49,52]],[[9326,9326],"mapped",[49,53]],[[9327,9327],"mapped",[49,54]],[[9328,9328],"mapped",[49,55]],[[9329,9329],"mapped",[49,56]],[[9330,9330],"mapped",[49,57]],[[9331,9331],"mapped",[50,48]],[[9332,9332],"disallowed_STD3_mapped",[40,49,41]],[[9333,9333],"disallowed_STD3_mapped",[40,50,41]],[[9334,9334],"disallowed_STD3_mapped",[40,51,41]],[[9335,9335],"disallowed_STD3_mapped",[40,52,41]],[[9336,9336],"disallowed_STD3_mapped",[40,53,41]],[[9337,9337],"disallowed_STD3_mapped",[40,54,41]],[[9338,9338],"disallowed_STD3_mapped",[40,55,41]],[[9339,9339],"disallowed_STD3_mapped",[40,56,41]],[[9340,9340],"disallowed_STD3_mapped",[40,57,41]],[[9341,9341],"disallowed_STD3_mapped",[40,49,48,41]],[[9342,9342],"disallowed_STD3_mapped",[40,49,49,41]],[[9343,9343],"disallowed_STD3_mapped",[40,49,50,41]],[[9344,9344],"disallowed_STD3_mapped",[40,49,51,41]],[[9345,9345],"disallowed_STD3_mapped",[40,49,52,41]],[[9346,9346],"disallowed_STD3_mapped",[40,49,53,41]],[[9347,9347],"disallowed_STD3_mapped",[40,49,54,41]],[[9348,9348],"disallowed_STD3_mapped",[40,49,55,41]],[[9349,9349],"disallowed_STD3_mapped",[40,49,56,41]],[[9350,9350],"disallowed_STD3_mapped",[40,49,57,41]],[[9351,9351],"disallowed_STD3_mapped",[40,50,48,41]],[[9352,9371],"disallowed"],[[9372,9372],"disallowed_STD3_mapped",[40,97,41]],[[9373,9373],"disallowed_STD3_mapped",[40,98,41]],[[9374,9374],"disallowed_STD3_mapped",[40,99,41]],[[9375,9375],"disallowed_STD3_mapped",[40,100,41]],[[9376,9376],"disallowed_STD3_mapped",[40,101,41]],[[9377,9377],"disallowed_STD3_mapped",[40,102,41]],[[9378,9378],"disallowed_STD3_mapped",[40,103,41]],[[9379,9379],"disallowed_STD3_mapped",[40,104,41]],[[9380,9380],"disallowed_STD3_mapped",[40,105,41]],[[9381,9381],"disallowed_STD3_mapped",[40,106,41]],[[9382,9382],"disallowed_STD3_mapped",[40,107,41]],[[9383,9383],"disallowed_STD3_mapped",[40,108,41]],[[9384,9384],"disallowed_STD3_mapped",[40,109,41]],[[9385,9385],"disallowed_STD3_mapped",[40,110,41]],[[9386,9386],"disallowed_STD3_mapped",[40,111,41]],[[9387,9387],"disallowed_STD3_mapped",[40,112,41]],[[9388,9388],"disallowed_STD3_mapped",[40,113,41]],[[9389,9389],"disallowed_STD3_mapped",[40,114,41]],[[9390,9390],"disallowed_STD3_mapped",[40,115,41]],[[9391,9391],"disallowed_STD3_mapped",[40,116,41]],[[9392,9392],"disallowed_STD3_mapped",[40,117,41]],[[9393,9393],"disallowed_STD3_mapped",[40,118,41]],[[9394,9394],"disallowed_STD3_mapped",[40,119,41]],[[9395,9395],"disallowed_STD3_mapped",[40,120,41]],[[9396,9396],"disallowed_STD3_mapped",[40,121,41]],[[9397,9397],"disallowed_STD3_mapped",[40,122,41]],[[9398,9398],"mapped",[97]],[[9399,9399],"mapped",[98]],[[9400,9400],"mapped",[99]],[[9401,9401],"mapped",[100]],[[9402,9402],"mapped",[101]],[[9403,9403],"mapped",[102]],[[9404,9404],"mapped",[103]],[[9405,9405],"mapped",[104]],[[9406,9406],"mapped",[105]],[[9407,9407],"mapped",[106]],[[9408,9408],"mapped",[107]],[[9409,9409],"mapped",[108]],[[9410,9410],"mapped",[109]],[[9411,9411],"mapped",[110]],[[9412,9412],"mapped",[111]],[[9413,9413],"mapped",[112]],[[9414,9414],"mapped",[113]],[[9415,9415],"mapped",[114]],[[9416,9416],"mapped",[115]],[[9417,9417],"mapped",[116]],[[9418,9418],"mapped",[117]],[[9419,9419],"mapped",[118]],[[9420,9420],"mapped",[119]],[[9421,9421],"mapped",[120]],[[9422,9422],"mapped",[121]],[[9423,9423],"mapped",[122]],[[9424,9424],"mapped",[97]],[[9425,9425],"mapped",[98]],[[9426,9426],"mapped",[99]],[[9427,9427],"mapped",[100]],[[9428,9428],"mapped",[101]],[[9429,9429],"mapped",[102]],[[9430,9430],"mapped",[103]],[[9431,9431],"mapped",[104]],[[9432,9432],"mapped",[105]],[[9433,9433],"mapped",[106]],[[9434,9434],"mapped",[107]],[[9435,9435],"mapped",[108]],[[9436,9436],"mapped",[109]],[[9437,9437],"mapped",[110]],[[9438,9438],"mapped",[111]],[[9439,9439],"mapped",[112]],[[9440,9440],"mapped",[113]],[[9441,9441],"mapped",[114]],[[9442,9442],"mapped",[115]],[[9443,9443],"mapped",[116]],[[9444,9444],"mapped",[117]],[[9445,9445],"mapped",[118]],[[9446,9446],"mapped",[119]],[[9447,9447],"mapped",[120]],[[9448,9448],"mapped",[121]],[[9449,9449],"mapped",[122]],[[9450,9450],"mapped",[48]],[[9451,9470],"valid",[],"NV8"],[[9471,9471],"valid",[],"NV8"],[[9472,9621],"valid",[],"NV8"],[[9622,9631],"valid",[],"NV8"],[[9632,9711],"valid",[],"NV8"],[[9712,9719],"valid",[],"NV8"],[[9720,9727],"valid",[],"NV8"],[[9728,9747],"valid",[],"NV8"],[[9748,9749],"valid",[],"NV8"],[[9750,9751],"valid",[],"NV8"],[[9752,9752],"valid",[],"NV8"],[[9753,9753],"valid",[],"NV8"],[[9754,9839],"valid",[],"NV8"],[[9840,9841],"valid",[],"NV8"],[[9842,9853],"valid",[],"NV8"],[[9854,9855],"valid",[],"NV8"],[[9856,9865],"valid",[],"NV8"],[[9866,9873],"valid",[],"NV8"],[[9874,9884],"valid",[],"NV8"],[[9885,9885],"valid",[],"NV8"],[[9886,9887],"valid",[],"NV8"],[[9888,9889],"valid",[],"NV8"],[[9890,9905],"valid",[],"NV8"],[[9906,9906],"valid",[],"NV8"],[[9907,9916],"valid",[],"NV8"],[[9917,9919],"valid",[],"NV8"],[[9920,9923],"valid",[],"NV8"],[[9924,9933],"valid",[],"NV8"],[[9934,9934],"valid",[],"NV8"],[[9935,9953],"valid",[],"NV8"],[[9954,9954],"valid",[],"NV8"],[[9955,9955],"valid",[],"NV8"],[[9956,9959],"valid",[],"NV8"],[[9960,9983],"valid",[],"NV8"],[[9984,9984],"valid",[],"NV8"],[[9985,9988],"valid",[],"NV8"],[[9989,9989],"valid",[],"NV8"],[[9990,9993],"valid",[],"NV8"],[[9994,9995],"valid",[],"NV8"],[[9996,10023],"valid",[],"NV8"],[[10024,10024],"valid",[],"NV8"],[[10025,10059],"valid",[],"NV8"],[[10060,10060],"valid",[],"NV8"],[[10061,10061],"valid",[],"NV8"],[[10062,10062],"valid",[],"NV8"],[[10063,10066],"valid",[],"NV8"],[[10067,10069],"valid",[],"NV8"],[[10070,10070],"valid",[],"NV8"],[[10071,10071],"valid",[],"NV8"],[[10072,10078],"valid",[],"NV8"],[[10079,10080],"valid",[],"NV8"],[[10081,10087],"valid",[],"NV8"],[[10088,10101],"valid",[],"NV8"],[[10102,10132],"valid",[],"NV8"],[[10133,10135],"valid",[],"NV8"],[[10136,10159],"valid",[],"NV8"],[[10160,10160],"valid",[],"NV8"],[[10161,10174],"valid",[],"NV8"],[[10175,10175],"valid",[],"NV8"],[[10176,10182],"valid",[],"NV8"],[[10183,10186],"valid",[],"NV8"],[[10187,10187],"valid",[],"NV8"],[[10188,10188],"valid",[],"NV8"],[[10189,10189],"valid",[],"NV8"],[[10190,10191],"valid",[],"NV8"],[[10192,10219],"valid",[],"NV8"],[[10220,10223],"valid",[],"NV8"],[[10224,10239],"valid",[],"NV8"],[[10240,10495],"valid",[],"NV8"],[[10496,10763],"valid",[],"NV8"],[[10764,10764],"mapped",[8747,8747,8747,8747]],[[10765,10867],"valid",[],"NV8"],[[10868,10868],"disallowed_STD3_mapped",[58,58,61]],[[10869,10869],"disallowed_STD3_mapped",[61,61]],[[10870,10870],"disallowed_STD3_mapped",[61,61,61]],[[10871,10971],"valid",[],"NV8"],[[10972,10972],"mapped",[10973,824]],[[10973,11007],"valid",[],"NV8"],[[11008,11021],"valid",[],"NV8"],[[11022,11027],"valid",[],"NV8"],[[11028,11034],"valid",[],"NV8"],[[11035,11039],"valid",[],"NV8"],[[11040,11043],"valid",[],"NV8"],[[11044,11084],"valid",[],"NV8"],[[11085,11087],"valid",[],"NV8"],[[11088,11092],"valid",[],"NV8"],[[11093,11097],"valid",[],"NV8"],[[11098,11123],"valid",[],"NV8"],[[11124,11125],"disallowed"],[[11126,11157],"valid",[],"NV8"],[[11158,11159],"disallowed"],[[11160,11193],"valid",[],"NV8"],[[11194,11196],"disallowed"],[[11197,11208],"valid",[],"NV8"],[[11209,11209],"disallowed"],[[11210,11217],"valid",[],"NV8"],[[11218,11243],"disallowed"],[[11244,11247],"valid",[],"NV8"],[[11248,11263],"disallowed"],[[11264,11264],"mapped",[11312]],[[11265,11265],"mapped",[11313]],[[11266,11266],"mapped",[11314]],[[11267,11267],"mapped",[11315]],[[11268,11268],"mapped",[11316]],[[11269,11269],"mapped",[11317]],[[11270,11270],"mapped",[11318]],[[11271,11271],"mapped",[11319]],[[11272,11272],"mapped",[11320]],[[11273,11273],"mapped",[11321]],[[11274,11274],"mapped",[11322]],[[11275,11275],"mapped",[11323]],[[11276,11276],"mapped",[11324]],[[11277,11277],"mapped",[11325]],[[11278,11278],"mapped",[11326]],[[11279,11279],"mapped",[11327]],[[11280,11280],"mapped",[11328]],[[11281,11281],"mapped",[11329]],[[11282,11282],"mapped",[11330]],[[11283,11283],"mapped",[11331]],[[11284,11284],"mapped",[11332]],[[11285,11285],"mapped",[11333]],[[11286,11286],"mapped",[11334]],[[11287,11287],"mapped",[11335]],[[11288,11288],"mapped",[11336]],[[11289,11289],"mapped",[11337]],[[11290,11290],"mapped",[11338]],[[11291,11291],"mapped",[11339]],[[11292,11292],"mapped",[11340]],[[11293,11293],"mapped",[11341]],[[11294,11294],"mapped",[11342]],[[11295,11295],"mapped",[11343]],[[11296,11296],"mapped",[11344]],[[11297,11297],"mapped",[11345]],[[11298,11298],"mapped",[11346]],[[11299,11299],"mapped",[11347]],[[11300,11300],"mapped",[11348]],[[11301,11301],"mapped",[11349]],[[11302,11302],"mapped",[11350]],[[11303,11303],"mapped",[11351]],[[11304,11304],"mapped",[11352]],[[11305,11305],"mapped",[11353]],[[11306,11306],"mapped",[11354]],[[11307,11307],"mapped",[11355]],[[11308,11308],"mapped",[11356]],[[11309,11309],"mapped",[11357]],[[11310,11310],"mapped",[11358]],[[11311,11311],"disallowed"],[[11312,11358],"valid"],[[11359,11359],"disallowed"],[[11360,11360],"mapped",[11361]],[[11361,11361],"valid"],[[11362,11362],"mapped",[619]],[[11363,11363],"mapped",[7549]],[[11364,11364],"mapped",[637]],[[11365,11366],"valid"],[[11367,11367],"mapped",[11368]],[[11368,11368],"valid"],[[11369,11369],"mapped",[11370]],[[11370,11370],"valid"],[[11371,11371],"mapped",[11372]],[[11372,11372],"valid"],[[11373,11373],"mapped",[593]],[[11374,11374],"mapped",[625]],[[11375,11375],"mapped",[592]],[[11376,11376],"mapped",[594]],[[11377,11377],"valid"],[[11378,11378],"mapped",[11379]],[[11379,11379],"valid"],[[11380,11380],"valid"],[[11381,11381],"mapped",[11382]],[[11382,11383],"valid"],[[11384,11387],"valid"],[[11388,11388],"mapped",[106]],[[11389,11389],"mapped",[118]],[[11390,11390],"mapped",[575]],[[11391,11391],"mapped",[576]],[[11392,11392],"mapped",[11393]],[[11393,11393],"valid"],[[11394,11394],"mapped",[11395]],[[11395,11395],"valid"],[[11396,11396],"mapped",[11397]],[[11397,11397],"valid"],[[11398,11398],"mapped",[11399]],[[11399,11399],"valid"],[[11400,11400],"mapped",[11401]],[[11401,11401],"valid"],[[11402,11402],"mapped",[11403]],[[11403,11403],"valid"],[[11404,11404],"mapped",[11405]],[[11405,11405],"valid"],[[11406,11406],"mapped",[11407]],[[11407,11407],"valid"],[[11408,11408],"mapped",[11409]],[[11409,11409],"valid"],[[11410,11410],"mapped",[11411]],[[11411,11411],"valid"],[[11412,11412],"mapped",[11413]],[[11413,11413],"valid"],[[11414,11414],"mapped",[11415]],[[11415,11415],"valid"],[[11416,11416],"mapped",[11417]],[[11417,11417],"valid"],[[11418,11418],"mapped",[11419]],[[11419,11419],"valid"],[[11420,11420],"mapped",[11421]],[[11421,11421],"valid"],[[11422,11422],"mapped",[11423]],[[11423,11423],"valid"],[[11424,11424],"mapped",[11425]],[[11425,11425],"valid"],[[11426,11426],"mapped",[11427]],[[11427,11427],"valid"],[[11428,11428],"mapped",[11429]],[[11429,11429],"valid"],[[11430,11430],"mapped",[11431]],[[11431,11431],"valid"],[[11432,11432],"mapped",[11433]],[[11433,11433],"valid"],[[11434,11434],"mapped",[11435]],[[11435,11435],"valid"],[[11436,11436],"mapped",[11437]],[[11437,11437],"valid"],[[11438,11438],"mapped",[11439]],[[11439,11439],"valid"],[[11440,11440],"mapped",[11441]],[[11441,11441],"valid"],[[11442,11442],"mapped",[11443]],[[11443,11443],"valid"],[[11444,11444],"mapped",[11445]],[[11445,11445],"valid"],[[11446,11446],"mapped",[11447]],[[11447,11447],"valid"],[[11448,11448],"mapped",[11449]],[[11449,11449],"valid"],[[11450,11450],"mapped",[11451]],[[11451,11451],"valid"],[[11452,11452],"mapped",[11453]],[[11453,11453],"valid"],[[11454,11454],"mapped",[11455]],[[11455,11455],"valid"],[[11456,11456],"mapped",[11457]],[[11457,11457],"valid"],[[11458,11458],"mapped",[11459]],[[11459,11459],"valid"],[[11460,11460],"mapped",[11461]],[[11461,11461],"valid"],[[11462,11462],"mapped",[11463]],[[11463,11463],"valid"],[[11464,11464],"mapped",[11465]],[[11465,11465],"valid"],[[11466,11466],"mapped",[11467]],[[11467,11467],"valid"],[[11468,11468],"mapped",[11469]],[[11469,11469],"valid"],[[11470,11470],"mapped",[11471]],[[11471,11471],"valid"],[[11472,11472],"mapped",[11473]],[[11473,11473],"valid"],[[11474,11474],"mapped",[11475]],[[11475,11475],"valid"],[[11476,11476],"mapped",[11477]],[[11477,11477],"valid"],[[11478,11478],"mapped",[11479]],[[11479,11479],"valid"],[[11480,11480],"mapped",[11481]],[[11481,11481],"valid"],[[11482,11482],"mapped",[11483]],[[11483,11483],"valid"],[[11484,11484],"mapped",[11485]],[[11485,11485],"valid"],[[11486,11486],"mapped",[11487]],[[11487,11487],"valid"],[[11488,11488],"mapped",[11489]],[[11489,11489],"valid"],[[11490,11490],"mapped",[11491]],[[11491,11492],"valid"],[[11493,11498],"valid",[],"NV8"],[[11499,11499],"mapped",[11500]],[[11500,11500],"valid"],[[11501,11501],"mapped",[11502]],[[11502,11505],"valid"],[[11506,11506],"mapped",[11507]],[[11507,11507],"valid"],[[11508,11512],"disallowed"],[[11513,11519],"valid",[],"NV8"],[[11520,11557],"valid"],[[11558,11558],"disallowed"],[[11559,11559],"valid"],[[11560,11564],"disallowed"],[[11565,11565],"valid"],[[11566,11567],"disallowed"],[[11568,11621],"valid"],[[11622,11623],"valid"],[[11624,11630],"disallowed"],[[11631,11631],"mapped",[11617]],[[11632,11632],"valid",[],"NV8"],[[11633,11646],"disallowed"],[[11647,11647],"valid"],[[11648,11670],"valid"],[[11671,11679],"disallowed"],[[11680,11686],"valid"],[[11687,11687],"disallowed"],[[11688,11694],"valid"],[[11695,11695],"disallowed"],[[11696,11702],"valid"],[[11703,11703],"disallowed"],[[11704,11710],"valid"],[[11711,11711],"disallowed"],[[11712,11718],"valid"],[[11719,11719],"disallowed"],[[11720,11726],"valid"],[[11727,11727],"disallowed"],[[11728,11734],"valid"],[[11735,11735],"disallowed"],[[11736,11742],"valid"],[[11743,11743],"disallowed"],[[11744,11775],"valid"],[[11776,11799],"valid",[],"NV8"],[[11800,11803],"valid",[],"NV8"],[[11804,11805],"valid",[],"NV8"],[[11806,11822],"valid",[],"NV8"],[[11823,11823],"valid"],[[11824,11824],"valid",[],"NV8"],[[11825,11825],"valid",[],"NV8"],[[11826,11835],"valid",[],"NV8"],[[11836,11842],"valid",[],"NV8"],[[11843,11903],"disallowed"],[[11904,11929],"valid",[],"NV8"],[[11930,11930],"disallowed"],[[11931,11934],"valid",[],"NV8"],[[11935,11935],"mapped",[27597]],[[11936,12018],"valid",[],"NV8"],[[12019,12019],"mapped",[40863]],[[12020,12031],"disallowed"],[[12032,12032],"mapped",[19968]],[[12033,12033],"mapped",[20008]],[[12034,12034],"mapped",[20022]],[[12035,12035],"mapped",[20031]],[[12036,12036],"mapped",[20057]],[[12037,12037],"mapped",[20101]],[[12038,12038],"mapped",[20108]],[[12039,12039],"mapped",[20128]],[[12040,12040],"mapped",[20154]],[[12041,12041],"mapped",[20799]],[[12042,12042],"mapped",[20837]],[[12043,12043],"mapped",[20843]],[[12044,12044],"mapped",[20866]],[[12045,12045],"mapped",[20886]],[[12046,12046],"mapped",[20907]],[[12047,12047],"mapped",[20960]],[[12048,12048],"mapped",[20981]],[[12049,12049],"mapped",[20992]],[[12050,12050],"mapped",[21147]],[[12051,12051],"mapped",[21241]],[[12052,12052],"mapped",[21269]],[[12053,12053],"mapped",[21274]],[[12054,12054],"mapped",[21304]],[[12055,12055],"mapped",[21313]],[[12056,12056],"mapped",[21340]],[[12057,12057],"mapped",[21353]],[[12058,12058],"mapped",[21378]],[[12059,12059],"mapped",[21430]],[[12060,12060],"mapped",[21448]],[[12061,12061],"mapped",[21475]],[[12062,12062],"mapped",[22231]],[[12063,12063],"mapped",[22303]],[[12064,12064],"mapped",[22763]],[[12065,12065],"mapped",[22786]],[[12066,12066],"mapped",[22794]],[[12067,12067],"mapped",[22805]],[[12068,12068],"mapped",[22823]],[[12069,12069],"mapped",[22899]],[[12070,12070],"mapped",[23376]],[[12071,12071],"mapped",[23424]],[[12072,12072],"mapped",[23544]],[[12073,12073],"mapped",[23567]],[[12074,12074],"mapped",[23586]],[[12075,12075],"mapped",[23608]],[[12076,12076],"mapped",[23662]],[[12077,12077],"mapped",[23665]],[[12078,12078],"mapped",[24027]],[[12079,12079],"mapped",[24037]],[[12080,12080],"mapped",[24049]],[[12081,12081],"mapped",[24062]],[[12082,12082],"mapped",[24178]],[[12083,12083],"mapped",[24186]],[[12084,12084],"mapped",[24191]],[[12085,12085],"mapped",[24308]],[[12086,12086],"mapped",[24318]],[[12087,12087],"mapped",[24331]],[[12088,12088],"mapped",[24339]],[[12089,12089],"mapped",[24400]],[[12090,12090],"mapped",[24417]],[[12091,12091],"mapped",[24435]],[[12092,12092],"mapped",[24515]],[[12093,12093],"mapped",[25096]],[[12094,12094],"mapped",[25142]],[[12095,12095],"mapped",[25163]],[[12096,12096],"mapped",[25903]],[[12097,12097],"mapped",[25908]],[[12098,12098],"mapped",[25991]],[[12099,12099],"mapped",[26007]],[[12100,12100],"mapped",[26020]],[[12101,12101],"mapped",[26041]],[[12102,12102],"mapped",[26080]],[[12103,12103],"mapped",[26085]],[[12104,12104],"mapped",[26352]],[[12105,12105],"mapped",[26376]],[[12106,12106],"mapped",[26408]],[[12107,12107],"mapped",[27424]],[[12108,12108],"mapped",[27490]],[[12109,12109],"mapped",[27513]],[[12110,12110],"mapped",[27571]],[[12111,12111],"mapped",[27595]],[[12112,12112],"mapped",[27604]],[[12113,12113],"mapped",[27611]],[[12114,12114],"mapped",[27663]],[[12115,12115],"mapped",[27668]],[[12116,12116],"mapped",[27700]],[[12117,12117],"mapped",[28779]],[[12118,12118],"mapped",[29226]],[[12119,12119],"mapped",[29238]],[[12120,12120],"mapped",[29243]],[[12121,12121],"mapped",[29247]],[[12122,12122],"mapped",[29255]],[[12123,12123],"mapped",[29273]],[[12124,12124],"mapped",[29275]],[[12125,12125],"mapped",[29356]],[[12126,12126],"mapped",[29572]],[[12127,12127],"mapped",[29577]],[[12128,12128],"mapped",[29916]],[[12129,12129],"mapped",[29926]],[[12130,12130],"mapped",[29976]],[[12131,12131],"mapped",[29983]],[[12132,12132],"mapped",[29992]],[[12133,12133],"mapped",[30000]],[[12134,12134],"mapped",[30091]],[[12135,12135],"mapped",[30098]],[[12136,12136],"mapped",[30326]],[[12137,12137],"mapped",[30333]],[[12138,12138],"mapped",[30382]],[[12139,12139],"mapped",[30399]],[[12140,12140],"mapped",[30446]],[[12141,12141],"mapped",[30683]],[[12142,12142],"mapped",[30690]],[[12143,12143],"mapped",[30707]],[[12144,12144],"mapped",[31034]],[[12145,12145],"mapped",[31160]],[[12146,12146],"mapped",[31166]],[[12147,12147],"mapped",[31348]],[[12148,12148],"mapped",[31435]],[[12149,12149],"mapped",[31481]],[[12150,12150],"mapped",[31859]],[[12151,12151],"mapped",[31992]],[[12152,12152],"mapped",[32566]],[[12153,12153],"mapped",[32593]],[[12154,12154],"mapped",[32650]],[[12155,12155],"mapped",[32701]],[[12156,12156],"mapped",[32769]],[[12157,12157],"mapped",[32780]],[[12158,12158],"mapped",[32786]],[[12159,12159],"mapped",[32819]],[[12160,12160],"mapped",[32895]],[[12161,12161],"mapped",[32905]],[[12162,12162],"mapped",[33251]],[[12163,12163],"mapped",[33258]],[[12164,12164],"mapped",[33267]],[[12165,12165],"mapped",[33276]],[[12166,12166],"mapped",[33292]],[[12167,12167],"mapped",[33307]],[[12168,12168],"mapped",[33311]],[[12169,12169],"mapped",[33390]],[[12170,12170],"mapped",[33394]],[[12171,12171],"mapped",[33400]],[[12172,12172],"mapped",[34381]],[[12173,12173],"mapped",[34411]],[[12174,12174],"mapped",[34880]],[[12175,12175],"mapped",[34892]],[[12176,12176],"mapped",[34915]],[[12177,12177],"mapped",[35198]],[[12178,12178],"mapped",[35211]],[[12179,12179],"mapped",[35282]],[[12180,12180],"mapped",[35328]],[[12181,12181],"mapped",[35895]],[[12182,12182],"mapped",[35910]],[[12183,12183],"mapped",[35925]],[[12184,12184],"mapped",[35960]],[[12185,12185],"mapped",[35997]],[[12186,12186],"mapped",[36196]],[[12187,12187],"mapped",[36208]],[[12188,12188],"mapped",[36275]],[[12189,12189],"mapped",[36523]],[[12190,12190],"mapped",[36554]],[[12191,12191],"mapped",[36763]],[[12192,12192],"mapped",[36784]],[[12193,12193],"mapped",[36789]],[[12194,12194],"mapped",[37009]],[[12195,12195],"mapped",[37193]],[[12196,12196],"mapped",[37318]],[[12197,12197],"mapped",[37324]],[[12198,12198],"mapped",[37329]],[[12199,12199],"mapped",[38263]],[[12200,12200],"mapped",[38272]],[[12201,12201],"mapped",[38428]],[[12202,12202],"mapped",[38582]],[[12203,12203],"mapped",[38585]],[[12204,12204],"mapped",[38632]],[[12205,12205],"mapped",[38737]],[[12206,12206],"mapped",[38750]],[[12207,12207],"mapped",[38754]],[[12208,12208],"mapped",[38761]],[[12209,12209],"mapped",[38859]],[[12210,12210],"mapped",[38893]],[[12211,12211],"mapped",[38899]],[[12212,12212],"mapped",[38913]],[[12213,12213],"mapped",[39080]],[[12214,12214],"mapped",[39131]],[[12215,12215],"mapped",[39135]],[[12216,12216],"mapped",[39318]],[[12217,12217],"mapped",[39321]],[[12218,12218],"mapped",[39340]],[[12219,12219],"mapped",[39592]],[[12220,12220],"mapped",[39640]],[[12221,12221],"mapped",[39647]],[[12222,12222],"mapped",[39717]],[[12223,12223],"mapped",[39727]],[[12224,12224],"mapped",[39730]],[[12225,12225],"mapped",[39740]],[[12226,12226],"mapped",[39770]],[[12227,12227],"mapped",[40165]],[[12228,12228],"mapped",[40565]],[[12229,12229],"mapped",[40575]],[[12230,12230],"mapped",[40613]],[[12231,12231],"mapped",[40635]],[[12232,12232],"mapped",[40643]],[[12233,12233],"mapped",[40653]],[[12234,12234],"mapped",[40657]],[[12235,12235],"mapped",[40697]],[[12236,12236],"mapped",[40701]],[[12237,12237],"mapped",[40718]],[[12238,12238],"mapped",[40723]],[[12239,12239],"mapped",[40736]],[[12240,12240],"mapped",[40763]],[[12241,12241],"mapped",[40778]],[[12242,12242],"mapped",[40786]],[[12243,12243],"mapped",[40845]],[[12244,12244],"mapped",[40860]],[[12245,12245],"mapped",[40864]],[[12246,12271],"disallowed"],[[12272,12283],"disallowed"],[[12284,12287],"disallowed"],[[12288,12288],"disallowed_STD3_mapped",[32]],[[12289,12289],"valid",[],"NV8"],[[12290,12290],"mapped",[46]],[[12291,12292],"valid",[],"NV8"],[[12293,12295],"valid"],[[12296,12329],"valid",[],"NV8"],[[12330,12333],"valid"],[[12334,12341],"valid",[],"NV8"],[[12342,12342],"mapped",[12306]],[[12343,12343],"valid",[],"NV8"],[[12344,12344],"mapped",[21313]],[[12345,12345],"mapped",[21316]],[[12346,12346],"mapped",[21317]],[[12347,12347],"valid",[],"NV8"],[[12348,12348],"valid"],[[12349,12349],"valid",[],"NV8"],[[12350,12350],"valid",[],"NV8"],[[12351,12351],"valid",[],"NV8"],[[12352,12352],"disallowed"],[[12353,12436],"valid"],[[12437,12438],"valid"],[[12439,12440],"disallowed"],[[12441,12442],"valid"],[[12443,12443],"disallowed_STD3_mapped",[32,12441]],[[12444,12444],"disallowed_STD3_mapped",[32,12442]],[[12445,12446],"valid"],[[12447,12447],"mapped",[12424,12426]],[[12448,12448],"valid",[],"NV8"],[[12449,12542],"valid"],[[12543,12543],"mapped",[12467,12488]],[[12544,12548],"disallowed"],[[12549,12588],"valid"],[[12589,12589],"valid"],[[12590,12592],"disallowed"],[[12593,12593],"mapped",[4352]],[[12594,12594],"mapped",[4353]],[[12595,12595],"mapped",[4522]],[[12596,12596],"mapped",[4354]],[[12597,12597],"mapped",[4524]],[[12598,12598],"mapped",[4525]],[[12599,12599],"mapped",[4355]],[[12600,12600],"mapped",[4356]],[[12601,12601],"mapped",[4357]],[[12602,12602],"mapped",[4528]],[[12603,12603],"mapped",[4529]],[[12604,12604],"mapped",[4530]],[[12605,12605],"mapped",[4531]],[[12606,12606],"mapped",[4532]],[[12607,12607],"mapped",[4533]],[[12608,12608],"mapped",[4378]],[[12609,12609],"mapped",[4358]],[[12610,12610],"mapped",[4359]],[[12611,12611],"mapped",[4360]],[[12612,12612],"mapped",[4385]],[[12613,12613],"mapped",[4361]],[[12614,12614],"mapped",[4362]],[[12615,12615],"mapped",[4363]],[[12616,12616],"mapped",[4364]],[[12617,12617],"mapped",[4365]],[[12618,12618],"mapped",[4366]],[[12619,12619],"mapped",[4367]],[[12620,12620],"mapped",[4368]],[[12621,12621],"mapped",[4369]],[[12622,12622],"mapped",[4370]],[[12623,12623],"mapped",[4449]],[[12624,12624],"mapped",[4450]],[[12625,12625],"mapped",[4451]],[[12626,12626],"mapped",[4452]],[[12627,12627],"mapped",[4453]],[[12628,12628],"mapped",[4454]],[[12629,12629],"mapped",[4455]],[[12630,12630],"mapped",[4456]],[[12631,12631],"mapped",[4457]],[[12632,12632],"mapped",[4458]],[[12633,12633],"mapped",[4459]],[[12634,12634],"mapped",[4460]],[[12635,12635],"mapped",[4461]],[[12636,12636],"mapped",[4462]],[[12637,12637],"mapped",[4463]],[[12638,12638],"mapped",[4464]],[[12639,12639],"mapped",[4465]],[[12640,12640],"mapped",[4466]],[[12641,12641],"mapped",[4467]],[[12642,12642],"mapped",[4468]],[[12643,12643],"mapped",[4469]],[[12644,12644],"disallowed"],[[12645,12645],"mapped",[4372]],[[12646,12646],"mapped",[4373]],[[12647,12647],"mapped",[4551]],[[12648,12648],"mapped",[4552]],[[12649,12649],"mapped",[4556]],[[12650,12650],"mapped",[4558]],[[12651,12651],"mapped",[4563]],[[12652,12652],"mapped",[4567]],[[12653,12653],"mapped",[4569]],[[12654,12654],"mapped",[4380]],[[12655,12655],"mapped",[4573]],[[12656,12656],"mapped",[4575]],[[12657,12657],"mapped",[4381]],[[12658,12658],"mapped",[4382]],[[12659,12659],"mapped",[4384]],[[12660,12660],"mapped",[4386]],[[12661,12661],"mapped",[4387]],[[12662,12662],"mapped",[4391]],[[12663,12663],"mapped",[4393]],[[12664,12664],"mapped",[4395]],[[12665,12665],"mapped",[4396]],[[12666,12666],"mapped",[4397]],[[12667,12667],"mapped",[4398]],[[12668,12668],"mapped",[4399]],[[12669,12669],"mapped",[4402]],[[12670,12670],"mapped",[4406]],[[12671,12671],"mapped",[4416]],[[12672,12672],"mapped",[4423]],[[12673,12673],"mapped",[4428]],[[12674,12674],"mapped",[4593]],[[12675,12675],"mapped",[4594]],[[12676,12676],"mapped",[4439]],[[12677,12677],"mapped",[4440]],[[12678,12678],"mapped",[4441]],[[12679,12679],"mapped",[4484]],[[12680,12680],"mapped",[4485]],[[12681,12681],"mapped",[4488]],[[12682,12682],"mapped",[4497]],[[12683,12683],"mapped",[4498]],[[12684,12684],"mapped",[4500]],[[12685,12685],"mapped",[4510]],[[12686,12686],"mapped",[4513]],[[12687,12687],"disallowed"],[[12688,12689],"valid",[],"NV8"],[[12690,12690],"mapped",[19968]],[[12691,12691],"mapped",[20108]],[[12692,12692],"mapped",[19977]],[[12693,12693],"mapped",[22235]],[[12694,12694],"mapped",[19978]],[[12695,12695],"mapped",[20013]],[[12696,12696],"mapped",[19979]],[[12697,12697],"mapped",[30002]],[[12698,12698],"mapped",[20057]],[[12699,12699],"mapped",[19993]],[[12700,12700],"mapped",[19969]],[[12701,12701],"mapped",[22825]],[[12702,12702],"mapped",[22320]],[[12703,12703],"mapped",[20154]],[[12704,12727],"valid"],[[12728,12730],"valid"],[[12731,12735],"disallowed"],[[12736,12751],"valid",[],"NV8"],[[12752,12771],"valid",[],"NV8"],[[12772,12783],"disallowed"],[[12784,12799],"valid"],[[12800,12800],"disallowed_STD3_mapped",[40,4352,41]],[[12801,12801],"disallowed_STD3_mapped",[40,4354,41]],[[12802,12802],"disallowed_STD3_mapped",[40,4355,41]],[[12803,12803],"disallowed_STD3_mapped",[40,4357,41]],[[12804,12804],"disallowed_STD3_mapped",[40,4358,41]],[[12805,12805],"disallowed_STD3_mapped",[40,4359,41]],[[12806,12806],"disallowed_STD3_mapped",[40,4361,41]],[[12807,12807],"disallowed_STD3_mapped",[40,4363,41]],[[12808,12808],"disallowed_STD3_mapped",[40,4364,41]],[[12809,12809],"disallowed_STD3_mapped",[40,4366,41]],[[12810,12810],"disallowed_STD3_mapped",[40,4367,41]],[[12811,12811],"disallowed_STD3_mapped",[40,4368,41]],[[12812,12812],"disallowed_STD3_mapped",[40,4369,41]],[[12813,12813],"disallowed_STD3_mapped",[40,4370,41]],[[12814,12814],"disallowed_STD3_mapped",[40,44032,41]],[[12815,12815],"disallowed_STD3_mapped",[40,45208,41]],[[12816,12816],"disallowed_STD3_mapped",[40,45796,41]],[[12817,12817],"disallowed_STD3_mapped",[40,46972,41]],[[12818,12818],"disallowed_STD3_mapped",[40,47560,41]],[[12819,12819],"disallowed_STD3_mapped",[40,48148,41]],[[12820,12820],"disallowed_STD3_mapped",[40,49324,41]],[[12821,12821],"disallowed_STD3_mapped",[40,50500,41]],[[12822,12822],"disallowed_STD3_mapped",[40,51088,41]],[[12823,12823],"disallowed_STD3_mapped",[40,52264,41]],[[12824,12824],"disallowed_STD3_mapped",[40,52852,41]],[[12825,12825],"disallowed_STD3_mapped",[40,53440,41]],[[12826,12826],"disallowed_STD3_mapped",[40,54028,41]],[[12827,12827],"disallowed_STD3_mapped",[40,54616,41]],[[12828,12828],"disallowed_STD3_mapped",[40,51452,41]],[[12829,12829],"disallowed_STD3_mapped",[40,50724,51204,41]],[[12830,12830],"disallowed_STD3_mapped",[40,50724,54980,41]],[[12831,12831],"disallowed"],[[12832,12832],"disallowed_STD3_mapped",[40,19968,41]],[[12833,12833],"disallowed_STD3_mapped",[40,20108,41]],[[12834,12834],"disallowed_STD3_mapped",[40,19977,41]],[[12835,12835],"disallowed_STD3_mapped",[40,22235,41]],[[12836,12836],"disallowed_STD3_mapped",[40,20116,41]],[[12837,12837],"disallowed_STD3_mapped",[40,20845,41]],[[12838,12838],"disallowed_STD3_mapped",[40,19971,41]],[[12839,12839],"disallowed_STD3_mapped",[40,20843,41]],[[12840,12840],"disallowed_STD3_mapped",[40,20061,41]],[[12841,12841],"disallowed_STD3_mapped",[40,21313,41]],[[12842,12842],"disallowed_STD3_mapped",[40,26376,41]],[[12843,12843],"disallowed_STD3_mapped",[40,28779,41]],[[12844,12844],"disallowed_STD3_mapped",[40,27700,41]],[[12845,12845],"disallowed_STD3_mapped",[40,26408,41]],[[12846,12846],"disallowed_STD3_mapped",[40,37329,41]],[[12847,12847],"disallowed_STD3_mapped",[40,22303,41]],[[12848,12848],"disallowed_STD3_mapped",[40,26085,41]],[[12849,12849],"disallowed_STD3_mapped",[40,26666,41]],[[12850,12850],"disallowed_STD3_mapped",[40,26377,41]],[[12851,12851],"disallowed_STD3_mapped",[40,31038,41]],[[12852,12852],"disallowed_STD3_mapped",[40,21517,41]],[[12853,12853],"disallowed_STD3_mapped",[40,29305,41]],[[12854,12854],"disallowed_STD3_mapped",[40,36001,41]],[[12855,12855],"disallowed_STD3_mapped",[40,31069,41]],[[12856,12856],"disallowed_STD3_mapped",[40,21172,41]],[[12857,12857],"disallowed_STD3_mapped",[40,20195,41]],[[12858,12858],"disallowed_STD3_mapped",[40,21628,41]],[[12859,12859],"disallowed_STD3_mapped",[40,23398,41]],[[12860,12860],"disallowed_STD3_mapped",[40,30435,41]],[[12861,12861],"disallowed_STD3_mapped",[40,20225,41]],[[12862,12862],"disallowed_STD3_mapped",[40,36039,41]],[[12863,12863],"disallowed_STD3_mapped",[40,21332,41]],[[12864,12864],"disallowed_STD3_mapped",[40,31085,41]],[[12865,12865],"disallowed_STD3_mapped",[40,20241,41]],[[12866,12866],"disallowed_STD3_mapped",[40,33258,41]],[[12867,12867],"disallowed_STD3_mapped",[40,33267,41]],[[12868,12868],"mapped",[21839]],[[12869,12869],"mapped",[24188]],[[12870,12870],"mapped",[25991]],[[12871,12871],"mapped",[31631]],[[12872,12879],"valid",[],"NV8"],[[12880,12880],"mapped",[112,116,101]],[[12881,12881],"mapped",[50,49]],[[12882,12882],"mapped",[50,50]],[[12883,12883],"mapped",[50,51]],[[12884,12884],"mapped",[50,52]],[[12885,12885],"mapped",[50,53]],[[12886,12886],"mapped",[50,54]],[[12887,12887],"mapped",[50,55]],[[12888,12888],"mapped",[50,56]],[[12889,12889],"mapped",[50,57]],[[12890,12890],"mapped",[51,48]],[[12891,12891],"mapped",[51,49]],[[12892,12892],"mapped",[51,50]],[[12893,12893],"mapped",[51,51]],[[12894,12894],"mapped",[51,52]],[[12895,12895],"mapped",[51,53]],[[12896,12896],"mapped",[4352]],[[12897,12897],"mapped",[4354]],[[12898,12898],"mapped",[4355]],[[12899,12899],"mapped",[4357]],[[12900,12900],"mapped",[4358]],[[12901,12901],"mapped",[4359]],[[12902,12902],"mapped",[4361]],[[12903,12903],"mapped",[4363]],[[12904,12904],"mapped",[4364]],[[12905,12905],"mapped",[4366]],[[12906,12906],"mapped",[4367]],[[12907,12907],"mapped",[4368]],[[12908,12908],"mapped",[4369]],[[12909,12909],"mapped",[4370]],[[12910,12910],"mapped",[44032]],[[12911,12911],"mapped",[45208]],[[12912,12912],"mapped",[45796]],[[12913,12913],"mapped",[46972]],[[12914,12914],"mapped",[47560]],[[12915,12915],"mapped",[48148]],[[12916,12916],"mapped",[49324]],[[12917,12917],"mapped",[50500]],[[12918,12918],"mapped",[51088]],[[12919,12919],"mapped",[52264]],[[12920,12920],"mapped",[52852]],[[12921,12921],"mapped",[53440]],[[12922,12922],"mapped",[54028]],[[12923,12923],"mapped",[54616]],[[12924,12924],"mapped",[52280,44256]],[[12925,12925],"mapped",[51452,51032]],[[12926,12926],"mapped",[50864]],[[12927,12927],"valid",[],"NV8"],[[12928,12928],"mapped",[19968]],[[12929,12929],"mapped",[20108]],[[12930,12930],"mapped",[19977]],[[12931,12931],"mapped",[22235]],[[12932,12932],"mapped",[20116]],[[12933,12933],"mapped",[20845]],[[12934,12934],"mapped",[19971]],[[12935,12935],"mapped",[20843]],[[12936,12936],"mapped",[20061]],[[12937,12937],"mapped",[21313]],[[12938,12938],"mapped",[26376]],[[12939,12939],"mapped",[28779]],[[12940,12940],"mapped",[27700]],[[12941,12941],"mapped",[26408]],[[12942,12942],"mapped",[37329]],[[12943,12943],"mapped",[22303]],[[12944,12944],"mapped",[26085]],[[12945,12945],"mapped",[26666]],[[12946,12946],"mapped",[26377]],[[12947,12947],"mapped",[31038]],[[12948,12948],"mapped",[21517]],[[12949,12949],"mapped",[29305]],[[12950,12950],"mapped",[36001]],[[12951,12951],"mapped",[31069]],[[12952,12952],"mapped",[21172]],[[12953,12953],"mapped",[31192]],[[12954,12954],"mapped",[30007]],[[12955,12955],"mapped",[22899]],[[12956,12956],"mapped",[36969]],[[12957,12957],"mapped",[20778]],[[12958,12958],"mapped",[21360]],[[12959,12959],"mapped",[27880]],[[12960,12960],"mapped",[38917]],[[12961,12961],"mapped",[20241]],[[12962,12962],"mapped",[20889]],[[12963,12963],"mapped",[27491]],[[12964,12964],"mapped",[19978]],[[12965,12965],"mapped",[20013]],[[12966,12966],"mapped",[19979]],[[12967,12967],"mapped",[24038]],[[12968,12968],"mapped",[21491]],[[12969,12969],"mapped",[21307]],[[12970,12970],"mapped",[23447]],[[12971,12971],"mapped",[23398]],[[12972,12972],"mapped",[30435]],[[12973,12973],"mapped",[20225]],[[12974,12974],"mapped",[36039]],[[12975,12975],"mapped",[21332]],[[12976,12976],"mapped",[22812]],[[12977,12977],"mapped",[51,54]],[[12978,12978],"mapped",[51,55]],[[12979,12979],"mapped",[51,56]],[[12980,12980],"mapped",[51,57]],[[12981,12981],"mapped",[52,48]],[[12982,12982],"mapped",[52,49]],[[12983,12983],"mapped",[52,50]],[[12984,12984],"mapped",[52,51]],[[12985,12985],"mapped",[52,52]],[[12986,12986],"mapped",[52,53]],[[12987,12987],"mapped",[52,54]],[[12988,12988],"mapped",[52,55]],[[12989,12989],"mapped",[52,56]],[[12990,12990],"mapped",[52,57]],[[12991,12991],"mapped",[53,48]],[[12992,12992],"mapped",[49,26376]],[[12993,12993],"mapped",[50,26376]],[[12994,12994],"mapped",[51,26376]],[[12995,12995],"mapped",[52,26376]],[[12996,12996],"mapped",[53,26376]],[[12997,12997],"mapped",[54,26376]],[[12998,12998],"mapped",[55,26376]],[[12999,12999],"mapped",[56,26376]],[[13000,13000],"mapped",[57,26376]],[[13001,13001],"mapped",[49,48,26376]],[[13002,13002],"mapped",[49,49,26376]],[[13003,13003],"mapped",[49,50,26376]],[[13004,13004],"mapped",[104,103]],[[13005,13005],"mapped",[101,114,103]],[[13006,13006],"mapped",[101,118]],[[13007,13007],"mapped",[108,116,100]],[[13008,13008],"mapped",[12450]],[[13009,13009],"mapped",[12452]],[[13010,13010],"mapped",[12454]],[[13011,13011],"mapped",[12456]],[[13012,13012],"mapped",[12458]],[[13013,13013],"mapped",[12459]],[[13014,13014],"mapped",[12461]],[[13015,13015],"mapped",[12463]],[[13016,13016],"mapped",[12465]],[[13017,13017],"mapped",[12467]],[[13018,13018],"mapped",[12469]],[[13019,13019],"mapped",[12471]],[[13020,13020],"mapped",[12473]],[[13021,13021],"mapped",[12475]],[[13022,13022],"mapped",[12477]],[[13023,13023],"mapped",[12479]],[[13024,13024],"mapped",[12481]],[[13025,13025],"mapped",[12484]],[[13026,13026],"mapped",[12486]],[[13027,13027],"mapped",[12488]],[[13028,13028],"mapped",[12490]],[[13029,13029],"mapped",[12491]],[[13030,13030],"mapped",[12492]],[[13031,13031],"mapped",[12493]],[[13032,13032],"mapped",[12494]],[[13033,13033],"mapped",[12495]],[[13034,13034],"mapped",[12498]],[[13035,13035],"mapped",[12501]],[[13036,13036],"mapped",[12504]],[[13037,13037],"mapped",[12507]],[[13038,13038],"mapped",[12510]],[[13039,13039],"mapped",[12511]],[[13040,13040],"mapped",[12512]],[[13041,13041],"mapped",[12513]],[[13042,13042],"mapped",[12514]],[[13043,13043],"mapped",[12516]],[[13044,13044],"mapped",[12518]],[[13045,13045],"mapped",[12520]],[[13046,13046],"mapped",[12521]],[[13047,13047],"mapped",[12522]],[[13048,13048],"mapped",[12523]],[[13049,13049],"mapped",[12524]],[[13050,13050],"mapped",[12525]],[[13051,13051],"mapped",[12527]],[[13052,13052],"mapped",[12528]],[[13053,13053],"mapped",[12529]],[[13054,13054],"mapped",[12530]],[[13055,13055],"disallowed"],[[13056,13056],"mapped",[12450,12497,12540,12488]],[[13057,13057],"mapped",[12450,12523,12501,12449]],[[13058,13058],"mapped",[12450,12531,12506,12450]],[[13059,13059],"mapped",[12450,12540,12523]],[[13060,13060],"mapped",[12452,12491,12531,12464]],[[13061,13061],"mapped",[12452,12531,12481]],[[13062,13062],"mapped",[12454,12457,12531]],[[13063,13063],"mapped",[12456,12473,12463,12540,12489]],[[13064,13064],"mapped",[12456,12540,12459,12540]],[[13065,13065],"mapped",[12458,12531,12473]],[[13066,13066],"mapped",[12458,12540,12512]],[[13067,13067],"mapped",[12459,12452,12522]],[[13068,13068],"mapped",[12459,12521,12483,12488]],[[13069,13069],"mapped",[12459,12525,12522,12540]],[[13070,13070],"mapped",[12460,12525,12531]],[[13071,13071],"mapped",[12460,12531,12510]],[[13072,13072],"mapped",[12462,12460]],[[13073,13073],"mapped",[12462,12491,12540]],[[13074,13074],"mapped",[12461,12517,12522,12540]],[[13075,13075],"mapped",[12462,12523,12480,12540]],[[13076,13076],"mapped",[12461,12525]],[[13077,13077],"mapped",[12461,12525,12464,12521,12512]],[[13078,13078],"mapped",[12461,12525,12513,12540,12488,12523]],[[13079,13079],"mapped",[12461,12525,12527,12483,12488]],[[13080,13080],"mapped",[12464,12521,12512]],[[13081,13081],"mapped",[12464,12521,12512,12488,12531]],[[13082,13082],"mapped",[12463,12523,12476,12452,12525]],[[13083,13083],"mapped",[12463,12525,12540,12493]],[[13084,13084],"mapped",[12465,12540,12473]],[[13085,13085],"mapped",[12467,12523,12490]],[[13086,13086],"mapped",[12467,12540,12509]],[[13087,13087],"mapped",[12469,12452,12463,12523]],[[13088,13088],"mapped",[12469,12531,12481,12540,12512]],[[13089,13089],"mapped",[12471,12522,12531,12464]],[[13090,13090],"mapped",[12475,12531,12481]],[[13091,13091],"mapped",[12475,12531,12488]],[[13092,13092],"mapped",[12480,12540,12473]],[[13093,13093],"mapped",[12487,12471]],[[13094,13094],"mapped",[12489,12523]],[[13095,13095],"mapped",[12488,12531]],[[13096,13096],"mapped",[12490,12494]],[[13097,13097],"mapped",[12494,12483,12488]],[[13098,13098],"mapped",[12495,12452,12484]],[[13099,13099],"mapped",[12497,12540,12475,12531,12488]],[[13100,13100],"mapped",[12497,12540,12484]],[[13101,13101],"mapped",[12496,12540,12524,12523]],[[13102,13102],"mapped",[12500,12450,12473,12488,12523]],[[13103,13103],"mapped",[12500,12463,12523]],[[13104,13104],"mapped",[12500,12467]],[[13105,13105],"mapped",[12499,12523]],[[13106,13106],"mapped",[12501,12449,12521,12483,12489]],[[13107,13107],"mapped",[12501,12451,12540,12488]],[[13108,13108],"mapped",[12502,12483,12471,12455,12523]],[[13109,13109],"mapped",[12501,12521,12531]],[[13110,13110],"mapped",[12504,12463,12479,12540,12523]],[[13111,13111],"mapped",[12506,12477]],[[13112,13112],"mapped",[12506,12491,12498]],[[13113,13113],"mapped",[12504,12523,12484]],[[13114,13114],"mapped",[12506,12531,12473]],[[13115,13115],"mapped",[12506,12540,12472]],[[13116,13116],"mapped",[12505,12540,12479]],[[13117,13117],"mapped",[12509,12452,12531,12488]],[[13118,13118],"mapped",[12508,12523,12488]],[[13119,13119],"mapped",[12507,12531]],[[13120,13120],"mapped",[12509,12531,12489]],[[13121,13121],"mapped",[12507,12540,12523]],[[13122,13122],"mapped",[12507,12540,12531]],[[13123,13123],"mapped",[12510,12452,12463,12525]],[[13124,13124],"mapped",[12510,12452,12523]],[[13125,13125],"mapped",[12510,12483,12495]],[[13126,13126],"mapped",[12510,12523,12463]],[[13127,13127],"mapped",[12510,12531,12471,12519,12531]],[[13128,13128],"mapped",[12511,12463,12525,12531]],[[13129,13129],"mapped",[12511,12522]],[[13130,13130],"mapped",[12511,12522,12496,12540,12523]],[[13131,13131],"mapped",[12513,12460]],[[13132,13132],"mapped",[12513,12460,12488,12531]],[[13133,13133],"mapped",[12513,12540,12488,12523]],[[13134,13134],"mapped",[12516,12540,12489]],[[13135,13135],"mapped",[12516,12540,12523]],[[13136,13136],"mapped",[12518,12450,12531]],[[13137,13137],"mapped",[12522,12483,12488,12523]],[[13138,13138],"mapped",[12522,12521]],[[13139,13139],"mapped",[12523,12500,12540]],[[13140,13140],"mapped",[12523,12540,12502,12523]],[[13141,13141],"mapped",[12524,12512]],[[13142,13142],"mapped",[12524,12531,12488,12466,12531]],[[13143,13143],"mapped",[12527,12483,12488]],[[13144,13144],"mapped",[48,28857]],[[13145,13145],"mapped",[49,28857]],[[13146,13146],"mapped",[50,28857]],[[13147,13147],"mapped",[51,28857]],[[13148,13148],"mapped",[52,28857]],[[13149,13149],"mapped",[53,28857]],[[13150,13150],"mapped",[54,28857]],[[13151,13151],"mapped",[55,28857]],[[13152,13152],"mapped",[56,28857]],[[13153,13153],"mapped",[57,28857]],[[13154,13154],"mapped",[49,48,28857]],[[13155,13155],"mapped",[49,49,28857]],[[13156,13156],"mapped",[49,50,28857]],[[13157,13157],"mapped",[49,51,28857]],[[13158,13158],"mapped",[49,52,28857]],[[13159,13159],"mapped",[49,53,28857]],[[13160,13160],"mapped",[49,54,28857]],[[13161,13161],"mapped",[49,55,28857]],[[13162,13162],"mapped",[49,56,28857]],[[13163,13163],"mapped",[49,57,28857]],[[13164,13164],"mapped",[50,48,28857]],[[13165,13165],"mapped",[50,49,28857]],[[13166,13166],"mapped",[50,50,28857]],[[13167,13167],"mapped",[50,51,28857]],[[13168,13168],"mapped",[50,52,28857]],[[13169,13169],"mapped",[104,112,97]],[[13170,13170],"mapped",[100,97]],[[13171,13171],"mapped",[97,117]],[[13172,13172],"mapped",[98,97,114]],[[13173,13173],"mapped",[111,118]],[[13174,13174],"mapped",[112,99]],[[13175,13175],"mapped",[100,109]],[[13176,13176],"mapped",[100,109,50]],[[13177,13177],"mapped",[100,109,51]],[[13178,13178],"mapped",[105,117]],[[13179,13179],"mapped",[24179,25104]],[[13180,13180],"mapped",[26157,21644]],[[13181,13181],"mapped",[22823,27491]],[[13182,13182],"mapped",[26126,27835]],[[13183,13183],"mapped",[26666,24335,20250,31038]],[[13184,13184],"mapped",[112,97]],[[13185,13185],"mapped",[110,97]],[[13186,13186],"mapped",[956,97]],[[13187,13187],"mapped",[109,97]],[[13188,13188],"mapped",[107,97]],[[13189,13189],"mapped",[107,98]],[[13190,13190],"mapped",[109,98]],[[13191,13191],"mapped",[103,98]],[[13192,13192],"mapped",[99,97,108]],[[13193,13193],"mapped",[107,99,97,108]],[[13194,13194],"mapped",[112,102]],[[13195,13195],"mapped",[110,102]],[[13196,13196],"mapped",[956,102]],[[13197,13197],"mapped",[956,103]],[[13198,13198],"mapped",[109,103]],[[13199,13199],"mapped",[107,103]],[[13200,13200],"mapped",[104,122]],[[13201,13201],"mapped",[107,104,122]],[[13202,13202],"mapped",[109,104,122]],[[13203,13203],"mapped",[103,104,122]],[[13204,13204],"mapped",[116,104,122]],[[13205,13205],"mapped",[956,108]],[[13206,13206],"mapped",[109,108]],[[13207,13207],"mapped",[100,108]],[[13208,13208],"mapped",[107,108]],[[13209,13209],"mapped",[102,109]],[[13210,13210],"mapped",[110,109]],[[13211,13211],"mapped",[956,109]],[[13212,13212],"mapped",[109,109]],[[13213,13213],"mapped",[99,109]],[[13214,13214],"mapped",[107,109]],[[13215,13215],"mapped",[109,109,50]],[[13216,13216],"mapped",[99,109,50]],[[13217,13217],"mapped",[109,50]],[[13218,13218],"mapped",[107,109,50]],[[13219,13219],"mapped",[109,109,51]],[[13220,13220],"mapped",[99,109,51]],[[13221,13221],"mapped",[109,51]],[[13222,13222],"mapped",[107,109,51]],[[13223,13223],"mapped",[109,8725,115]],[[13224,13224],"mapped",[109,8725,115,50]],[[13225,13225],"mapped",[112,97]],[[13226,13226],"mapped",[107,112,97]],[[13227,13227],"mapped",[109,112,97]],[[13228,13228],"mapped",[103,112,97]],[[13229,13229],"mapped",[114,97,100]],[[13230,13230],"mapped",[114,97,100,8725,115]],[[13231,13231],"mapped",[114,97,100,8725,115,50]],[[13232,13232],"mapped",[112,115]],[[13233,13233],"mapped",[110,115]],[[13234,13234],"mapped",[956,115]],[[13235,13235],"mapped",[109,115]],[[13236,13236],"mapped",[112,118]],[[13237,13237],"mapped",[110,118]],[[13238,13238],"mapped",[956,118]],[[13239,13239],"mapped",[109,118]],[[13240,13240],"mapped",[107,118]],[[13241,13241],"mapped",[109,118]],[[13242,13242],"mapped",[112,119]],[[13243,13243],"mapped",[110,119]],[[13244,13244],"mapped",[956,119]],[[13245,13245],"mapped",[109,119]],[[13246,13246],"mapped",[107,119]],[[13247,13247],"mapped",[109,119]],[[13248,13248],"mapped",[107,969]],[[13249,13249],"mapped",[109,969]],[[13250,13250],"disallowed"],[[13251,13251],"mapped",[98,113]],[[13252,13252],"mapped",[99,99]],[[13253,13253],"mapped",[99,100]],[[13254,13254],"mapped",[99,8725,107,103]],[[13255,13255],"disallowed"],[[13256,13256],"mapped",[100,98]],[[13257,13257],"mapped",[103,121]],[[13258,13258],"mapped",[104,97]],[[13259,13259],"mapped",[104,112]],[[13260,13260],"mapped",[105,110]],[[13261,13261],"mapped",[107,107]],[[13262,13262],"mapped",[107,109]],[[13263,13263],"mapped",[107,116]],[[13264,13264],"mapped",[108,109]],[[13265,13265],"mapped",[108,110]],[[13266,13266],"mapped",[108,111,103]],[[13267,13267],"mapped",[108,120]],[[13268,13268],"mapped",[109,98]],[[13269,13269],"mapped",[109,105,108]],[[13270,13270],"mapped",[109,111,108]],[[13271,13271],"mapped",[112,104]],[[13272,13272],"disallowed"],[[13273,13273],"mapped",[112,112,109]],[[13274,13274],"mapped",[112,114]],[[13275,13275],"mapped",[115,114]],[[13276,13276],"mapped",[115,118]],[[13277,13277],"mapped",[119,98]],[[13278,13278],"mapped",[118,8725,109]],[[13279,13279],"mapped",[97,8725,109]],[[13280,13280],"mapped",[49,26085]],[[13281,13281],"mapped",[50,26085]],[[13282,13282],"mapped",[51,26085]],[[13283,13283],"mapped",[52,26085]],[[13284,13284],"mapped",[53,26085]],[[13285,13285],"mapped",[54,26085]],[[13286,13286],"mapped",[55,26085]],[[13287,13287],"mapped",[56,26085]],[[13288,13288],"mapped",[57,26085]],[[13289,13289],"mapped",[49,48,26085]],[[13290,13290],"mapped",[49,49,26085]],[[13291,13291],"mapped",[49,50,26085]],[[13292,13292],"mapped",[49,51,26085]],[[13293,13293],"mapped",[49,52,26085]],[[13294,13294],"mapped",[49,53,26085]],[[13295,13295],"mapped",[49,54,26085]],[[13296,13296],"mapped",[49,55,26085]],[[13297,13297],"mapped",[49,56,26085]],[[13298,13298],"mapped",[49,57,26085]],[[13299,13299],"mapped",[50,48,26085]],[[13300,13300],"mapped",[50,49,26085]],[[13301,13301],"mapped",[50,50,26085]],[[13302,13302],"mapped",[50,51,26085]],[[13303,13303],"mapped",[50,52,26085]],[[13304,13304],"mapped",[50,53,26085]],[[13305,13305],"mapped",[50,54,26085]],[[13306,13306],"mapped",[50,55,26085]],[[13307,13307],"mapped",[50,56,26085]],[[13308,13308],"mapped",[50,57,26085]],[[13309,13309],"mapped",[51,48,26085]],[[13310,13310],"mapped",[51,49,26085]],[[13311,13311],"mapped",[103,97,108]],[[13312,19893],"valid"],[[19894,19903],"disallowed"],[[19904,19967],"valid",[],"NV8"],[[19968,40869],"valid"],[[40870,40891],"valid"],[[40892,40899],"valid"],[[40900,40907],"valid"],[[40908,40908],"valid"],[[40909,40917],"valid"],[[40918,40959],"disallowed"],[[40960,42124],"valid"],[[42125,42127],"disallowed"],[[42128,42145],"valid",[],"NV8"],[[42146,42147],"valid",[],"NV8"],[[42148,42163],"valid",[],"NV8"],[[42164,42164],"valid",[],"NV8"],[[42165,42176],"valid",[],"NV8"],[[42177,42177],"valid",[],"NV8"],[[42178,42180],"valid",[],"NV8"],[[42181,42181],"valid",[],"NV8"],[[42182,42182],"valid",[],"NV8"],[[42183,42191],"disallowed"],[[42192,42237],"valid"],[[42238,42239],"valid",[],"NV8"],[[42240,42508],"valid"],[[42509,42511],"valid",[],"NV8"],[[42512,42539],"valid"],[[42540,42559],"disallowed"],[[42560,42560],"mapped",[42561]],[[42561,42561],"valid"],[[42562,42562],"mapped",[42563]],[[42563,42563],"valid"],[[42564,42564],"mapped",[42565]],[[42565,42565],"valid"],[[42566,42566],"mapped",[42567]],[[42567,42567],"valid"],[[42568,42568],"mapped",[42569]],[[42569,42569],"valid"],[[42570,42570],"mapped",[42571]],[[42571,42571],"valid"],[[42572,42572],"mapped",[42573]],[[42573,42573],"valid"],[[42574,42574],"mapped",[42575]],[[42575,42575],"valid"],[[42576,42576],"mapped",[42577]],[[42577,42577],"valid"],[[42578,42578],"mapped",[42579]],[[42579,42579],"valid"],[[42580,42580],"mapped",[42581]],[[42581,42581],"valid"],[[42582,42582],"mapped",[42583]],[[42583,42583],"valid"],[[42584,42584],"mapped",[42585]],[[42585,42585],"valid"],[[42586,42586],"mapped",[42587]],[[42587,42587],"valid"],[[42588,42588],"mapped",[42589]],[[42589,42589],"valid"],[[42590,42590],"mapped",[42591]],[[42591,42591],"valid"],[[42592,42592],"mapped",[42593]],[[42593,42593],"valid"],[[42594,42594],"mapped",[42595]],[[42595,42595],"valid"],[[42596,42596],"mapped",[42597]],[[42597,42597],"valid"],[[42598,42598],"mapped",[42599]],[[42599,42599],"valid"],[[42600,42600],"mapped",[42601]],[[42601,42601],"valid"],[[42602,42602],"mapped",[42603]],[[42603,42603],"valid"],[[42604,42604],"mapped",[42605]],[[42605,42607],"valid"],[[42608,42611],"valid",[],"NV8"],[[42612,42619],"valid"],[[42620,42621],"valid"],[[42622,42622],"valid",[],"NV8"],[[42623,42623],"valid"],[[42624,42624],"mapped",[42625]],[[42625,42625],"valid"],[[42626,42626],"mapped",[42627]],[[42627,42627],"valid"],[[42628,42628],"mapped",[42629]],[[42629,42629],"valid"],[[42630,42630],"mapped",[42631]],[[42631,42631],"valid"],[[42632,42632],"mapped",[42633]],[[42633,42633],"valid"],[[42634,42634],"mapped",[42635]],[[42635,42635],"valid"],[[42636,42636],"mapped",[42637]],[[42637,42637],"valid"],[[42638,42638],"mapped",[42639]],[[42639,42639],"valid"],[[42640,42640],"mapped",[42641]],[[42641,42641],"valid"],[[42642,42642],"mapped",[42643]],[[42643,42643],"valid"],[[42644,42644],"mapped",[42645]],[[42645,42645],"valid"],[[42646,42646],"mapped",[42647]],[[42647,42647],"valid"],[[42648,42648],"mapped",[42649]],[[42649,42649],"valid"],[[42650,42650],"mapped",[42651]],[[42651,42651],"valid"],[[42652,42652],"mapped",[1098]],[[42653,42653],"mapped",[1100]],[[42654,42654],"valid"],[[42655,42655],"valid"],[[42656,42725],"valid"],[[42726,42735],"valid",[],"NV8"],[[42736,42737],"valid"],[[42738,42743],"valid",[],"NV8"],[[42744,42751],"disallowed"],[[42752,42774],"valid",[],"NV8"],[[42775,42778],"valid"],[[42779,42783],"valid"],[[42784,42785],"valid",[],"NV8"],[[42786,42786],"mapped",[42787]],[[42787,42787],"valid"],[[42788,42788],"mapped",[42789]],[[42789,42789],"valid"],[[42790,42790],"mapped",[42791]],[[42791,42791],"valid"],[[42792,42792],"mapped",[42793]],[[42793,42793],"valid"],[[42794,42794],"mapped",[42795]],[[42795,42795],"valid"],[[42796,42796],"mapped",[42797]],[[42797,42797],"valid"],[[42798,42798],"mapped",[42799]],[[42799,42801],"valid"],[[42802,42802],"mapped",[42803]],[[42803,42803],"valid"],[[42804,42804],"mapped",[42805]],[[42805,42805],"valid"],[[42806,42806],"mapped",[42807]],[[42807,42807],"valid"],[[42808,42808],"mapped",[42809]],[[42809,42809],"valid"],[[42810,42810],"mapped",[42811]],[[42811,42811],"valid"],[[42812,42812],"mapped",[42813]],[[42813,42813],"valid"],[[42814,42814],"mapped",[42815]],[[42815,42815],"valid"],[[42816,42816],"mapped",[42817]],[[42817,42817],"valid"],[[42818,42818],"mapped",[42819]],[[42819,42819],"valid"],[[42820,42820],"mapped",[42821]],[[42821,42821],"valid"],[[42822,42822],"mapped",[42823]],[[42823,42823],"valid"],[[42824,42824],"mapped",[42825]],[[42825,42825],"valid"],[[42826,42826],"mapped",[42827]],[[42827,42827],"valid"],[[42828,42828],"mapped",[42829]],[[42829,42829],"valid"],[[42830,42830],"mapped",[42831]],[[42831,42831],"valid"],[[42832,42832],"mapped",[42833]],[[42833,42833],"valid"],[[42834,42834],"mapped",[42835]],[[42835,42835],"valid"],[[42836,42836],"mapped",[42837]],[[42837,42837],"valid"],[[42838,42838],"mapped",[42839]],[[42839,42839],"valid"],[[42840,42840],"mapped",[42841]],[[42841,42841],"valid"],[[42842,42842],"mapped",[42843]],[[42843,42843],"valid"],[[42844,42844],"mapped",[42845]],[[42845,42845],"valid"],[[42846,42846],"mapped",[42847]],[[42847,42847],"valid"],[[42848,42848],"mapped",[42849]],[[42849,42849],"valid"],[[42850,42850],"mapped",[42851]],[[42851,42851],"valid"],[[42852,42852],"mapped",[42853]],[[42853,42853],"valid"],[[42854,42854],"mapped",[42855]],[[42855,42855],"valid"],[[42856,42856],"mapped",[42857]],[[42857,42857],"valid"],[[42858,42858],"mapped",[42859]],[[42859,42859],"valid"],[[42860,42860],"mapped",[42861]],[[42861,42861],"valid"],[[42862,42862],"mapped",[42863]],[[42863,42863],"valid"],[[42864,42864],"mapped",[42863]],[[42865,42872],"valid"],[[42873,42873],"mapped",[42874]],[[42874,42874],"valid"],[[42875,42875],"mapped",[42876]],[[42876,42876],"valid"],[[42877,42877],"mapped",[7545]],[[42878,42878],"mapped",[42879]],[[42879,42879],"valid"],[[42880,42880],"mapped",[42881]],[[42881,42881],"valid"],[[42882,42882],"mapped",[42883]],[[42883,42883],"valid"],[[42884,42884],"mapped",[42885]],[[42885,42885],"valid"],[[42886,42886],"mapped",[42887]],[[42887,42888],"valid"],[[42889,42890],"valid",[],"NV8"],[[42891,42891],"mapped",[42892]],[[42892,42892],"valid"],[[42893,42893],"mapped",[613]],[[42894,42894],"valid"],[[42895,42895],"valid"],[[42896,42896],"mapped",[42897]],[[42897,42897],"valid"],[[42898,42898],"mapped",[42899]],[[42899,42899],"valid"],[[42900,42901],"valid"],[[42902,42902],"mapped",[42903]],[[42903,42903],"valid"],[[42904,42904],"mapped",[42905]],[[42905,42905],"valid"],[[42906,42906],"mapped",[42907]],[[42907,42907],"valid"],[[42908,42908],"mapped",[42909]],[[42909,42909],"valid"],[[42910,42910],"mapped",[42911]],[[42911,42911],"valid"],[[42912,42912],"mapped",[42913]],[[42913,42913],"valid"],[[42914,42914],"mapped",[42915]],[[42915,42915],"valid"],[[42916,42916],"mapped",[42917]],[[42917,42917],"valid"],[[42918,42918],"mapped",[42919]],[[42919,42919],"valid"],[[42920,42920],"mapped",[42921]],[[42921,42921],"valid"],[[42922,42922],"mapped",[614]],[[42923,42923],"mapped",[604]],[[42924,42924],"mapped",[609]],[[42925,42925],"mapped",[620]],[[42926,42927],"disallowed"],[[42928,42928],"mapped",[670]],[[42929,42929],"mapped",[647]],[[42930,42930],"mapped",[669]],[[42931,42931],"mapped",[43859]],[[42932,42932],"mapped",[42933]],[[42933,42933],"valid"],[[42934,42934],"mapped",[42935]],[[42935,42935],"valid"],[[42936,42998],"disallowed"],[[42999,42999],"valid"],[[43000,43000],"mapped",[295]],[[43001,43001],"mapped",[339]],[[43002,43002],"valid"],[[43003,43007],"valid"],[[43008,43047],"valid"],[[43048,43051],"valid",[],"NV8"],[[43052,43055],"disallowed"],[[43056,43065],"valid",[],"NV8"],[[43066,43071],"disallowed"],[[43072,43123],"valid"],[[43124,43127],"valid",[],"NV8"],[[43128,43135],"disallowed"],[[43136,43204],"valid"],[[43205,43213],"disallowed"],[[43214,43215],"valid",[],"NV8"],[[43216,43225],"valid"],[[43226,43231],"disallowed"],[[43232,43255],"valid"],[[43256,43258],"valid",[],"NV8"],[[43259,43259],"valid"],[[43260,43260],"valid",[],"NV8"],[[43261,43261],"valid"],[[43262,43263],"disallowed"],[[43264,43309],"valid"],[[43310,43311],"valid",[],"NV8"],[[43312,43347],"valid"],[[43348,43358],"disallowed"],[[43359,43359],"valid",[],"NV8"],[[43360,43388],"valid",[],"NV8"],[[43389,43391],"disallowed"],[[43392,43456],"valid"],[[43457,43469],"valid",[],"NV8"],[[43470,43470],"disallowed"],[[43471,43481],"valid"],[[43482,43485],"disallowed"],[[43486,43487],"valid",[],"NV8"],[[43488,43518],"valid"],[[43519,43519],"disallowed"],[[43520,43574],"valid"],[[43575,43583],"disallowed"],[[43584,43597],"valid"],[[43598,43599],"disallowed"],[[43600,43609],"valid"],[[43610,43611],"disallowed"],[[43612,43615],"valid",[],"NV8"],[[43616,43638],"valid"],[[43639,43641],"valid",[],"NV8"],[[43642,43643],"valid"],[[43644,43647],"valid"],[[43648,43714],"valid"],[[43715,43738],"disallowed"],[[43739,43741],"valid"],[[43742,43743],"valid",[],"NV8"],[[43744,43759],"valid"],[[43760,43761],"valid",[],"NV8"],[[43762,43766],"valid"],[[43767,43776],"disallowed"],[[43777,43782],"valid"],[[43783,43784],"disallowed"],[[43785,43790],"valid"],[[43791,43792],"disallowed"],[[43793,43798],"valid"],[[43799,43807],"disallowed"],[[43808,43814],"valid"],[[43815,43815],"disallowed"],[[43816,43822],"valid"],[[43823,43823],"disallowed"],[[43824,43866],"valid"],[[43867,43867],"valid",[],"NV8"],[[43868,43868],"mapped",[42791]],[[43869,43869],"mapped",[43831]],[[43870,43870],"mapped",[619]],[[43871,43871],"mapped",[43858]],[[43872,43875],"valid"],[[43876,43877],"valid"],[[43878,43887],"disallowed"],[[43888,43888],"mapped",[5024]],[[43889,43889],"mapped",[5025]],[[43890,43890],"mapped",[5026]],[[43891,43891],"mapped",[5027]],[[43892,43892],"mapped",[5028]],[[43893,43893],"mapped",[5029]],[[43894,43894],"mapped",[5030]],[[43895,43895],"mapped",[5031]],[[43896,43896],"mapped",[5032]],[[43897,43897],"mapped",[5033]],[[43898,43898],"mapped",[5034]],[[43899,43899],"mapped",[5035]],[[43900,43900],"mapped",[5036]],[[43901,43901],"mapped",[5037]],[[43902,43902],"mapped",[5038]],[[43903,43903],"mapped",[5039]],[[43904,43904],"mapped",[5040]],[[43905,43905],"mapped",[5041]],[[43906,43906],"mapped",[5042]],[[43907,43907],"mapped",[5043]],[[43908,43908],"mapped",[5044]],[[43909,43909],"mapped",[5045]],[[43910,43910],"mapped",[5046]],[[43911,43911],"mapped",[5047]],[[43912,43912],"mapped",[5048]],[[43913,43913],"mapped",[5049]],[[43914,43914],"mapped",[5050]],[[43915,43915],"mapped",[5051]],[[43916,43916],"mapped",[5052]],[[43917,43917],"mapped",[5053]],[[43918,43918],"mapped",[5054]],[[43919,43919],"mapped",[5055]],[[43920,43920],"mapped",[5056]],[[43921,43921],"mapped",[5057]],[[43922,43922],"mapped",[5058]],[[43923,43923],"mapped",[5059]],[[43924,43924],"mapped",[5060]],[[43925,43925],"mapped",[5061]],[[43926,43926],"mapped",[5062]],[[43927,43927],"mapped",[5063]],[[43928,43928],"mapped",[5064]],[[43929,43929],"mapped",[5065]],[[43930,43930],"mapped",[5066]],[[43931,43931],"mapped",[5067]],[[43932,43932],"mapped",[5068]],[[43933,43933],"mapped",[5069]],[[43934,43934],"mapped",[5070]],[[43935,43935],"mapped",[5071]],[[43936,43936],"mapped",[5072]],[[43937,43937],"mapped",[5073]],[[43938,43938],"mapped",[5074]],[[43939,43939],"mapped",[5075]],[[43940,43940],"mapped",[5076]],[[43941,43941],"mapped",[5077]],[[43942,43942],"mapped",[5078]],[[43943,43943],"mapped",[5079]],[[43944,43944],"mapped",[5080]],[[43945,43945],"mapped",[5081]],[[43946,43946],"mapped",[5082]],[[43947,43947],"mapped",[5083]],[[43948,43948],"mapped",[5084]],[[43949,43949],"mapped",[5085]],[[43950,43950],"mapped",[5086]],[[43951,43951],"mapped",[5087]],[[43952,43952],"mapped",[5088]],[[43953,43953],"mapped",[5089]],[[43954,43954],"mapped",[5090]],[[43955,43955],"mapped",[5091]],[[43956,43956],"mapped",[5092]],[[43957,43957],"mapped",[5093]],[[43958,43958],"mapped",[5094]],[[43959,43959],"mapped",[5095]],[[43960,43960],"mapped",[5096]],[[43961,43961],"mapped",[5097]],[[43962,43962],"mapped",[5098]],[[43963,43963],"mapped",[5099]],[[43964,43964],"mapped",[5100]],[[43965,43965],"mapped",[5101]],[[43966,43966],"mapped",[5102]],[[43967,43967],"mapped",[5103]],[[43968,44010],"valid"],[[44011,44011],"valid",[],"NV8"],[[44012,44013],"valid"],[[44014,44015],"disallowed"],[[44016,44025],"valid"],[[44026,44031],"disallowed"],[[44032,55203],"valid"],[[55204,55215],"disallowed"],[[55216,55238],"valid",[],"NV8"],[[55239,55242],"disallowed"],[[55243,55291],"valid",[],"NV8"],[[55292,55295],"disallowed"],[[55296,57343],"disallowed"],[[57344,63743],"disallowed"],[[63744,63744],"mapped",[35912]],[[63745,63745],"mapped",[26356]],[[63746,63746],"mapped",[36554]],[[63747,63747],"mapped",[36040]],[[63748,63748],"mapped",[28369]],[[63749,63749],"mapped",[20018]],[[63750,63750],"mapped",[21477]],[[63751,63752],"mapped",[40860]],[[63753,63753],"mapped",[22865]],[[63754,63754],"mapped",[37329]],[[63755,63755],"mapped",[21895]],[[63756,63756],"mapped",[22856]],[[63757,63757],"mapped",[25078]],[[63758,63758],"mapped",[30313]],[[63759,63759],"mapped",[32645]],[[63760,63760],"mapped",[34367]],[[63761,63761],"mapped",[34746]],[[63762,63762],"mapped",[35064]],[[63763,63763],"mapped",[37007]],[[63764,63764],"mapped",[27138]],[[63765,63765],"mapped",[27931]],[[63766,63766],"mapped",[28889]],[[63767,63767],"mapped",[29662]],[[63768,63768],"mapped",[33853]],[[63769,63769],"mapped",[37226]],[[63770,63770],"mapped",[39409]],[[63771,63771],"mapped",[20098]],[[63772,63772],"mapped",[21365]],[[63773,63773],"mapped",[27396]],[[63774,63774],"mapped",[29211]],[[63775,63775],"mapped",[34349]],[[63776,63776],"mapped",[40478]],[[63777,63777],"mapped",[23888]],[[63778,63778],"mapped",[28651]],[[63779,63779],"mapped",[34253]],[[63780,63780],"mapped",[35172]],[[63781,63781],"mapped",[25289]],[[63782,63782],"mapped",[33240]],[[63783,63783],"mapped",[34847]],[[63784,63784],"mapped",[24266]],[[63785,63785],"mapped",[26391]],[[63786,63786],"mapped",[28010]],[[63787,63787],"mapped",[29436]],[[63788,63788],"mapped",[37070]],[[63789,63789],"mapped",[20358]],[[63790,63790],"mapped",[20919]],[[63791,63791],"mapped",[21214]],[[63792,63792],"mapped",[25796]],[[63793,63793],"mapped",[27347]],[[63794,63794],"mapped",[29200]],[[63795,63795],"mapped",[30439]],[[63796,63796],"mapped",[32769]],[[63797,63797],"mapped",[34310]],[[63798,63798],"mapped",[34396]],[[63799,63799],"mapped",[36335]],[[63800,63800],"mapped",[38706]],[[63801,63801],"mapped",[39791]],[[63802,63802],"mapped",[40442]],[[63803,63803],"mapped",[30860]],[[63804,63804],"mapped",[31103]],[[63805,63805],"mapped",[32160]],[[63806,63806],"mapped",[33737]],[[63807,63807],"mapped",[37636]],[[63808,63808],"mapped",[40575]],[[63809,63809],"mapped",[35542]],[[63810,63810],"mapped",[22751]],[[63811,63811],"mapped",[24324]],[[63812,63812],"mapped",[31840]],[[63813,63813],"mapped",[32894]],[[63814,63814],"mapped",[29282]],[[63815,63815],"mapped",[30922]],[[63816,63816],"mapped",[36034]],[[63817,63817],"mapped",[38647]],[[63818,63818],"mapped",[22744]],[[63819,63819],"mapped",[23650]],[[63820,63820],"mapped",[27155]],[[63821,63821],"mapped",[28122]],[[63822,63822],"mapped",[28431]],[[63823,63823],"mapped",[32047]],[[63824,63824],"mapped",[32311]],[[63825,63825],"mapped",[38475]],[[63826,63826],"mapped",[21202]],[[63827,63827],"mapped",[32907]],[[63828,63828],"mapped",[20956]],[[63829,63829],"mapped",[20940]],[[63830,63830],"mapped",[31260]],[[63831,63831],"mapped",[32190]],[[63832,63832],"mapped",[33777]],[[63833,63833],"mapped",[38517]],[[63834,63834],"mapped",[35712]],[[63835,63835],"mapped",[25295]],[[63836,63836],"mapped",[27138]],[[63837,63837],"mapped",[35582]],[[63838,63838],"mapped",[20025]],[[63839,63839],"mapped",[23527]],[[63840,63840],"mapped",[24594]],[[63841,63841],"mapped",[29575]],[[63842,63842],"mapped",[30064]],[[63843,63843],"mapped",[21271]],[[63844,63844],"mapped",[30971]],[[63845,63845],"mapped",[20415]],[[63846,63846],"mapped",[24489]],[[63847,63847],"mapped",[19981]],[[63848,63848],"mapped",[27852]],[[63849,63849],"mapped",[25976]],[[63850,63850],"mapped",[32034]],[[63851,63851],"mapped",[21443]],[[63852,63852],"mapped",[22622]],[[63853,63853],"mapped",[30465]],[[63854,63854],"mapped",[33865]],[[63855,63855],"mapped",[35498]],[[63856,63856],"mapped",[27578]],[[63857,63857],"mapped",[36784]],[[63858,63858],"mapped",[27784]],[[63859,63859],"mapped",[25342]],[[63860,63860],"mapped",[33509]],[[63861,63861],"mapped",[25504]],[[63862,63862],"mapped",[30053]],[[63863,63863],"mapped",[20142]],[[63864,63864],"mapped",[20841]],[[63865,63865],"mapped",[20937]],[[63866,63866],"mapped",[26753]],[[63867,63867],"mapped",[31975]],[[63868,63868],"mapped",[33391]],[[63869,63869],"mapped",[35538]],[[63870,63870],"mapped",[37327]],[[63871,63871],"mapped",[21237]],[[63872,63872],"mapped",[21570]],[[63873,63873],"mapped",[22899]],[[63874,63874],"mapped",[24300]],[[63875,63875],"mapped",[26053]],[[63876,63876],"mapped",[28670]],[[63877,63877],"mapped",[31018]],[[63878,63878],"mapped",[38317]],[[63879,63879],"mapped",[39530]],[[63880,63880],"mapped",[40599]],[[63881,63881],"mapped",[40654]],[[63882,63882],"mapped",[21147]],[[63883,63883],"mapped",[26310]],[[63884,63884],"mapped",[27511]],[[63885,63885],"mapped",[36706]],[[63886,63886],"mapped",[24180]],[[63887,63887],"mapped",[24976]],[[63888,63888],"mapped",[25088]],[[63889,63889],"mapped",[25754]],[[63890,63890],"mapped",[28451]],[[63891,63891],"mapped",[29001]],[[63892,63892],"mapped",[29833]],[[63893,63893],"mapped",[31178]],[[63894,63894],"mapped",[32244]],[[63895,63895],"mapped",[32879]],[[63896,63896],"mapped",[36646]],[[63897,63897],"mapped",[34030]],[[63898,63898],"mapped",[36899]],[[63899,63899],"mapped",[37706]],[[63900,63900],"mapped",[21015]],[[63901,63901],"mapped",[21155]],[[63902,63902],"mapped",[21693]],[[63903,63903],"mapped",[28872]],[[63904,63904],"mapped",[35010]],[[63905,63905],"mapped",[35498]],[[63906,63906],"mapped",[24265]],[[63907,63907],"mapped",[24565]],[[63908,63908],"mapped",[25467]],[[63909,63909],"mapped",[27566]],[[63910,63910],"mapped",[31806]],[[63911,63911],"mapped",[29557]],[[63912,63912],"mapped",[20196]],[[63913,63913],"mapped",[22265]],[[63914,63914],"mapped",[23527]],[[63915,63915],"mapped",[23994]],[[63916,63916],"mapped",[24604]],[[63917,63917],"mapped",[29618]],[[63918,63918],"mapped",[29801]],[[63919,63919],"mapped",[32666]],[[63920,63920],"mapped",[32838]],[[63921,63921],"mapped",[37428]],[[63922,63922],"mapped",[38646]],[[63923,63923],"mapped",[38728]],[[63924,63924],"mapped",[38936]],[[63925,63925],"mapped",[20363]],[[63926,63926],"mapped",[31150]],[[63927,63927],"mapped",[37300]],[[63928,63928],"mapped",[38584]],[[63929,63929],"mapped",[24801]],[[63930,63930],"mapped",[20102]],[[63931,63931],"mapped",[20698]],[[63932,63932],"mapped",[23534]],[[63933,63933],"mapped",[23615]],[[63934,63934],"mapped",[26009]],[[63935,63935],"mapped",[27138]],[[63936,63936],"mapped",[29134]],[[63937,63937],"mapped",[30274]],[[63938,63938],"mapped",[34044]],[[63939,63939],"mapped",[36988]],[[63940,63940],"mapped",[40845]],[[63941,63941],"mapped",[26248]],[[63942,63942],"mapped",[38446]],[[63943,63943],"mapped",[21129]],[[63944,63944],"mapped",[26491]],[[63945,63945],"mapped",[26611]],[[63946,63946],"mapped",[27969]],[[63947,63947],"mapped",[28316]],[[63948,63948],"mapped",[29705]],[[63949,63949],"mapped",[30041]],[[63950,63950],"mapped",[30827]],[[63951,63951],"mapped",[32016]],[[63952,63952],"mapped",[39006]],[[63953,63953],"mapped",[20845]],[[63954,63954],"mapped",[25134]],[[63955,63955],"mapped",[38520]],[[63956,63956],"mapped",[20523]],[[63957,63957],"mapped",[23833]],[[63958,63958],"mapped",[28138]],[[63959,63959],"mapped",[36650]],[[63960,63960],"mapped",[24459]],[[63961,63961],"mapped",[24900]],[[63962,63962],"mapped",[26647]],[[63963,63963],"mapped",[29575]],[[63964,63964],"mapped",[38534]],[[63965,63965],"mapped",[21033]],[[63966,63966],"mapped",[21519]],[[63967,63967],"mapped",[23653]],[[63968,63968],"mapped",[26131]],[[63969,63969],"mapped",[26446]],[[63970,63970],"mapped",[26792]],[[63971,63971],"mapped",[27877]],[[63972,63972],"mapped",[29702]],[[63973,63973],"mapped",[30178]],[[63974,63974],"mapped",[32633]],[[63975,63975],"mapped",[35023]],[[63976,63976],"mapped",[35041]],[[63977,63977],"mapped",[37324]],[[63978,63978],"mapped",[38626]],[[63979,63979],"mapped",[21311]],[[63980,63980],"mapped",[28346]],[[63981,63981],"mapped",[21533]],[[63982,63982],"mapped",[29136]],[[63983,63983],"mapped",[29848]],[[63984,63984],"mapped",[34298]],[[63985,63985],"mapped",[38563]],[[63986,63986],"mapped",[40023]],[[63987,63987],"mapped",[40607]],[[63988,63988],"mapped",[26519]],[[63989,63989],"mapped",[28107]],[[63990,63990],"mapped",[33256]],[[63991,63991],"mapped",[31435]],[[63992,63992],"mapped",[31520]],[[63993,63993],"mapped",[31890]],[[63994,63994],"mapped",[29376]],[[63995,63995],"mapped",[28825]],[[63996,63996],"mapped",[35672]],[[63997,63997],"mapped",[20160]],[[63998,63998],"mapped",[33590]],[[63999,63999],"mapped",[21050]],[[64000,64000],"mapped",[20999]],[[64001,64001],"mapped",[24230]],[[64002,64002],"mapped",[25299]],[[64003,64003],"mapped",[31958]],[[64004,64004],"mapped",[23429]],[[64005,64005],"mapped",[27934]],[[64006,64006],"mapped",[26292]],[[64007,64007],"mapped",[36667]],[[64008,64008],"mapped",[34892]],[[64009,64009],"mapped",[38477]],[[64010,64010],"mapped",[35211]],[[64011,64011],"mapped",[24275]],[[64012,64012],"mapped",[20800]],[[64013,64013],"mapped",[21952]],[[64014,64015],"valid"],[[64016,64016],"mapped",[22618]],[[64017,64017],"valid"],[[64018,64018],"mapped",[26228]],[[64019,64020],"valid"],[[64021,64021],"mapped",[20958]],[[64022,64022],"mapped",[29482]],[[64023,64023],"mapped",[30410]],[[64024,64024],"mapped",[31036]],[[64025,64025],"mapped",[31070]],[[64026,64026],"mapped",[31077]],[[64027,64027],"mapped",[31119]],[[64028,64028],"mapped",[38742]],[[64029,64029],"mapped",[31934]],[[64030,64030],"mapped",[32701]],[[64031,64031],"valid"],[[64032,64032],"mapped",[34322]],[[64033,64033],"valid"],[[64034,64034],"mapped",[35576]],[[64035,64036],"valid"],[[64037,64037],"mapped",[36920]],[[64038,64038],"mapped",[37117]],[[64039,64041],"valid"],[[64042,64042],"mapped",[39151]],[[64043,64043],"mapped",[39164]],[[64044,64044],"mapped",[39208]],[[64045,64045],"mapped",[40372]],[[64046,64046],"mapped",[37086]],[[64047,64047],"mapped",[38583]],[[64048,64048],"mapped",[20398]],[[64049,64049],"mapped",[20711]],[[64050,64050],"mapped",[20813]],[[64051,64051],"mapped",[21193]],[[64052,64052],"mapped",[21220]],[[64053,64053],"mapped",[21329]],[[64054,64054],"mapped",[21917]],[[64055,64055],"mapped",[22022]],[[64056,64056],"mapped",[22120]],[[64057,64057],"mapped",[22592]],[[64058,64058],"mapped",[22696]],[[64059,64059],"mapped",[23652]],[[64060,64060],"mapped",[23662]],[[64061,64061],"mapped",[24724]],[[64062,64062],"mapped",[24936]],[[64063,64063],"mapped",[24974]],[[64064,64064],"mapped",[25074]],[[64065,64065],"mapped",[25935]],[[64066,64066],"mapped",[26082]],[[64067,64067],"mapped",[26257]],[[64068,64068],"mapped",[26757]],[[64069,64069],"mapped",[28023]],[[64070,64070],"mapped",[28186]],[[64071,64071],"mapped",[28450]],[[64072,64072],"mapped",[29038]],[[64073,64073],"mapped",[29227]],[[64074,64074],"mapped",[29730]],[[64075,64075],"mapped",[30865]],[[64076,64076],"mapped",[31038]],[[64077,64077],"mapped",[31049]],[[64078,64078],"mapped",[31048]],[[64079,64079],"mapped",[31056]],[[64080,64080],"mapped",[31062]],[[64081,64081],"mapped",[31069]],[[64082,64082],"mapped",[31117]],[[64083,64083],"mapped",[31118]],[[64084,64084],"mapped",[31296]],[[64085,64085],"mapped",[31361]],[[64086,64086],"mapped",[31680]],[[64087,64087],"mapped",[32244]],[[64088,64088],"mapped",[32265]],[[64089,64089],"mapped",[32321]],[[64090,64090],"mapped",[32626]],[[64091,64091],"mapped",[32773]],[[64092,64092],"mapped",[33261]],[[64093,64094],"mapped",[33401]],[[64095,64095],"mapped",[33879]],[[64096,64096],"mapped",[35088]],[[64097,64097],"mapped",[35222]],[[64098,64098],"mapped",[35585]],[[64099,64099],"mapped",[35641]],[[64100,64100],"mapped",[36051]],[[64101,64101],"mapped",[36104]],[[64102,64102],"mapped",[36790]],[[64103,64103],"mapped",[36920]],[[64104,64104],"mapped",[38627]],[[64105,64105],"mapped",[38911]],[[64106,64106],"mapped",[38971]],[[64107,64107],"mapped",[24693]],[[64108,64108],"mapped",[148206]],[[64109,64109],"mapped",[33304]],[[64110,64111],"disallowed"],[[64112,64112],"mapped",[20006]],[[64113,64113],"mapped",[20917]],[[64114,64114],"mapped",[20840]],[[64115,64115],"mapped",[20352]],[[64116,64116],"mapped",[20805]],[[64117,64117],"mapped",[20864]],[[64118,64118],"mapped",[21191]],[[64119,64119],"mapped",[21242]],[[64120,64120],"mapped",[21917]],[[64121,64121],"mapped",[21845]],[[64122,64122],"mapped",[21913]],[[64123,64123],"mapped",[21986]],[[64124,64124],"mapped",[22618]],[[64125,64125],"mapped",[22707]],[[64126,64126],"mapped",[22852]],[[64127,64127],"mapped",[22868]],[[64128,64128],"mapped",[23138]],[[64129,64129],"mapped",[23336]],[[64130,64130],"mapped",[24274]],[[64131,64131],"mapped",[24281]],[[64132,64132],"mapped",[24425]],[[64133,64133],"mapped",[24493]],[[64134,64134],"mapped",[24792]],[[64135,64135],"mapped",[24910]],[[64136,64136],"mapped",[24840]],[[64137,64137],"mapped",[24974]],[[64138,64138],"mapped",[24928]],[[64139,64139],"mapped",[25074]],[[64140,64140],"mapped",[25140]],[[64141,64141],"mapped",[25540]],[[64142,64142],"mapped",[25628]],[[64143,64143],"mapped",[25682]],[[64144,64144],"mapped",[25942]],[[64145,64145],"mapped",[26228]],[[64146,64146],"mapped",[26391]],[[64147,64147],"mapped",[26395]],[[64148,64148],"mapped",[26454]],[[64149,64149],"mapped",[27513]],[[64150,64150],"mapped",[27578]],[[64151,64151],"mapped",[27969]],[[64152,64152],"mapped",[28379]],[[64153,64153],"mapped",[28363]],[[64154,64154],"mapped",[28450]],[[64155,64155],"mapped",[28702]],[[64156,64156],"mapped",[29038]],[[64157,64157],"mapped",[30631]],[[64158,64158],"mapped",[29237]],[[64159,64159],"mapped",[29359]],[[64160,64160],"mapped",[29482]],[[64161,64161],"mapped",[29809]],[[64162,64162],"mapped",[29958]],[[64163,64163],"mapped",[30011]],[[64164,64164],"mapped",[30237]],[[64165,64165],"mapped",[30239]],[[64166,64166],"mapped",[30410]],[[64167,64167],"mapped",[30427]],[[64168,64168],"mapped",[30452]],[[64169,64169],"mapped",[30538]],[[64170,64170],"mapped",[30528]],[[64171,64171],"mapped",[30924]],[[64172,64172],"mapped",[31409]],[[64173,64173],"mapped",[31680]],[[64174,64174],"mapped",[31867]],[[64175,64175],"mapped",[32091]],[[64176,64176],"mapped",[32244]],[[64177,64177],"mapped",[32574]],[[64178,64178],"mapped",[32773]],[[64179,64179],"mapped",[33618]],[[64180,64180],"mapped",[33775]],[[64181,64181],"mapped",[34681]],[[64182,64182],"mapped",[35137]],[[64183,64183],"mapped",[35206]],[[64184,64184],"mapped",[35222]],[[64185,64185],"mapped",[35519]],[[64186,64186],"mapped",[35576]],[[64187,64187],"mapped",[35531]],[[64188,64188],"mapped",[35585]],[[64189,64189],"mapped",[35582]],[[64190,64190],"mapped",[35565]],[[64191,64191],"mapped",[35641]],[[64192,64192],"mapped",[35722]],[[64193,64193],"mapped",[36104]],[[64194,64194],"mapped",[36664]],[[64195,64195],"mapped",[36978]],[[64196,64196],"mapped",[37273]],[[64197,64197],"mapped",[37494]],[[64198,64198],"mapped",[38524]],[[64199,64199],"mapped",[38627]],[[64200,64200],"mapped",[38742]],[[64201,64201],"mapped",[38875]],[[64202,64202],"mapped",[38911]],[[64203,64203],"mapped",[38923]],[[64204,64204],"mapped",[38971]],[[64205,64205],"mapped",[39698]],[[64206,64206],"mapped",[40860]],[[64207,64207],"mapped",[141386]],[[64208,64208],"mapped",[141380]],[[64209,64209],"mapped",[144341]],[[64210,64210],"mapped",[15261]],[[64211,64211],"mapped",[16408]],[[64212,64212],"mapped",[16441]],[[64213,64213],"mapped",[152137]],[[64214,64214],"mapped",[154832]],[[64215,64215],"mapped",[163539]],[[64216,64216],"mapped",[40771]],[[64217,64217],"mapped",[40846]],[[64218,64255],"disallowed"],[[64256,64256],"mapped",[102,102]],[[64257,64257],"mapped",[102,105]],[[64258,64258],"mapped",[102,108]],[[64259,64259],"mapped",[102,102,105]],[[64260,64260],"mapped",[102,102,108]],[[64261,64262],"mapped",[115,116]],[[64263,64274],"disallowed"],[[64275,64275],"mapped",[1396,1398]],[[64276,64276],"mapped",[1396,1381]],[[64277,64277],"mapped",[1396,1387]],[[64278,64278],"mapped",[1406,1398]],[[64279,64279],"mapped",[1396,1389]],[[64280,64284],"disallowed"],[[64285,64285],"mapped",[1497,1460]],[[64286,64286],"valid"],[[64287,64287],"mapped",[1522,1463]],[[64288,64288],"mapped",[1506]],[[64289,64289],"mapped",[1488]],[[64290,64290],"mapped",[1491]],[[64291,64291],"mapped",[1492]],[[64292,64292],"mapped",[1499]],[[64293,64293],"mapped",[1500]],[[64294,64294],"mapped",[1501]],[[64295,64295],"mapped",[1512]],[[64296,64296],"mapped",[1514]],[[64297,64297],"disallowed_STD3_mapped",[43]],[[64298,64298],"mapped",[1513,1473]],[[64299,64299],"mapped",[1513,1474]],[[64300,64300],"mapped",[1513,1468,1473]],[[64301,64301],"mapped",[1513,1468,1474]],[[64302,64302],"mapped",[1488,1463]],[[64303,64303],"mapped",[1488,1464]],[[64304,64304],"mapped",[1488,1468]],[[64305,64305],"mapped",[1489,1468]],[[64306,64306],"mapped",[1490,1468]],[[64307,64307],"mapped",[1491,1468]],[[64308,64308],"mapped",[1492,1468]],[[64309,64309],"mapped",[1493,1468]],[[64310,64310],"mapped",[1494,1468]],[[64311,64311],"disallowed"],[[64312,64312],"mapped",[1496,1468]],[[64313,64313],"mapped",[1497,1468]],[[64314,64314],"mapped",[1498,1468]],[[64315,64315],"mapped",[1499,1468]],[[64316,64316],"mapped",[1500,1468]],[[64317,64317],"disallowed"],[[64318,64318],"mapped",[1502,1468]],[[64319,64319],"disallowed"],[[64320,64320],"mapped",[1504,1468]],[[64321,64321],"mapped",[1505,1468]],[[64322,64322],"disallowed"],[[64323,64323],"mapped",[1507,1468]],[[64324,64324],"mapped",[1508,1468]],[[64325,64325],"disallowed"],[[64326,64326],"mapped",[1510,1468]],[[64327,64327],"mapped",[1511,1468]],[[64328,64328],"mapped",[1512,1468]],[[64329,64329],"mapped",[1513,1468]],[[64330,64330],"mapped",[1514,1468]],[[64331,64331],"mapped",[1493,1465]],[[64332,64332],"mapped",[1489,1471]],[[64333,64333],"mapped",[1499,1471]],[[64334,64334],"mapped",[1508,1471]],[[64335,64335],"mapped",[1488,1500]],[[64336,64337],"mapped",[1649]],[[64338,64341],"mapped",[1659]],[[64342,64345],"mapped",[1662]],[[64346,64349],"mapped",[1664]],[[64350,64353],"mapped",[1658]],[[64354,64357],"mapped",[1663]],[[64358,64361],"mapped",[1657]],[[64362,64365],"mapped",[1700]],[[64366,64369],"mapped",[1702]],[[64370,64373],"mapped",[1668]],[[64374,64377],"mapped",[1667]],[[64378,64381],"mapped",[1670]],[[64382,64385],"mapped",[1671]],[[64386,64387],"mapped",[1677]],[[64388,64389],"mapped",[1676]],[[64390,64391],"mapped",[1678]],[[64392,64393],"mapped",[1672]],[[64394,64395],"mapped",[1688]],[[64396,64397],"mapped",[1681]],[[64398,64401],"mapped",[1705]],[[64402,64405],"mapped",[1711]],[[64406,64409],"mapped",[1715]],[[64410,64413],"mapped",[1713]],[[64414,64415],"mapped",[1722]],[[64416,64419],"mapped",[1723]],[[64420,64421],"mapped",[1728]],[[64422,64425],"mapped",[1729]],[[64426,64429],"mapped",[1726]],[[64430,64431],"mapped",[1746]],[[64432,64433],"mapped",[1747]],[[64434,64449],"valid",[],"NV8"],[[64450,64466],"disallowed"],[[64467,64470],"mapped",[1709]],[[64471,64472],"mapped",[1735]],[[64473,64474],"mapped",[1734]],[[64475,64476],"mapped",[1736]],[[64477,64477],"mapped",[1735,1652]],[[64478,64479],"mapped",[1739]],[[64480,64481],"mapped",[1733]],[[64482,64483],"mapped",[1737]],[[64484,64487],"mapped",[1744]],[[64488,64489],"mapped",[1609]],[[64490,64491],"mapped",[1574,1575]],[[64492,64493],"mapped",[1574,1749]],[[64494,64495],"mapped",[1574,1608]],[[64496,64497],"mapped",[1574,1735]],[[64498,64499],"mapped",[1574,1734]],[[64500,64501],"mapped",[1574,1736]],[[64502,64504],"mapped",[1574,1744]],[[64505,64507],"mapped",[1574,1609]],[[64508,64511],"mapped",[1740]],[[64512,64512],"mapped",[1574,1580]],[[64513,64513],"mapped",[1574,1581]],[[64514,64514],"mapped",[1574,1605]],[[64515,64515],"mapped",[1574,1609]],[[64516,64516],"mapped",[1574,1610]],[[64517,64517],"mapped",[1576,1580]],[[64518,64518],"mapped",[1576,1581]],[[64519,64519],"mapped",[1576,1582]],[[64520,64520],"mapped",[1576,1605]],[[64521,64521],"mapped",[1576,1609]],[[64522,64522],"mapped",[1576,1610]],[[64523,64523],"mapped",[1578,1580]],[[64524,64524],"mapped",[1578,1581]],[[64525,64525],"mapped",[1578,1582]],[[64526,64526],"mapped",[1578,1605]],[[64527,64527],"mapped",[1578,1609]],[[64528,64528],"mapped",[1578,1610]],[[64529,64529],"mapped",[1579,1580]],[[64530,64530],"mapped",[1579,1605]],[[64531,64531],"mapped",[1579,1609]],[[64532,64532],"mapped",[1579,1610]],[[64533,64533],"mapped",[1580,1581]],[[64534,64534],"mapped",[1580,1605]],[[64535,64535],"mapped",[1581,1580]],[[64536,64536],"mapped",[1581,1605]],[[64537,64537],"mapped",[1582,1580]],[[64538,64538],"mapped",[1582,1581]],[[64539,64539],"mapped",[1582,1605]],[[64540,64540],"mapped",[1587,1580]],[[64541,64541],"mapped",[1587,1581]],[[64542,64542],"mapped",[1587,1582]],[[64543,64543],"mapped",[1587,1605]],[[64544,64544],"mapped",[1589,1581]],[[64545,64545],"mapped",[1589,1605]],[[64546,64546],"mapped",[1590,1580]],[[64547,64547],"mapped",[1590,1581]],[[64548,64548],"mapped",[1590,1582]],[[64549,64549],"mapped",[1590,1605]],[[64550,64550],"mapped",[1591,1581]],[[64551,64551],"mapped",[1591,1605]],[[64552,64552],"mapped",[1592,1605]],[[64553,64553],"mapped",[1593,1580]],[[64554,64554],"mapped",[1593,1605]],[[64555,64555],"mapped",[1594,1580]],[[64556,64556],"mapped",[1594,1605]],[[64557,64557],"mapped",[1601,1580]],[[64558,64558],"mapped",[1601,1581]],[[64559,64559],"mapped",[1601,1582]],[[64560,64560],"mapped",[1601,1605]],[[64561,64561],"mapped",[1601,1609]],[[64562,64562],"mapped",[1601,1610]],[[64563,64563],"mapped",[1602,1581]],[[64564,64564],"mapped",[1602,1605]],[[64565,64565],"mapped",[1602,1609]],[[64566,64566],"mapped",[1602,1610]],[[64567,64567],"mapped",[1603,1575]],[[64568,64568],"mapped",[1603,1580]],[[64569,64569],"mapped",[1603,1581]],[[64570,64570],"mapped",[1603,1582]],[[64571,64571],"mapped",[1603,1604]],[[64572,64572],"mapped",[1603,1605]],[[64573,64573],"mapped",[1603,1609]],[[64574,64574],"mapped",[1603,1610]],[[64575,64575],"mapped",[1604,1580]],[[64576,64576],"mapped",[1604,1581]],[[64577,64577],"mapped",[1604,1582]],[[64578,64578],"mapped",[1604,1605]],[[64579,64579],"mapped",[1604,1609]],[[64580,64580],"mapped",[1604,1610]],[[64581,64581],"mapped",[1605,1580]],[[64582,64582],"mapped",[1605,1581]],[[64583,64583],"mapped",[1605,1582]],[[64584,64584],"mapped",[1605,1605]],[[64585,64585],"mapped",[1605,1609]],[[64586,64586],"mapped",[1605,1610]],[[64587,64587],"mapped",[1606,1580]],[[64588,64588],"mapped",[1606,1581]],[[64589,64589],"mapped",[1606,1582]],[[64590,64590],"mapped",[1606,1605]],[[64591,64591],"mapped",[1606,1609]],[[64592,64592],"mapped",[1606,1610]],[[64593,64593],"mapped",[1607,1580]],[[64594,64594],"mapped",[1607,1605]],[[64595,64595],"mapped",[1607,1609]],[[64596,64596],"mapped",[1607,1610]],[[64597,64597],"mapped",[1610,1580]],[[64598,64598],"mapped",[1610,1581]],[[64599,64599],"mapped",[1610,1582]],[[64600,64600],"mapped",[1610,1605]],[[64601,64601],"mapped",[1610,1609]],[[64602,64602],"mapped",[1610,1610]],[[64603,64603],"mapped",[1584,1648]],[[64604,64604],"mapped",[1585,1648]],[[64605,64605],"mapped",[1609,1648]],[[64606,64606],"disallowed_STD3_mapped",[32,1612,1617]],[[64607,64607],"disallowed_STD3_mapped",[32,1613,1617]],[[64608,64608],"disallowed_STD3_mapped",[32,1614,1617]],[[64609,64609],"disallowed_STD3_mapped",[32,1615,1617]],[[64610,64610],"disallowed_STD3_mapped",[32,1616,1617]],[[64611,64611],"disallowed_STD3_mapped",[32,1617,1648]],[[64612,64612],"mapped",[1574,1585]],[[64613,64613],"mapped",[1574,1586]],[[64614,64614],"mapped",[1574,1605]],[[64615,64615],"mapped",[1574,1606]],[[64616,64616],"mapped",[1574,1609]],[[64617,64617],"mapped",[1574,1610]],[[64618,64618],"mapped",[1576,1585]],[[64619,64619],"mapped",[1576,1586]],[[64620,64620],"mapped",[1576,1605]],[[64621,64621],"mapped",[1576,1606]],[[64622,64622],"mapped",[1576,1609]],[[64623,64623],"mapped",[1576,1610]],[[64624,64624],"mapped",[1578,1585]],[[64625,64625],"mapped",[1578,1586]],[[64626,64626],"mapped",[1578,1605]],[[64627,64627],"mapped",[1578,1606]],[[64628,64628],"mapped",[1578,1609]],[[64629,64629],"mapped",[1578,1610]],[[64630,64630],"mapped",[1579,1585]],[[64631,64631],"mapped",[1579,1586]],[[64632,64632],"mapped",[1579,1605]],[[64633,64633],"mapped",[1579,1606]],[[64634,64634],"mapped",[1579,1609]],[[64635,64635],"mapped",[1579,1610]],[[64636,64636],"mapped",[1601,1609]],[[64637,64637],"mapped",[1601,1610]],[[64638,64638],"mapped",[1602,1609]],[[64639,64639],"mapped",[1602,1610]],[[64640,64640],"mapped",[1603,1575]],[[64641,64641],"mapped",[1603,1604]],[[64642,64642],"mapped",[1603,1605]],[[64643,64643],"mapped",[1603,1609]],[[64644,64644],"mapped",[1603,1610]],[[64645,64645],"mapped",[1604,1605]],[[64646,64646],"mapped",[1604,1609]],[[64647,64647],"mapped",[1604,1610]],[[64648,64648],"mapped",[1605,1575]],[[64649,64649],"mapped",[1605,1605]],[[64650,64650],"mapped",[1606,1585]],[[64651,64651],"mapped",[1606,1586]],[[64652,64652],"mapped",[1606,1605]],[[64653,64653],"mapped",[1606,1606]],[[64654,64654],"mapped",[1606,1609]],[[64655,64655],"mapped",[1606,1610]],[[64656,64656],"mapped",[1609,1648]],[[64657,64657],"mapped",[1610,1585]],[[64658,64658],"mapped",[1610,1586]],[[64659,64659],"mapped",[1610,1605]],[[64660,64660],"mapped",[1610,1606]],[[64661,64661],"mapped",[1610,1609]],[[64662,64662],"mapped",[1610,1610]],[[64663,64663],"mapped",[1574,1580]],[[64664,64664],"mapped",[1574,1581]],[[64665,64665],"mapped",[1574,1582]],[[64666,64666],"mapped",[1574,1605]],[[64667,64667],"mapped",[1574,1607]],[[64668,64668],"mapped",[1576,1580]],[[64669,64669],"mapped",[1576,1581]],[[64670,64670],"mapped",[1576,1582]],[[64671,64671],"mapped",[1576,1605]],[[64672,64672],"mapped",[1576,1607]],[[64673,64673],"mapped",[1578,1580]],[[64674,64674],"mapped",[1578,1581]],[[64675,64675],"mapped",[1578,1582]],[[64676,64676],"mapped",[1578,1605]],[[64677,64677],"mapped",[1578,1607]],[[64678,64678],"mapped",[1579,1605]],[[64679,64679],"mapped",[1580,1581]],[[64680,64680],"mapped",[1580,1605]],[[64681,64681],"mapped",[1581,1580]],[[64682,64682],"mapped",[1581,1605]],[[64683,64683],"mapped",[1582,1580]],[[64684,64684],"mapped",[1582,1605]],[[64685,64685],"mapped",[1587,1580]],[[64686,64686],"mapped",[1587,1581]],[[64687,64687],"mapped",[1587,1582]],[[64688,64688],"mapped",[1587,1605]],[[64689,64689],"mapped",[1589,1581]],[[64690,64690],"mapped",[1589,1582]],[[64691,64691],"mapped",[1589,1605]],[[64692,64692],"mapped",[1590,1580]],[[64693,64693],"mapped",[1590,1581]],[[64694,64694],"mapped",[1590,1582]],[[64695,64695],"mapped",[1590,1605]],[[64696,64696],"mapped",[1591,1581]],[[64697,64697],"mapped",[1592,1605]],[[64698,64698],"mapped",[1593,1580]],[[64699,64699],"mapped",[1593,1605]],[[64700,64700],"mapped",[1594,1580]],[[64701,64701],"mapped",[1594,1605]],[[64702,64702],"mapped",[1601,1580]],[[64703,64703],"mapped",[1601,1581]],[[64704,64704],"mapped",[1601,1582]],[[64705,64705],"mapped",[1601,1605]],[[64706,64706],"mapped",[1602,1581]],[[64707,64707],"mapped",[1602,1605]],[[64708,64708],"mapped",[1603,1580]],[[64709,64709],"mapped",[1603,1581]],[[64710,64710],"mapped",[1603,1582]],[[64711,64711],"mapped",[1603,1604]],[[64712,64712],"mapped",[1603,1605]],[[64713,64713],"mapped",[1604,1580]],[[64714,64714],"mapped",[1604,1581]],[[64715,64715],"mapped",[1604,1582]],[[64716,64716],"mapped",[1604,1605]],[[64717,64717],"mapped",[1604,1607]],[[64718,64718],"mapped",[1605,1580]],[[64719,64719],"mapped",[1605,1581]],[[64720,64720],"mapped",[1605,1582]],[[64721,64721],"mapped",[1605,1605]],[[64722,64722],"mapped",[1606,1580]],[[64723,64723],"mapped",[1606,1581]],[[64724,64724],"mapped",[1606,1582]],[[64725,64725],"mapped",[1606,1605]],[[64726,64726],"mapped",[1606,1607]],[[64727,64727],"mapped",[1607,1580]],[[64728,64728],"mapped",[1607,1605]],[[64729,64729],"mapped",[1607,1648]],[[64730,64730],"mapped",[1610,1580]],[[64731,64731],"mapped",[1610,1581]],[[64732,64732],"mapped",[1610,1582]],[[64733,64733],"mapped",[1610,1605]],[[64734,64734],"mapped",[1610,1607]],[[64735,64735],"mapped",[1574,1605]],[[64736,64736],"mapped",[1574,1607]],[[64737,64737],"mapped",[1576,1605]],[[64738,64738],"mapped",[1576,1607]],[[64739,64739],"mapped",[1578,1605]],[[64740,64740],"mapped",[1578,1607]],[[64741,64741],"mapped",[1579,1605]],[[64742,64742],"mapped",[1579,1607]],[[64743,64743],"mapped",[1587,1605]],[[64744,64744],"mapped",[1587,1607]],[[64745,64745],"mapped",[1588,1605]],[[64746,64746],"mapped",[1588,1607]],[[64747,64747],"mapped",[1603,1604]],[[64748,64748],"mapped",[1603,1605]],[[64749,64749],"mapped",[1604,1605]],[[64750,64750],"mapped",[1606,1605]],[[64751,64751],"mapped",[1606,1607]],[[64752,64752],"mapped",[1610,1605]],[[64753,64753],"mapped",[1610,1607]],[[64754,64754],"mapped",[1600,1614,1617]],[[64755,64755],"mapped",[1600,1615,1617]],[[64756,64756],"mapped",[1600,1616,1617]],[[64757,64757],"mapped",[1591,1609]],[[64758,64758],"mapped",[1591,1610]],[[64759,64759],"mapped",[1593,1609]],[[64760,64760],"mapped",[1593,1610]],[[64761,64761],"mapped",[1594,1609]],[[64762,64762],"mapped",[1594,1610]],[[64763,64763],"mapped",[1587,1609]],[[64764,64764],"mapped",[1587,1610]],[[64765,64765],"mapped",[1588,1609]],[[64766,64766],"mapped",[1588,1610]],[[64767,64767],"mapped",[1581,1609]],[[64768,64768],"mapped",[1581,1610]],[[64769,64769],"mapped",[1580,1609]],[[64770,64770],"mapped",[1580,1610]],[[64771,64771],"mapped",[1582,1609]],[[64772,64772],"mapped",[1582,1610]],[[64773,64773],"mapped",[1589,1609]],[[64774,64774],"mapped",[1589,1610]],[[64775,64775],"mapped",[1590,1609]],[[64776,64776],"mapped",[1590,1610]],[[64777,64777],"mapped",[1588,1580]],[[64778,64778],"mapped",[1588,1581]],[[64779,64779],"mapped",[1588,1582]],[[64780,64780],"mapped",[1588,1605]],[[64781,64781],"mapped",[1588,1585]],[[64782,64782],"mapped",[1587,1585]],[[64783,64783],"mapped",[1589,1585]],[[64784,64784],"mapped",[1590,1585]],[[64785,64785],"mapped",[1591,1609]],[[64786,64786],"mapped",[1591,1610]],[[64787,64787],"mapped",[1593,1609]],[[64788,64788],"mapped",[1593,1610]],[[64789,64789],"mapped",[1594,1609]],[[64790,64790],"mapped",[1594,1610]],[[64791,64791],"mapped",[1587,1609]],[[64792,64792],"mapped",[1587,1610]],[[64793,64793],"mapped",[1588,1609]],[[64794,64794],"mapped",[1588,1610]],[[64795,64795],"mapped",[1581,1609]],[[64796,64796],"mapped",[1581,1610]],[[64797,64797],"mapped",[1580,1609]],[[64798,64798],"mapped",[1580,1610]],[[64799,64799],"mapped",[1582,1609]],[[64800,64800],"mapped",[1582,1610]],[[64801,64801],"mapped",[1589,1609]],[[64802,64802],"mapped",[1589,1610]],[[64803,64803],"mapped",[1590,1609]],[[64804,64804],"mapped",[1590,1610]],[[64805,64805],"mapped",[1588,1580]],[[64806,64806],"mapped",[1588,1581]],[[64807,64807],"mapped",[1588,1582]],[[64808,64808],"mapped",[1588,1605]],[[64809,64809],"mapped",[1588,1585]],[[64810,64810],"mapped",[1587,1585]],[[64811,64811],"mapped",[1589,1585]],[[64812,64812],"mapped",[1590,1585]],[[64813,64813],"mapped",[1588,1580]],[[64814,64814],"mapped",[1588,1581]],[[64815,64815],"mapped",[1588,1582]],[[64816,64816],"mapped",[1588,1605]],[[64817,64817],"mapped",[1587,1607]],[[64818,64818],"mapped",[1588,1607]],[[64819,64819],"mapped",[1591,1605]],[[64820,64820],"mapped",[1587,1580]],[[64821,64821],"mapped",[1587,1581]],[[64822,64822],"mapped",[1587,1582]],[[64823,64823],"mapped",[1588,1580]],[[64824,64824],"mapped",[1588,1581]],[[64825,64825],"mapped",[1588,1582]],[[64826,64826],"mapped",[1591,1605]],[[64827,64827],"mapped",[1592,1605]],[[64828,64829],"mapped",[1575,1611]],[[64830,64831],"valid",[],"NV8"],[[64832,64847],"disallowed"],[[64848,64848],"mapped",[1578,1580,1605]],[[64849,64850],"mapped",[1578,1581,1580]],[[64851,64851],"mapped",[1578,1581,1605]],[[64852,64852],"mapped",[1578,1582,1605]],[[64853,64853],"mapped",[1578,1605,1580]],[[64854,64854],"mapped",[1578,1605,1581]],[[64855,64855],"mapped",[1578,1605,1582]],[[64856,64857],"mapped",[1580,1605,1581]],[[64858,64858],"mapped",[1581,1605,1610]],[[64859,64859],"mapped",[1581,1605,1609]],[[64860,64860],"mapped",[1587,1581,1580]],[[64861,64861],"mapped",[1587,1580,1581]],[[64862,64862],"mapped",[1587,1580,1609]],[[64863,64864],"mapped",[1587,1605,1581]],[[64865,64865],"mapped",[1587,1605,1580]],[[64866,64867],"mapped",[1587,1605,1605]],[[64868,64869],"mapped",[1589,1581,1581]],[[64870,64870],"mapped",[1589,1605,1605]],[[64871,64872],"mapped",[1588,1581,1605]],[[64873,64873],"mapped",[1588,1580,1610]],[[64874,64875],"mapped",[1588,1605,1582]],[[64876,64877],"mapped",[1588,1605,1605]],[[64878,64878],"mapped",[1590,1581,1609]],[[64879,64880],"mapped",[1590,1582,1605]],[[64881,64882],"mapped",[1591,1605,1581]],[[64883,64883],"mapped",[1591,1605,1605]],[[64884,64884],"mapped",[1591,1605,1610]],[[64885,64885],"mapped",[1593,1580,1605]],[[64886,64887],"mapped",[1593,1605,1605]],[[64888,64888],"mapped",[1593,1605,1609]],[[64889,64889],"mapped",[1594,1605,1605]],[[64890,64890],"mapped",[1594,1605,1610]],[[64891,64891],"mapped",[1594,1605,1609]],[[64892,64893],"mapped",[1601,1582,1605]],[[64894,64894],"mapped",[1602,1605,1581]],[[64895,64895],"mapped",[1602,1605,1605]],[[64896,64896],"mapped",[1604,1581,1605]],[[64897,64897],"mapped",[1604,1581,1610]],[[64898,64898],"mapped",[1604,1581,1609]],[[64899,64900],"mapped",[1604,1580,1580]],[[64901,64902],"mapped",[1604,1582,1605]],[[64903,64904],"mapped",[1604,1605,1581]],[[64905,64905],"mapped",[1605,1581,1580]],[[64906,64906],"mapped",[1605,1581,1605]],[[64907,64907],"mapped",[1605,1581,1610]],[[64908,64908],"mapped",[1605,1580,1581]],[[64909,64909],"mapped",[1605,1580,1605]],[[64910,64910],"mapped",[1605,1582,1580]],[[64911,64911],"mapped",[1605,1582,1605]],[[64912,64913],"disallowed"],[[64914,64914],"mapped",[1605,1580,1582]],[[64915,64915],"mapped",[1607,1605,1580]],[[64916,64916],"mapped",[1607,1605,1605]],[[64917,64917],"mapped",[1606,1581,1605]],[[64918,64918],"mapped",[1606,1581,1609]],[[64919,64920],"mapped",[1606,1580,1605]],[[64921,64921],"mapped",[1606,1580,1609]],[[64922,64922],"mapped",[1606,1605,1610]],[[64923,64923],"mapped",[1606,1605,1609]],[[64924,64925],"mapped",[1610,1605,1605]],[[64926,64926],"mapped",[1576,1582,1610]],[[64927,64927],"mapped",[1578,1580,1610]],[[64928,64928],"mapped",[1578,1580,1609]],[[64929,64929],"mapped",[1578,1582,1610]],[[64930,64930],"mapped",[1578,1582,1609]],[[64931,64931],"mapped",[1578,1605,1610]],[[64932,64932],"mapped",[1578,1605,1609]],[[64933,64933],"mapped",[1580,1605,1610]],[[64934,64934],"mapped",[1580,1581,1609]],[[64935,64935],"mapped",[1580,1605,1609]],[[64936,64936],"mapped",[1587,1582,1609]],[[64937,64937],"mapped",[1589,1581,1610]],[[64938,64938],"mapped",[1588,1581,1610]],[[64939,64939],"mapped",[1590,1581,1610]],[[64940,64940],"mapped",[1604,1580,1610]],[[64941,64941],"mapped",[1604,1605,1610]],[[64942,64942],"mapped",[1610,1581,1610]],[[64943,64943],"mapped",[1610,1580,1610]],[[64944,64944],"mapped",[1610,1605,1610]],[[64945,64945],"mapped",[1605,1605,1610]],[[64946,64946],"mapped",[1602,1605,1610]],[[64947,64947],"mapped",[1606,1581,1610]],[[64948,64948],"mapped",[1602,1605,1581]],[[64949,64949],"mapped",[1604,1581,1605]],[[64950,64950],"mapped",[1593,1605,1610]],[[64951,64951],"mapped",[1603,1605,1610]],[[64952,64952],"mapped",[1606,1580,1581]],[[64953,64953],"mapped",[1605,1582,1610]],[[64954,64954],"mapped",[1604,1580,1605]],[[64955,64955],"mapped",[1603,1605,1605]],[[64956,64956],"mapped",[1604,1580,1605]],[[64957,64957],"mapped",[1606,1580,1581]],[[64958,64958],"mapped",[1580,1581,1610]],[[64959,64959],"mapped",[1581,1580,1610]],[[64960,64960],"mapped",[1605,1580,1610]],[[64961,64961],"mapped",[1601,1605,1610]],[[64962,64962],"mapped",[1576,1581,1610]],[[64963,64963],"mapped",[1603,1605,1605]],[[64964,64964],"mapped",[1593,1580,1605]],[[64965,64965],"mapped",[1589,1605,1605]],[[64966,64966],"mapped",[1587,1582,1610]],[[64967,64967],"mapped",[1606,1580,1610]],[[64968,64975],"disallowed"],[[64976,65007],"disallowed"],[[65008,65008],"mapped",[1589,1604,1746]],[[65009,65009],"mapped",[1602,1604,1746]],[[65010,65010],"mapped",[1575,1604,1604,1607]],[[65011,65011],"mapped",[1575,1603,1576,1585]],[[65012,65012],"mapped",[1605,1581,1605,1583]],[[65013,65013],"mapped",[1589,1604,1593,1605]],[[65014,65014],"mapped",[1585,1587,1608,1604]],[[65015,65015],"mapped",[1593,1604,1610,1607]],[[65016,65016],"mapped",[1608,1587,1604,1605]],[[65017,65017],"mapped",[1589,1604,1609]],[[65018,65018],"disallowed_STD3_mapped",[1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605]],[[65019,65019],"disallowed_STD3_mapped",[1580,1604,32,1580,1604,1575,1604,1607]],[[65020,65020],"mapped",[1585,1740,1575,1604]],[[65021,65021],"valid",[],"NV8"],[[65022,65023],"disallowed"],[[65024,65039],"ignored"],[[65040,65040],"disallowed_STD3_mapped",[44]],[[65041,65041],"mapped",[12289]],[[65042,65042],"disallowed"],[[65043,65043],"disallowed_STD3_mapped",[58]],[[65044,65044],"disallowed_STD3_mapped",[59]],[[65045,65045],"disallowed_STD3_mapped",[33]],[[65046,65046],"disallowed_STD3_mapped",[63]],[[65047,65047],"mapped",[12310]],[[65048,65048],"mapped",[12311]],[[65049,65049],"disallowed"],[[65050,65055],"disallowed"],[[65056,65059],"valid"],[[65060,65062],"valid"],[[65063,65069],"valid"],[[65070,65071],"valid"],[[65072,65072],"disallowed"],[[65073,65073],"mapped",[8212]],[[65074,65074],"mapped",[8211]],[[65075,65076],"disallowed_STD3_mapped",[95]],[[65077,65077],"disallowed_STD3_mapped",[40]],[[65078,65078],"disallowed_STD3_mapped",[41]],[[65079,65079],"disallowed_STD3_mapped",[123]],[[65080,65080],"disallowed_STD3_mapped",[125]],[[65081,65081],"mapped",[12308]],[[65082,65082],"mapped",[12309]],[[65083,65083],"mapped",[12304]],[[65084,65084],"mapped",[12305]],[[65085,65085],"mapped",[12298]],[[65086,65086],"mapped",[12299]],[[65087,65087],"mapped",[12296]],[[65088,65088],"mapped",[12297]],[[65089,65089],"mapped",[12300]],[[65090,65090],"mapped",[12301]],[[65091,65091],"mapped",[12302]],[[65092,65092],"mapped",[12303]],[[65093,65094],"valid",[],"NV8"],[[65095,65095],"disallowed_STD3_mapped",[91]],[[65096,65096],"disallowed_STD3_mapped",[93]],[[65097,65100],"disallowed_STD3_mapped",[32,773]],[[65101,65103],"disallowed_STD3_mapped",[95]],[[65104,65104],"disallowed_STD3_mapped",[44]],[[65105,65105],"mapped",[12289]],[[65106,65106],"disallowed"],[[65107,65107],"disallowed"],[[65108,65108],"disallowed_STD3_mapped",[59]],[[65109,65109],"disallowed_STD3_mapped",[58]],[[65110,65110],"disallowed_STD3_mapped",[63]],[[65111,65111],"disallowed_STD3_mapped",[33]],[[65112,65112],"mapped",[8212]],[[65113,65113],"disallowed_STD3_mapped",[40]],[[65114,65114],"disallowed_STD3_mapped",[41]],[[65115,65115],"disallowed_STD3_mapped",[123]],[[65116,65116],"disallowed_STD3_mapped",[125]],[[65117,65117],"mapped",[12308]],[[65118,65118],"mapped",[12309]],[[65119,65119],"disallowed_STD3_mapped",[35]],[[65120,65120],"disallowed_STD3_mapped",[38]],[[65121,65121],"disallowed_STD3_mapped",[42]],[[65122,65122],"disallowed_STD3_mapped",[43]],[[65123,65123],"mapped",[45]],[[65124,65124],"disallowed_STD3_mapped",[60]],[[65125,65125],"disallowed_STD3_mapped",[62]],[[65126,65126],"disallowed_STD3_mapped",[61]],[[65127,65127],"disallowed"],[[65128,65128],"disallowed_STD3_mapped",[92]],[[65129,65129],"disallowed_STD3_mapped",[36]],[[65130,65130],"disallowed_STD3_mapped",[37]],[[65131,65131],"disallowed_STD3_mapped",[64]],[[65132,65135],"disallowed"],[[65136,65136],"disallowed_STD3_mapped",[32,1611]],[[65137,65137],"mapped",[1600,1611]],[[65138,65138],"disallowed_STD3_mapped",[32,1612]],[[65139,65139],"valid"],[[65140,65140],"disallowed_STD3_mapped",[32,1613]],[[65141,65141],"disallowed"],[[65142,65142],"disallowed_STD3_mapped",[32,1614]],[[65143,65143],"mapped",[1600,1614]],[[65144,65144],"disallowed_STD3_mapped",[32,1615]],[[65145,65145],"mapped",[1600,1615]],[[65146,65146],"disallowed_STD3_mapped",[32,1616]],[[65147,65147],"mapped",[1600,1616]],[[65148,65148],"disallowed_STD3_mapped",[32,1617]],[[65149,65149],"mapped",[1600,1617]],[[65150,65150],"disallowed_STD3_mapped",[32,1618]],[[65151,65151],"mapped",[1600,1618]],[[65152,65152],"mapped",[1569]],[[65153,65154],"mapped",[1570]],[[65155,65156],"mapped",[1571]],[[65157,65158],"mapped",[1572]],[[65159,65160],"mapped",[1573]],[[65161,65164],"mapped",[1574]],[[65165,65166],"mapped",[1575]],[[65167,65170],"mapped",[1576]],[[65171,65172],"mapped",[1577]],[[65173,65176],"mapped",[1578]],[[65177,65180],"mapped",[1579]],[[65181,65184],"mapped",[1580]],[[65185,65188],"mapped",[1581]],[[65189,65192],"mapped",[1582]],[[65193,65194],"mapped",[1583]],[[65195,65196],"mapped",[1584]],[[65197,65198],"mapped",[1585]],[[65199,65200],"mapped",[1586]],[[65201,65204],"mapped",[1587]],[[65205,65208],"mapped",[1588]],[[65209,65212],"mapped",[1589]],[[65213,65216],"mapped",[1590]],[[65217,65220],"mapped",[1591]],[[65221,65224],"mapped",[1592]],[[65225,65228],"mapped",[1593]],[[65229,65232],"mapped",[1594]],[[65233,65236],"mapped",[1601]],[[65237,65240],"mapped",[1602]],[[65241,65244],"mapped",[1603]],[[65245,65248],"mapped",[1604]],[[65249,65252],"mapped",[1605]],[[65253,65256],"mapped",[1606]],[[65257,65260],"mapped",[1607]],[[65261,65262],"mapped",[1608]],[[65263,65264],"mapped",[1609]],[[65265,65268],"mapped",[1610]],[[65269,65270],"mapped",[1604,1570]],[[65271,65272],"mapped",[1604,1571]],[[65273,65274],"mapped",[1604,1573]],[[65275,65276],"mapped",[1604,1575]],[[65277,65278],"disallowed"],[[65279,65279],"ignored"],[[65280,65280],"disallowed"],[[65281,65281],"disallowed_STD3_mapped",[33]],[[65282,65282],"disallowed_STD3_mapped",[34]],[[65283,65283],"disallowed_STD3_mapped",[35]],[[65284,65284],"disallowed_STD3_mapped",[36]],[[65285,65285],"disallowed_STD3_mapped",[37]],[[65286,65286],"disallowed_STD3_mapped",[38]],[[65287,65287],"disallowed_STD3_mapped",[39]],[[65288,65288],"disallowed_STD3_mapped",[40]],[[65289,65289],"disallowed_STD3_mapped",[41]],[[65290,65290],"disallowed_STD3_mapped",[42]],[[65291,65291],"disallowed_STD3_mapped",[43]],[[65292,65292],"disallowed_STD3_mapped",[44]],[[65293,65293],"mapped",[45]],[[65294,65294],"mapped",[46]],[[65295,65295],"disallowed_STD3_mapped",[47]],[[65296,65296],"mapped",[48]],[[65297,65297],"mapped",[49]],[[65298,65298],"mapped",[50]],[[65299,65299],"mapped",[51]],[[65300,65300],"mapped",[52]],[[65301,65301],"mapped",[53]],[[65302,65302],"mapped",[54]],[[65303,65303],"mapped",[55]],[[65304,65304],"mapped",[56]],[[65305,65305],"mapped",[57]],[[65306,65306],"disallowed_STD3_mapped",[58]],[[65307,65307],"disallowed_STD3_mapped",[59]],[[65308,65308],"disallowed_STD3_mapped",[60]],[[65309,65309],"disallowed_STD3_mapped",[61]],[[65310,65310],"disallowed_STD3_mapped",[62]],[[65311,65311],"disallowed_STD3_mapped",[63]],[[65312,65312],"disallowed_STD3_mapped",[64]],[[65313,65313],"mapped",[97]],[[65314,65314],"mapped",[98]],[[65315,65315],"mapped",[99]],[[65316,65316],"mapped",[100]],[[65317,65317],"mapped",[101]],[[65318,65318],"mapped",[102]],[[65319,65319],"mapped",[103]],[[65320,65320],"mapped",[104]],[[65321,65321],"mapped",[105]],[[65322,65322],"mapped",[106]],[[65323,65323],"mapped",[107]],[[65324,65324],"mapped",[108]],[[65325,65325],"mapped",[109]],[[65326,65326],"mapped",[110]],[[65327,65327],"mapped",[111]],[[65328,65328],"mapped",[112]],[[65329,65329],"mapped",[113]],[[65330,65330],"mapped",[114]],[[65331,65331],"mapped",[115]],[[65332,65332],"mapped",[116]],[[65333,65333],"mapped",[117]],[[65334,65334],"mapped",[118]],[[65335,65335],"mapped",[119]],[[65336,65336],"mapped",[120]],[[65337,65337],"mapped",[121]],[[65338,65338],"mapped",[122]],[[65339,65339],"disallowed_STD3_mapped",[91]],[[65340,65340],"disallowed_STD3_mapped",[92]],[[65341,65341],"disallowed_STD3_mapped",[93]],[[65342,65342],"disallowed_STD3_mapped",[94]],[[65343,65343],"disallowed_STD3_mapped",[95]],[[65344,65344],"disallowed_STD3_mapped",[96]],[[65345,65345],"mapped",[97]],[[65346,65346],"mapped",[98]],[[65347,65347],"mapped",[99]],[[65348,65348],"mapped",[100]],[[65349,65349],"mapped",[101]],[[65350,65350],"mapped",[102]],[[65351,65351],"mapped",[103]],[[65352,65352],"mapped",[104]],[[65353,65353],"mapped",[105]],[[65354,65354],"mapped",[106]],[[65355,65355],"mapped",[107]],[[65356,65356],"mapped",[108]],[[65357,65357],"mapped",[109]],[[65358,65358],"mapped",[110]],[[65359,65359],"mapped",[111]],[[65360,65360],"mapped",[112]],[[65361,65361],"mapped",[113]],[[65362,65362],"mapped",[114]],[[65363,65363],"mapped",[115]],[[65364,65364],"mapped",[116]],[[65365,65365],"mapped",[117]],[[65366,65366],"mapped",[118]],[[65367,65367],"mapped",[119]],[[65368,65368],"mapped",[120]],[[65369,65369],"mapped",[121]],[[65370,65370],"mapped",[122]],[[65371,65371],"disallowed_STD3_mapped",[123]],[[65372,65372],"disallowed_STD3_mapped",[124]],[[65373,65373],"disallowed_STD3_mapped",[125]],[[65374,65374],"disallowed_STD3_mapped",[126]],[[65375,65375],"mapped",[10629]],[[65376,65376],"mapped",[10630]],[[65377,65377],"mapped",[46]],[[65378,65378],"mapped",[12300]],[[65379,65379],"mapped",[12301]],[[65380,65380],"mapped",[12289]],[[65381,65381],"mapped",[12539]],[[65382,65382],"mapped",[12530]],[[65383,65383],"mapped",[12449]],[[65384,65384],"mapped",[12451]],[[65385,65385],"mapped",[12453]],[[65386,65386],"mapped",[12455]],[[65387,65387],"mapped",[12457]],[[65388,65388],"mapped",[12515]],[[65389,65389],"mapped",[12517]],[[65390,65390],"mapped",[12519]],[[65391,65391],"mapped",[12483]],[[65392,65392],"mapped",[12540]],[[65393,65393],"mapped",[12450]],[[65394,65394],"mapped",[12452]],[[65395,65395],"mapped",[12454]],[[65396,65396],"mapped",[12456]],[[65397,65397],"mapped",[12458]],[[65398,65398],"mapped",[12459]],[[65399,65399],"mapped",[12461]],[[65400,65400],"mapped",[12463]],[[65401,65401],"mapped",[12465]],[[65402,65402],"mapped",[12467]],[[65403,65403],"mapped",[12469]],[[65404,65404],"mapped",[12471]],[[65405,65405],"mapped",[12473]],[[65406,65406],"mapped",[12475]],[[65407,65407],"mapped",[12477]],[[65408,65408],"mapped",[12479]],[[65409,65409],"mapped",[12481]],[[65410,65410],"mapped",[12484]],[[65411,65411],"mapped",[12486]],[[65412,65412],"mapped",[12488]],[[65413,65413],"mapped",[12490]],[[65414,65414],"mapped",[12491]],[[65415,65415],"mapped",[12492]],[[65416,65416],"mapped",[12493]],[[65417,65417],"mapped",[12494]],[[65418,65418],"mapped",[12495]],[[65419,65419],"mapped",[12498]],[[65420,65420],"mapped",[12501]],[[65421,65421],"mapped",[12504]],[[65422,65422],"mapped",[12507]],[[65423,65423],"mapped",[12510]],[[65424,65424],"mapped",[12511]],[[65425,65425],"mapped",[12512]],[[65426,65426],"mapped",[12513]],[[65427,65427],"mapped",[12514]],[[65428,65428],"mapped",[12516]],[[65429,65429],"mapped",[12518]],[[65430,65430],"mapped",[12520]],[[65431,65431],"mapped",[12521]],[[65432,65432],"mapped",[12522]],[[65433,65433],"mapped",[12523]],[[65434,65434],"mapped",[12524]],[[65435,65435],"mapped",[12525]],[[65436,65436],"mapped",[12527]],[[65437,65437],"mapped",[12531]],[[65438,65438],"mapped",[12441]],[[65439,65439],"mapped",[12442]],[[65440,65440],"disallowed"],[[65441,65441],"mapped",[4352]],[[65442,65442],"mapped",[4353]],[[65443,65443],"mapped",[4522]],[[65444,65444],"mapped",[4354]],[[65445,65445],"mapped",[4524]],[[65446,65446],"mapped",[4525]],[[65447,65447],"mapped",[4355]],[[65448,65448],"mapped",[4356]],[[65449,65449],"mapped",[4357]],[[65450,65450],"mapped",[4528]],[[65451,65451],"mapped",[4529]],[[65452,65452],"mapped",[4530]],[[65453,65453],"mapped",[4531]],[[65454,65454],"mapped",[4532]],[[65455,65455],"mapped",[4533]],[[65456,65456],"mapped",[4378]],[[65457,65457],"mapped",[4358]],[[65458,65458],"mapped",[4359]],[[65459,65459],"mapped",[4360]],[[65460,65460],"mapped",[4385]],[[65461,65461],"mapped",[4361]],[[65462,65462],"mapped",[4362]],[[65463,65463],"mapped",[4363]],[[65464,65464],"mapped",[4364]],[[65465,65465],"mapped",[4365]],[[65466,65466],"mapped",[4366]],[[65467,65467],"mapped",[4367]],[[65468,65468],"mapped",[4368]],[[65469,65469],"mapped",[4369]],[[65470,65470],"mapped",[4370]],[[65471,65473],"disallowed"],[[65474,65474],"mapped",[4449]],[[65475,65475],"mapped",[4450]],[[65476,65476],"mapped",[4451]],[[65477,65477],"mapped",[4452]],[[65478,65478],"mapped",[4453]],[[65479,65479],"mapped",[4454]],[[65480,65481],"disallowed"],[[65482,65482],"mapped",[4455]],[[65483,65483],"mapped",[4456]],[[65484,65484],"mapped",[4457]],[[65485,65485],"mapped",[4458]],[[65486,65486],"mapped",[4459]],[[65487,65487],"mapped",[4460]],[[65488,65489],"disallowed"],[[65490,65490],"mapped",[4461]],[[65491,65491],"mapped",[4462]],[[65492,65492],"mapped",[4463]],[[65493,65493],"mapped",[4464]],[[65494,65494],"mapped",[4465]],[[65495,65495],"mapped",[4466]],[[65496,65497],"disallowed"],[[65498,65498],"mapped",[4467]],[[65499,65499],"mapped",[4468]],[[65500,65500],"mapped",[4469]],[[65501,65503],"disallowed"],[[65504,65504],"mapped",[162]],[[65505,65505],"mapped",[163]],[[65506,65506],"mapped",[172]],[[65507,65507],"disallowed_STD3_mapped",[32,772]],[[65508,65508],"mapped",[166]],[[65509,65509],"mapped",[165]],[[65510,65510],"mapped",[8361]],[[65511,65511],"disallowed"],[[65512,65512],"mapped",[9474]],[[65513,65513],"mapped",[8592]],[[65514,65514],"mapped",[8593]],[[65515,65515],"mapped",[8594]],[[65516,65516],"mapped",[8595]],[[65517,65517],"mapped",[9632]],[[65518,65518],"mapped",[9675]],[[65519,65528],"disallowed"],[[65529,65531],"disallowed"],[[65532,65532],"disallowed"],[[65533,65533],"disallowed"],[[65534,65535],"disallowed"],[[65536,65547],"valid"],[[65548,65548],"disallowed"],[[65549,65574],"valid"],[[65575,65575],"disallowed"],[[65576,65594],"valid"],[[65595,65595],"disallowed"],[[65596,65597],"valid"],[[65598,65598],"disallowed"],[[65599,65613],"valid"],[[65614,65615],"disallowed"],[[65616,65629],"valid"],[[65630,65663],"disallowed"],[[65664,65786],"valid"],[[65787,65791],"disallowed"],[[65792,65794],"valid",[],"NV8"],[[65795,65798],"disallowed"],[[65799,65843],"valid",[],"NV8"],[[65844,65846],"disallowed"],[[65847,65855],"valid",[],"NV8"],[[65856,65930],"valid",[],"NV8"],[[65931,65932],"valid",[],"NV8"],[[65933,65935],"disallowed"],[[65936,65947],"valid",[],"NV8"],[[65948,65951],"disallowed"],[[65952,65952],"valid",[],"NV8"],[[65953,65999],"disallowed"],[[66000,66044],"valid",[],"NV8"],[[66045,66045],"valid"],[[66046,66175],"disallowed"],[[66176,66204],"valid"],[[66205,66207],"disallowed"],[[66208,66256],"valid"],[[66257,66271],"disallowed"],[[66272,66272],"valid"],[[66273,66299],"valid",[],"NV8"],[[66300,66303],"disallowed"],[[66304,66334],"valid"],[[66335,66335],"valid"],[[66336,66339],"valid",[],"NV8"],[[66340,66351],"disallowed"],[[66352,66368],"valid"],[[66369,66369],"valid",[],"NV8"],[[66370,66377],"valid"],[[66378,66378],"valid",[],"NV8"],[[66379,66383],"disallowed"],[[66384,66426],"valid"],[[66427,66431],"disallowed"],[[66432,66461],"valid"],[[66462,66462],"disallowed"],[[66463,66463],"valid",[],"NV8"],[[66464,66499],"valid"],[[66500,66503],"disallowed"],[[66504,66511],"valid"],[[66512,66517],"valid",[],"NV8"],[[66518,66559],"disallowed"],[[66560,66560],"mapped",[66600]],[[66561,66561],"mapped",[66601]],[[66562,66562],"mapped",[66602]],[[66563,66563],"mapped",[66603]],[[66564,66564],"mapped",[66604]],[[66565,66565],"mapped",[66605]],[[66566,66566],"mapped",[66606]],[[66567,66567],"mapped",[66607]],[[66568,66568],"mapped",[66608]],[[66569,66569],"mapped",[66609]],[[66570,66570],"mapped",[66610]],[[66571,66571],"mapped",[66611]],[[66572,66572],"mapped",[66612]],[[66573,66573],"mapped",[66613]],[[66574,66574],"mapped",[66614]],[[66575,66575],"mapped",[66615]],[[66576,66576],"mapped",[66616]],[[66577,66577],"mapped",[66617]],[[66578,66578],"mapped",[66618]],[[66579,66579],"mapped",[66619]],[[66580,66580],"mapped",[66620]],[[66581,66581],"mapped",[66621]],[[66582,66582],"mapped",[66622]],[[66583,66583],"mapped",[66623]],[[66584,66584],"mapped",[66624]],[[66585,66585],"mapped",[66625]],[[66586,66586],"mapped",[66626]],[[66587,66587],"mapped",[66627]],[[66588,66588],"mapped",[66628]],[[66589,66589],"mapped",[66629]],[[66590,66590],"mapped",[66630]],[[66591,66591],"mapped",[66631]],[[66592,66592],"mapped",[66632]],[[66593,66593],"mapped",[66633]],[[66594,66594],"mapped",[66634]],[[66595,66595],"mapped",[66635]],[[66596,66596],"mapped",[66636]],[[66597,66597],"mapped",[66637]],[[66598,66598],"mapped",[66638]],[[66599,66599],"mapped",[66639]],[[66600,66637],"valid"],[[66638,66717],"valid"],[[66718,66719],"disallowed"],[[66720,66729],"valid"],[[66730,66815],"disallowed"],[[66816,66855],"valid"],[[66856,66863],"disallowed"],[[66864,66915],"valid"],[[66916,66926],"disallowed"],[[66927,66927],"valid",[],"NV8"],[[66928,67071],"disallowed"],[[67072,67382],"valid"],[[67383,67391],"disallowed"],[[67392,67413],"valid"],[[67414,67423],"disallowed"],[[67424,67431],"valid"],[[67432,67583],"disallowed"],[[67584,67589],"valid"],[[67590,67591],"disallowed"],[[67592,67592],"valid"],[[67593,67593],"disallowed"],[[67594,67637],"valid"],[[67638,67638],"disallowed"],[[67639,67640],"valid"],[[67641,67643],"disallowed"],[[67644,67644],"valid"],[[67645,67646],"disallowed"],[[67647,67647],"valid"],[[67648,67669],"valid"],[[67670,67670],"disallowed"],[[67671,67679],"valid",[],"NV8"],[[67680,67702],"valid"],[[67703,67711],"valid",[],"NV8"],[[67712,67742],"valid"],[[67743,67750],"disallowed"],[[67751,67759],"valid",[],"NV8"],[[67760,67807],"disallowed"],[[67808,67826],"valid"],[[67827,67827],"disallowed"],[[67828,67829],"valid"],[[67830,67834],"disallowed"],[[67835,67839],"valid",[],"NV8"],[[67840,67861],"valid"],[[67862,67865],"valid",[],"NV8"],[[67866,67867],"valid",[],"NV8"],[[67868,67870],"disallowed"],[[67871,67871],"valid",[],"NV8"],[[67872,67897],"valid"],[[67898,67902],"disallowed"],[[67903,67903],"valid",[],"NV8"],[[67904,67967],"disallowed"],[[67968,68023],"valid"],[[68024,68027],"disallowed"],[[68028,68029],"valid",[],"NV8"],[[68030,68031],"valid"],[[68032,68047],"valid",[],"NV8"],[[68048,68049],"disallowed"],[[68050,68095],"valid",[],"NV8"],[[68096,68099],"valid"],[[68100,68100],"disallowed"],[[68101,68102],"valid"],[[68103,68107],"disallowed"],[[68108,68115],"valid"],[[68116,68116],"disallowed"],[[68117,68119],"valid"],[[68120,68120],"disallowed"],[[68121,68147],"valid"],[[68148,68151],"disallowed"],[[68152,68154],"valid"],[[68155,68158],"disallowed"],[[68159,68159],"valid"],[[68160,68167],"valid",[],"NV8"],[[68168,68175],"disallowed"],[[68176,68184],"valid",[],"NV8"],[[68185,68191],"disallowed"],[[68192,68220],"valid"],[[68221,68223],"valid",[],"NV8"],[[68224,68252],"valid"],[[68253,68255],"valid",[],"NV8"],[[68256,68287],"disallowed"],[[68288,68295],"valid"],[[68296,68296],"valid",[],"NV8"],[[68297,68326],"valid"],[[68327,68330],"disallowed"],[[68331,68342],"valid",[],"NV8"],[[68343,68351],"disallowed"],[[68352,68405],"valid"],[[68406,68408],"disallowed"],[[68409,68415],"valid",[],"NV8"],[[68416,68437],"valid"],[[68438,68439],"disallowed"],[[68440,68447],"valid",[],"NV8"],[[68448,68466],"valid"],[[68467,68471],"disallowed"],[[68472,68479],"valid",[],"NV8"],[[68480,68497],"valid"],[[68498,68504],"disallowed"],[[68505,68508],"valid",[],"NV8"],[[68509,68520],"disallowed"],[[68521,68527],"valid",[],"NV8"],[[68528,68607],"disallowed"],[[68608,68680],"valid"],[[68681,68735],"disallowed"],[[68736,68736],"mapped",[68800]],[[68737,68737],"mapped",[68801]],[[68738,68738],"mapped",[68802]],[[68739,68739],"mapped",[68803]],[[68740,68740],"mapped",[68804]],[[68741,68741],"mapped",[68805]],[[68742,68742],"mapped",[68806]],[[68743,68743],"mapped",[68807]],[[68744,68744],"mapped",[68808]],[[68745,68745],"mapped",[68809]],[[68746,68746],"mapped",[68810]],[[68747,68747],"mapped",[68811]],[[68748,68748],"mapped",[68812]],[[68749,68749],"mapped",[68813]],[[68750,68750],"mapped",[68814]],[[68751,68751],"mapped",[68815]],[[68752,68752],"mapped",[68816]],[[68753,68753],"mapped",[68817]],[[68754,68754],"mapped",[68818]],[[68755,68755],"mapped",[68819]],[[68756,68756],"mapped",[68820]],[[68757,68757],"mapped",[68821]],[[68758,68758],"mapped",[68822]],[[68759,68759],"mapped",[68823]],[[68760,68760],"mapped",[68824]],[[68761,68761],"mapped",[68825]],[[68762,68762],"mapped",[68826]],[[68763,68763],"mapped",[68827]],[[68764,68764],"mapped",[68828]],[[68765,68765],"mapped",[68829]],[[68766,68766],"mapped",[68830]],[[68767,68767],"mapped",[68831]],[[68768,68768],"mapped",[68832]],[[68769,68769],"mapped",[68833]],[[68770,68770],"mapped",[68834]],[[68771,68771],"mapped",[68835]],[[68772,68772],"mapped",[68836]],[[68773,68773],"mapped",[68837]],[[68774,68774],"mapped",[68838]],[[68775,68775],"mapped",[68839]],[[68776,68776],"mapped",[68840]],[[68777,68777],"mapped",[68841]],[[68778,68778],"mapped",[68842]],[[68779,68779],"mapped",[68843]],[[68780,68780],"mapped",[68844]],[[68781,68781],"mapped",[68845]],[[68782,68782],"mapped",[68846]],[[68783,68783],"mapped",[68847]],[[68784,68784],"mapped",[68848]],[[68785,68785],"mapped",[68849]],[[68786,68786],"mapped",[68850]],[[68787,68799],"disallowed"],[[68800,68850],"valid"],[[68851,68857],"disallowed"],[[68858,68863],"valid",[],"NV8"],[[68864,69215],"disallowed"],[[69216,69246],"valid",[],"NV8"],[[69247,69631],"disallowed"],[[69632,69702],"valid"],[[69703,69709],"valid",[],"NV8"],[[69710,69713],"disallowed"],[[69714,69733],"valid",[],"NV8"],[[69734,69743],"valid"],[[69744,69758],"disallowed"],[[69759,69759],"valid"],[[69760,69818],"valid"],[[69819,69820],"valid",[],"NV8"],[[69821,69821],"disallowed"],[[69822,69825],"valid",[],"NV8"],[[69826,69839],"disallowed"],[[69840,69864],"valid"],[[69865,69871],"disallowed"],[[69872,69881],"valid"],[[69882,69887],"disallowed"],[[69888,69940],"valid"],[[69941,69941],"disallowed"],[[69942,69951],"valid"],[[69952,69955],"valid",[],"NV8"],[[69956,69967],"disallowed"],[[69968,70003],"valid"],[[70004,70005],"valid",[],"NV8"],[[70006,70006],"valid"],[[70007,70015],"disallowed"],[[70016,70084],"valid"],[[70085,70088],"valid",[],"NV8"],[[70089,70089],"valid",[],"NV8"],[[70090,70092],"valid"],[[70093,70093],"valid",[],"NV8"],[[70094,70095],"disallowed"],[[70096,70105],"valid"],[[70106,70106],"valid"],[[70107,70107],"valid",[],"NV8"],[[70108,70108],"valid"],[[70109,70111],"valid",[],"NV8"],[[70112,70112],"disallowed"],[[70113,70132],"valid",[],"NV8"],[[70133,70143],"disallowed"],[[70144,70161],"valid"],[[70162,70162],"disallowed"],[[70163,70199],"valid"],[[70200,70205],"valid",[],"NV8"],[[70206,70271],"disallowed"],[[70272,70278],"valid"],[[70279,70279],"disallowed"],[[70280,70280],"valid"],[[70281,70281],"disallowed"],[[70282,70285],"valid"],[[70286,70286],"disallowed"],[[70287,70301],"valid"],[[70302,70302],"disallowed"],[[70303,70312],"valid"],[[70313,70313],"valid",[],"NV8"],[[70314,70319],"disallowed"],[[70320,70378],"valid"],[[70379,70383],"disallowed"],[[70384,70393],"valid"],[[70394,70399],"disallowed"],[[70400,70400],"valid"],[[70401,70403],"valid"],[[70404,70404],"disallowed"],[[70405,70412],"valid"],[[70413,70414],"disallowed"],[[70415,70416],"valid"],[[70417,70418],"disallowed"],[[70419,70440],"valid"],[[70441,70441],"disallowed"],[[70442,70448],"valid"],[[70449,70449],"disallowed"],[[70450,70451],"valid"],[[70452,70452],"disallowed"],[[70453,70457],"valid"],[[70458,70459],"disallowed"],[[70460,70468],"valid"],[[70469,70470],"disallowed"],[[70471,70472],"valid"],[[70473,70474],"disallowed"],[[70475,70477],"valid"],[[70478,70479],"disallowed"],[[70480,70480],"valid"],[[70481,70486],"disallowed"],[[70487,70487],"valid"],[[70488,70492],"disallowed"],[[70493,70499],"valid"],[[70500,70501],"disallowed"],[[70502,70508],"valid"],[[70509,70511],"disallowed"],[[70512,70516],"valid"],[[70517,70783],"disallowed"],[[70784,70853],"valid"],[[70854,70854],"valid",[],"NV8"],[[70855,70855],"valid"],[[70856,70863],"disallowed"],[[70864,70873],"valid"],[[70874,71039],"disallowed"],[[71040,71093],"valid"],[[71094,71095],"disallowed"],[[71096,71104],"valid"],[[71105,71113],"valid",[],"NV8"],[[71114,71127],"valid",[],"NV8"],[[71128,71133],"valid"],[[71134,71167],"disallowed"],[[71168,71232],"valid"],[[71233,71235],"valid",[],"NV8"],[[71236,71236],"valid"],[[71237,71247],"disallowed"],[[71248,71257],"valid"],[[71258,71295],"disallowed"],[[71296,71351],"valid"],[[71352,71359],"disallowed"],[[71360,71369],"valid"],[[71370,71423],"disallowed"],[[71424,71449],"valid"],[[71450,71452],"disallowed"],[[71453,71467],"valid"],[[71468,71471],"disallowed"],[[71472,71481],"valid"],[[71482,71487],"valid",[],"NV8"],[[71488,71839],"disallowed"],[[71840,71840],"mapped",[71872]],[[71841,71841],"mapped",[71873]],[[71842,71842],"mapped",[71874]],[[71843,71843],"mapped",[71875]],[[71844,71844],"mapped",[71876]],[[71845,71845],"mapped",[71877]],[[71846,71846],"mapped",[71878]],[[71847,71847],"mapped",[71879]],[[71848,71848],"mapped",[71880]],[[71849,71849],"mapped",[71881]],[[71850,71850],"mapped",[71882]],[[71851,71851],"mapped",[71883]],[[71852,71852],"mapped",[71884]],[[71853,71853],"mapped",[71885]],[[71854,71854],"mapped",[71886]],[[71855,71855],"mapped",[71887]],[[71856,71856],"mapped",[71888]],[[71857,71857],"mapped",[71889]],[[71858,71858],"mapped",[71890]],[[71859,71859],"mapped",[71891]],[[71860,71860],"mapped",[71892]],[[71861,71861],"mapped",[71893]],[[71862,71862],"mapped",[71894]],[[71863,71863],"mapped",[71895]],[[71864,71864],"mapped",[71896]],[[71865,71865],"mapped",[71897]],[[71866,71866],"mapped",[71898]],[[71867,71867],"mapped",[71899]],[[71868,71868],"mapped",[71900]],[[71869,71869],"mapped",[71901]],[[71870,71870],"mapped",[71902]],[[71871,71871],"mapped",[71903]],[[71872,71913],"valid"],[[71914,71922],"valid",[],"NV8"],[[71923,71934],"disallowed"],[[71935,71935],"valid"],[[71936,72383],"disallowed"],[[72384,72440],"valid"],[[72441,73727],"disallowed"],[[73728,74606],"valid"],[[74607,74648],"valid"],[[74649,74649],"valid"],[[74650,74751],"disallowed"],[[74752,74850],"valid",[],"NV8"],[[74851,74862],"valid",[],"NV8"],[[74863,74863],"disallowed"],[[74864,74867],"valid",[],"NV8"],[[74868,74868],"valid",[],"NV8"],[[74869,74879],"disallowed"],[[74880,75075],"valid"],[[75076,77823],"disallowed"],[[77824,78894],"valid"],[[78895,82943],"disallowed"],[[82944,83526],"valid"],[[83527,92159],"disallowed"],[[92160,92728],"valid"],[[92729,92735],"disallowed"],[[92736,92766],"valid"],[[92767,92767],"disallowed"],[[92768,92777],"valid"],[[92778,92781],"disallowed"],[[92782,92783],"valid",[],"NV8"],[[92784,92879],"disallowed"],[[92880,92909],"valid"],[[92910,92911],"disallowed"],[[92912,92916],"valid"],[[92917,92917],"valid",[],"NV8"],[[92918,92927],"disallowed"],[[92928,92982],"valid"],[[92983,92991],"valid",[],"NV8"],[[92992,92995],"valid"],[[92996,92997],"valid",[],"NV8"],[[92998,93007],"disallowed"],[[93008,93017],"valid"],[[93018,93018],"disallowed"],[[93019,93025],"valid",[],"NV8"],[[93026,93026],"disallowed"],[[93027,93047],"valid"],[[93048,93052],"disallowed"],[[93053,93071],"valid"],[[93072,93951],"disallowed"],[[93952,94020],"valid"],[[94021,94031],"disallowed"],[[94032,94078],"valid"],[[94079,94094],"disallowed"],[[94095,94111],"valid"],[[94112,110591],"disallowed"],[[110592,110593],"valid"],[[110594,113663],"disallowed"],[[113664,113770],"valid"],[[113771,113775],"disallowed"],[[113776,113788],"valid"],[[113789,113791],"disallowed"],[[113792,113800],"valid"],[[113801,113807],"disallowed"],[[113808,113817],"valid"],[[113818,113819],"disallowed"],[[113820,113820],"valid",[],"NV8"],[[113821,113822],"valid"],[[113823,113823],"valid",[],"NV8"],[[113824,113827],"ignored"],[[113828,118783],"disallowed"],[[118784,119029],"valid",[],"NV8"],[[119030,119039],"disallowed"],[[119040,119078],"valid",[],"NV8"],[[119079,119080],"disallowed"],[[119081,119081],"valid",[],"NV8"],[[119082,119133],"valid",[],"NV8"],[[119134,119134],"mapped",[119127,119141]],[[119135,119135],"mapped",[119128,119141]],[[119136,119136],"mapped",[119128,119141,119150]],[[119137,119137],"mapped",[119128,119141,119151]],[[119138,119138],"mapped",[119128,119141,119152]],[[119139,119139],"mapped",[119128,119141,119153]],[[119140,119140],"mapped",[119128,119141,119154]],[[119141,119154],"valid",[],"NV8"],[[119155,119162],"disallowed"],[[119163,119226],"valid",[],"NV8"],[[119227,119227],"mapped",[119225,119141]],[[119228,119228],"mapped",[119226,119141]],[[119229,119229],"mapped",[119225,119141,119150]],[[119230,119230],"mapped",[119226,119141,119150]],[[119231,119231],"mapped",[119225,119141,119151]],[[119232,119232],"mapped",[119226,119141,119151]],[[119233,119261],"valid",[],"NV8"],[[119262,119272],"valid",[],"NV8"],[[119273,119295],"disallowed"],[[119296,119365],"valid",[],"NV8"],[[119366,119551],"disallowed"],[[119552,119638],"valid",[],"NV8"],[[119639,119647],"disallowed"],[[119648,119665],"valid",[],"NV8"],[[119666,119807],"disallowed"],[[119808,119808],"mapped",[97]],[[119809,119809],"mapped",[98]],[[119810,119810],"mapped",[99]],[[119811,119811],"mapped",[100]],[[119812,119812],"mapped",[101]],[[119813,119813],"mapped",[102]],[[119814,119814],"mapped",[103]],[[119815,119815],"mapped",[104]],[[119816,119816],"mapped",[105]],[[119817,119817],"mapped",[106]],[[119818,119818],"mapped",[107]],[[119819,119819],"mapped",[108]],[[119820,119820],"mapped",[109]],[[119821,119821],"mapped",[110]],[[119822,119822],"mapped",[111]],[[119823,119823],"mapped",[112]],[[119824,119824],"mapped",[113]],[[119825,119825],"mapped",[114]],[[119826,119826],"mapped",[115]],[[119827,119827],"mapped",[116]],[[119828,119828],"mapped",[117]],[[119829,119829],"mapped",[118]],[[119830,119830],"mapped",[119]],[[119831,119831],"mapped",[120]],[[119832,119832],"mapped",[121]],[[119833,119833],"mapped",[122]],[[119834,119834],"mapped",[97]],[[119835,119835],"mapped",[98]],[[119836,119836],"mapped",[99]],[[119837,119837],"mapped",[100]],[[119838,119838],"mapped",[101]],[[119839,119839],"mapped",[102]],[[119840,119840],"mapped",[103]],[[119841,119841],"mapped",[104]],[[119842,119842],"mapped",[105]],[[119843,119843],"mapped",[106]],[[119844,119844],"mapped",[107]],[[119845,119845],"mapped",[108]],[[119846,119846],"mapped",[109]],[[119847,119847],"mapped",[110]],[[119848,119848],"mapped",[111]],[[119849,119849],"mapped",[112]],[[119850,119850],"mapped",[113]],[[119851,119851],"mapped",[114]],[[119852,119852],"mapped",[115]],[[119853,119853],"mapped",[116]],[[119854,119854],"mapped",[117]],[[119855,119855],"mapped",[118]],[[119856,119856],"mapped",[119]],[[119857,119857],"mapped",[120]],[[119858,119858],"mapped",[121]],[[119859,119859],"mapped",[122]],[[119860,119860],"mapped",[97]],[[119861,119861],"mapped",[98]],[[119862,119862],"mapped",[99]],[[119863,119863],"mapped",[100]],[[119864,119864],"mapped",[101]],[[119865,119865],"mapped",[102]],[[119866,119866],"mapped",[103]],[[119867,119867],"mapped",[104]],[[119868,119868],"mapped",[105]],[[119869,119869],"mapped",[106]],[[119870,119870],"mapped",[107]],[[119871,119871],"mapped",[108]],[[119872,119872],"mapped",[109]],[[119873,119873],"mapped",[110]],[[119874,119874],"mapped",[111]],[[119875,119875],"mapped",[112]],[[119876,119876],"mapped",[113]],[[119877,119877],"mapped",[114]],[[119878,119878],"mapped",[115]],[[119879,119879],"mapped",[116]],[[119880,119880],"mapped",[117]],[[119881,119881],"mapped",[118]],[[119882,119882],"mapped",[119]],[[119883,119883],"mapped",[120]],[[119884,119884],"mapped",[121]],[[119885,119885],"mapped",[122]],[[119886,119886],"mapped",[97]],[[119887,119887],"mapped",[98]],[[119888,119888],"mapped",[99]],[[119889,119889],"mapped",[100]],[[119890,119890],"mapped",[101]],[[119891,119891],"mapped",[102]],[[119892,119892],"mapped",[103]],[[119893,119893],"disallowed"],[[119894,119894],"mapped",[105]],[[119895,119895],"mapped",[106]],[[119896,119896],"mapped",[107]],[[119897,119897],"mapped",[108]],[[119898,119898],"mapped",[109]],[[119899,119899],"mapped",[110]],[[119900,119900],"mapped",[111]],[[119901,119901],"mapped",[112]],[[119902,119902],"mapped",[113]],[[119903,119903],"mapped",[114]],[[119904,119904],"mapped",[115]],[[119905,119905],"mapped",[116]],[[119906,119906],"mapped",[117]],[[119907,119907],"mapped",[118]],[[119908,119908],"mapped",[119]],[[119909,119909],"mapped",[120]],[[119910,119910],"mapped",[121]],[[119911,119911],"mapped",[122]],[[119912,119912],"mapped",[97]],[[119913,119913],"mapped",[98]],[[119914,119914],"mapped",[99]],[[119915,119915],"mapped",[100]],[[119916,119916],"mapped",[101]],[[119917,119917],"mapped",[102]],[[119918,119918],"mapped",[103]],[[119919,119919],"mapped",[104]],[[119920,119920],"mapped",[105]],[[119921,119921],"mapped",[106]],[[119922,119922],"mapped",[107]],[[119923,119923],"mapped",[108]],[[119924,119924],"mapped",[109]],[[119925,119925],"mapped",[110]],[[119926,119926],"mapped",[111]],[[119927,119927],"mapped",[112]],[[119928,119928],"mapped",[113]],[[119929,119929],"mapped",[114]],[[119930,119930],"mapped",[115]],[[119931,119931],"mapped",[116]],[[119932,119932],"mapped",[117]],[[119933,119933],"mapped",[118]],[[119934,119934],"mapped",[119]],[[119935,119935],"mapped",[120]],[[119936,119936],"mapped",[121]],[[119937,119937],"mapped",[122]],[[119938,119938],"mapped",[97]],[[119939,119939],"mapped",[98]],[[119940,119940],"mapped",[99]],[[119941,119941],"mapped",[100]],[[119942,119942],"mapped",[101]],[[119943,119943],"mapped",[102]],[[119944,119944],"mapped",[103]],[[119945,119945],"mapped",[104]],[[119946,119946],"mapped",[105]],[[119947,119947],"mapped",[106]],[[119948,119948],"mapped",[107]],[[119949,119949],"mapped",[108]],[[119950,119950],"mapped",[109]],[[119951,119951],"mapped",[110]],[[119952,119952],"mapped",[111]],[[119953,119953],"mapped",[112]],[[119954,119954],"mapped",[113]],[[119955,119955],"mapped",[114]],[[119956,119956],"mapped",[115]],[[119957,119957],"mapped",[116]],[[119958,119958],"mapped",[117]],[[119959,119959],"mapped",[118]],[[119960,119960],"mapped",[119]],[[119961,119961],"mapped",[120]],[[119962,119962],"mapped",[121]],[[119963,119963],"mapped",[122]],[[119964,119964],"mapped",[97]],[[119965,119965],"disallowed"],[[119966,119966],"mapped",[99]],[[119967,119967],"mapped",[100]],[[119968,119969],"disallowed"],[[119970,119970],"mapped",[103]],[[119971,119972],"disallowed"],[[119973,119973],"mapped",[106]],[[119974,119974],"mapped",[107]],[[119975,119976],"disallowed"],[[119977,119977],"mapped",[110]],[[119978,119978],"mapped",[111]],[[119979,119979],"mapped",[112]],[[119980,119980],"mapped",[113]],[[119981,119981],"disallowed"],[[119982,119982],"mapped",[115]],[[119983,119983],"mapped",[116]],[[119984,119984],"mapped",[117]],[[119985,119985],"mapped",[118]],[[119986,119986],"mapped",[119]],[[119987,119987],"mapped",[120]],[[119988,119988],"mapped",[121]],[[119989,119989],"mapped",[122]],[[119990,119990],"mapped",[97]],[[119991,119991],"mapped",[98]],[[119992,119992],"mapped",[99]],[[119993,119993],"mapped",[100]],[[119994,119994],"disallowed"],[[119995,119995],"mapped",[102]],[[119996,119996],"disallowed"],[[119997,119997],"mapped",[104]],[[119998,119998],"mapped",[105]],[[119999,119999],"mapped",[106]],[[120000,120000],"mapped",[107]],[[120001,120001],"mapped",[108]],[[120002,120002],"mapped",[109]],[[120003,120003],"mapped",[110]],[[120004,120004],"disallowed"],[[120005,120005],"mapped",[112]],[[120006,120006],"mapped",[113]],[[120007,120007],"mapped",[114]],[[120008,120008],"mapped",[115]],[[120009,120009],"mapped",[116]],[[120010,120010],"mapped",[117]],[[120011,120011],"mapped",[118]],[[120012,120012],"mapped",[119]],[[120013,120013],"mapped",[120]],[[120014,120014],"mapped",[121]],[[120015,120015],"mapped",[122]],[[120016,120016],"mapped",[97]],[[120017,120017],"mapped",[98]],[[120018,120018],"mapped",[99]],[[120019,120019],"mapped",[100]],[[120020,120020],"mapped",[101]],[[120021,120021],"mapped",[102]],[[120022,120022],"mapped",[103]],[[120023,120023],"mapped",[104]],[[120024,120024],"mapped",[105]],[[120025,120025],"mapped",[106]],[[120026,120026],"mapped",[107]],[[120027,120027],"mapped",[108]],[[120028,120028],"mapped",[109]],[[120029,120029],"mapped",[110]],[[120030,120030],"mapped",[111]],[[120031,120031],"mapped",[112]],[[120032,120032],"mapped",[113]],[[120033,120033],"mapped",[114]],[[120034,120034],"mapped",[115]],[[120035,120035],"mapped",[116]],[[120036,120036],"mapped",[117]],[[120037,120037],"mapped",[118]],[[120038,120038],"mapped",[119]],[[120039,120039],"mapped",[120]],[[120040,120040],"mapped",[121]],[[120041,120041],"mapped",[122]],[[120042,120042],"mapped",[97]],[[120043,120043],"mapped",[98]],[[120044,120044],"mapped",[99]],[[120045,120045],"mapped",[100]],[[120046,120046],"mapped",[101]],[[120047,120047],"mapped",[102]],[[120048,120048],"mapped",[103]],[[120049,120049],"mapped",[104]],[[120050,120050],"mapped",[105]],[[120051,120051],"mapped",[106]],[[120052,120052],"mapped",[107]],[[120053,120053],"mapped",[108]],[[120054,120054],"mapped",[109]],[[120055,120055],"mapped",[110]],[[120056,120056],"mapped",[111]],[[120057,120057],"mapped",[112]],[[120058,120058],"mapped",[113]],[[120059,120059],"mapped",[114]],[[120060,120060],"mapped",[115]],[[120061,120061],"mapped",[116]],[[120062,120062],"mapped",[117]],[[120063,120063],"mapped",[118]],[[120064,120064],"mapped",[119]],[[120065,120065],"mapped",[120]],[[120066,120066],"mapped",[121]],[[120067,120067],"mapped",[122]],[[120068,120068],"mapped",[97]],[[120069,120069],"mapped",[98]],[[120070,120070],"disallowed"],[[120071,120071],"mapped",[100]],[[120072,120072],"mapped",[101]],[[120073,120073],"mapped",[102]],[[120074,120074],"mapped",[103]],[[120075,120076],"disallowed"],[[120077,120077],"mapped",[106]],[[120078,120078],"mapped",[107]],[[120079,120079],"mapped",[108]],[[120080,120080],"mapped",[109]],[[120081,120081],"mapped",[110]],[[120082,120082],"mapped",[111]],[[120083,120083],"mapped",[112]],[[120084,120084],"mapped",[113]],[[120085,120085],"disallowed"],[[120086,120086],"mapped",[115]],[[120087,120087],"mapped",[116]],[[120088,120088],"mapped",[117]],[[120089,120089],"mapped",[118]],[[120090,120090],"mapped",[119]],[[120091,120091],"mapped",[120]],[[120092,120092],"mapped",[121]],[[120093,120093],"disallowed"],[[120094,120094],"mapped",[97]],[[120095,120095],"mapped",[98]],[[120096,120096],"mapped",[99]],[[120097,120097],"mapped",[100]],[[120098,120098],"mapped",[101]],[[120099,120099],"mapped",[102]],[[120100,120100],"mapped",[103]],[[120101,120101],"mapped",[104]],[[120102,120102],"mapped",[105]],[[120103,120103],"mapped",[106]],[[120104,120104],"mapped",[107]],[[120105,120105],"mapped",[108]],[[120106,120106],"mapped",[109]],[[120107,120107],"mapped",[110]],[[120108,120108],"mapped",[111]],[[120109,120109],"mapped",[112]],[[120110,120110],"mapped",[113]],[[120111,120111],"mapped",[114]],[[120112,120112],"mapped",[115]],[[120113,120113],"mapped",[116]],[[120114,120114],"mapped",[117]],[[120115,120115],"mapped",[118]],[[120116,120116],"mapped",[119]],[[120117,120117],"mapped",[120]],[[120118,120118],"mapped",[121]],[[120119,120119],"mapped",[122]],[[120120,120120],"mapped",[97]],[[120121,120121],"mapped",[98]],[[120122,120122],"disallowed"],[[120123,120123],"mapped",[100]],[[120124,120124],"mapped",[101]],[[120125,120125],"mapped",[102]],[[120126,120126],"mapped",[103]],[[120127,120127],"disallowed"],[[120128,120128],"mapped",[105]],[[120129,120129],"mapped",[106]],[[120130,120130],"mapped",[107]],[[120131,120131],"mapped",[108]],[[120132,120132],"mapped",[109]],[[120133,120133],"disallowed"],[[120134,120134],"mapped",[111]],[[120135,120137],"disallowed"],[[120138,120138],"mapped",[115]],[[120139,120139],"mapped",[116]],[[120140,120140],"mapped",[117]],[[120141,120141],"mapped",[118]],[[120142,120142],"mapped",[119]],[[120143,120143],"mapped",[120]],[[120144,120144],"mapped",[121]],[[120145,120145],"disallowed"],[[120146,120146],"mapped",[97]],[[120147,120147],"mapped",[98]],[[120148,120148],"mapped",[99]],[[120149,120149],"mapped",[100]],[[120150,120150],"mapped",[101]],[[120151,120151],"mapped",[102]],[[120152,120152],"mapped",[103]],[[120153,120153],"mapped",[104]],[[120154,120154],"mapped",[105]],[[120155,120155],"mapped",[106]],[[120156,120156],"mapped",[107]],[[120157,120157],"mapped",[108]],[[120158,120158],"mapped",[109]],[[120159,120159],"mapped",[110]],[[120160,120160],"mapped",[111]],[[120161,120161],"mapped",[112]],[[120162,120162],"mapped",[113]],[[120163,120163],"mapped",[114]],[[120164,120164],"mapped",[115]],[[120165,120165],"mapped",[116]],[[120166,120166],"mapped",[117]],[[120167,120167],"mapped",[118]],[[120168,120168],"mapped",[119]],[[120169,120169],"mapped",[120]],[[120170,120170],"mapped",[121]],[[120171,120171],"mapped",[122]],[[120172,120172],"mapped",[97]],[[120173,120173],"mapped",[98]],[[120174,120174],"mapped",[99]],[[120175,120175],"mapped",[100]],[[120176,120176],"mapped",[101]],[[120177,120177],"mapped",[102]],[[120178,120178],"mapped",[103]],[[120179,120179],"mapped",[104]],[[120180,120180],"mapped",[105]],[[120181,120181],"mapped",[106]],[[120182,120182],"mapped",[107]],[[120183,120183],"mapped",[108]],[[120184,120184],"mapped",[109]],[[120185,120185],"mapped",[110]],[[120186,120186],"mapped",[111]],[[120187,120187],"mapped",[112]],[[120188,120188],"mapped",[113]],[[120189,120189],"mapped",[114]],[[120190,120190],"mapped",[115]],[[120191,120191],"mapped",[116]],[[120192,120192],"mapped",[117]],[[120193,120193],"mapped",[118]],[[120194,120194],"mapped",[119]],[[120195,120195],"mapped",[120]],[[120196,120196],"mapped",[121]],[[120197,120197],"mapped",[122]],[[120198,120198],"mapped",[97]],[[120199,120199],"mapped",[98]],[[120200,120200],"mapped",[99]],[[120201,120201],"mapped",[100]],[[120202,120202],"mapped",[101]],[[120203,120203],"mapped",[102]],[[120204,120204],"mapped",[103]],[[120205,120205],"mapped",[104]],[[120206,120206],"mapped",[105]],[[120207,120207],"mapped",[106]],[[120208,120208],"mapped",[107]],[[120209,120209],"mapped",[108]],[[120210,120210],"mapped",[109]],[[120211,120211],"mapped",[110]],[[120212,120212],"mapped",[111]],[[120213,120213],"mapped",[112]],[[120214,120214],"mapped",[113]],[[120215,120215],"mapped",[114]],[[120216,120216],"mapped",[115]],[[120217,120217],"mapped",[116]],[[120218,120218],"mapped",[117]],[[120219,120219],"mapped",[118]],[[120220,120220],"mapped",[119]],[[120221,120221],"mapped",[120]],[[120222,120222],"mapped",[121]],[[120223,120223],"mapped",[122]],[[120224,120224],"mapped",[97]],[[120225,120225],"mapped",[98]],[[120226,120226],"mapped",[99]],[[120227,120227],"mapped",[100]],[[120228,120228],"mapped",[101]],[[120229,120229],"mapped",[102]],[[120230,120230],"mapped",[103]],[[120231,120231],"mapped",[104]],[[120232,120232],"mapped",[105]],[[120233,120233],"mapped",[106]],[[120234,120234],"mapped",[107]],[[120235,120235],"mapped",[108]],[[120236,120236],"mapped",[109]],[[120237,120237],"mapped",[110]],[[120238,120238],"mapped",[111]],[[120239,120239],"mapped",[112]],[[120240,120240],"mapped",[113]],[[120241,120241],"mapped",[114]],[[120242,120242],"mapped",[115]],[[120243,120243],"mapped",[116]],[[120244,120244],"mapped",[117]],[[120245,120245],"mapped",[118]],[[120246,120246],"mapped",[119]],[[120247,120247],"mapped",[120]],[[120248,120248],"mapped",[121]],[[120249,120249],"mapped",[122]],[[120250,120250],"mapped",[97]],[[120251,120251],"mapped",[98]],[[120252,120252],"mapped",[99]],[[120253,120253],"mapped",[100]],[[120254,120254],"mapped",[101]],[[120255,120255],"mapped",[102]],[[120256,120256],"mapped",[103]],[[120257,120257],"mapped",[104]],[[120258,120258],"mapped",[105]],[[120259,120259],"mapped",[106]],[[120260,120260],"mapped",[107]],[[120261,120261],"mapped",[108]],[[120262,120262],"mapped",[109]],[[120263,120263],"mapped",[110]],[[120264,120264],"mapped",[111]],[[120265,120265],"mapped",[112]],[[120266,120266],"mapped",[113]],[[120267,120267],"mapped",[114]],[[120268,120268],"mapped",[115]],[[120269,120269],"mapped",[116]],[[120270,120270],"mapped",[117]],[[120271,120271],"mapped",[118]],[[120272,120272],"mapped",[119]],[[120273,120273],"mapped",[120]],[[120274,120274],"mapped",[121]],[[120275,120275],"mapped",[122]],[[120276,120276],"mapped",[97]],[[120277,120277],"mapped",[98]],[[120278,120278],"mapped",[99]],[[120279,120279],"mapped",[100]],[[120280,120280],"mapped",[101]],[[120281,120281],"mapped",[102]],[[120282,120282],"mapped",[103]],[[120283,120283],"mapped",[104]],[[120284,120284],"mapped",[105]],[[120285,120285],"mapped",[106]],[[120286,120286],"mapped",[107]],[[120287,120287],"mapped",[108]],[[120288,120288],"mapped",[109]],[[120289,120289],"mapped",[110]],[[120290,120290],"mapped",[111]],[[120291,120291],"mapped",[112]],[[120292,120292],"mapped",[113]],[[120293,120293],"mapped",[114]],[[120294,120294],"mapped",[115]],[[120295,120295],"mapped",[116]],[[120296,120296],"mapped",[117]],[[120297,120297],"mapped",[118]],[[120298,120298],"mapped",[119]],[[120299,120299],"mapped",[120]],[[120300,120300],"mapped",[121]],[[120301,120301],"mapped",[122]],[[120302,120302],"mapped",[97]],[[120303,120303],"mapped",[98]],[[120304,120304],"mapped",[99]],[[120305,120305],"mapped",[100]],[[120306,120306],"mapped",[101]],[[120307,120307],"mapped",[102]],[[120308,120308],"mapped",[103]],[[120309,120309],"mapped",[104]],[[120310,120310],"mapped",[105]],[[120311,120311],"mapped",[106]],[[120312,120312],"mapped",[107]],[[120313,120313],"mapped",[108]],[[120314,120314],"mapped",[109]],[[120315,120315],"mapped",[110]],[[120316,120316],"mapped",[111]],[[120317,120317],"mapped",[112]],[[120318,120318],"mapped",[113]],[[120319,120319],"mapped",[114]],[[120320,120320],"mapped",[115]],[[120321,120321],"mapped",[116]],[[120322,120322],"mapped",[117]],[[120323,120323],"mapped",[118]],[[120324,120324],"mapped",[119]],[[120325,120325],"mapped",[120]],[[120326,120326],"mapped",[121]],[[120327,120327],"mapped",[122]],[[120328,120328],"mapped",[97]],[[120329,120329],"mapped",[98]],[[120330,120330],"mapped",[99]],[[120331,120331],"mapped",[100]],[[120332,120332],"mapped",[101]],[[120333,120333],"mapped",[102]],[[120334,120334],"mapped",[103]],[[120335,120335],"mapped",[104]],[[120336,120336],"mapped",[105]],[[120337,120337],"mapped",[106]],[[120338,120338],"mapped",[107]],[[120339,120339],"mapped",[108]],[[120340,120340],"mapped",[109]],[[120341,120341],"mapped",[110]],[[120342,120342],"mapped",[111]],[[120343,120343],"mapped",[112]],[[120344,120344],"mapped",[113]],[[120345,120345],"mapped",[114]],[[120346,120346],"mapped",[115]],[[120347,120347],"mapped",[116]],[[120348,120348],"mapped",[117]],[[120349,120349],"mapped",[118]],[[120350,120350],"mapped",[119]],[[120351,120351],"mapped",[120]],[[120352,120352],"mapped",[121]],[[120353,120353],"mapped",[122]],[[120354,120354],"mapped",[97]],[[120355,120355],"mapped",[98]],[[120356,120356],"mapped",[99]],[[120357,120357],"mapped",[100]],[[120358,120358],"mapped",[101]],[[120359,120359],"mapped",[102]],[[120360,120360],"mapped",[103]],[[120361,120361],"mapped",[104]],[[120362,120362],"mapped",[105]],[[120363,120363],"mapped",[106]],[[120364,120364],"mapped",[107]],[[120365,120365],"mapped",[108]],[[120366,120366],"mapped",[109]],[[120367,120367],"mapped",[110]],[[120368,120368],"mapped",[111]],[[120369,120369],"mapped",[112]],[[120370,120370],"mapped",[113]],[[120371,120371],"mapped",[114]],[[120372,120372],"mapped",[115]],[[120373,120373],"mapped",[116]],[[120374,120374],"mapped",[117]],[[120375,120375],"mapped",[118]],[[120376,120376],"mapped",[119]],[[120377,120377],"mapped",[120]],[[120378,120378],"mapped",[121]],[[120379,120379],"mapped",[122]],[[120380,120380],"mapped",[97]],[[120381,120381],"mapped",[98]],[[120382,120382],"mapped",[99]],[[120383,120383],"mapped",[100]],[[120384,120384],"mapped",[101]],[[120385,120385],"mapped",[102]],[[120386,120386],"mapped",[103]],[[120387,120387],"mapped",[104]],[[120388,120388],"mapped",[105]],[[120389,120389],"mapped",[106]],[[120390,120390],"mapped",[107]],[[120391,120391],"mapped",[108]],[[120392,120392],"mapped",[109]],[[120393,120393],"mapped",[110]],[[120394,120394],"mapped",[111]],[[120395,120395],"mapped",[112]],[[120396,120396],"mapped",[113]],[[120397,120397],"mapped",[114]],[[120398,120398],"mapped",[115]],[[120399,120399],"mapped",[116]],[[120400,120400],"mapped",[117]],[[120401,120401],"mapped",[118]],[[120402,120402],"mapped",[119]],[[120403,120403],"mapped",[120]],[[120404,120404],"mapped",[121]],[[120405,120405],"mapped",[122]],[[120406,120406],"mapped",[97]],[[120407,120407],"mapped",[98]],[[120408,120408],"mapped",[99]],[[120409,120409],"mapped",[100]],[[120410,120410],"mapped",[101]],[[120411,120411],"mapped",[102]],[[120412,120412],"mapped",[103]],[[120413,120413],"mapped",[104]],[[120414,120414],"mapped",[105]],[[120415,120415],"mapped",[106]],[[120416,120416],"mapped",[107]],[[120417,120417],"mapped",[108]],[[120418,120418],"mapped",[109]],[[120419,120419],"mapped",[110]],[[120420,120420],"mapped",[111]],[[120421,120421],"mapped",[112]],[[120422,120422],"mapped",[113]],[[120423,120423],"mapped",[114]],[[120424,120424],"mapped",[115]],[[120425,120425],"mapped",[116]],[[120426,120426],"mapped",[117]],[[120427,120427],"mapped",[118]],[[120428,120428],"mapped",[119]],[[120429,120429],"mapped",[120]],[[120430,120430],"mapped",[121]],[[120431,120431],"mapped",[122]],[[120432,120432],"mapped",[97]],[[120433,120433],"mapped",[98]],[[120434,120434],"mapped",[99]],[[120435,120435],"mapped",[100]],[[120436,120436],"mapped",[101]],[[120437,120437],"mapped",[102]],[[120438,120438],"mapped",[103]],[[120439,120439],"mapped",[104]],[[120440,120440],"mapped",[105]],[[120441,120441],"mapped",[106]],[[120442,120442],"mapped",[107]],[[120443,120443],"mapped",[108]],[[120444,120444],"mapped",[109]],[[120445,120445],"mapped",[110]],[[120446,120446],"mapped",[111]],[[120447,120447],"mapped",[112]],[[120448,120448],"mapped",[113]],[[120449,120449],"mapped",[114]],[[120450,120450],"mapped",[115]],[[120451,120451],"mapped",[116]],[[120452,120452],"mapped",[117]],[[120453,120453],"mapped",[118]],[[120454,120454],"mapped",[119]],[[120455,120455],"mapped",[120]],[[120456,120456],"mapped",[121]],[[120457,120457],"mapped",[122]],[[120458,120458],"mapped",[97]],[[120459,120459],"mapped",[98]],[[120460,120460],"mapped",[99]],[[120461,120461],"mapped",[100]],[[120462,120462],"mapped",[101]],[[120463,120463],"mapped",[102]],[[120464,120464],"mapped",[103]],[[120465,120465],"mapped",[104]],[[120466,120466],"mapped",[105]],[[120467,120467],"mapped",[106]],[[120468,120468],"mapped",[107]],[[120469,120469],"mapped",[108]],[[120470,120470],"mapped",[109]],[[120471,120471],"mapped",[110]],[[120472,120472],"mapped",[111]],[[120473,120473],"mapped",[112]],[[120474,120474],"mapped",[113]],[[120475,120475],"mapped",[114]],[[120476,120476],"mapped",[115]],[[120477,120477],"mapped",[116]],[[120478,120478],"mapped",[117]],[[120479,120479],"mapped",[118]],[[120480,120480],"mapped",[119]],[[120481,120481],"mapped",[120]],[[120482,120482],"mapped",[121]],[[120483,120483],"mapped",[122]],[[120484,120484],"mapped",[305]],[[120485,120485],"mapped",[567]],[[120486,120487],"disallowed"],[[120488,120488],"mapped",[945]],[[120489,120489],"mapped",[946]],[[120490,120490],"mapped",[947]],[[120491,120491],"mapped",[948]],[[120492,120492],"mapped",[949]],[[120493,120493],"mapped",[950]],[[120494,120494],"mapped",[951]],[[120495,120495],"mapped",[952]],[[120496,120496],"mapped",[953]],[[120497,120497],"mapped",[954]],[[120498,120498],"mapped",[955]],[[120499,120499],"mapped",[956]],[[120500,120500],"mapped",[957]],[[120501,120501],"mapped",[958]],[[120502,120502],"mapped",[959]],[[120503,120503],"mapped",[960]],[[120504,120504],"mapped",[961]],[[120505,120505],"mapped",[952]],[[120506,120506],"mapped",[963]],[[120507,120507],"mapped",[964]],[[120508,120508],"mapped",[965]],[[120509,120509],"mapped",[966]],[[120510,120510],"mapped",[967]],[[120511,120511],"mapped",[968]],[[120512,120512],"mapped",[969]],[[120513,120513],"mapped",[8711]],[[120514,120514],"mapped",[945]],[[120515,120515],"mapped",[946]],[[120516,120516],"mapped",[947]],[[120517,120517],"mapped",[948]],[[120518,120518],"mapped",[949]],[[120519,120519],"mapped",[950]],[[120520,120520],"mapped",[951]],[[120521,120521],"mapped",[952]],[[120522,120522],"mapped",[953]],[[120523,120523],"mapped",[954]],[[120524,120524],"mapped",[955]],[[120525,120525],"mapped",[956]],[[120526,120526],"mapped",[957]],[[120527,120527],"mapped",[958]],[[120528,120528],"mapped",[959]],[[120529,120529],"mapped",[960]],[[120530,120530],"mapped",[961]],[[120531,120532],"mapped",[963]],[[120533,120533],"mapped",[964]],[[120534,120534],"mapped",[965]],[[120535,120535],"mapped",[966]],[[120536,120536],"mapped",[967]],[[120537,120537],"mapped",[968]],[[120538,120538],"mapped",[969]],[[120539,120539],"mapped",[8706]],[[120540,120540],"mapped",[949]],[[120541,120541],"mapped",[952]],[[120542,120542],"mapped",[954]],[[120543,120543],"mapped",[966]],[[120544,120544],"mapped",[961]],[[120545,120545],"mapped",[960]],[[120546,120546],"mapped",[945]],[[120547,120547],"mapped",[946]],[[120548,120548],"mapped",[947]],[[120549,120549],"mapped",[948]],[[120550,120550],"mapped",[949]],[[120551,120551],"mapped",[950]],[[120552,120552],"mapped",[951]],[[120553,120553],"mapped",[952]],[[120554,120554],"mapped",[953]],[[120555,120555],"mapped",[954]],[[120556,120556],"mapped",[955]],[[120557,120557],"mapped",[956]],[[120558,120558],"mapped",[957]],[[120559,120559],"mapped",[958]],[[120560,120560],"mapped",[959]],[[120561,120561],"mapped",[960]],[[120562,120562],"mapped",[961]],[[120563,120563],"mapped",[952]],[[120564,120564],"mapped",[963]],[[120565,120565],"mapped",[964]],[[120566,120566],"mapped",[965]],[[120567,120567],"mapped",[966]],[[120568,120568],"mapped",[967]],[[120569,120569],"mapped",[968]],[[120570,120570],"mapped",[969]],[[120571,120571],"mapped",[8711]],[[120572,120572],"mapped",[945]],[[120573,120573],"mapped",[946]],[[120574,120574],"mapped",[947]],[[120575,120575],"mapped",[948]],[[120576,120576],"mapped",[949]],[[120577,120577],"mapped",[950]],[[120578,120578],"mapped",[951]],[[120579,120579],"mapped",[952]],[[120580,120580],"mapped",[953]],[[120581,120581],"mapped",[954]],[[120582,120582],"mapped",[955]],[[120583,120583],"mapped",[956]],[[120584,120584],"mapped",[957]],[[120585,120585],"mapped",[958]],[[120586,120586],"mapped",[959]],[[120587,120587],"mapped",[960]],[[120588,120588],"mapped",[961]],[[120589,120590],"mapped",[963]],[[120591,120591],"mapped",[964]],[[120592,120592],"mapped",[965]],[[120593,120593],"mapped",[966]],[[120594,120594],"mapped",[967]],[[120595,120595],"mapped",[968]],[[120596,120596],"mapped",[969]],[[120597,120597],"mapped",[8706]],[[120598,120598],"mapped",[949]],[[120599,120599],"mapped",[952]],[[120600,120600],"mapped",[954]],[[120601,120601],"mapped",[966]],[[120602,120602],"mapped",[961]],[[120603,120603],"mapped",[960]],[[120604,120604],"mapped",[945]],[[120605,120605],"mapped",[946]],[[120606,120606],"mapped",[947]],[[120607,120607],"mapped",[948]],[[120608,120608],"mapped",[949]],[[120609,120609],"mapped",[950]],[[120610,120610],"mapped",[951]],[[120611,120611],"mapped",[952]],[[120612,120612],"mapped",[953]],[[120613,120613],"mapped",[954]],[[120614,120614],"mapped",[955]],[[120615,120615],"mapped",[956]],[[120616,120616],"mapped",[957]],[[120617,120617],"mapped",[958]],[[120618,120618],"mapped",[959]],[[120619,120619],"mapped",[960]],[[120620,120620],"mapped",[961]],[[120621,120621],"mapped",[952]],[[120622,120622],"mapped",[963]],[[120623,120623],"mapped",[964]],[[120624,120624],"mapped",[965]],[[120625,120625],"mapped",[966]],[[120626,120626],"mapped",[967]],[[120627,120627],"mapped",[968]],[[120628,120628],"mapped",[969]],[[120629,120629],"mapped",[8711]],[[120630,120630],"mapped",[945]],[[120631,120631],"mapped",[946]],[[120632,120632],"mapped",[947]],[[120633,120633],"mapped",[948]],[[120634,120634],"mapped",[949]],[[120635,120635],"mapped",[950]],[[120636,120636],"mapped",[951]],[[120637,120637],"mapped",[952]],[[120638,120638],"mapped",[953]],[[120639,120639],"mapped",[954]],[[120640,120640],"mapped",[955]],[[120641,120641],"mapped",[956]],[[120642,120642],"mapped",[957]],[[120643,120643],"mapped",[958]],[[120644,120644],"mapped",[959]],[[120645,120645],"mapped",[960]],[[120646,120646],"mapped",[961]],[[120647,120648],"mapped",[963]],[[120649,120649],"mapped",[964]],[[120650,120650],"mapped",[965]],[[120651,120651],"mapped",[966]],[[120652,120652],"mapped",[967]],[[120653,120653],"mapped",[968]],[[120654,120654],"mapped",[969]],[[120655,120655],"mapped",[8706]],[[120656,120656],"mapped",[949]],[[120657,120657],"mapped",[952]],[[120658,120658],"mapped",[954]],[[120659,120659],"mapped",[966]],[[120660,120660],"mapped",[961]],[[120661,120661],"mapped",[960]],[[120662,120662],"mapped",[945]],[[120663,120663],"mapped",[946]],[[120664,120664],"mapped",[947]],[[120665,120665],"mapped",[948]],[[120666,120666],"mapped",[949]],[[120667,120667],"mapped",[950]],[[120668,120668],"mapped",[951]],[[120669,120669],"mapped",[952]],[[120670,120670],"mapped",[953]],[[120671,120671],"mapped",[954]],[[120672,120672],"mapped",[955]],[[120673,120673],"mapped",[956]],[[120674,120674],"mapped",[957]],[[120675,120675],"mapped",[958]],[[120676,120676],"mapped",[959]],[[120677,120677],"mapped",[960]],[[120678,120678],"mapped",[961]],[[120679,120679],"mapped",[952]],[[120680,120680],"mapped",[963]],[[120681,120681],"mapped",[964]],[[120682,120682],"mapped",[965]],[[120683,120683],"mapped",[966]],[[120684,120684],"mapped",[967]],[[120685,120685],"mapped",[968]],[[120686,120686],"mapped",[969]],[[120687,120687],"mapped",[8711]],[[120688,120688],"mapped",[945]],[[120689,120689],"mapped",[946]],[[120690,120690],"mapped",[947]],[[120691,120691],"mapped",[948]],[[120692,120692],"mapped",[949]],[[120693,120693],"mapped",[950]],[[120694,120694],"mapped",[951]],[[120695,120695],"mapped",[952]],[[120696,120696],"mapped",[953]],[[120697,120697],"mapped",[954]],[[120698,120698],"mapped",[955]],[[120699,120699],"mapped",[956]],[[120700,120700],"mapped",[957]],[[120701,120701],"mapped",[958]],[[120702,120702],"mapped",[959]],[[120703,120703],"mapped",[960]],[[120704,120704],"mapped",[961]],[[120705,120706],"mapped",[963]],[[120707,120707],"mapped",[964]],[[120708,120708],"mapped",[965]],[[120709,120709],"mapped",[966]],[[120710,120710],"mapped",[967]],[[120711,120711],"mapped",[968]],[[120712,120712],"mapped",[969]],[[120713,120713],"mapped",[8706]],[[120714,120714],"mapped",[949]],[[120715,120715],"mapped",[952]],[[120716,120716],"mapped",[954]],[[120717,120717],"mapped",[966]],[[120718,120718],"mapped",[961]],[[120719,120719],"mapped",[960]],[[120720,120720],"mapped",[945]],[[120721,120721],"mapped",[946]],[[120722,120722],"mapped",[947]],[[120723,120723],"mapped",[948]],[[120724,120724],"mapped",[949]],[[120725,120725],"mapped",[950]],[[120726,120726],"mapped",[951]],[[120727,120727],"mapped",[952]],[[120728,120728],"mapped",[953]],[[120729,120729],"mapped",[954]],[[120730,120730],"mapped",[955]],[[120731,120731],"mapped",[956]],[[120732,120732],"mapped",[957]],[[120733,120733],"mapped",[958]],[[120734,120734],"mapped",[959]],[[120735,120735],"mapped",[960]],[[120736,120736],"mapped",[961]],[[120737,120737],"mapped",[952]],[[120738,120738],"mapped",[963]],[[120739,120739],"mapped",[964]],[[120740,120740],"mapped",[965]],[[120741,120741],"mapped",[966]],[[120742,120742],"mapped",[967]],[[120743,120743],"mapped",[968]],[[120744,120744],"mapped",[969]],[[120745,120745],"mapped",[8711]],[[120746,120746],"mapped",[945]],[[120747,120747],"mapped",[946]],[[120748,120748],"mapped",[947]],[[120749,120749],"mapped",[948]],[[120750,120750],"mapped",[949]],[[120751,120751],"mapped",[950]],[[120752,120752],"mapped",[951]],[[120753,120753],"mapped",[952]],[[120754,120754],"mapped",[953]],[[120755,120755],"mapped",[954]],[[120756,120756],"mapped",[955]],[[120757,120757],"mapped",[956]],[[120758,120758],"mapped",[957]],[[120759,120759],"mapped",[958]],[[120760,120760],"mapped",[959]],[[120761,120761],"mapped",[960]],[[120762,120762],"mapped",[961]],[[120763,120764],"mapped",[963]],[[120765,120765],"mapped",[964]],[[120766,120766],"mapped",[965]],[[120767,120767],"mapped",[966]],[[120768,120768],"mapped",[967]],[[120769,120769],"mapped",[968]],[[120770,120770],"mapped",[969]],[[120771,120771],"mapped",[8706]],[[120772,120772],"mapped",[949]],[[120773,120773],"mapped",[952]],[[120774,120774],"mapped",[954]],[[120775,120775],"mapped",[966]],[[120776,120776],"mapped",[961]],[[120777,120777],"mapped",[960]],[[120778,120779],"mapped",[989]],[[120780,120781],"disallowed"],[[120782,120782],"mapped",[48]],[[120783,120783],"mapped",[49]],[[120784,120784],"mapped",[50]],[[120785,120785],"mapped",[51]],[[120786,120786],"mapped",[52]],[[120787,120787],"mapped",[53]],[[120788,120788],"mapped",[54]],[[120789,120789],"mapped",[55]],[[120790,120790],"mapped",[56]],[[120791,120791],"mapped",[57]],[[120792,120792],"mapped",[48]],[[120793,120793],"mapped",[49]],[[120794,120794],"mapped",[50]],[[120795,120795],"mapped",[51]],[[120796,120796],"mapped",[52]],[[120797,120797],"mapped",[53]],[[120798,120798],"mapped",[54]],[[120799,120799],"mapped",[55]],[[120800,120800],"mapped",[56]],[[120801,120801],"mapped",[57]],[[120802,120802],"mapped",[48]],[[120803,120803],"mapped",[49]],[[120804,120804],"mapped",[50]],[[120805,120805],"mapped",[51]],[[120806,120806],"mapped",[52]],[[120807,120807],"mapped",[53]],[[120808,120808],"mapped",[54]],[[120809,120809],"mapped",[55]],[[120810,120810],"mapped",[56]],[[120811,120811],"mapped",[57]],[[120812,120812],"mapped",[48]],[[120813,120813],"mapped",[49]],[[120814,120814],"mapped",[50]],[[120815,120815],"mapped",[51]],[[120816,120816],"mapped",[52]],[[120817,120817],"mapped",[53]],[[120818,120818],"mapped",[54]],[[120819,120819],"mapped",[55]],[[120820,120820],"mapped",[56]],[[120821,120821],"mapped",[57]],[[120822,120822],"mapped",[48]],[[120823,120823],"mapped",[49]],[[120824,120824],"mapped",[50]],[[120825,120825],"mapped",[51]],[[120826,120826],"mapped",[52]],[[120827,120827],"mapped",[53]],[[120828,120828],"mapped",[54]],[[120829,120829],"mapped",[55]],[[120830,120830],"mapped",[56]],[[120831,120831],"mapped",[57]],[[120832,121343],"valid",[],"NV8"],[[121344,121398],"valid"],[[121399,121402],"valid",[],"NV8"],[[121403,121452],"valid"],[[121453,121460],"valid",[],"NV8"],[[121461,121461],"valid"],[[121462,121475],"valid",[],"NV8"],[[121476,121476],"valid"],[[121477,121483],"valid",[],"NV8"],[[121484,121498],"disallowed"],[[121499,121503],"valid"],[[121504,121504],"disallowed"],[[121505,121519],"valid"],[[121520,124927],"disallowed"],[[124928,125124],"valid"],[[125125,125126],"disallowed"],[[125127,125135],"valid",[],"NV8"],[[125136,125142],"valid"],[[125143,126463],"disallowed"],[[126464,126464],"mapped",[1575]],[[126465,126465],"mapped",[1576]],[[126466,126466],"mapped",[1580]],[[126467,126467],"mapped",[1583]],[[126468,126468],"disallowed"],[[126469,126469],"mapped",[1608]],[[126470,126470],"mapped",[1586]],[[126471,126471],"mapped",[1581]],[[126472,126472],"mapped",[1591]],[[126473,126473],"mapped",[1610]],[[126474,126474],"mapped",[1603]],[[126475,126475],"mapped",[1604]],[[126476,126476],"mapped",[1605]],[[126477,126477],"mapped",[1606]],[[126478,126478],"mapped",[1587]],[[126479,126479],"mapped",[1593]],[[126480,126480],"mapped",[1601]],[[126481,126481],"mapped",[1589]],[[126482,126482],"mapped",[1602]],[[126483,126483],"mapped",[1585]],[[126484,126484],"mapped",[1588]],[[126485,126485],"mapped",[1578]],[[126486,126486],"mapped",[1579]],[[126487,126487],"mapped",[1582]],[[126488,126488],"mapped",[1584]],[[126489,126489],"mapped",[1590]],[[126490,126490],"mapped",[1592]],[[126491,126491],"mapped",[1594]],[[126492,126492],"mapped",[1646]],[[126493,126493],"mapped",[1722]],[[126494,126494],"mapped",[1697]],[[126495,126495],"mapped",[1647]],[[126496,126496],"disallowed"],[[126497,126497],"mapped",[1576]],[[126498,126498],"mapped",[1580]],[[126499,126499],"disallowed"],[[126500,126500],"mapped",[1607]],[[126501,126502],"disallowed"],[[126503,126503],"mapped",[1581]],[[126504,126504],"disallowed"],[[126505,126505],"mapped",[1610]],[[126506,126506],"mapped",[1603]],[[126507,126507],"mapped",[1604]],[[126508,126508],"mapped",[1605]],[[126509,126509],"mapped",[1606]],[[126510,126510],"mapped",[1587]],[[126511,126511],"mapped",[1593]],[[126512,126512],"mapped",[1601]],[[126513,126513],"mapped",[1589]],[[126514,126514],"mapped",[1602]],[[126515,126515],"disallowed"],[[126516,126516],"mapped",[1588]],[[126517,126517],"mapped",[1578]],[[126518,126518],"mapped",[1579]],[[126519,126519],"mapped",[1582]],[[126520,126520],"disallowed"],[[126521,126521],"mapped",[1590]],[[126522,126522],"disallowed"],[[126523,126523],"mapped",[1594]],[[126524,126529],"disallowed"],[[126530,126530],"mapped",[1580]],[[126531,126534],"disallowed"],[[126535,126535],"mapped",[1581]],[[126536,126536],"disallowed"],[[126537,126537],"mapped",[1610]],[[126538,126538],"disallowed"],[[126539,126539],"mapped",[1604]],[[126540,126540],"disallowed"],[[126541,126541],"mapped",[1606]],[[126542,126542],"mapped",[1587]],[[126543,126543],"mapped",[1593]],[[126544,126544],"disallowed"],[[126545,126545],"mapped",[1589]],[[126546,126546],"mapped",[1602]],[[126547,126547],"disallowed"],[[126548,126548],"mapped",[1588]],[[126549,126550],"disallowed"],[[126551,126551],"mapped",[1582]],[[126552,126552],"disallowed"],[[126553,126553],"mapped",[1590]],[[126554,126554],"disallowed"],[[126555,126555],"mapped",[1594]],[[126556,126556],"disallowed"],[[126557,126557],"mapped",[1722]],[[126558,126558],"disallowed"],[[126559,126559],"mapped",[1647]],[[126560,126560],"disallowed"],[[126561,126561],"mapped",[1576]],[[126562,126562],"mapped",[1580]],[[126563,126563],"disallowed"],[[126564,126564],"mapped",[1607]],[[126565,126566],"disallowed"],[[126567,126567],"mapped",[1581]],[[126568,126568],"mapped",[1591]],[[126569,126569],"mapped",[1610]],[[126570,126570],"mapped",[1603]],[[126571,126571],"disallowed"],[[126572,126572],"mapped",[1605]],[[126573,126573],"mapped",[1606]],[[126574,126574],"mapped",[1587]],[[126575,126575],"mapped",[1593]],[[126576,126576],"mapped",[1601]],[[126577,126577],"mapped",[1589]],[[126578,126578],"mapped",[1602]],[[126579,126579],"disallowed"],[[126580,126580],"mapped",[1588]],[[126581,126581],"mapped",[1578]],[[126582,126582],"mapped",[1579]],[[126583,126583],"mapped",[1582]],[[126584,126584],"disallowed"],[[126585,126585],"mapped",[1590]],[[126586,126586],"mapped",[1592]],[[126587,126587],"mapped",[1594]],[[126588,126588],"mapped",[1646]],[[126589,126589],"disallowed"],[[126590,126590],"mapped",[1697]],[[126591,126591],"disallowed"],[[126592,126592],"mapped",[1575]],[[126593,126593],"mapped",[1576]],[[126594,126594],"mapped",[1580]],[[126595,126595],"mapped",[1583]],[[126596,126596],"mapped",[1607]],[[126597,126597],"mapped",[1608]],[[126598,126598],"mapped",[1586]],[[126599,126599],"mapped",[1581]],[[126600,126600],"mapped",[1591]],[[126601,126601],"mapped",[1610]],[[126602,126602],"disallowed"],[[126603,126603],"mapped",[1604]],[[126604,126604],"mapped",[1605]],[[126605,126605],"mapped",[1606]],[[126606,126606],"mapped",[1587]],[[126607,126607],"mapped",[1593]],[[126608,126608],"mapped",[1601]],[[126609,126609],"mapped",[1589]],[[126610,126610],"mapped",[1602]],[[126611,126611],"mapped",[1585]],[[126612,126612],"mapped",[1588]],[[126613,126613],"mapped",[1578]],[[126614,126614],"mapped",[1579]],[[126615,126615],"mapped",[1582]],[[126616,126616],"mapped",[1584]],[[126617,126617],"mapped",[1590]],[[126618,126618],"mapped",[1592]],[[126619,126619],"mapped",[1594]],[[126620,126624],"disallowed"],[[126625,126625],"mapped",[1576]],[[126626,126626],"mapped",[1580]],[[126627,126627],"mapped",[1583]],[[126628,126628],"disallowed"],[[126629,126629],"mapped",[1608]],[[126630,126630],"mapped",[1586]],[[126631,126631],"mapped",[1581]],[[126632,126632],"mapped",[1591]],[[126633,126633],"mapped",[1610]],[[126634,126634],"disallowed"],[[126635,126635],"mapped",[1604]],[[126636,126636],"mapped",[1605]],[[126637,126637],"mapped",[1606]],[[126638,126638],"mapped",[1587]],[[126639,126639],"mapped",[1593]],[[126640,126640],"mapped",[1601]],[[126641,126641],"mapped",[1589]],[[126642,126642],"mapped",[1602]],[[126643,126643],"mapped",[1585]],[[126644,126644],"mapped",[1588]],[[126645,126645],"mapped",[1578]],[[126646,126646],"mapped",[1579]],[[126647,126647],"mapped",[1582]],[[126648,126648],"mapped",[1584]],[[126649,126649],"mapped",[1590]],[[126650,126650],"mapped",[1592]],[[126651,126651],"mapped",[1594]],[[126652,126703],"disallowed"],[[126704,126705],"valid",[],"NV8"],[[126706,126975],"disallowed"],[[126976,127019],"valid",[],"NV8"],[[127020,127023],"disallowed"],[[127024,127123],"valid",[],"NV8"],[[127124,127135],"disallowed"],[[127136,127150],"valid",[],"NV8"],[[127151,127152],"disallowed"],[[127153,127166],"valid",[],"NV8"],[[127167,127167],"valid",[],"NV8"],[[127168,127168],"disallowed"],[[127169,127183],"valid",[],"NV8"],[[127184,127184],"disallowed"],[[127185,127199],"valid",[],"NV8"],[[127200,127221],"valid",[],"NV8"],[[127222,127231],"disallowed"],[[127232,127232],"disallowed"],[[127233,127233],"disallowed_STD3_mapped",[48,44]],[[127234,127234],"disallowed_STD3_mapped",[49,44]],[[127235,127235],"disallowed_STD3_mapped",[50,44]],[[127236,127236],"disallowed_STD3_mapped",[51,44]],[[127237,127237],"disallowed_STD3_mapped",[52,44]],[[127238,127238],"disallowed_STD3_mapped",[53,44]],[[127239,127239],"disallowed_STD3_mapped",[54,44]],[[127240,127240],"disallowed_STD3_mapped",[55,44]],[[127241,127241],"disallowed_STD3_mapped",[56,44]],[[127242,127242],"disallowed_STD3_mapped",[57,44]],[[127243,127244],"valid",[],"NV8"],[[127245,127247],"disallowed"],[[127248,127248],"disallowed_STD3_mapped",[40,97,41]],[[127249,127249],"disallowed_STD3_mapped",[40,98,41]],[[127250,127250],"disallowed_STD3_mapped",[40,99,41]],[[127251,127251],"disallowed_STD3_mapped",[40,100,41]],[[127252,127252],"disallowed_STD3_mapped",[40,101,41]],[[127253,127253],"disallowed_STD3_mapped",[40,102,41]],[[127254,127254],"disallowed_STD3_mapped",[40,103,41]],[[127255,127255],"disallowed_STD3_mapped",[40,104,41]],[[127256,127256],"disallowed_STD3_mapped",[40,105,41]],[[127257,127257],"disallowed_STD3_mapped",[40,106,41]],[[127258,127258],"disallowed_STD3_mapped",[40,107,41]],[[127259,127259],"disallowed_STD3_mapped",[40,108,41]],[[127260,127260],"disallowed_STD3_mapped",[40,109,41]],[[127261,127261],"disallowed_STD3_mapped",[40,110,41]],[[127262,127262],"disallowed_STD3_mapped",[40,111,41]],[[127263,127263],"disallowed_STD3_mapped",[40,112,41]],[[127264,127264],"disallowed_STD3_mapped",[40,113,41]],[[127265,127265],"disallowed_STD3_mapped",[40,114,41]],[[127266,127266],"disallowed_STD3_mapped",[40,115,41]],[[127267,127267],"disallowed_STD3_mapped",[40,116,41]],[[127268,127268],"disallowed_STD3_mapped",[40,117,41]],[[127269,127269],"disallowed_STD3_mapped",[40,118,41]],[[127270,127270],"disallowed_STD3_mapped",[40,119,41]],[[127271,127271],"disallowed_STD3_mapped",[40,120,41]],[[127272,127272],"disallowed_STD3_mapped",[40,121,41]],[[127273,127273],"disallowed_STD3_mapped",[40,122,41]],[[127274,127274],"mapped",[12308,115,12309]],[[127275,127275],"mapped",[99]],[[127276,127276],"mapped",[114]],[[127277,127277],"mapped",[99,100]],[[127278,127278],"mapped",[119,122]],[[127279,127279],"disallowed"],[[127280,127280],"mapped",[97]],[[127281,127281],"mapped",[98]],[[127282,127282],"mapped",[99]],[[127283,127283],"mapped",[100]],[[127284,127284],"mapped",[101]],[[127285,127285],"mapped",[102]],[[127286,127286],"mapped",[103]],[[127287,127287],"mapped",[104]],[[127288,127288],"mapped",[105]],[[127289,127289],"mapped",[106]],[[127290,127290],"mapped",[107]],[[127291,127291],"mapped",[108]],[[127292,127292],"mapped",[109]],[[127293,127293],"mapped",[110]],[[127294,127294],"mapped",[111]],[[127295,127295],"mapped",[112]],[[127296,127296],"mapped",[113]],[[127297,127297],"mapped",[114]],[[127298,127298],"mapped",[115]],[[127299,127299],"mapped",[116]],[[127300,127300],"mapped",[117]],[[127301,127301],"mapped",[118]],[[127302,127302],"mapped",[119]],[[127303,127303],"mapped",[120]],[[127304,127304],"mapped",[121]],[[127305,127305],"mapped",[122]],[[127306,127306],"mapped",[104,118]],[[127307,127307],"mapped",[109,118]],[[127308,127308],"mapped",[115,100]],[[127309,127309],"mapped",[115,115]],[[127310,127310],"mapped",[112,112,118]],[[127311,127311],"mapped",[119,99]],[[127312,127318],"valid",[],"NV8"],[[127319,127319],"valid",[],"NV8"],[[127320,127326],"valid",[],"NV8"],[[127327,127327],"valid",[],"NV8"],[[127328,127337],"valid",[],"NV8"],[[127338,127338],"mapped",[109,99]],[[127339,127339],"mapped",[109,100]],[[127340,127343],"disallowed"],[[127344,127352],"valid",[],"NV8"],[[127353,127353],"valid",[],"NV8"],[[127354,127354],"valid",[],"NV8"],[[127355,127356],"valid",[],"NV8"],[[127357,127358],"valid",[],"NV8"],[[127359,127359],"valid",[],"NV8"],[[127360,127369],"valid",[],"NV8"],[[127370,127373],"valid",[],"NV8"],[[127374,127375],"valid",[],"NV8"],[[127376,127376],"mapped",[100,106]],[[127377,127386],"valid",[],"NV8"],[[127387,127461],"disallowed"],[[127462,127487],"valid",[],"NV8"],[[127488,127488],"mapped",[12411,12363]],[[127489,127489],"mapped",[12467,12467]],[[127490,127490],"mapped",[12469]],[[127491,127503],"disallowed"],[[127504,127504],"mapped",[25163]],[[127505,127505],"mapped",[23383]],[[127506,127506],"mapped",[21452]],[[127507,127507],"mapped",[12487]],[[127508,127508],"mapped",[20108]],[[127509,127509],"mapped",[22810]],[[127510,127510],"mapped",[35299]],[[127511,127511],"mapped",[22825]],[[127512,127512],"mapped",[20132]],[[127513,127513],"mapped",[26144]],[[127514,127514],"mapped",[28961]],[[127515,127515],"mapped",[26009]],[[127516,127516],"mapped",[21069]],[[127517,127517],"mapped",[24460]],[[127518,127518],"mapped",[20877]],[[127519,127519],"mapped",[26032]],[[127520,127520],"mapped",[21021]],[[127521,127521],"mapped",[32066]],[[127522,127522],"mapped",[29983]],[[127523,127523],"mapped",[36009]],[[127524,127524],"mapped",[22768]],[[127525,127525],"mapped",[21561]],[[127526,127526],"mapped",[28436]],[[127527,127527],"mapped",[25237]],[[127528,127528],"mapped",[25429]],[[127529,127529],"mapped",[19968]],[[127530,127530],"mapped",[19977]],[[127531,127531],"mapped",[36938]],[[127532,127532],"mapped",[24038]],[[127533,127533],"mapped",[20013]],[[127534,127534],"mapped",[21491]],[[127535,127535],"mapped",[25351]],[[127536,127536],"mapped",[36208]],[[127537,127537],"mapped",[25171]],[[127538,127538],"mapped",[31105]],[[127539,127539],"mapped",[31354]],[[127540,127540],"mapped",[21512]],[[127541,127541],"mapped",[28288]],[[127542,127542],"mapped",[26377]],[[127543,127543],"mapped",[26376]],[[127544,127544],"mapped",[30003]],[[127545,127545],"mapped",[21106]],[[127546,127546],"mapped",[21942]],[[127547,127551],"disallowed"],[[127552,127552],"mapped",[12308,26412,12309]],[[127553,127553],"mapped",[12308,19977,12309]],[[127554,127554],"mapped",[12308,20108,12309]],[[127555,127555],"mapped",[12308,23433,12309]],[[127556,127556],"mapped",[12308,28857,12309]],[[127557,127557],"mapped",[12308,25171,12309]],[[127558,127558],"mapped",[12308,30423,12309]],[[127559,127559],"mapped",[12308,21213,12309]],[[127560,127560],"mapped",[12308,25943,12309]],[[127561,127567],"disallowed"],[[127568,127568],"mapped",[24471]],[[127569,127569],"mapped",[21487]],[[127570,127743],"disallowed"],[[127744,127776],"valid",[],"NV8"],[[127777,127788],"valid",[],"NV8"],[[127789,127791],"valid",[],"NV8"],[[127792,127797],"valid",[],"NV8"],[[127798,127798],"valid",[],"NV8"],[[127799,127868],"valid",[],"NV8"],[[127869,127869],"valid",[],"NV8"],[[127870,127871],"valid",[],"NV8"],[[127872,127891],"valid",[],"NV8"],[[127892,127903],"valid",[],"NV8"],[[127904,127940],"valid",[],"NV8"],[[127941,127941],"valid",[],"NV8"],[[127942,127946],"valid",[],"NV8"],[[127947,127950],"valid",[],"NV8"],[[127951,127955],"valid",[],"NV8"],[[127956,127967],"valid",[],"NV8"],[[127968,127984],"valid",[],"NV8"],[[127985,127991],"valid",[],"NV8"],[[127992,127999],"valid",[],"NV8"],[[128000,128062],"valid",[],"NV8"],[[128063,128063],"valid",[],"NV8"],[[128064,128064],"valid",[],"NV8"],[[128065,128065],"valid",[],"NV8"],[[128066,128247],"valid",[],"NV8"],[[128248,128248],"valid",[],"NV8"],[[128249,128252],"valid",[],"NV8"],[[128253,128254],"valid",[],"NV8"],[[128255,128255],"valid",[],"NV8"],[[128256,128317],"valid",[],"NV8"],[[128318,128319],"valid",[],"NV8"],[[128320,128323],"valid",[],"NV8"],[[128324,128330],"valid",[],"NV8"],[[128331,128335],"valid",[],"NV8"],[[128336,128359],"valid",[],"NV8"],[[128360,128377],"valid",[],"NV8"],[[128378,128378],"disallowed"],[[128379,128419],"valid",[],"NV8"],[[128420,128420],"disallowed"],[[128421,128506],"valid",[],"NV8"],[[128507,128511],"valid",[],"NV8"],[[128512,128512],"valid",[],"NV8"],[[128513,128528],"valid",[],"NV8"],[[128529,128529],"valid",[],"NV8"],[[128530,128532],"valid",[],"NV8"],[[128533,128533],"valid",[],"NV8"],[[128534,128534],"valid",[],"NV8"],[[128535,128535],"valid",[],"NV8"],[[128536,128536],"valid",[],"NV8"],[[128537,128537],"valid",[],"NV8"],[[128538,128538],"valid",[],"NV8"],[[128539,128539],"valid",[],"NV8"],[[128540,128542],"valid",[],"NV8"],[[128543,128543],"valid",[],"NV8"],[[128544,128549],"valid",[],"NV8"],[[128550,128551],"valid",[],"NV8"],[[128552,128555],"valid",[],"NV8"],[[128556,128556],"valid",[],"NV8"],[[128557,128557],"valid",[],"NV8"],[[128558,128559],"valid",[],"NV8"],[[128560,128563],"valid",[],"NV8"],[[128564,128564],"valid",[],"NV8"],[[128565,128576],"valid",[],"NV8"],[[128577,128578],"valid",[],"NV8"],[[128579,128580],"valid",[],"NV8"],[[128581,128591],"valid",[],"NV8"],[[128592,128639],"valid",[],"NV8"],[[128640,128709],"valid",[],"NV8"],[[128710,128719],"valid",[],"NV8"],[[128720,128720],"valid",[],"NV8"],[[128721,128735],"disallowed"],[[128736,128748],"valid",[],"NV8"],[[128749,128751],"disallowed"],[[128752,128755],"valid",[],"NV8"],[[128756,128767],"disallowed"],[[128768,128883],"valid",[],"NV8"],[[128884,128895],"disallowed"],[[128896,128980],"valid",[],"NV8"],[[128981,129023],"disallowed"],[[129024,129035],"valid",[],"NV8"],[[129036,129039],"disallowed"],[[129040,129095],"valid",[],"NV8"],[[129096,129103],"disallowed"],[[129104,129113],"valid",[],"NV8"],[[129114,129119],"disallowed"],[[129120,129159],"valid",[],"NV8"],[[129160,129167],"disallowed"],[[129168,129197],"valid",[],"NV8"],[[129198,129295],"disallowed"],[[129296,129304],"valid",[],"NV8"],[[129305,129407],"disallowed"],[[129408,129412],"valid",[],"NV8"],[[129413,129471],"disallowed"],[[129472,129472],"valid",[],"NV8"],[[129473,131069],"disallowed"],[[131070,131071],"disallowed"],[[131072,173782],"valid"],[[173783,173823],"disallowed"],[[173824,177972],"valid"],[[177973,177983],"disallowed"],[[177984,178205],"valid"],[[178206,178207],"disallowed"],[[178208,183969],"valid"],[[183970,194559],"disallowed"],[[194560,194560],"mapped",[20029]],[[194561,194561],"mapped",[20024]],[[194562,194562],"mapped",[20033]],[[194563,194563],"mapped",[131362]],[[194564,194564],"mapped",[20320]],[[194565,194565],"mapped",[20398]],[[194566,194566],"mapped",[20411]],[[194567,194567],"mapped",[20482]],[[194568,194568],"mapped",[20602]],[[194569,194569],"mapped",[20633]],[[194570,194570],"mapped",[20711]],[[194571,194571],"mapped",[20687]],[[194572,194572],"mapped",[13470]],[[194573,194573],"mapped",[132666]],[[194574,194574],"mapped",[20813]],[[194575,194575],"mapped",[20820]],[[194576,194576],"mapped",[20836]],[[194577,194577],"mapped",[20855]],[[194578,194578],"mapped",[132380]],[[194579,194579],"mapped",[13497]],[[194580,194580],"mapped",[20839]],[[194581,194581],"mapped",[20877]],[[194582,194582],"mapped",[132427]],[[194583,194583],"mapped",[20887]],[[194584,194584],"mapped",[20900]],[[194585,194585],"mapped",[20172]],[[194586,194586],"mapped",[20908]],[[194587,194587],"mapped",[20917]],[[194588,194588],"mapped",[168415]],[[194589,194589],"mapped",[20981]],[[194590,194590],"mapped",[20995]],[[194591,194591],"mapped",[13535]],[[194592,194592],"mapped",[21051]],[[194593,194593],"mapped",[21062]],[[194594,194594],"mapped",[21106]],[[194595,194595],"mapped",[21111]],[[194596,194596],"mapped",[13589]],[[194597,194597],"mapped",[21191]],[[194598,194598],"mapped",[21193]],[[194599,194599],"mapped",[21220]],[[194600,194600],"mapped",[21242]],[[194601,194601],"mapped",[21253]],[[194602,194602],"mapped",[21254]],[[194603,194603],"mapped",[21271]],[[194604,194604],"mapped",[21321]],[[194605,194605],"mapped",[21329]],[[194606,194606],"mapped",[21338]],[[194607,194607],"mapped",[21363]],[[194608,194608],"mapped",[21373]],[[194609,194611],"mapped",[21375]],[[194612,194612],"mapped",[133676]],[[194613,194613],"mapped",[28784]],[[194614,194614],"mapped",[21450]],[[194615,194615],"mapped",[21471]],[[194616,194616],"mapped",[133987]],[[194617,194617],"mapped",[21483]],[[194618,194618],"mapped",[21489]],[[194619,194619],"mapped",[21510]],[[194620,194620],"mapped",[21662]],[[194621,194621],"mapped",[21560]],[[194622,194622],"mapped",[21576]],[[194623,194623],"mapped",[21608]],[[194624,194624],"mapped",[21666]],[[194625,194625],"mapped",[21750]],[[194626,194626],"mapped",[21776]],[[194627,194627],"mapped",[21843]],[[194628,194628],"mapped",[21859]],[[194629,194630],"mapped",[21892]],[[194631,194631],"mapped",[21913]],[[194632,194632],"mapped",[21931]],[[194633,194633],"mapped",[21939]],[[194634,194634],"mapped",[21954]],[[194635,194635],"mapped",[22294]],[[194636,194636],"mapped",[22022]],[[194637,194637],"mapped",[22295]],[[194638,194638],"mapped",[22097]],[[194639,194639],"mapped",[22132]],[[194640,194640],"mapped",[20999]],[[194641,194641],"mapped",[22766]],[[194642,194642],"mapped",[22478]],[[194643,194643],"mapped",[22516]],[[194644,194644],"mapped",[22541]],[[194645,194645],"mapped",[22411]],[[194646,194646],"mapped",[22578]],[[194647,194647],"mapped",[22577]],[[194648,194648],"mapped",[22700]],[[194649,194649],"mapped",[136420]],[[194650,194650],"mapped",[22770]],[[194651,194651],"mapped",[22775]],[[194652,194652],"mapped",[22790]],[[194653,194653],"mapped",[22810]],[[194654,194654],"mapped",[22818]],[[194655,194655],"mapped",[22882]],[[194656,194656],"mapped",[136872]],[[194657,194657],"mapped",[136938]],[[194658,194658],"mapped",[23020]],[[194659,194659],"mapped",[23067]],[[194660,194660],"mapped",[23079]],[[194661,194661],"mapped",[23000]],[[194662,194662],"mapped",[23142]],[[194663,194663],"mapped",[14062]],[[194664,194664],"disallowed"],[[194665,194665],"mapped",[23304]],[[194666,194667],"mapped",[23358]],[[194668,194668],"mapped",[137672]],[[194669,194669],"mapped",[23491]],[[194670,194670],"mapped",[23512]],[[194671,194671],"mapped",[23527]],[[194672,194672],"mapped",[23539]],[[194673,194673],"mapped",[138008]],[[194674,194674],"mapped",[23551]],[[194675,194675],"mapped",[23558]],[[194676,194676],"disallowed"],[[194677,194677],"mapped",[23586]],[[194678,194678],"mapped",[14209]],[[194679,194679],"mapped",[23648]],[[194680,194680],"mapped",[23662]],[[194681,194681],"mapped",[23744]],[[194682,194682],"mapped",[23693]],[[194683,194683],"mapped",[138724]],[[194684,194684],"mapped",[23875]],[[194685,194685],"mapped",[138726]],[[194686,194686],"mapped",[23918]],[[194687,194687],"mapped",[23915]],[[194688,194688],"mapped",[23932]],[[194689,194689],"mapped",[24033]],[[194690,194690],"mapped",[24034]],[[194691,194691],"mapped",[14383]],[[194692,194692],"mapped",[24061]],[[194693,194693],"mapped",[24104]],[[194694,194694],"mapped",[24125]],[[194695,194695],"mapped",[24169]],[[194696,194696],"mapped",[14434]],[[194697,194697],"mapped",[139651]],[[194698,194698],"mapped",[14460]],[[194699,194699],"mapped",[24240]],[[194700,194700],"mapped",[24243]],[[194701,194701],"mapped",[24246]],[[194702,194702],"mapped",[24266]],[[194703,194703],"mapped",[172946]],[[194704,194704],"mapped",[24318]],[[194705,194706],"mapped",[140081]],[[194707,194707],"mapped",[33281]],[[194708,194709],"mapped",[24354]],[[194710,194710],"mapped",[14535]],[[194711,194711],"mapped",[144056]],[[194712,194712],"mapped",[156122]],[[194713,194713],"mapped",[24418]],[[194714,194714],"mapped",[24427]],[[194715,194715],"mapped",[14563]],[[194716,194716],"mapped",[24474]],[[194717,194717],"mapped",[24525]],[[194718,194718],"mapped",[24535]],[[194719,194719],"mapped",[24569]],[[194720,194720],"mapped",[24705]],[[194721,194721],"mapped",[14650]],[[194722,194722],"mapped",[14620]],[[194723,194723],"mapped",[24724]],[[194724,194724],"mapped",[141012]],[[194725,194725],"mapped",[24775]],[[194726,194726],"mapped",[24904]],[[194727,194727],"mapped",[24908]],[[194728,194728],"mapped",[24910]],[[194729,194729],"mapped",[24908]],[[194730,194730],"mapped",[24954]],[[194731,194731],"mapped",[24974]],[[194732,194732],"mapped",[25010]],[[194733,194733],"mapped",[24996]],[[194734,194734],"mapped",[25007]],[[194735,194735],"mapped",[25054]],[[194736,194736],"mapped",[25074]],[[194737,194737],"mapped",[25078]],[[194738,194738],"mapped",[25104]],[[194739,194739],"mapped",[25115]],[[194740,194740],"mapped",[25181]],[[194741,194741],"mapped",[25265]],[[194742,194742],"mapped",[25300]],[[194743,194743],"mapped",[25424]],[[194744,194744],"mapped",[142092]],[[194745,194745],"mapped",[25405]],[[194746,194746],"mapped",[25340]],[[194747,194747],"mapped",[25448]],[[194748,194748],"mapped",[25475]],[[194749,194749],"mapped",[25572]],[[194750,194750],"mapped",[142321]],[[194751,194751],"mapped",[25634]],[[194752,194752],"mapped",[25541]],[[194753,194753],"mapped",[25513]],[[194754,194754],"mapped",[14894]],[[194755,194755],"mapped",[25705]],[[194756,194756],"mapped",[25726]],[[194757,194757],"mapped",[25757]],[[194758,194758],"mapped",[25719]],[[194759,194759],"mapped",[14956]],[[194760,194760],"mapped",[25935]],[[194761,194761],"mapped",[25964]],[[194762,194762],"mapped",[143370]],[[194763,194763],"mapped",[26083]],[[194764,194764],"mapped",[26360]],[[194765,194765],"mapped",[26185]],[[194766,194766],"mapped",[15129]],[[194767,194767],"mapped",[26257]],[[194768,194768],"mapped",[15112]],[[194769,194769],"mapped",[15076]],[[194770,194770],"mapped",[20882]],[[194771,194771],"mapped",[20885]],[[194772,194772],"mapped",[26368]],[[194773,194773],"mapped",[26268]],[[194774,194774],"mapped",[32941]],[[194775,194775],"mapped",[17369]],[[194776,194776],"mapped",[26391]],[[194777,194777],"mapped",[26395]],[[194778,194778],"mapped",[26401]],[[194779,194779],"mapped",[26462]],[[194780,194780],"mapped",[26451]],[[194781,194781],"mapped",[144323]],[[194782,194782],"mapped",[15177]],[[194783,194783],"mapped",[26618]],[[194784,194784],"mapped",[26501]],[[194785,194785],"mapped",[26706]],[[194786,194786],"mapped",[26757]],[[194787,194787],"mapped",[144493]],[[194788,194788],"mapped",[26766]],[[194789,194789],"mapped",[26655]],[[194790,194790],"mapped",[26900]],[[194791,194791],"mapped",[15261]],[[194792,194792],"mapped",[26946]],[[194793,194793],"mapped",[27043]],[[194794,194794],"mapped",[27114]],[[194795,194795],"mapped",[27304]],[[194796,194796],"mapped",[145059]],[[194797,194797],"mapped",[27355]],[[194798,194798],"mapped",[15384]],[[194799,194799],"mapped",[27425]],[[194800,194800],"mapped",[145575]],[[194801,194801],"mapped",[27476]],[[194802,194802],"mapped",[15438]],[[194803,194803],"mapped",[27506]],[[194804,194804],"mapped",[27551]],[[194805,194805],"mapped",[27578]],[[194806,194806],"mapped",[27579]],[[194807,194807],"mapped",[146061]],[[194808,194808],"mapped",[138507]],[[194809,194809],"mapped",[146170]],[[194810,194810],"mapped",[27726]],[[194811,194811],"mapped",[146620]],[[194812,194812],"mapped",[27839]],[[194813,194813],"mapped",[27853]],[[194814,194814],"mapped",[27751]],[[194815,194815],"mapped",[27926]],[[194816,194816],"mapped",[27966]],[[194817,194817],"mapped",[28023]],[[194818,194818],"mapped",[27969]],[[194819,194819],"mapped",[28009]],[[194820,194820],"mapped",[28024]],[[194821,194821],"mapped",[28037]],[[194822,194822],"mapped",[146718]],[[194823,194823],"mapped",[27956]],[[194824,194824],"mapped",[28207]],[[194825,194825],"mapped",[28270]],[[194826,194826],"mapped",[15667]],[[194827,194827],"mapped",[28363]],[[194828,194828],"mapped",[28359]],[[194829,194829],"mapped",[147153]],[[194830,194830],"mapped",[28153]],[[194831,194831],"mapped",[28526]],[[194832,194832],"mapped",[147294]],[[194833,194833],"mapped",[147342]],[[194834,194834],"mapped",[28614]],[[194835,194835],"mapped",[28729]],[[194836,194836],"mapped",[28702]],[[194837,194837],"mapped",[28699]],[[194838,194838],"mapped",[15766]],[[194839,194839],"mapped",[28746]],[[194840,194840],"mapped",[28797]],[[194841,194841],"mapped",[28791]],[[194842,194842],"mapped",[28845]],[[194843,194843],"mapped",[132389]],[[194844,194844],"mapped",[28997]],[[194845,194845],"mapped",[148067]],[[194846,194846],"mapped",[29084]],[[194847,194847],"disallowed"],[[194848,194848],"mapped",[29224]],[[194849,194849],"mapped",[29237]],[[194850,194850],"mapped",[29264]],[[194851,194851],"mapped",[149000]],[[194852,194852],"mapped",[29312]],[[194853,194853],"mapped",[29333]],[[194854,194854],"mapped",[149301]],[[194855,194855],"mapped",[149524]],[[194856,194856],"mapped",[29562]],[[194857,194857],"mapped",[29579]],[[194858,194858],"mapped",[16044]],[[194859,194859],"mapped",[29605]],[[194860,194861],"mapped",[16056]],[[194862,194862],"mapped",[29767]],[[194863,194863],"mapped",[29788]],[[194864,194864],"mapped",[29809]],[[194865,194865],"mapped",[29829]],[[194866,194866],"mapped",[29898]],[[194867,194867],"mapped",[16155]],[[194868,194868],"mapped",[29988]],[[194869,194869],"mapped",[150582]],[[194870,194870],"mapped",[30014]],[[194871,194871],"mapped",[150674]],[[194872,194872],"mapped",[30064]],[[194873,194873],"mapped",[139679]],[[194874,194874],"mapped",[30224]],[[194875,194875],"mapped",[151457]],[[194876,194876],"mapped",[151480]],[[194877,194877],"mapped",[151620]],[[194878,194878],"mapped",[16380]],[[194879,194879],"mapped",[16392]],[[194880,194880],"mapped",[30452]],[[194881,194881],"mapped",[151795]],[[194882,194882],"mapped",[151794]],[[194883,194883],"mapped",[151833]],[[194884,194884],"mapped",[151859]],[[194885,194885],"mapped",[30494]],[[194886,194887],"mapped",[30495]],[[194888,194888],"mapped",[30538]],[[194889,194889],"mapped",[16441]],[[194890,194890],"mapped",[30603]],[[194891,194891],"mapped",[16454]],[[194892,194892],"mapped",[16534]],[[194893,194893],"mapped",[152605]],[[194894,194894],"mapped",[30798]],[[194895,194895],"mapped",[30860]],[[194896,194896],"mapped",[30924]],[[194897,194897],"mapped",[16611]],[[194898,194898],"mapped",[153126]],[[194899,194899],"mapped",[31062]],[[194900,194900],"mapped",[153242]],[[194901,194901],"mapped",[153285]],[[194902,194902],"mapped",[31119]],[[194903,194903],"mapped",[31211]],[[194904,194904],"mapped",[16687]],[[194905,194905],"mapped",[31296]],[[194906,194906],"mapped",[31306]],[[194907,194907],"mapped",[31311]],[[194908,194908],"mapped",[153980]],[[194909,194910],"mapped",[154279]],[[194911,194911],"disallowed"],[[194912,194912],"mapped",[16898]],[[194913,194913],"mapped",[154539]],[[194914,194914],"mapped",[31686]],[[194915,194915],"mapped",[31689]],[[194916,194916],"mapped",[16935]],[[194917,194917],"mapped",[154752]],[[194918,194918],"mapped",[31954]],[[194919,194919],"mapped",[17056]],[[194920,194920],"mapped",[31976]],[[194921,194921],"mapped",[31971]],[[194922,194922],"mapped",[32000]],[[194923,194923],"mapped",[155526]],[[194924,194924],"mapped",[32099]],[[194925,194925],"mapped",[17153]],[[194926,194926],"mapped",[32199]],[[194927,194927],"mapped",[32258]],[[194928,194928],"mapped",[32325]],[[194929,194929],"mapped",[17204]],[[194930,194930],"mapped",[156200]],[[194931,194931],"mapped",[156231]],[[194932,194932],"mapped",[17241]],[[194933,194933],"mapped",[156377]],[[194934,194934],"mapped",[32634]],[[194935,194935],"mapped",[156478]],[[194936,194936],"mapped",[32661]],[[194937,194937],"mapped",[32762]],[[194938,194938],"mapped",[32773]],[[194939,194939],"mapped",[156890]],[[194940,194940],"mapped",[156963]],[[194941,194941],"mapped",[32864]],[[194942,194942],"mapped",[157096]],[[194943,194943],"mapped",[32880]],[[194944,194944],"mapped",[144223]],[[194945,194945],"mapped",[17365]],[[194946,194946],"mapped",[32946]],[[194947,194947],"mapped",[33027]],[[194948,194948],"mapped",[17419]],[[194949,194949],"mapped",[33086]],[[194950,194950],"mapped",[23221]],[[194951,194951],"mapped",[157607]],[[194952,194952],"mapped",[157621]],[[194953,194953],"mapped",[144275]],[[194954,194954],"mapped",[144284]],[[194955,194955],"mapped",[33281]],[[194956,194956],"mapped",[33284]],[[194957,194957],"mapped",[36766]],[[194958,194958],"mapped",[17515]],[[194959,194959],"mapped",[33425]],[[194960,194960],"mapped",[33419]],[[194961,194961],"mapped",[33437]],[[194962,194962],"mapped",[21171]],[[194963,194963],"mapped",[33457]],[[194964,194964],"mapped",[33459]],[[194965,194965],"mapped",[33469]],[[194966,194966],"mapped",[33510]],[[194967,194967],"mapped",[158524]],[[194968,194968],"mapped",[33509]],[[194969,194969],"mapped",[33565]],[[194970,194970],"mapped",[33635]],[[194971,194971],"mapped",[33709]],[[194972,194972],"mapped",[33571]],[[194973,194973],"mapped",[33725]],[[194974,194974],"mapped",[33767]],[[194975,194975],"mapped",[33879]],[[194976,194976],"mapped",[33619]],[[194977,194977],"mapped",[33738]],[[194978,194978],"mapped",[33740]],[[194979,194979],"mapped",[33756]],[[194980,194980],"mapped",[158774]],[[194981,194981],"mapped",[159083]],[[194982,194982],"mapped",[158933]],[[194983,194983],"mapped",[17707]],[[194984,194984],"mapped",[34033]],[[194985,194985],"mapped",[34035]],[[194986,194986],"mapped",[34070]],[[194987,194987],"mapped",[160714]],[[194988,194988],"mapped",[34148]],[[194989,194989],"mapped",[159532]],[[194990,194990],"mapped",[17757]],[[194991,194991],"mapped",[17761]],[[194992,194992],"mapped",[159665]],[[194993,194993],"mapped",[159954]],[[194994,194994],"mapped",[17771]],[[194995,194995],"mapped",[34384]],[[194996,194996],"mapped",[34396]],[[194997,194997],"mapped",[34407]],[[194998,194998],"mapped",[34409]],[[194999,194999],"mapped",[34473]],[[195000,195000],"mapped",[34440]],[[195001,195001],"mapped",[34574]],[[195002,195002],"mapped",[34530]],[[195003,195003],"mapped",[34681]],[[195004,195004],"mapped",[34600]],[[195005,195005],"mapped",[34667]],[[195006,195006],"mapped",[34694]],[[195007,195007],"disallowed"],[[195008,195008],"mapped",[34785]],[[195009,195009],"mapped",[34817]],[[195010,195010],"mapped",[17913]],[[195011,195011],"mapped",[34912]],[[195012,195012],"mapped",[34915]],[[195013,195013],"mapped",[161383]],[[195014,195014],"mapped",[35031]],[[195015,195015],"mapped",[35038]],[[195016,195016],"mapped",[17973]],[[195017,195017],"mapped",[35066]],[[195018,195018],"mapped",[13499]],[[195019,195019],"mapped",[161966]],[[195020,195020],"mapped",[162150]],[[195021,195021],"mapped",[18110]],[[195022,195022],"mapped",[18119]],[[195023,195023],"mapped",[35488]],[[195024,195024],"mapped",[35565]],[[195025,195025],"mapped",[35722]],[[195026,195026],"mapped",[35925]],[[195027,195027],"mapped",[162984]],[[195028,195028],"mapped",[36011]],[[195029,195029],"mapped",[36033]],[[195030,195030],"mapped",[36123]],[[195031,195031],"mapped",[36215]],[[195032,195032],"mapped",[163631]],[[195033,195033],"mapped",[133124]],[[195034,195034],"mapped",[36299]],[[195035,195035],"mapped",[36284]],[[195036,195036],"mapped",[36336]],[[195037,195037],"mapped",[133342]],[[195038,195038],"mapped",[36564]],[[195039,195039],"mapped",[36664]],[[195040,195040],"mapped",[165330]],[[195041,195041],"mapped",[165357]],[[195042,195042],"mapped",[37012]],[[195043,195043],"mapped",[37105]],[[195044,195044],"mapped",[37137]],[[195045,195045],"mapped",[165678]],[[195046,195046],"mapped",[37147]],[[195047,195047],"mapped",[37432]],[[195048,195048],"mapped",[37591]],[[195049,195049],"mapped",[37592]],[[195050,195050],"mapped",[37500]],[[195051,195051],"mapped",[37881]],[[195052,195052],"mapped",[37909]],[[195053,195053],"mapped",[166906]],[[195054,195054],"mapped",[38283]],[[195055,195055],"mapped",[18837]],[[195056,195056],"mapped",[38327]],[[195057,195057],"mapped",[167287]],[[195058,195058],"mapped",[18918]],[[195059,195059],"mapped",[38595]],[[195060,195060],"mapped",[23986]],[[195061,195061],"mapped",[38691]],[[195062,195062],"mapped",[168261]],[[195063,195063],"mapped",[168474]],[[195064,195064],"mapped",[19054]],[[195065,195065],"mapped",[19062]],[[195066,195066],"mapped",[38880]],[[195067,195067],"mapped",[168970]],[[195068,195068],"mapped",[19122]],[[195069,195069],"mapped",[169110]],[[195070,195071],"mapped",[38923]],[[195072,195072],"mapped",[38953]],[[195073,195073],"mapped",[169398]],[[195074,195074],"mapped",[39138]],[[195075,195075],"mapped",[19251]],[[195076,195076],"mapped",[39209]],[[195077,195077],"mapped",[39335]],[[195078,195078],"mapped",[39362]],[[195079,195079],"mapped",[39422]],[[195080,195080],"mapped",[19406]],[[195081,195081],"mapped",[170800]],[[195082,195082],"mapped",[39698]],[[195083,195083],"mapped",[40000]],[[195084,195084],"mapped",[40189]],[[195085,195085],"mapped",[19662]],[[195086,195086],"mapped",[19693]],[[195087,195087],"mapped",[40295]],[[195088,195088],"mapped",[172238]],[[195089,195089],"mapped",[19704]],[[195090,195090],"mapped",[172293]],[[195091,195091],"mapped",[172558]],[[195092,195092],"mapped",[172689]],[[195093,195093],"mapped",[40635]],[[195094,195094],"mapped",[19798]],[[195095,195095],"mapped",[40697]],[[195096,195096],"mapped",[40702]],[[195097,195097],"mapped",[40709]],[[195098,195098],"mapped",[40719]],[[195099,195099],"mapped",[40726]],[[195100,195100],"mapped",[40763]],[[195101,195101],"mapped",[173568]],[[195102,196605],"disallowed"],[[196606,196607],"disallowed"],[[196608,262141],"disallowed"],[[262142,262143],"disallowed"],[[262144,327677],"disallowed"],[[327678,327679],"disallowed"],[[327680,393213],"disallowed"],[[393214,393215],"disallowed"],[[393216,458749],"disallowed"],[[458750,458751],"disallowed"],[[458752,524285],"disallowed"],[[524286,524287],"disallowed"],[[524288,589821],"disallowed"],[[589822,589823],"disallowed"],[[589824,655357],"disallowed"],[[655358,655359],"disallowed"],[[655360,720893],"disallowed"],[[720894,720895],"disallowed"],[[720896,786429],"disallowed"],[[786430,786431],"disallowed"],[[786432,851965],"disallowed"],[[851966,851967],"disallowed"],[[851968,917501],"disallowed"],[[917502,917503],"disallowed"],[[917504,917504],"disallowed"],[[917505,917505],"disallowed"],[[917506,917535],"disallowed"],[[917536,917631],"disallowed"],[[917632,917759],"disallowed"],[[917760,917999],"ignored"],[[918000,983037],"disallowed"],[[983038,983039],"disallowed"],[[983040,1048573],"disallowed"],[[1048574,1048575],"disallowed"],[[1048576,1114109],"disallowed"],[[1114110,1114111],"disallowed"]]'); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/"; +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module is referenced by other modules so it can't be inlined +/******/ var __webpack_exports__ = __nccwpck_require__(2644); +/******/ module.exports = __webpack_exports__; +/******/ +/******/ })() +; diff --git a/.github/actions/javascript/proposalPoliceCommentEdit/action.yml b/.github/actions/javascript/proposalPoliceCommentEdit/action.yml index e8cc92cd2027..937ad513d103 100644 --- a/.github/actions/javascript/proposalPoliceCommentEdit/action.yml +++ b/.github/actions/javascript/proposalPoliceCommentEdit/action.yml @@ -1,30 +1,18 @@ -name: ProposalPolice™ - Issue Comment Edit Workflow -on: - issue_comment: - types: [edited] - -jobs: - process-issue-comment: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - name: Setup Node.js - uses: actions/setup-node@v2 - with: - node-version: "20" - - - name: Install dependencies - run: npm install - working-directory: ../../../ - - # Checks if the comment is edited and if proposal template is followed - - name: Run issue comment edited script - if: github.event.action == 'edited' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - OPENAI_ASSISTANT_ID: ${{ secrets.OPENAI_ASSISTANT_ID }} - ISSUE: ${{ toJson(github.event.issue) }} - COMMENT: ${{ toJson(github.event.comment) }} - run: ./index.js +name: 'ProposalPolice™ Edited Comment Check' +description: 'Verifies whether an updated proposal had substantial changes' +inputs: + GITHUB_TOKEN: + description: 'Auth token for New Expensify Github' + required: true + OPENAI_API_KEY: + description: 'OpenAI API key for accessing AI services' + required: true + OPENAI_ASSISTANT_ID: + description: 'OpenAI Assistant ID for personalized AI assistant' + required: true +runs: + using: 'node20' + main: './index.js' + env: + ISSUE: '${{ toJson(github.event.issue) }}' + COMMENT: '${{ toJson(github.event.comment) }}' diff --git a/.github/actions/javascript/proposalPoliceCommentEdit/index.js b/.github/actions/javascript/proposalPoliceCommentEdit/index.js new file mode 100644 index 000000000000..58b741a59361 --- /dev/null +++ b/.github/actions/javascript/proposalPoliceCommentEdit/index.js @@ -0,0 +1,20936 @@ +/** + * NOTE: This is a compiled file. DO NOT directly edit this file. + */ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ 4087: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Context = void 0; +const fs_1 = __nccwpck_require__(7147); +const os_1 = __nccwpck_require__(2037); +class Context { + /** + * Hydrate the context from the environment + */ + constructor() { + var _a, _b, _c; + this.payload = {}; + if (process.env.GITHUB_EVENT_PATH) { + if (fs_1.existsSync(process.env.GITHUB_EVENT_PATH)) { + this.payload = JSON.parse(fs_1.readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' })); + } + else { + const path = process.env.GITHUB_EVENT_PATH; + process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`); + } + } + this.eventName = process.env.GITHUB_EVENT_NAME; + this.sha = process.env.GITHUB_SHA; + this.ref = process.env.GITHUB_REF; + this.workflow = process.env.GITHUB_WORKFLOW; + this.action = process.env.GITHUB_ACTION; + this.actor = process.env.GITHUB_ACTOR; + this.job = process.env.GITHUB_JOB; + this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); + this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); + this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`; + this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`; + this.graphqlUrl = (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`; + } + get issue() { + const payload = this.payload; + return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number }); + } + get repo() { + if (process.env.GITHUB_REPOSITORY) { + const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/'); + return { owner, repo }; + } + if (this.payload.repository) { + return { + owner: this.payload.repository.owner.login, + repo: this.payload.repository.name + }; + } + throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'"); + } +} +exports.Context = Context; +//# sourceMappingURL=context.js.map + +/***/ }), + +/***/ 5438: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getOctokit = exports.context = void 0; +const Context = __importStar(__nccwpck_require__(4087)); +const utils_1 = __nccwpck_require__(3030); +exports.context = new Context.Context(); +/** + * Returns a hydrated octokit ready to use for GitHub Actions + * + * @param token the repo PAT or GITHUB_TOKEN + * @param options other options to set + */ +function getOctokit(token, options, ...additionalPlugins) { + const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins); + return new GitHubWithPlugins(utils_1.getOctokitOptions(token, options)); +} +exports.getOctokit = getOctokit; +//# sourceMappingURL=github.js.map + +/***/ }), + +/***/ 7914: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getApiBaseUrl = exports.getProxyAgent = exports.getAuthString = void 0; +const httpClient = __importStar(__nccwpck_require__(6255)); +function getAuthString(token, options) { + if (!token && !options.auth) { + throw new Error('Parameter token or opts.auth is required'); + } + else if (token && options.auth) { + throw new Error('Parameters token and opts.auth may not both be specified'); + } + return typeof options.auth === 'string' ? options.auth : `token ${token}`; +} +exports.getAuthString = getAuthString; +function getProxyAgent(destinationUrl) { + const hc = new httpClient.HttpClient(); + return hc.getAgent(destinationUrl); +} +exports.getProxyAgent = getProxyAgent; +function getApiBaseUrl() { + return process.env['GITHUB_API_URL'] || 'https://api.github.com'; +} +exports.getApiBaseUrl = getApiBaseUrl; +//# sourceMappingURL=utils.js.map + +/***/ }), + +/***/ 3030: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0; +const Context = __importStar(__nccwpck_require__(4087)); +const Utils = __importStar(__nccwpck_require__(7914)); +// octokit + plugins +const core_1 = __nccwpck_require__(8525); +const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044); +const plugin_paginate_rest_1 = __nccwpck_require__(8945); +exports.context = new Context.Context(); +const baseUrl = Utils.getApiBaseUrl(); +exports.defaults = { + baseUrl, + request: { + agent: Utils.getProxyAgent(baseUrl) + } +}; +exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults); +/** + * Convience function to correctly format Octokit Options to pass into the constructor. + * + * @param token the repo PAT or GITHUB_TOKEN + * @param options other options to set + */ +function getOctokitOptions(token, options) { + const opts = Object.assign({}, options || {}); // Shallow clone - don't mutate the object provided by the caller + // Auth + const auth = Utils.getAuthString(token, opts); + if (auth) { + opts.auth = auth; + } + return opts; +} +exports.getOctokitOptions = getOctokitOptions; +//# sourceMappingURL=utils.js.map + +/***/ }), + +/***/ 673: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +const REGEX_IS_INSTALLATION_LEGACY = /^v1\./; +const REGEX_IS_INSTALLATION = /^ghs_/; +const REGEX_IS_USER_TO_SERVER = /^ghu_/; +async function auth(token) { + const isApp = token.split(/\./).length === 3; + const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token); + const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token); + const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; + return { + type: "token", + token: token, + tokenType + }; +} + +/** + * Prefix token for usage in the Authorization header + * + * @param token OAuth token or JSON Web Token + */ +function withAuthorizationPrefix(token) { + if (token.split(/\./).length === 3) { + return `bearer ${token}`; + } + + return `token ${token}`; +} + +async function hook(token, request, route, parameters) { + const endpoint = request.endpoint.merge(route, parameters); + endpoint.headers.authorization = withAuthorizationPrefix(token); + return request(endpoint); +} + +const createTokenAuth = function createTokenAuth(token) { + if (!token) { + throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); + } + + if (typeof token !== "string") { + throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string"); + } + + token = token.replace(/^(token|bearer) +/i, ""); + return Object.assign(auth.bind(null, token), { + hook: hook.bind(null, token) + }); +}; + +exports.createTokenAuth = createTokenAuth; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 8525: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +var universalUserAgent = __nccwpck_require__(5030); +var beforeAfterHook = __nccwpck_require__(3682); +var request = __nccwpck_require__(9353); +var graphql = __nccwpck_require__(6422); +var authToken = __nccwpck_require__(673); + +function _objectWithoutPropertiesLoose(source, excluded) { + if (source == null) return {}; + var target = {}; + var sourceKeys = Object.keys(source); + var key, i; + + for (i = 0; i < sourceKeys.length; i++) { + key = sourceKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + target[key] = source[key]; + } + + return target; +} + +function _objectWithoutProperties(source, excluded) { + if (source == null) return {}; + + var target = _objectWithoutPropertiesLoose(source, excluded); + + var key, i; + + if (Object.getOwnPropertySymbols) { + var sourceSymbolKeys = Object.getOwnPropertySymbols(source); + + for (i = 0; i < sourceSymbolKeys.length; i++) { + key = sourceSymbolKeys[i]; + if (excluded.indexOf(key) >= 0) continue; + if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; + target[key] = source[key]; + } + } + + return target; +} + +const VERSION = "3.6.0"; + +const _excluded = ["authStrategy"]; +class Octokit { + constructor(options = {}) { + const hook = new beforeAfterHook.Collection(); + const requestDefaults = { + baseUrl: request.request.endpoint.DEFAULTS.baseUrl, + headers: {}, + request: Object.assign({}, options.request, { + // @ts-ignore internal usage only, no need to type + hook: hook.bind(null, "request") + }), + mediaType: { + previews: [], + format: "" + } + }; // prepend default user agent with `options.userAgent` if set + + requestDefaults.headers["user-agent"] = [options.userAgent, `octokit-core.js/${VERSION} ${universalUserAgent.getUserAgent()}`].filter(Boolean).join(" "); + + if (options.baseUrl) { + requestDefaults.baseUrl = options.baseUrl; + } + + if (options.previews) { + requestDefaults.mediaType.previews = options.previews; + } + + if (options.timeZone) { + requestDefaults.headers["time-zone"] = options.timeZone; + } + + this.request = request.request.defaults(requestDefaults); + this.graphql = graphql.withCustomRequest(this.request).defaults(requestDefaults); + this.log = Object.assign({ + debug: () => {}, + info: () => {}, + warn: console.warn.bind(console), + error: console.error.bind(console) + }, options.log); + this.hook = hook; // (1) If neither `options.authStrategy` nor `options.auth` are set, the `octokit` instance + // is unauthenticated. The `this.auth()` method is a no-op and no request hook is registered. + // (2) If only `options.auth` is set, use the default token authentication strategy. + // (3) If `options.authStrategy` is set then use it and pass in `options.auth`. Always pass own request as many strategies accept a custom request instance. + // TODO: type `options.auth` based on `options.authStrategy`. + + if (!options.authStrategy) { + if (!options.auth) { + // (1) + this.auth = async () => ({ + type: "unauthenticated" + }); + } else { + // (2) + const auth = authToken.createTokenAuth(options.auth); // @ts-ignore ¯\_(ツ)_/¯ + + hook.wrap("request", auth.hook); + this.auth = auth; + } + } else { + const { + authStrategy + } = options, + otherOptions = _objectWithoutProperties(options, _excluded); + + const auth = authStrategy(Object.assign({ + request: this.request, + log: this.log, + // we pass the current octokit instance as well as its constructor options + // to allow for authentication strategies that return a new octokit instance + // that shares the same internal state as the current one. The original + // requirement for this was the "event-octokit" authentication strategy + // of https://github.com/probot/octokit-auth-probot. + octokit: this, + octokitOptions: otherOptions + }, options.auth)); // @ts-ignore ¯\_(ツ)_/¯ + + hook.wrap("request", auth.hook); + this.auth = auth; + } // apply plugins + // https://stackoverflow.com/a/16345172 + + + const classConstructor = this.constructor; + classConstructor.plugins.forEach(plugin => { + Object.assign(this, plugin(this, options)); + }); + } + + static defaults(defaults) { + const OctokitWithDefaults = class extends this { + constructor(...args) { + const options = args[0] || {}; + + if (typeof defaults === "function") { + super(defaults(options)); + return; + } + + super(Object.assign({}, defaults, options, options.userAgent && defaults.userAgent ? { + userAgent: `${options.userAgent} ${defaults.userAgent}` + } : null)); + } + + }; + return OctokitWithDefaults; + } + /** + * Attach a plugin (or many) to your Octokit instance. + * + * @example + * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...) + */ + + + static plugin(...newPlugins) { + var _a; + + const currentPlugins = this.plugins; + const NewOctokit = (_a = class extends this {}, _a.plugins = currentPlugins.concat(newPlugins.filter(plugin => !currentPlugins.includes(plugin))), _a); + return NewOctokit; + } + +} +Octokit.VERSION = VERSION; +Octokit.plugins = []; + +exports.Octokit = Octokit; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 8713: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +var isPlainObject = __nccwpck_require__(3287); +var universalUserAgent = __nccwpck_require__(5030); + +function lowercaseKeys(object) { + if (!object) { + return {}; + } + + return Object.keys(object).reduce((newObj, key) => { + newObj[key.toLowerCase()] = object[key]; + return newObj; + }, {}); +} + +function mergeDeep(defaults, options) { + const result = Object.assign({}, defaults); + Object.keys(options).forEach(key => { + if (isPlainObject.isPlainObject(options[key])) { + if (!(key in defaults)) Object.assign(result, { + [key]: options[key] + });else result[key] = mergeDeep(defaults[key], options[key]); + } else { + Object.assign(result, { + [key]: options[key] + }); + } + }); + return result; +} + +function removeUndefinedProperties(obj) { + for (const key in obj) { + if (obj[key] === undefined) { + delete obj[key]; + } + } + + return obj; +} + +function merge(defaults, route, options) { + if (typeof route === "string") { + let [method, url] = route.split(" "); + options = Object.assign(url ? { + method, + url + } : { + url: method + }, options); + } else { + options = Object.assign({}, route); + } // lowercase header names before merging with defaults to avoid duplicates + + + options.headers = lowercaseKeys(options.headers); // remove properties with undefined values before merging + + removeUndefinedProperties(options); + removeUndefinedProperties(options.headers); + const mergedOptions = mergeDeep(defaults || {}, options); // mediaType.previews arrays are merged, instead of overwritten + + if (defaults && defaults.mediaType.previews.length) { + mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(preview => !mergedOptions.mediaType.previews.includes(preview)).concat(mergedOptions.mediaType.previews); + } + + mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map(preview => preview.replace(/-preview/, "")); + return mergedOptions; +} + +function addQueryParameters(url, parameters) { + const separator = /\?/.test(url) ? "&" : "?"; + const names = Object.keys(parameters); + + if (names.length === 0) { + return url; + } + + return url + separator + names.map(name => { + if (name === "q") { + return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); + } + + return `${name}=${encodeURIComponent(parameters[name])}`; + }).join("&"); +} + +const urlVariableRegex = /\{[^}]+\}/g; + +function removeNonChars(variableName) { + return variableName.replace(/^\W+|\W+$/g, "").split(/,/); +} + +function extractUrlVariableNames(url) { + const matches = url.match(urlVariableRegex); + + if (!matches) { + return []; + } + + return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []); +} + +function omit(object, keysToOmit) { + return Object.keys(object).filter(option => !keysToOmit.includes(option)).reduce((obj, key) => { + obj[key] = object[key]; + return obj; + }, {}); +} + +// Based on https://github.com/bramstein/url-template, licensed under BSD +// TODO: create separate package. +// +// Copyright (c) 2012-2014, Bram Stein +// All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// 3. The name of the author may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED +// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO +// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY +// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +/* istanbul ignore file */ +function encodeReserved(str) { + return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) { + if (!/%[0-9A-Fa-f]/.test(part)) { + part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); + } + + return part; + }).join(""); +} + +function encodeUnreserved(str) { + return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { + return "%" + c.charCodeAt(0).toString(16).toUpperCase(); + }); +} + +function encodeValue(operator, value, key) { + value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); + + if (key) { + return encodeUnreserved(key) + "=" + value; + } else { + return value; + } +} + +function isDefined(value) { + return value !== undefined && value !== null; +} + +function isKeyOperator(operator) { + return operator === ";" || operator === "&" || operator === "?"; +} + +function getValues(context, operator, key, modifier) { + var value = context[key], + result = []; + + if (isDefined(value) && value !== "") { + if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { + value = value.toString(); + + if (modifier && modifier !== "*") { + value = value.substring(0, parseInt(modifier, 10)); + } + + result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); + } else { + if (modifier === "*") { + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function (value) { + result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); + }); + } else { + Object.keys(value).forEach(function (k) { + if (isDefined(value[k])) { + result.push(encodeValue(operator, value[k], k)); + } + }); + } + } else { + const tmp = []; + + if (Array.isArray(value)) { + value.filter(isDefined).forEach(function (value) { + tmp.push(encodeValue(operator, value)); + }); + } else { + Object.keys(value).forEach(function (k) { + if (isDefined(value[k])) { + tmp.push(encodeUnreserved(k)); + tmp.push(encodeValue(operator, value[k].toString())); + } + }); + } + + if (isKeyOperator(operator)) { + result.push(encodeUnreserved(key) + "=" + tmp.join(",")); + } else if (tmp.length !== 0) { + result.push(tmp.join(",")); + } + } + } + } else { + if (operator === ";") { + if (isDefined(value)) { + result.push(encodeUnreserved(key)); + } + } else if (value === "" && (operator === "&" || operator === "?")) { + result.push(encodeUnreserved(key) + "="); + } else if (value === "") { + result.push(""); + } + } + + return result; +} + +function parseUrl(template) { + return { + expand: expand.bind(null, template) + }; +} + +function expand(template, context) { + var operators = ["+", "#", ".", "/", ";", "?", "&"]; + return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) { + if (expression) { + let operator = ""; + const values = []; + + if (operators.indexOf(expression.charAt(0)) !== -1) { + operator = expression.charAt(0); + expression = expression.substr(1); + } + + expression.split(/,/g).forEach(function (variable) { + var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); + values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); + }); + + if (operator && operator !== "+") { + var separator = ","; + + if (operator === "?") { + separator = "&"; + } else if (operator !== "#") { + separator = operator; + } + + return (values.length !== 0 ? operator : "") + values.join(separator); + } else { + return values.join(","); + } + } else { + return encodeReserved(literal); + } + }); +} + +function parse(options) { + // https://fetch.spec.whatwg.org/#methods + let method = options.method.toUpperCase(); // replace :varname with {varname} to make it RFC 6570 compatible + + let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); + let headers = Object.assign({}, options.headers); + let body; + let parameters = omit(options, ["method", "baseUrl", "url", "headers", "request", "mediaType"]); // extract variable names from URL to calculate remaining variables later + + const urlVariableNames = extractUrlVariableNames(url); + url = parseUrl(url).expand(parameters); + + if (!/^http/.test(url)) { + url = options.baseUrl + url; + } + + const omittedParameters = Object.keys(options).filter(option => urlVariableNames.includes(option)).concat("baseUrl"); + const remainingParameters = omit(parameters, omittedParameters); + const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); + + if (!isBinaryRequest) { + if (options.mediaType.format) { + // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw + headers.accept = headers.accept.split(/,/).map(preview => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`)).join(","); + } + + if (options.mediaType.previews.length) { + const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || []; + headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map(preview => { + const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; + return `application/vnd.github.${preview}-preview${format}`; + }).join(","); + } + } // for GET/HEAD requests, set URL query parameters from remaining parameters + // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters + + + if (["GET", "HEAD"].includes(method)) { + url = addQueryParameters(url, remainingParameters); + } else { + if ("data" in remainingParameters) { + body = remainingParameters.data; + } else { + if (Object.keys(remainingParameters).length) { + body = remainingParameters; + } else { + headers["content-length"] = 0; + } + } + } // default content-type for JSON if body is set + + + if (!headers["content-type"] && typeof body !== "undefined") { + headers["content-type"] = "application/json; charset=utf-8"; + } // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body. + // fetch does not allow to set `content-length` header, but we can set body to an empty string + + + if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { + body = ""; + } // Only return body/request keys if present + + + return Object.assign({ + method, + url, + headers + }, typeof body !== "undefined" ? { + body + } : null, options.request ? { + request: options.request + } : null); +} + +function endpointWithDefaults(defaults, route, options) { + return parse(merge(defaults, route, options)); +} + +function withDefaults(oldDefaults, newDefaults) { + const DEFAULTS = merge(oldDefaults, newDefaults); + const endpoint = endpointWithDefaults.bind(null, DEFAULTS); + return Object.assign(endpoint, { + DEFAULTS, + defaults: withDefaults.bind(null, DEFAULTS), + merge: merge.bind(null, DEFAULTS), + parse + }); +} + +const VERSION = "6.0.12"; + +const userAgent = `octokit-endpoint.js/${VERSION} ${universalUserAgent.getUserAgent()}`; // DEFAULTS has all properties set that EndpointOptions has, except url. +// So we use RequestParameters and add method as additional required property. + +const DEFAULTS = { + method: "GET", + baseUrl: "https://api.github.com", + headers: { + accept: "application/vnd.github.v3+json", + "user-agent": userAgent + }, + mediaType: { + format: "", + previews: [] + } +}; + +const endpoint = withDefaults(null, DEFAULTS); + +exports.endpoint = endpoint; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 6422: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +var request = __nccwpck_require__(9353); +var universalUserAgent = __nccwpck_require__(5030); + +const VERSION = "4.8.0"; + +function _buildMessageForResponseErrors(data) { + return `Request failed due to following response errors:\n` + data.errors.map(e => ` - ${e.message}`).join("\n"); +} + +class GraphqlResponseError extends Error { + constructor(request, headers, response) { + super(_buildMessageForResponseErrors(response)); + this.request = request; + this.headers = headers; + this.response = response; + this.name = "GraphqlResponseError"; // Expose the errors and response data in their shorthand properties. + + this.errors = response.errors; + this.data = response.data; // Maintains proper stack trace (only available on V8) + + /* istanbul ignore next */ + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + } + +} + +const NON_VARIABLE_OPTIONS = ["method", "baseUrl", "url", "headers", "request", "query", "mediaType"]; +const FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; +const GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; +function graphql(request, query, options) { + if (options) { + if (typeof query === "string" && "query" in options) { + return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`)); + } + + for (const key in options) { + if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue; + return Promise.reject(new Error(`[@octokit/graphql] "${key}" cannot be used as variable name`)); + } + } + + const parsedOptions = typeof query === "string" ? Object.assign({ + query + }, options) : query; + const requestOptions = Object.keys(parsedOptions).reduce((result, key) => { + if (NON_VARIABLE_OPTIONS.includes(key)) { + result[key] = parsedOptions[key]; + return result; + } + + if (!result.variables) { + result.variables = {}; + } + + result.variables[key] = parsedOptions[key]; + return result; + }, {}); // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix + // https://github.com/octokit/auth-app.js/issues/111#issuecomment-657610451 + + const baseUrl = parsedOptions.baseUrl || request.endpoint.DEFAULTS.baseUrl; + + if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { + requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); + } + + return request(requestOptions).then(response => { + if (response.data.errors) { + const headers = {}; + + for (const key of Object.keys(response.headers)) { + headers[key] = response.headers[key]; + } + + throw new GraphqlResponseError(requestOptions, headers, response.data); + } + + return response.data.data; + }); +} + +function withDefaults(request$1, newDefaults) { + const newRequest = request$1.defaults(newDefaults); + + const newApi = (query, options) => { + return graphql(newRequest, query, options); + }; + + return Object.assign(newApi, { + defaults: withDefaults.bind(null, newRequest), + endpoint: request.request.endpoint + }); +} + +const graphql$1 = withDefaults(request.request, { + headers: { + "user-agent": `octokit-graphql.js/${VERSION} ${universalUserAgent.getUserAgent()}` + }, + method: "POST", + url: "/graphql" +}); +function withCustomRequest(customRequest) { + return withDefaults(customRequest, { + method: "POST", + url: "/graphql" + }); +} + +exports.GraphqlResponseError = GraphqlResponseError; +exports.graphql = graphql$1; +exports.withCustomRequest = withCustomRequest; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 8945: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +const VERSION = "2.21.3"; + +function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + enumerableOnly && (symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + })), keys.push.apply(keys, symbols); + } + + return keys; +} + +function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = null != arguments[i] ? arguments[i] : {}; + i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { + _defineProperty(target, key, source[key]); + }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + + return target; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +/** + * Some “list” response that can be paginated have a different response structure + * + * They have a `total_count` key in the response (search also has `incomplete_results`, + * /installation/repositories also has `repository_selection`), as well as a key with + * the list of the items which name varies from endpoint to endpoint. + * + * Octokit normalizes these responses so that paginated results are always returned following + * the same structure. One challenge is that if the list response has only one page, no Link + * header is provided, so this header alone is not sufficient to check wether a response is + * paginated or not. + * + * We check if a "total_count" key is present in the response data, but also make sure that + * a "url" property is not, as the "Get the combined status for a specific ref" endpoint would + * otherwise match: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref + */ +function normalizePaginatedListResponse(response) { + // endpoints can respond with 204 if repository is empty + if (!response.data) { + return _objectSpread2(_objectSpread2({}, response), {}, { + data: [] + }); + } + + const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data); + if (!responseNeedsNormalization) return response; // keep the additional properties intact as there is currently no other way + // to retrieve the same information. + + const incompleteResults = response.data.incomplete_results; + const repositorySelection = response.data.repository_selection; + const totalCount = response.data.total_count; + delete response.data.incomplete_results; + delete response.data.repository_selection; + delete response.data.total_count; + const namespaceKey = Object.keys(response.data)[0]; + const data = response.data[namespaceKey]; + response.data = data; + + if (typeof incompleteResults !== "undefined") { + response.data.incomplete_results = incompleteResults; + } + + if (typeof repositorySelection !== "undefined") { + response.data.repository_selection = repositorySelection; + } + + response.data.total_count = totalCount; + return response; +} + +function iterator(octokit, route, parameters) { + const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters); + const requestMethod = typeof route === "function" ? route : octokit.request; + const method = options.method; + const headers = options.headers; + let url = options.url; + return { + [Symbol.asyncIterator]: () => ({ + async next() { + if (!url) return { + done: true + }; + + try { + const response = await requestMethod({ + method, + url, + headers + }); + const normalizedResponse = normalizePaginatedListResponse(response); // `response.headers.link` format: + // '; rel="next", ; rel="last"' + // sets `url` to undefined if "next" URL is not present or `link` header is not set + + url = ((normalizedResponse.headers.link || "").match(/<([^>]+)>;\s*rel="next"/) || [])[1]; + return { + value: normalizedResponse + }; + } catch (error) { + if (error.status !== 409) throw error; + url = ""; + return { + value: { + status: 200, + headers: {}, + data: [] + } + }; + } + } + + }) + }; +} + +function paginate(octokit, route, parameters, mapFn) { + if (typeof parameters === "function") { + mapFn = parameters; + parameters = undefined; + } + + return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn); +} + +function gather(octokit, results, iterator, mapFn) { + return iterator.next().then(result => { + if (result.done) { + return results; + } + + let earlyExit = false; + + function done() { + earlyExit = true; + } + + results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data); + + if (earlyExit) { + return results; + } + + return gather(octokit, results, iterator, mapFn); + }); +} + +const composePaginateRest = Object.assign(paginate, { + iterator +}); + +const paginatingEndpoints = ["GET /app/hook/deliveries", "GET /app/installations", "GET /applications/grants", "GET /authorizations", "GET /enterprises/{enterprise}/actions/permissions/organizations", "GET /enterprises/{enterprise}/actions/runner-groups", "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations", "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners", "GET /enterprises/{enterprise}/actions/runners", "GET /enterprises/{enterprise}/audit-log", "GET /enterprises/{enterprise}/secret-scanning/alerts", "GET /enterprises/{enterprise}/settings/billing/advanced-security", "GET /events", "GET /gists", "GET /gists/public", "GET /gists/starred", "GET /gists/{gist_id}/comments", "GET /gists/{gist_id}/commits", "GET /gists/{gist_id}/forks", "GET /installation/repositories", "GET /issues", "GET /licenses", "GET /marketplace_listing/plans", "GET /marketplace_listing/plans/{plan_id}/accounts", "GET /marketplace_listing/stubbed/plans", "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts", "GET /networks/{owner}/{repo}/events", "GET /notifications", "GET /organizations", "GET /orgs/{org}/actions/cache/usage-by-repository", "GET /orgs/{org}/actions/permissions/repositories", "GET /orgs/{org}/actions/runner-groups", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners", "GET /orgs/{org}/actions/runners", "GET /orgs/{org}/actions/secrets", "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", "GET /orgs/{org}/audit-log", "GET /orgs/{org}/blocks", "GET /orgs/{org}/code-scanning/alerts", "GET /orgs/{org}/codespaces", "GET /orgs/{org}/credential-authorizations", "GET /orgs/{org}/dependabot/secrets", "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", "GET /orgs/{org}/events", "GET /orgs/{org}/external-groups", "GET /orgs/{org}/failed_invitations", "GET /orgs/{org}/hooks", "GET /orgs/{org}/hooks/{hook_id}/deliveries", "GET /orgs/{org}/installations", "GET /orgs/{org}/invitations", "GET /orgs/{org}/invitations/{invitation_id}/teams", "GET /orgs/{org}/issues", "GET /orgs/{org}/members", "GET /orgs/{org}/migrations", "GET /orgs/{org}/migrations/{migration_id}/repositories", "GET /orgs/{org}/outside_collaborators", "GET /orgs/{org}/packages", "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", "GET /orgs/{org}/projects", "GET /orgs/{org}/public_members", "GET /orgs/{org}/repos", "GET /orgs/{org}/secret-scanning/alerts", "GET /orgs/{org}/settings/billing/advanced-security", "GET /orgs/{org}/team-sync/groups", "GET /orgs/{org}/teams", "GET /orgs/{org}/teams/{team_slug}/discussions", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", "GET /orgs/{org}/teams/{team_slug}/invitations", "GET /orgs/{org}/teams/{team_slug}/members", "GET /orgs/{org}/teams/{team_slug}/projects", "GET /orgs/{org}/teams/{team_slug}/repos", "GET /orgs/{org}/teams/{team_slug}/teams", "GET /projects/columns/{column_id}/cards", "GET /projects/{project_id}/collaborators", "GET /projects/{project_id}/columns", "GET /repos/{owner}/{repo}/actions/artifacts", "GET /repos/{owner}/{repo}/actions/caches", "GET /repos/{owner}/{repo}/actions/runners", "GET /repos/{owner}/{repo}/actions/runs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs", "GET /repos/{owner}/{repo}/actions/secrets", "GET /repos/{owner}/{repo}/actions/workflows", "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs", "GET /repos/{owner}/{repo}/assignees", "GET /repos/{owner}/{repo}/branches", "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", "GET /repos/{owner}/{repo}/code-scanning/alerts", "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", "GET /repos/{owner}/{repo}/code-scanning/analyses", "GET /repos/{owner}/{repo}/codespaces", "GET /repos/{owner}/{repo}/codespaces/devcontainers", "GET /repos/{owner}/{repo}/codespaces/secrets", "GET /repos/{owner}/{repo}/collaborators", "GET /repos/{owner}/{repo}/comments", "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/commits", "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments", "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", "GET /repos/{owner}/{repo}/commits/{ref}/check-runs", "GET /repos/{owner}/{repo}/commits/{ref}/check-suites", "GET /repos/{owner}/{repo}/commits/{ref}/status", "GET /repos/{owner}/{repo}/commits/{ref}/statuses", "GET /repos/{owner}/{repo}/contributors", "GET /repos/{owner}/{repo}/dependabot/secrets", "GET /repos/{owner}/{repo}/deployments", "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", "GET /repos/{owner}/{repo}/environments", "GET /repos/{owner}/{repo}/events", "GET /repos/{owner}/{repo}/forks", "GET /repos/{owner}/{repo}/git/matching-refs/{ref}", "GET /repos/{owner}/{repo}/hooks", "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries", "GET /repos/{owner}/{repo}/invitations", "GET /repos/{owner}/{repo}/issues", "GET /repos/{owner}/{repo}/issues/comments", "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/issues/events", "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", "GET /repos/{owner}/{repo}/issues/{issue_number}/events", "GET /repos/{owner}/{repo}/issues/{issue_number}/labels", "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", "GET /repos/{owner}/{repo}/keys", "GET /repos/{owner}/{repo}/labels", "GET /repos/{owner}/{repo}/milestones", "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels", "GET /repos/{owner}/{repo}/notifications", "GET /repos/{owner}/{repo}/pages/builds", "GET /repos/{owner}/{repo}/projects", "GET /repos/{owner}/{repo}/pulls", "GET /repos/{owner}/{repo}/pulls/comments", "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments", "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", "GET /repos/{owner}/{repo}/pulls/{pull_number}/files", "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers", "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews", "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments", "GET /repos/{owner}/{repo}/releases", "GET /repos/{owner}/{repo}/releases/{release_id}/assets", "GET /repos/{owner}/{repo}/releases/{release_id}/reactions", "GET /repos/{owner}/{repo}/secret-scanning/alerts", "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", "GET /repos/{owner}/{repo}/stargazers", "GET /repos/{owner}/{repo}/subscribers", "GET /repos/{owner}/{repo}/tags", "GET /repos/{owner}/{repo}/teams", "GET /repos/{owner}/{repo}/topics", "GET /repositories", "GET /repositories/{repository_id}/environments/{environment_name}/secrets", "GET /search/code", "GET /search/commits", "GET /search/issues", "GET /search/labels", "GET /search/repositories", "GET /search/topics", "GET /search/users", "GET /teams/{team_id}/discussions", "GET /teams/{team_id}/discussions/{discussion_number}/comments", "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions", "GET /teams/{team_id}/discussions/{discussion_number}/reactions", "GET /teams/{team_id}/invitations", "GET /teams/{team_id}/members", "GET /teams/{team_id}/projects", "GET /teams/{team_id}/repos", "GET /teams/{team_id}/teams", "GET /user/blocks", "GET /user/codespaces", "GET /user/codespaces/secrets", "GET /user/emails", "GET /user/followers", "GET /user/following", "GET /user/gpg_keys", "GET /user/installations", "GET /user/installations/{installation_id}/repositories", "GET /user/issues", "GET /user/keys", "GET /user/marketplace_purchases", "GET /user/marketplace_purchases/stubbed", "GET /user/memberships/orgs", "GET /user/migrations", "GET /user/migrations/{migration_id}/repositories", "GET /user/orgs", "GET /user/packages", "GET /user/packages/{package_type}/{package_name}/versions", "GET /user/public_emails", "GET /user/repos", "GET /user/repository_invitations", "GET /user/starred", "GET /user/subscriptions", "GET /user/teams", "GET /users", "GET /users/{username}/events", "GET /users/{username}/events/orgs/{org}", "GET /users/{username}/events/public", "GET /users/{username}/followers", "GET /users/{username}/following", "GET /users/{username}/gists", "GET /users/{username}/gpg_keys", "GET /users/{username}/keys", "GET /users/{username}/orgs", "GET /users/{username}/packages", "GET /users/{username}/projects", "GET /users/{username}/received_events", "GET /users/{username}/received_events/public", "GET /users/{username}/repos", "GET /users/{username}/starred", "GET /users/{username}/subscriptions"]; + +function isPaginatingEndpoint(arg) { + if (typeof arg === "string") { + return paginatingEndpoints.includes(arg); + } else { + return false; + } +} + +/** + * @param octokit Octokit instance + * @param options Options passed to Octokit constructor + */ + +function paginateRest(octokit) { + return { + paginate: Object.assign(paginate.bind(null, octokit), { + iterator: iterator.bind(null, octokit) + }) + }; +} +paginateRest.VERSION = VERSION; + +exports.composePaginateRest = composePaginateRest; +exports.isPaginatingEndpoint = isPaginatingEndpoint; +exports.paginateRest = paginateRest; +exports.paginatingEndpoints = paginatingEndpoints; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 7471: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var deprecation = __nccwpck_require__(8932); +var once = _interopDefault(__nccwpck_require__(1223)); + +const logOnceCode = once(deprecation => console.warn(deprecation)); +const logOnceHeaders = once(deprecation => console.warn(deprecation)); +/** + * Error with extra properties to help with debugging + */ + +class RequestError extends Error { + constructor(message, statusCode, options) { + super(message); // Maintains proper stack trace (only available on V8) + + /* istanbul ignore next */ + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = "HttpError"; + this.status = statusCode; + let headers; + + if ("headers" in options && typeof options.headers !== "undefined") { + headers = options.headers; + } + + if ("response" in options) { + this.response = options.response; + headers = options.response.headers; + } // redact request credentials without mutating original request options + + + const requestCopy = Object.assign({}, options.request); + + if (options.request.headers.authorization) { + requestCopy.headers = Object.assign({}, options.request.headers, { + authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]") + }); + } + + requestCopy.url = requestCopy.url // client_id & client_secret can be passed as URL query parameters to increase rate limit + // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications + .replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]") // OAuth tokens can be passed as URL query parameters, although it is not recommended + // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header + .replace(/\baccess_token=\w+/g, "access_token=[REDACTED]"); + this.request = requestCopy; // deprecations + + Object.defineProperty(this, "code", { + get() { + logOnceCode(new deprecation.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`.")); + return statusCode; + } + + }); + Object.defineProperty(this, "headers", { + get() { + logOnceHeaders(new deprecation.Deprecation("[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`.")); + return headers || {}; + } + + }); + } + +} + +exports.RequestError = RequestError; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 9353: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var endpoint = __nccwpck_require__(8713); +var universalUserAgent = __nccwpck_require__(5030); +var isPlainObject = __nccwpck_require__(3287); +var nodeFetch = _interopDefault(__nccwpck_require__(467)); +var requestError = __nccwpck_require__(7471); + +const VERSION = "5.6.3"; + +function getBufferResponse(response) { + return response.arrayBuffer(); +} + +function fetchWrapper(requestOptions) { + const log = requestOptions.request && requestOptions.request.log ? requestOptions.request.log : console; + + if (isPlainObject.isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) { + requestOptions.body = JSON.stringify(requestOptions.body); + } + + let headers = {}; + let status; + let url; + const fetch = requestOptions.request && requestOptions.request.fetch || nodeFetch; + return fetch(requestOptions.url, Object.assign({ + method: requestOptions.method, + body: requestOptions.body, + headers: requestOptions.headers, + redirect: requestOptions.redirect + }, // `requestOptions.request.agent` type is incompatible + // see https://github.com/octokit/types.ts/pull/264 + requestOptions.request)).then(async response => { + url = response.url; + status = response.status; + + for (const keyAndValue of response.headers) { + headers[keyAndValue[0]] = keyAndValue[1]; + } + + if ("deprecation" in headers) { + const matches = headers.link && headers.link.match(/<([^>]+)>; rel="deprecation"/); + const deprecationLink = matches && matches.pop(); + log.warn(`[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`); + } + + if (status === 204 || status === 205) { + return; + } // GitHub API returns 200 for HEAD requests + + + if (requestOptions.method === "HEAD") { + if (status < 400) { + return; + } + + throw new requestError.RequestError(response.statusText, status, { + response: { + url, + status, + headers, + data: undefined + }, + request: requestOptions + }); + } + + if (status === 304) { + throw new requestError.RequestError("Not modified", status, { + response: { + url, + status, + headers, + data: await getResponseData(response) + }, + request: requestOptions + }); + } + + if (status >= 400) { + const data = await getResponseData(response); + const error = new requestError.RequestError(toErrorMessage(data), status, { + response: { + url, + status, + headers, + data + }, + request: requestOptions + }); + throw error; + } + + return getResponseData(response); + }).then(data => { + return { + status, + url, + headers, + data + }; + }).catch(error => { + if (error instanceof requestError.RequestError) throw error; + throw new requestError.RequestError(error.message, 500, { + request: requestOptions + }); + }); +} + +async function getResponseData(response) { + const contentType = response.headers.get("content-type"); + + if (/application\/json/.test(contentType)) { + return response.json(); + } + + if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { + return response.text(); + } + + return getBufferResponse(response); +} + +function toErrorMessage(data) { + if (typeof data === "string") return data; // istanbul ignore else - just in case + + if ("message" in data) { + if (Array.isArray(data.errors)) { + return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`; + } + + return data.message; + } // istanbul ignore next - just in case + + + return `Unknown error: ${JSON.stringify(data)}`; +} + +function withDefaults(oldEndpoint, newDefaults) { + const endpoint = oldEndpoint.defaults(newDefaults); + + const newApi = function (route, parameters) { + const endpointOptions = endpoint.merge(route, parameters); + + if (!endpointOptions.request || !endpointOptions.request.hook) { + return fetchWrapper(endpoint.parse(endpointOptions)); + } + + const request = (route, parameters) => { + return fetchWrapper(endpoint.parse(endpoint.merge(route, parameters))); + }; + + Object.assign(request, { + endpoint, + defaults: withDefaults.bind(null, endpoint) + }); + return endpointOptions.request.hook(request, endpointOptions); + }; + + return Object.assign(newApi, { + endpoint, + defaults: withDefaults.bind(null, endpoint) + }); +} + +const request = withDefaults(endpoint.endpoint, { + headers: { + "user-agent": `octokit-request.js/${VERSION} ${universalUserAgent.getUserAgent()}` + } +}); + +exports.request = request; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 6255: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +/* eslint-disable @typescript-eslint/no-explicit-any */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0; +const http = __importStar(__nccwpck_require__(3685)); +const https = __importStar(__nccwpck_require__(5687)); +const pm = __importStar(__nccwpck_require__(9835)); +const tunnel = __importStar(__nccwpck_require__(4294)); +var HttpCodes; +(function (HttpCodes) { + HttpCodes[HttpCodes["OK"] = 200] = "OK"; + HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; + HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; + HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; + HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; + HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; + HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; + HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; + HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; + HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; + HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; + HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; + HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; + HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; + HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; + HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; + HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; + HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; + HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; + HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; + HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; + HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; + HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; + HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; + HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; + HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; + HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; +})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); +var Headers; +(function (Headers) { + Headers["Accept"] = "accept"; + Headers["ContentType"] = "content-type"; +})(Headers = exports.Headers || (exports.Headers = {})); +var MediaTypes; +(function (MediaTypes) { + MediaTypes["ApplicationJson"] = "application/json"; +})(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {})); +/** + * Returns the proxy URL, depending upon the supplied url and proxy environment variables. + * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com + */ +function getProxyUrl(serverUrl) { + const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); + return proxyUrl ? proxyUrl.href : ''; +} +exports.getProxyUrl = getProxyUrl; +const HttpRedirectCodes = [ + HttpCodes.MovedPermanently, + HttpCodes.ResourceMoved, + HttpCodes.SeeOther, + HttpCodes.TemporaryRedirect, + HttpCodes.PermanentRedirect +]; +const HttpResponseRetryCodes = [ + HttpCodes.BadGateway, + HttpCodes.ServiceUnavailable, + HttpCodes.GatewayTimeout +]; +const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; +const ExponentialBackoffCeiling = 10; +const ExponentialBackoffTimeSlice = 5; +class HttpClientError extends Error { + constructor(message, statusCode) { + super(message); + this.name = 'HttpClientError'; + this.statusCode = statusCode; + Object.setPrototypeOf(this, HttpClientError.prototype); + } +} +exports.HttpClientError = HttpClientError; +class HttpClientResponse { + constructor(message) { + this.message = message; + } + readBody() { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { + let output = Buffer.alloc(0); + this.message.on('data', (chunk) => { + output = Buffer.concat([output, chunk]); + }); + this.message.on('end', () => { + resolve(output.toString()); + }); + })); + }); + } +} +exports.HttpClientResponse = HttpClientResponse; +function isHttps(requestUrl) { + const parsedUrl = new URL(requestUrl); + return parsedUrl.protocol === 'https:'; +} +exports.isHttps = isHttps; +class HttpClient { + constructor(userAgent, handlers, requestOptions) { + this._ignoreSslError = false; + this._allowRedirects = true; + this._allowRedirectDowngrade = false; + this._maxRedirects = 50; + this._allowRetries = false; + this._maxRetries = 1; + this._keepAlive = false; + this._disposed = false; + this.userAgent = userAgent; + this.handlers = handlers || []; + this.requestOptions = requestOptions; + if (requestOptions) { + if (requestOptions.ignoreSslError != null) { + this._ignoreSslError = requestOptions.ignoreSslError; + } + this._socketTimeout = requestOptions.socketTimeout; + if (requestOptions.allowRedirects != null) { + this._allowRedirects = requestOptions.allowRedirects; + } + if (requestOptions.allowRedirectDowngrade != null) { + this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; + } + if (requestOptions.maxRedirects != null) { + this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); + } + if (requestOptions.keepAlive != null) { + this._keepAlive = requestOptions.keepAlive; + } + if (requestOptions.allowRetries != null) { + this._allowRetries = requestOptions.allowRetries; + } + if (requestOptions.maxRetries != null) { + this._maxRetries = requestOptions.maxRetries; + } + } + } + options(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); + }); + } + get(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('GET', requestUrl, null, additionalHeaders || {}); + }); + } + del(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('DELETE', requestUrl, null, additionalHeaders || {}); + }); + } + post(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('POST', requestUrl, data, additionalHeaders || {}); + }); + } + patch(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('PATCH', requestUrl, data, additionalHeaders || {}); + }); + } + put(requestUrl, data, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('PUT', requestUrl, data, additionalHeaders || {}); + }); + } + head(requestUrl, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request('HEAD', requestUrl, null, additionalHeaders || {}); + }); + } + sendStream(verb, requestUrl, stream, additionalHeaders) { + return __awaiter(this, void 0, void 0, function* () { + return this.request(verb, requestUrl, stream, additionalHeaders); + }); + } + /** + * Gets a typed object from an endpoint + * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise + */ + getJson(requestUrl, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + const res = yield this.get(requestUrl, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + postJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.post(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + putJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.put(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + patchJson(requestUrl, obj, additionalHeaders = {}) { + return __awaiter(this, void 0, void 0, function* () { + const data = JSON.stringify(obj, null, 2); + additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); + additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); + const res = yield this.patch(requestUrl, data, additionalHeaders); + return this._processResponse(res, this.requestOptions); + }); + } + /** + * Makes a raw http request. + * All other methods such as get, post, patch, and request ultimately call this. + * Prefer get, del, post and patch + */ + request(verb, requestUrl, data, headers) { + return __awaiter(this, void 0, void 0, function* () { + if (this._disposed) { + throw new Error('Client has already been disposed.'); + } + const parsedUrl = new URL(requestUrl); + let info = this._prepareRequest(verb, parsedUrl, headers); + // Only perform retries on reads since writes may not be idempotent. + const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) + ? this._maxRetries + 1 + : 1; + let numTries = 0; + let response; + do { + response = yield this.requestRaw(info, data); + // Check if it's an authentication challenge + if (response && + response.message && + response.message.statusCode === HttpCodes.Unauthorized) { + let authenticationHandler; + for (const handler of this.handlers) { + if (handler.canHandleAuthentication(response)) { + authenticationHandler = handler; + break; + } + } + if (authenticationHandler) { + return authenticationHandler.handleAuthentication(this, info, data); + } + else { + // We have received an unauthorized response but have no handlers to handle it. + // Let the response return to the caller. + return response; + } + } + let redirectsRemaining = this._maxRedirects; + while (response.message.statusCode && + HttpRedirectCodes.includes(response.message.statusCode) && + this._allowRedirects && + redirectsRemaining > 0) { + const redirectUrl = response.message.headers['location']; + if (!redirectUrl) { + // if there's no location to redirect to, we won't + break; + } + const parsedRedirectUrl = new URL(redirectUrl); + if (parsedUrl.protocol === 'https:' && + parsedUrl.protocol !== parsedRedirectUrl.protocol && + !this._allowRedirectDowngrade) { + throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); + } + // we need to finish reading the response before reassigning response + // which will leak the open socket. + yield response.readBody(); + // strip authorization header if redirected to a different hostname + if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { + for (const header in headers) { + // header names are case insensitive + if (header.toLowerCase() === 'authorization') { + delete headers[header]; + } + } + } + // let's make the request with the new redirectUrl + info = this._prepareRequest(verb, parsedRedirectUrl, headers); + response = yield this.requestRaw(info, data); + redirectsRemaining--; + } + if (!response.message.statusCode || + !HttpResponseRetryCodes.includes(response.message.statusCode)) { + // If not a retry code, return immediately instead of retrying + return response; + } + numTries += 1; + if (numTries < maxTries) { + yield response.readBody(); + yield this._performExponentialBackoff(numTries); + } + } while (numTries < maxTries); + return response; + }); + } + /** + * Needs to be called if keepAlive is set to true in request options. + */ + dispose() { + if (this._agent) { + this._agent.destroy(); + } + this._disposed = true; + } + /** + * Raw request. + * @param info + * @param data + */ + requestRaw(info, data) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => { + function callbackForResult(err, res) { + if (err) { + reject(err); + } + else if (!res) { + // If `err` is not passed, then `res` must be passed. + reject(new Error('Unknown error')); + } + else { + resolve(res); + } + } + this.requestRawWithCallback(info, data, callbackForResult); + }); + }); + } + /** + * Raw request with callback. + * @param info + * @param data + * @param onResult + */ + requestRawWithCallback(info, data, onResult) { + if (typeof data === 'string') { + if (!info.options.headers) { + info.options.headers = {}; + } + info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); + } + let callbackCalled = false; + function handleResult(err, res) { + if (!callbackCalled) { + callbackCalled = true; + onResult(err, res); + } + } + const req = info.httpModule.request(info.options, (msg) => { + const res = new HttpClientResponse(msg); + handleResult(undefined, res); + }); + let socket; + req.on('socket', sock => { + socket = sock; + }); + // If we ever get disconnected, we want the socket to timeout eventually + req.setTimeout(this._socketTimeout || 3 * 60000, () => { + if (socket) { + socket.end(); + } + handleResult(new Error(`Request timeout: ${info.options.path}`)); + }); + req.on('error', function (err) { + // err has statusCode property + // res should have headers + handleResult(err); + }); + if (data && typeof data === 'string') { + req.write(data, 'utf8'); + } + if (data && typeof data !== 'string') { + data.on('close', function () { + req.end(); + }); + data.pipe(req); + } + else { + req.end(); + } + } + /** + * Gets an http agent. This function is useful when you need an http agent that handles + * routing through a proxy server - depending upon the url and proxy environment variables. + * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com + */ + getAgent(serverUrl) { + const parsedUrl = new URL(serverUrl); + return this._getAgent(parsedUrl); + } + _prepareRequest(method, requestUrl, headers) { + const info = {}; + info.parsedUrl = requestUrl; + const usingSsl = info.parsedUrl.protocol === 'https:'; + info.httpModule = usingSsl ? https : http; + const defaultPort = usingSsl ? 443 : 80; + info.options = {}; + info.options.host = info.parsedUrl.hostname; + info.options.port = info.parsedUrl.port + ? parseInt(info.parsedUrl.port) + : defaultPort; + info.options.path = + (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); + info.options.method = method; + info.options.headers = this._mergeHeaders(headers); + if (this.userAgent != null) { + info.options.headers['user-agent'] = this.userAgent; + } + info.options.agent = this._getAgent(info.parsedUrl); + // gives handlers an opportunity to participate + if (this.handlers) { + for (const handler of this.handlers) { + handler.prepareRequest(info.options); + } + } + return info; + } + _mergeHeaders(headers) { + if (this.requestOptions && this.requestOptions.headers) { + return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); + } + return lowercaseKeys(headers || {}); + } + _getExistingOrDefaultHeader(additionalHeaders, header, _default) { + let clientHeader; + if (this.requestOptions && this.requestOptions.headers) { + clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; + } + return additionalHeaders[header] || clientHeader || _default; + } + _getAgent(parsedUrl) { + let agent; + const proxyUrl = pm.getProxyUrl(parsedUrl); + const useProxy = proxyUrl && proxyUrl.hostname; + if (this._keepAlive && useProxy) { + agent = this._proxyAgent; + } + if (this._keepAlive && !useProxy) { + agent = this._agent; + } + // if agent is already assigned use that agent. + if (agent) { + return agent; + } + const usingSsl = parsedUrl.protocol === 'https:'; + let maxSockets = 100; + if (this.requestOptions) { + maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; + } + // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis. + if (proxyUrl && proxyUrl.hostname) { + const agentOptions = { + maxSockets, + keepAlive: this._keepAlive, + proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && { + proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` + })), { host: proxyUrl.hostname, port: proxyUrl.port }) + }; + let tunnelAgent; + const overHttps = proxyUrl.protocol === 'https:'; + if (usingSsl) { + tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; + } + else { + tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; + } + agent = tunnelAgent(agentOptions); + this._proxyAgent = agent; + } + // if reusing agent across request and tunneling agent isn't assigned create a new agent + if (this._keepAlive && !agent) { + const options = { keepAlive: this._keepAlive, maxSockets }; + agent = usingSsl ? new https.Agent(options) : new http.Agent(options); + this._agent = agent; + } + // if not using private agent and tunnel agent isn't setup then use global agent + if (!agent) { + agent = usingSsl ? https.globalAgent : http.globalAgent; + } + if (usingSsl && this._ignoreSslError) { + // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process + // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options + // we have to cast it to any and change it directly + agent.options = Object.assign(agent.options || {}, { + rejectUnauthorized: false + }); + } + return agent; + } + _performExponentialBackoff(retryNumber) { + return __awaiter(this, void 0, void 0, function* () { + retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); + const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); + return new Promise(resolve => setTimeout(() => resolve(), ms)); + }); + } + _processResponse(res, options) { + return __awaiter(this, void 0, void 0, function* () { + return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { + const statusCode = res.message.statusCode || 0; + const response = { + statusCode, + result: null, + headers: {} + }; + // not found leads to null obj returned + if (statusCode === HttpCodes.NotFound) { + resolve(response); + } + // get the result from the body + function dateTimeDeserializer(key, value) { + if (typeof value === 'string') { + const a = new Date(value); + if (!isNaN(a.valueOf())) { + return a; + } + } + return value; + } + let obj; + let contents; + try { + contents = yield res.readBody(); + if (contents && contents.length > 0) { + if (options && options.deserializeDates) { + obj = JSON.parse(contents, dateTimeDeserializer); + } + else { + obj = JSON.parse(contents); + } + response.result = obj; + } + response.headers = res.message.headers; + } + catch (err) { + // Invalid resource (contents not json); leaving result obj null + } + // note that 3xx redirects are handled by the http layer. + if (statusCode > 299) { + let msg; + // if exception/error in body, attempt to get better error + if (obj && obj.message) { + msg = obj.message; + } + else if (contents && contents.length > 0) { + // it may be the case that the exception is in the body message as string + msg = contents; + } + else { + msg = `Failed request: (${statusCode})`; + } + const err = new HttpClientError(msg, statusCode); + err.result = response.result; + reject(err); + } + else { + resolve(response); + } + })); + }); + } +} +exports.HttpClient = HttpClient; +const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ 9835: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkBypass = exports.getProxyUrl = void 0; +function getProxyUrl(reqUrl) { + const usingSsl = reqUrl.protocol === 'https:'; + if (checkBypass(reqUrl)) { + return undefined; + } + const proxyVar = (() => { + if (usingSsl) { + return process.env['https_proxy'] || process.env['HTTPS_PROXY']; + } + else { + return process.env['http_proxy'] || process.env['HTTP_PROXY']; + } + })(); + if (proxyVar) { + return new URL(proxyVar); + } + else { + return undefined; + } +} +exports.getProxyUrl = getProxyUrl; +function checkBypass(reqUrl) { + if (!reqUrl.hostname) { + return false; + } + const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; + if (!noProxy) { + return false; + } + // Determine the request port + let reqPort; + if (reqUrl.port) { + reqPort = Number(reqUrl.port); + } + else if (reqUrl.protocol === 'http:') { + reqPort = 80; + } + else if (reqUrl.protocol === 'https:') { + reqPort = 443; + } + // Format the request hostname and hostname with port + const upperReqHosts = [reqUrl.hostname.toUpperCase()]; + if (typeof reqPort === 'number') { + upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); + } + // Compare request host against noproxy + for (const upperNoProxyItem of noProxy + .split(',') + .map(x => x.trim().toUpperCase()) + .filter(x => x)) { + if (upperReqHosts.some(x => x === upperNoProxyItem)) { + return true; + } + } + return false; +} +exports.checkBypass = checkBypass; +//# sourceMappingURL=proxy.js.map + +/***/ }), + +/***/ 3044: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function ownKeys(object, enumerableOnly) { + var keys = Object.keys(object); + + if (Object.getOwnPropertySymbols) { + var symbols = Object.getOwnPropertySymbols(object); + + if (enumerableOnly) { + symbols = symbols.filter(function (sym) { + return Object.getOwnPropertyDescriptor(object, sym).enumerable; + }); + } + + keys.push.apply(keys, symbols); + } + + return keys; +} + +function _objectSpread2(target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i] != null ? arguments[i] : {}; + + if (i % 2) { + ownKeys(Object(source), true).forEach(function (key) { + _defineProperty(target, key, source[key]); + }); + } else if (Object.getOwnPropertyDescriptors) { + Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); + } else { + ownKeys(Object(source)).forEach(function (key) { + Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); + }); + } + } + + return target; +} + +function _defineProperty(obj, key, value) { + if (key in obj) { + Object.defineProperty(obj, key, { + value: value, + enumerable: true, + configurable: true, + writable: true + }); + } else { + obj[key] = value; + } + + return obj; +} + +const Endpoints = { + actions: { + addCustomLabelsToSelfHostedRunnerForOrg: ["POST /orgs/{org}/actions/runners/{runner_id}/labels"], + addCustomLabelsToSelfHostedRunnerForRepo: ["POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], + approveWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"], + cancelWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"], + createOrUpdateEnvironmentSecret: ["PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + createRegistrationTokenForOrg: ["POST /orgs/{org}/actions/runners/registration-token"], + createRegistrationTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/registration-token"], + createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"], + createRemoveTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/remove-token"], + createWorkflowDispatch: ["POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"], + deleteActionsCacheById: ["DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"], + deleteActionsCacheByKey: ["DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"], + deleteArtifact: ["DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + deleteEnvironmentSecret: ["DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + deleteSelfHostedRunnerFromOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}"], + deleteSelfHostedRunnerFromRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"], + deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"], + deleteWorkflowRunLogs: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], + disableSelectedRepositoryGithubActionsOrganization: ["DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}"], + disableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"], + downloadArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"], + downloadJobLogsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"], + downloadWorkflowRunAttemptLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs"], + downloadWorkflowRunLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], + enableSelectedRepositoryGithubActionsOrganization: ["PUT /orgs/{org}/actions/permissions/repositories/{repository_id}"], + enableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"], + getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"], + getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"], + getActionsCacheUsageByRepoForOrg: ["GET /orgs/{org}/actions/cache/usage-by-repository"], + getActionsCacheUsageForEnterprise: ["GET /enterprises/{enterprise}/actions/cache/usage"], + getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"], + getAllowedActionsOrganization: ["GET /orgs/{org}/actions/permissions/selected-actions"], + getAllowedActionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/selected-actions"], + getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], + getEnvironmentPublicKey: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key"], + getEnvironmentSecret: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], + getGithubActionsDefaultWorkflowPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/workflow"], + getGithubActionsDefaultWorkflowPermissionsOrganization: ["GET /orgs/{org}/actions/permissions/workflow"], + getGithubActionsDefaultWorkflowPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/workflow"], + getGithubActionsPermissionsOrganization: ["GET /orgs/{org}/actions/permissions"], + getGithubActionsPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions"], + getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], + getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], + getPendingDeploymentsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"], + getRepoPermissions: ["GET /repos/{owner}/{repo}/actions/permissions", {}, { + renamed: ["actions", "getGithubActionsPermissionsRepository"] + }], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"], + getReviewsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"], + getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"], + getSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}"], + getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"], + getWorkflowAccessToRepository: ["GET /repos/{owner}/{repo}/actions/permissions/access"], + getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"], + getWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"], + getWorkflowRunUsage: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"], + getWorkflowUsage: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"], + listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"], + listEnvironmentSecrets: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets"], + listJobsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"], + listJobsForWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"], + listLabelsForSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}/labels"], + listLabelsForSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + listOrgSecrets: ["GET /orgs/{org}/actions/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"], + listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"], + listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"], + listRunnerApplicationsForRepo: ["GET /repos/{owner}/{repo}/actions/runners/downloads"], + listSelectedReposForOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}/repositories"], + listSelectedRepositoriesEnabledGithubActionsOrganization: ["GET /orgs/{org}/actions/permissions/repositories"], + listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"], + listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"], + listWorkflowRunArtifacts: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"], + listWorkflowRuns: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"], + listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"], + reRunJobForWorkflowRun: ["POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"], + reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"], + reRunWorkflowFailedJobs: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"], + removeAllCustomLabelsFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels"], + removeAllCustomLabelsFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + removeCustomLabelFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"], + removeCustomLabelFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"], + removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], + reviewPendingDeploymentsForRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"], + setAllowedActionsOrganization: ["PUT /orgs/{org}/actions/permissions/selected-actions"], + setAllowedActionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"], + setCustomLabelsForSelfHostedRunnerForOrg: ["PUT /orgs/{org}/actions/runners/{runner_id}/labels"], + setCustomLabelsForSelfHostedRunnerForRepo: ["PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], + setGithubActionsDefaultWorkflowPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/workflow"], + setGithubActionsDefaultWorkflowPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions/workflow"], + setGithubActionsDefaultWorkflowPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/workflow"], + setGithubActionsPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions"], + setGithubActionsPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions"], + setSelectedReposForOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"], + setSelectedRepositoriesEnabledGithubActionsOrganization: ["PUT /orgs/{org}/actions/permissions/repositories"], + setWorkflowAccessToRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/access"] + }, + activity: { + checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"], + deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"], + deleteThreadSubscription: ["DELETE /notifications/threads/{thread_id}/subscription"], + getFeeds: ["GET /feeds"], + getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"], + getThread: ["GET /notifications/threads/{thread_id}"], + getThreadSubscriptionForAuthenticatedUser: ["GET /notifications/threads/{thread_id}/subscription"], + listEventsForAuthenticatedUser: ["GET /users/{username}/events"], + listNotificationsForAuthenticatedUser: ["GET /notifications"], + listOrgEventsForAuthenticatedUser: ["GET /users/{username}/events/orgs/{org}"], + listPublicEvents: ["GET /events"], + listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"], + listPublicEventsForUser: ["GET /users/{username}/events/public"], + listPublicOrgEvents: ["GET /orgs/{org}/events"], + listReceivedEventsForUser: ["GET /users/{username}/received_events"], + listReceivedPublicEventsForUser: ["GET /users/{username}/received_events/public"], + listRepoEvents: ["GET /repos/{owner}/{repo}/events"], + listRepoNotificationsForAuthenticatedUser: ["GET /repos/{owner}/{repo}/notifications"], + listReposStarredByAuthenticatedUser: ["GET /user/starred"], + listReposStarredByUser: ["GET /users/{username}/starred"], + listReposWatchedByUser: ["GET /users/{username}/subscriptions"], + listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"], + listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"], + listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], + markNotificationsAsRead: ["PUT /notifications"], + markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], + markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], + setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], + setThreadSubscription: ["PUT /notifications/threads/{thread_id}/subscription"], + starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"], + unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"] + }, + apps: { + addRepoToInstallation: ["PUT /user/installations/{installation_id}/repositories/{repository_id}", {}, { + renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] + }], + addRepoToInstallationForAuthenticatedUser: ["PUT /user/installations/{installation_id}/repositories/{repository_id}"], + checkToken: ["POST /applications/{client_id}/token"], + createFromManifest: ["POST /app-manifests/{code}/conversions"], + createInstallationAccessToken: ["POST /app/installations/{installation_id}/access_tokens"], + deleteAuthorization: ["DELETE /applications/{client_id}/grant"], + deleteInstallation: ["DELETE /app/installations/{installation_id}"], + deleteToken: ["DELETE /applications/{client_id}/token"], + getAuthenticated: ["GET /app"], + getBySlug: ["GET /apps/{app_slug}"], + getInstallation: ["GET /app/installations/{installation_id}"], + getOrgInstallation: ["GET /orgs/{org}/installation"], + getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"], + getSubscriptionPlanForAccount: ["GET /marketplace_listing/accounts/{account_id}"], + getSubscriptionPlanForAccountStubbed: ["GET /marketplace_listing/stubbed/accounts/{account_id}"], + getUserInstallation: ["GET /users/{username}/installation"], + getWebhookConfigForApp: ["GET /app/hook/config"], + getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"], + listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"], + listAccountsForPlanStubbed: ["GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"], + listInstallationReposForAuthenticatedUser: ["GET /user/installations/{installation_id}/repositories"], + listInstallations: ["GET /app/installations"], + listInstallationsForAuthenticatedUser: ["GET /user/installations"], + listPlans: ["GET /marketplace_listing/plans"], + listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"], + listReposAccessibleToInstallation: ["GET /installation/repositories"], + listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"], + listSubscriptionsForAuthenticatedUserStubbed: ["GET /user/marketplace_purchases/stubbed"], + listWebhookDeliveries: ["GET /app/hook/deliveries"], + redeliverWebhookDelivery: ["POST /app/hook/deliveries/{delivery_id}/attempts"], + removeRepoFromInstallation: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}", {}, { + renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] + }], + removeRepoFromInstallationForAuthenticatedUser: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}"], + resetToken: ["PATCH /applications/{client_id}/token"], + revokeInstallationAccessToken: ["DELETE /installation/token"], + scopeToken: ["POST /applications/{client_id}/token/scoped"], + suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"], + unsuspendInstallation: ["DELETE /app/installations/{installation_id}/suspended"], + updateWebhookConfigForApp: ["PATCH /app/hook/config"] + }, + billing: { + getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"], + getGithubActionsBillingUser: ["GET /users/{username}/settings/billing/actions"], + getGithubAdvancedSecurityBillingGhe: ["GET /enterprises/{enterprise}/settings/billing/advanced-security"], + getGithubAdvancedSecurityBillingOrg: ["GET /orgs/{org}/settings/billing/advanced-security"], + getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], + getGithubPackagesBillingUser: ["GET /users/{username}/settings/billing/packages"], + getSharedStorageBillingOrg: ["GET /orgs/{org}/settings/billing/shared-storage"], + getSharedStorageBillingUser: ["GET /users/{username}/settings/billing/shared-storage"] + }, + checks: { + create: ["POST /repos/{owner}/{repo}/check-runs"], + createSuite: ["POST /repos/{owner}/{repo}/check-suites"], + get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"], + getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"], + listAnnotations: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"], + listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"], + listForSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"], + listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"], + rerequestRun: ["POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"], + rerequestSuite: ["POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"], + setSuitesPreferences: ["PATCH /repos/{owner}/{repo}/check-suites/preferences"], + update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"] + }, + codeScanning: { + deleteAnalysis: ["DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}"], + getAlert: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", {}, { + renamedParameters: { + alert_id: "alert_number" + } + }], + getAnalysis: ["GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"], + getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"], + listAlertInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"], + listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"], + listAlertsInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", {}, { + renamed: ["codeScanning", "listAlertInstances"] + }], + listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"], + updateAlert: ["PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"], + uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] + }, + codesOfConduct: { + getAllCodesOfConduct: ["GET /codes_of_conduct"], + getConductCode: ["GET /codes_of_conduct/{key}"] + }, + codespaces: { + addRepositoryForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"], + codespaceMachinesForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/machines"], + createForAuthenticatedUser: ["POST /user/codespaces"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + createOrUpdateSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}"], + createWithPrForAuthenticatedUser: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"], + createWithRepoForAuthenticatedUser: ["POST /repos/{owner}/{repo}/codespaces"], + deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"], + deleteFromOrganization: ["DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + deleteSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}"], + exportForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/exports"], + getExportDetailsForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/exports/{export_id}"], + getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"], + getPublicKeyForAuthenticatedUser: ["GET /user/codespaces/secrets/public-key"], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/codespaces/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], + getSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}"], + listDevcontainersInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/devcontainers"], + listForAuthenticatedUser: ["GET /user/codespaces"], + listInOrganization: ["GET /orgs/{org}/codespaces", {}, { + renamedParameters: { + org_id: "org" + } + }], + listInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"], + listRepositoriesForSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}/repositories"], + listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"], + removeRepositoryForSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"], + repoMachinesForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/machines"], + setRepositoriesForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories"], + startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"], + stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"], + stopInOrganization: ["POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"], + updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"] + }, + dependabot: { + addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"], + createOrUpdateOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}"], + createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"], + deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"], + getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"], + getRepoPublicKey: ["GET /repos/{owner}/{repo}/dependabot/secrets/public-key"], + getRepoSecret: ["GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], + listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"], + listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"], + listSelectedReposForOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"], + removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"], + setSelectedReposForOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"] + }, + dependencyGraph: { + createRepositorySnapshot: ["POST /repos/{owner}/{repo}/dependency-graph/snapshots"], + diffRange: ["GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"] + }, + emojis: { + get: ["GET /emojis"] + }, + enterpriseAdmin: { + addCustomLabelsToSelfHostedRunnerForEnterprise: ["POST /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + disableSelectedOrganizationGithubActionsEnterprise: ["DELETE /enterprises/{enterprise}/actions/permissions/organizations/{org_id}"], + enableSelectedOrganizationGithubActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/organizations/{org_id}"], + getAllowedActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/selected-actions"], + getGithubActionsPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions"], + getServerStatistics: ["GET /enterprise-installation/{enterprise_or_org}/server-statistics"], + listLabelsForSelfHostedRunnerForEnterprise: ["GET /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + listSelectedOrganizationsEnabledGithubActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/organizations"], + removeAllCustomLabelsFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + removeCustomLabelFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels/{name}"], + setAllowedActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/selected-actions"], + setCustomLabelsForSelfHostedRunnerForEnterprise: ["PUT /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], + setGithubActionsPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions"], + setSelectedOrganizationsEnabledGithubActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/organizations"] + }, + gists: { + checkIsStarred: ["GET /gists/{gist_id}/star"], + create: ["POST /gists"], + createComment: ["POST /gists/{gist_id}/comments"], + delete: ["DELETE /gists/{gist_id}"], + deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"], + fork: ["POST /gists/{gist_id}/forks"], + get: ["GET /gists/{gist_id}"], + getComment: ["GET /gists/{gist_id}/comments/{comment_id}"], + getRevision: ["GET /gists/{gist_id}/{sha}"], + list: ["GET /gists"], + listComments: ["GET /gists/{gist_id}/comments"], + listCommits: ["GET /gists/{gist_id}/commits"], + listForUser: ["GET /users/{username}/gists"], + listForks: ["GET /gists/{gist_id}/forks"], + listPublic: ["GET /gists/public"], + listStarred: ["GET /gists/starred"], + star: ["PUT /gists/{gist_id}/star"], + unstar: ["DELETE /gists/{gist_id}/star"], + update: ["PATCH /gists/{gist_id}"], + updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"] + }, + git: { + createBlob: ["POST /repos/{owner}/{repo}/git/blobs"], + createCommit: ["POST /repos/{owner}/{repo}/git/commits"], + createRef: ["POST /repos/{owner}/{repo}/git/refs"], + createTag: ["POST /repos/{owner}/{repo}/git/tags"], + createTree: ["POST /repos/{owner}/{repo}/git/trees"], + deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"], + getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"], + getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"], + getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"], + getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"], + getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"], + listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"], + updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"] + }, + gitignore: { + getAllTemplates: ["GET /gitignore/templates"], + getTemplate: ["GET /gitignore/templates/{name}"] + }, + interactions: { + getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"], + getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"], + getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"], + getRestrictionsForYourPublicRepos: ["GET /user/interaction-limits", {}, { + renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] + }], + removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"], + removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"], + removeRestrictionsForRepo: ["DELETE /repos/{owner}/{repo}/interaction-limits"], + removeRestrictionsForYourPublicRepos: ["DELETE /user/interaction-limits", {}, { + renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] + }], + setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"], + setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"], + setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"], + setRestrictionsForYourPublicRepos: ["PUT /user/interaction-limits", {}, { + renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] + }] + }, + issues: { + addAssignees: ["POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"], + addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], + checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], + create: ["POST /repos/{owner}/{repo}/issues"], + createComment: ["POST /repos/{owner}/{repo}/issues/{issue_number}/comments"], + createLabel: ["POST /repos/{owner}/{repo}/labels"], + createMilestone: ["POST /repos/{owner}/{repo}/milestones"], + deleteComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"], + deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"], + deleteMilestone: ["DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"], + get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"], + getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"], + getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"], + getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"], + getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"], + list: ["GET /issues"], + listAssignees: ["GET /repos/{owner}/{repo}/assignees"], + listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"], + listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"], + listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"], + listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"], + listEventsForTimeline: ["GET /repos/{owner}/{repo}/issues/{issue_number}/timeline"], + listForAuthenticatedUser: ["GET /user/issues"], + listForOrg: ["GET /orgs/{org}/issues"], + listForRepo: ["GET /repos/{owner}/{repo}/issues"], + listLabelsForMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"], + listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"], + listLabelsOnIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"], + listMilestones: ["GET /repos/{owner}/{repo}/milestones"], + lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], + removeAllLabels: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"], + removeAssignees: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"], + removeLabel: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"], + setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], + unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], + update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], + updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"], + updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"], + updateMilestone: ["PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"] + }, + licenses: { + get: ["GET /licenses/{license}"], + getAllCommonlyUsed: ["GET /licenses"], + getForRepo: ["GET /repos/{owner}/{repo}/license"] + }, + markdown: { + render: ["POST /markdown"], + renderRaw: ["POST /markdown/raw", { + headers: { + "content-type": "text/plain; charset=utf-8" + } + }] + }, + meta: { + get: ["GET /meta"], + getOctocat: ["GET /octocat"], + getZen: ["GET /zen"], + root: ["GET /"] + }, + migrations: { + cancelImport: ["DELETE /repos/{owner}/{repo}/import"], + deleteArchiveForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/archive"], + deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive"], + downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive"], + getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive"], + getCommitAuthors: ["GET /repos/{owner}/{repo}/import/authors"], + getImportStatus: ["GET /repos/{owner}/{repo}/import"], + getLargeFiles: ["GET /repos/{owner}/{repo}/import/large_files"], + getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"], + getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"], + listForAuthenticatedUser: ["GET /user/migrations"], + listForOrg: ["GET /orgs/{org}/migrations"], + listReposForAuthenticatedUser: ["GET /user/migrations/{migration_id}/repositories"], + listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"], + listReposForUser: ["GET /user/migrations/{migration_id}/repositories", {}, { + renamed: ["migrations", "listReposForAuthenticatedUser"] + }], + mapCommitAuthor: ["PATCH /repos/{owner}/{repo}/import/authors/{author_id}"], + setLfsPreference: ["PATCH /repos/{owner}/{repo}/import/lfs"], + startForAuthenticatedUser: ["POST /user/migrations"], + startForOrg: ["POST /orgs/{org}/migrations"], + startImport: ["PUT /repos/{owner}/{repo}/import"], + unlockRepoForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock"], + unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"], + updateImport: ["PATCH /repos/{owner}/{repo}/import"] + }, + orgs: { + blockUser: ["PUT /orgs/{org}/blocks/{username}"], + cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], + checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], + checkMembershipForUser: ["GET /orgs/{org}/members/{username}"], + checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"], + convertMemberToOutsideCollaborator: ["PUT /orgs/{org}/outside_collaborators/{username}"], + createInvitation: ["POST /orgs/{org}/invitations"], + createWebhook: ["POST /orgs/{org}/hooks"], + deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], + get: ["GET /orgs/{org}"], + getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], + getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], + getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], + getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], + getWebhookDelivery: ["GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"], + list: ["GET /organizations"], + listAppInstallations: ["GET /orgs/{org}/installations"], + listBlockedUsers: ["GET /orgs/{org}/blocks"], + listCustomRoles: ["GET /organizations/{organization_id}/custom_roles"], + listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], + listForAuthenticatedUser: ["GET /user/orgs"], + listForUser: ["GET /users/{username}/orgs"], + listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], + listMembers: ["GET /orgs/{org}/members"], + listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], + listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], + listPendingInvitations: ["GET /orgs/{org}/invitations"], + listPublicMembers: ["GET /orgs/{org}/public_members"], + listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], + listWebhooks: ["GET /orgs/{org}/hooks"], + pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], + redeliverWebhookDelivery: ["POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"], + removeMember: ["DELETE /orgs/{org}/members/{username}"], + removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], + removeOutsideCollaborator: ["DELETE /orgs/{org}/outside_collaborators/{username}"], + removePublicMembershipForAuthenticatedUser: ["DELETE /orgs/{org}/public_members/{username}"], + setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], + setPublicMembershipForAuthenticatedUser: ["PUT /orgs/{org}/public_members/{username}"], + unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], + update: ["PATCH /orgs/{org}"], + updateMembershipForAuthenticatedUser: ["PATCH /user/memberships/orgs/{org}"], + updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"], + updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"] + }, + packages: { + deletePackageForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}"], + deletePackageForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}"], + deletePackageForUser: ["DELETE /users/{username}/packages/{package_type}/{package_name}"], + deletePackageVersionForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}"], + deletePackageVersionForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + deletePackageVersionForUser: ["DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getAllPackageVersionsForAPackageOwnedByAnOrg: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions", {}, { + renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] + }], + getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions", {}, { + renamed: ["packages", "getAllPackageVersionsForPackageOwnedByAuthenticatedUser"] + }], + getAllPackageVersionsForPackageOwnedByAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions"], + getAllPackageVersionsForPackageOwnedByOrg: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions"], + getAllPackageVersionsForPackageOwnedByUser: ["GET /users/{username}/packages/{package_type}/{package_name}/versions"], + getPackageForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}"], + getPackageForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}"], + getPackageForUser: ["GET /users/{username}/packages/{package_type}/{package_name}"], + getPackageVersionForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getPackageVersionForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + getPackageVersionForUser: ["GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"], + listPackagesForAuthenticatedUser: ["GET /user/packages"], + listPackagesForOrganization: ["GET /orgs/{org}/packages"], + listPackagesForUser: ["GET /users/{username}/packages"], + restorePackageForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageForUser: ["POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}"], + restorePackageVersionForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"], + restorePackageVersionForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"], + restorePackageVersionForUser: ["POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"] + }, + projects: { + addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"], + createCard: ["POST /projects/columns/{column_id}/cards"], + createColumn: ["POST /projects/{project_id}/columns"], + createForAuthenticatedUser: ["POST /user/projects"], + createForOrg: ["POST /orgs/{org}/projects"], + createForRepo: ["POST /repos/{owner}/{repo}/projects"], + delete: ["DELETE /projects/{project_id}"], + deleteCard: ["DELETE /projects/columns/cards/{card_id}"], + deleteColumn: ["DELETE /projects/columns/{column_id}"], + get: ["GET /projects/{project_id}"], + getCard: ["GET /projects/columns/cards/{card_id}"], + getColumn: ["GET /projects/columns/{column_id}"], + getPermissionForUser: ["GET /projects/{project_id}/collaborators/{username}/permission"], + listCards: ["GET /projects/columns/{column_id}/cards"], + listCollaborators: ["GET /projects/{project_id}/collaborators"], + listColumns: ["GET /projects/{project_id}/columns"], + listForOrg: ["GET /orgs/{org}/projects"], + listForRepo: ["GET /repos/{owner}/{repo}/projects"], + listForUser: ["GET /users/{username}/projects"], + moveCard: ["POST /projects/columns/cards/{card_id}/moves"], + moveColumn: ["POST /projects/columns/{column_id}/moves"], + removeCollaborator: ["DELETE /projects/{project_id}/collaborators/{username}"], + update: ["PATCH /projects/{project_id}"], + updateCard: ["PATCH /projects/columns/cards/{card_id}"], + updateColumn: ["PATCH /projects/columns/{column_id}"] + }, + pulls: { + checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + create: ["POST /repos/{owner}/{repo}/pulls"], + createReplyForReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"], + createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + createReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"], + deletePendingReview: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + deleteReviewComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + dismissReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"], + get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"], + getReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"], + list: ["GET /repos/{owner}/{repo}/pulls"], + listCommentsForReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"], + listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"], + listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"], + listRequestedReviewers: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + listReviewComments: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"], + listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"], + listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], + merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"], + removeRequestedReviewers: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + requestReviewers: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], + submitReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"], + update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"], + updateBranch: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch"], + updateReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], + updateReviewComment: ["PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"] + }, + rateLimit: { + get: ["GET /rate_limit"] + }, + reactions: { + createForCommitComment: ["POST /repos/{owner}/{repo}/comments/{comment_id}/reactions"], + createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"], + createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"], + createForPullRequestReviewComment: ["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"], + createForRelease: ["POST /repos/{owner}/{repo}/releases/{release_id}/reactions"], + createForTeamDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"], + createForTeamDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"], + deleteForCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"], + deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"], + deleteForIssueComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"], + deleteForPullRequestComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"], + deleteForRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"], + deleteForTeamDiscussion: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"], + deleteForTeamDiscussionComment: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"], + listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"], + listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"], + listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"], + listForPullRequestReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"], + listForRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}/reactions"], + listForTeamDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"], + listForTeamDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"] + }, + repos: { + acceptInvitation: ["PATCH /user/repository_invitations/{invitation_id}", {}, { + renamed: ["repos", "acceptInvitationForAuthenticatedUser"] + }], + acceptInvitationForAuthenticatedUser: ["PATCH /user/repository_invitations/{invitation_id}"], + addAppAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"], + addStatusCheckContexts: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + addTeamAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + addUserAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"], + checkVulnerabilityAlerts: ["GET /repos/{owner}/{repo}/vulnerability-alerts"], + codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"], + compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"], + compareCommitsWithBasehead: ["GET /repos/{owner}/{repo}/compare/{basehead}"], + createAutolink: ["POST /repos/{owner}/{repo}/autolinks"], + createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"], + createCommitSignatureProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], + createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"], + createDeployKey: ["POST /repos/{owner}/{repo}/keys"], + createDeployment: ["POST /repos/{owner}/{repo}/deployments"], + createDeploymentStatus: ["POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], + createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"], + createForAuthenticatedUser: ["POST /user/repos"], + createFork: ["POST /repos/{owner}/{repo}/forks"], + createInOrg: ["POST /orgs/{org}/repos"], + createOrUpdateEnvironment: ["PUT /repos/{owner}/{repo}/environments/{environment_name}"], + createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], + createPagesSite: ["POST /repos/{owner}/{repo}/pages"], + createRelease: ["POST /repos/{owner}/{repo}/releases"], + createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"], + createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate"], + createWebhook: ["POST /repos/{owner}/{repo}/hooks"], + declineInvitation: ["DELETE /user/repository_invitations/{invitation_id}", {}, { + renamed: ["repos", "declineInvitationForAuthenticatedUser"] + }], + declineInvitationForAuthenticatedUser: ["DELETE /user/repository_invitations/{invitation_id}"], + delete: ["DELETE /repos/{owner}/{repo}"], + deleteAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], + deleteAdminBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + deleteAnEnvironment: ["DELETE /repos/{owner}/{repo}/environments/{environment_name}"], + deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"], + deleteBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection"], + deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"], + deleteCommitSignatureProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], + deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"], + deleteDeployment: ["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"], + deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"], + deleteInvitation: ["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"], + deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"], + deletePullRequestReviewProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"], + deleteReleaseAsset: ["DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"], + deleteTagProtection: ["DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}"], + deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], + disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes"], + disableLfsForRepo: ["DELETE /repos/{owner}/{repo}/lfs"], + disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts"], + downloadArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}", {}, { + renamed: ["repos", "downloadZipballArchive"] + }], + downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"], + downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"], + enableAutomatedSecurityFixes: ["PUT /repos/{owner}/{repo}/automated-security-fixes"], + enableLfsForRepo: ["PUT /repos/{owner}/{repo}/lfs"], + enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts"], + generateReleaseNotes: ["POST /repos/{owner}/{repo}/releases/generate-notes"], + get: ["GET /repos/{owner}/{repo}"], + getAccessRestrictions: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], + getAdminBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"], + getAllStatusCheckContexts: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"], + getAllTopics: ["GET /repos/{owner}/{repo}/topics"], + getAppsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"], + getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"], + getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"], + getBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection"], + getClones: ["GET /repos/{owner}/{repo}/traffic/clones"], + getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"], + getCollaboratorPermissionLevel: ["GET /repos/{owner}/{repo}/collaborators/{username}/permission"], + getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"], + getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"], + getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"], + getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"], + getCommitSignatureProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], + getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"], + getContent: ["GET /repos/{owner}/{repo}/contents/{path}"], + getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"], + getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], + getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], + getDeploymentStatus: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"], + getEnvironment: ["GET /repos/{owner}/{repo}/environments/{environment_name}"], + getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], + getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], + getPages: ["GET /repos/{owner}/{repo}/pages"], + getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], + getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], + getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], + getPullRequestReviewProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"], + getReadme: ["GET /repos/{owner}/{repo}/readme"], + getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"], + getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], + getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], + getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], + getStatusChecksProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + getTeamsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"], + getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"], + getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"], + getUsersWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"], + getViews: ["GET /repos/{owner}/{repo}/traffic/views"], + getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"], + getWebhookConfigForRepo: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/config"], + getWebhookDelivery: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"], + listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"], + listBranches: ["GET /repos/{owner}/{repo}/branches"], + listBranchesForHeadCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"], + listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"], + listCommentsForCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"], + listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"], + listCommitStatusesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/statuses"], + listCommits: ["GET /repos/{owner}/{repo}/commits"], + listContributors: ["GET /repos/{owner}/{repo}/contributors"], + listDeployKeys: ["GET /repos/{owner}/{repo}/keys"], + listDeploymentStatuses: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], + listDeployments: ["GET /repos/{owner}/{repo}/deployments"], + listForAuthenticatedUser: ["GET /user/repos"], + listForOrg: ["GET /orgs/{org}/repos"], + listForUser: ["GET /users/{username}/repos"], + listForks: ["GET /repos/{owner}/{repo}/forks"], + listInvitations: ["GET /repos/{owner}/{repo}/invitations"], + listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"], + listLanguages: ["GET /repos/{owner}/{repo}/languages"], + listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"], + listPublic: ["GET /repositories"], + listPullRequestsAssociatedWithCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls"], + listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"], + listReleases: ["GET /repos/{owner}/{repo}/releases"], + listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"], + listTags: ["GET /repos/{owner}/{repo}/tags"], + listTeams: ["GET /repos/{owner}/{repo}/teams"], + listWebhookDeliveries: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"], + listWebhooks: ["GET /repos/{owner}/{repo}/hooks"], + merge: ["POST /repos/{owner}/{repo}/merges"], + mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"], + pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"], + redeliverWebhookDelivery: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"], + removeAppAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + removeCollaborator: ["DELETE /repos/{owner}/{repo}/collaborators/{username}"], + removeStatusCheckContexts: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + removeStatusCheckProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + removeTeamAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + removeUserAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"], + replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"], + requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"], + setAdminBranchProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], + setAppAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { + mapToData: "apps" + }], + setStatusCheckContexts: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { + mapToData: "contexts" + }], + setTeamAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { + mapToData: "teams" + }], + setUserAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { + mapToData: "users" + }], + testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"], + transfer: ["POST /repos/{owner}/{repo}/transfer"], + update: ["PATCH /repos/{owner}/{repo}"], + updateBranchProtection: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection"], + updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"], + updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"], + updateInvitation: ["PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"], + updatePullRequestReviewProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], + updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"], + updateReleaseAsset: ["PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"], + updateStatusCheckPotection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks", {}, { + renamed: ["repos", "updateStatusCheckProtection"] + }], + updateStatusCheckProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], + updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"], + updateWebhookConfigForRepo: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"], + uploadReleaseAsset: ["POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}", { + baseUrl: "https://uploads.github.com" + }] + }, + search: { + code: ["GET /search/code"], + commits: ["GET /search/commits"], + issuesAndPullRequests: ["GET /search/issues"], + labels: ["GET /search/labels"], + repos: ["GET /search/repositories"], + topics: ["GET /search/topics"], + users: ["GET /search/users"] + }, + secretScanning: { + getAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"], + listAlertsForEnterprise: ["GET /enterprises/{enterprise}/secret-scanning/alerts"], + listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"], + listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"], + listLocationsForAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"], + updateAlert: ["PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"] + }, + teams: { + addOrUpdateMembershipForUserInOrg: ["PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"], + addOrUpdateProjectPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}"], + addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + checkPermissionsForProjectInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects/{project_id}"], + checkPermissionsForRepoInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + create: ["POST /orgs/{org}/teams"], + createDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], + createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"], + deleteDiscussionCommentInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + deleteDiscussionInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"], + getByName: ["GET /orgs/{org}/teams/{team_slug}"], + getDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + getDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + getMembershipForUserInOrg: ["GET /orgs/{org}/teams/{team_slug}/memberships/{username}"], + list: ["GET /orgs/{org}/teams"], + listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"], + listDiscussionCommentsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], + listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"], + listForAuthenticatedUser: ["GET /user/teams"], + listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"], + listPendingInvitationsInOrg: ["GET /orgs/{org}/teams/{team_slug}/invitations"], + listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects"], + listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], + removeMembershipForUserInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"], + removeProjectInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}"], + removeRepoInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], + updateDiscussionCommentInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], + updateDiscussionInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], + updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"] + }, + users: { + addEmailForAuthenticated: ["POST /user/emails", {}, { + renamed: ["users", "addEmailForAuthenticatedUser"] + }], + addEmailForAuthenticatedUser: ["POST /user/emails"], + block: ["PUT /user/blocks/{username}"], + checkBlocked: ["GET /user/blocks/{username}"], + checkFollowingForUser: ["GET /users/{username}/following/{target_user}"], + checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"], + createGpgKeyForAuthenticated: ["POST /user/gpg_keys", {}, { + renamed: ["users", "createGpgKeyForAuthenticatedUser"] + }], + createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"], + createPublicSshKeyForAuthenticated: ["POST /user/keys", {}, { + renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] + }], + createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"], + deleteEmailForAuthenticated: ["DELETE /user/emails", {}, { + renamed: ["users", "deleteEmailForAuthenticatedUser"] + }], + deleteEmailForAuthenticatedUser: ["DELETE /user/emails"], + deleteGpgKeyForAuthenticated: ["DELETE /user/gpg_keys/{gpg_key_id}", {}, { + renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] + }], + deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"], + deletePublicSshKeyForAuthenticated: ["DELETE /user/keys/{key_id}", {}, { + renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] + }], + deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"], + follow: ["PUT /user/following/{username}"], + getAuthenticated: ["GET /user"], + getByUsername: ["GET /users/{username}"], + getContextForUser: ["GET /users/{username}/hovercard"], + getGpgKeyForAuthenticated: ["GET /user/gpg_keys/{gpg_key_id}", {}, { + renamed: ["users", "getGpgKeyForAuthenticatedUser"] + }], + getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"], + getPublicSshKeyForAuthenticated: ["GET /user/keys/{key_id}", {}, { + renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] + }], + getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"], + list: ["GET /users"], + listBlockedByAuthenticated: ["GET /user/blocks", {}, { + renamed: ["users", "listBlockedByAuthenticatedUser"] + }], + listBlockedByAuthenticatedUser: ["GET /user/blocks"], + listEmailsForAuthenticated: ["GET /user/emails", {}, { + renamed: ["users", "listEmailsForAuthenticatedUser"] + }], + listEmailsForAuthenticatedUser: ["GET /user/emails"], + listFollowedByAuthenticated: ["GET /user/following", {}, { + renamed: ["users", "listFollowedByAuthenticatedUser"] + }], + listFollowedByAuthenticatedUser: ["GET /user/following"], + listFollowersForAuthenticatedUser: ["GET /user/followers"], + listFollowersForUser: ["GET /users/{username}/followers"], + listFollowingForUser: ["GET /users/{username}/following"], + listGpgKeysForAuthenticated: ["GET /user/gpg_keys", {}, { + renamed: ["users", "listGpgKeysForAuthenticatedUser"] + }], + listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"], + listGpgKeysForUser: ["GET /users/{username}/gpg_keys"], + listPublicEmailsForAuthenticated: ["GET /user/public_emails", {}, { + renamed: ["users", "listPublicEmailsForAuthenticatedUser"] + }], + listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"], + listPublicKeysForUser: ["GET /users/{username}/keys"], + listPublicSshKeysForAuthenticated: ["GET /user/keys", {}, { + renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] + }], + listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"], + setPrimaryEmailVisibilityForAuthenticated: ["PATCH /user/email/visibility", {}, { + renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] + }], + setPrimaryEmailVisibilityForAuthenticatedUser: ["PATCH /user/email/visibility"], + unblock: ["DELETE /user/blocks/{username}"], + unfollow: ["DELETE /user/following/{username}"], + updateAuthenticated: ["PATCH /user"] + } +}; + +const VERSION = "5.16.2"; + +function endpointsToMethods(octokit, endpointsMap) { + const newMethods = {}; + + for (const [scope, endpoints] of Object.entries(endpointsMap)) { + for (const [methodName, endpoint] of Object.entries(endpoints)) { + const [route, defaults, decorations] = endpoint; + const [method, url] = route.split(/ /); + const endpointDefaults = Object.assign({ + method, + url + }, defaults); + + if (!newMethods[scope]) { + newMethods[scope] = {}; + } + + const scopeMethods = newMethods[scope]; + + if (decorations) { + scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations); + continue; + } + + scopeMethods[methodName] = octokit.request.defaults(endpointDefaults); + } + } + + return newMethods; +} + +function decorate(octokit, scope, methodName, defaults, decorations) { + const requestWithDefaults = octokit.request.defaults(defaults); + /* istanbul ignore next */ + + function withDecorations(...args) { + // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 + let options = requestWithDefaults.endpoint.merge(...args); // There are currently no other decorations than `.mapToData` + + if (decorations.mapToData) { + options = Object.assign({}, options, { + data: options[decorations.mapToData], + [decorations.mapToData]: undefined + }); + return requestWithDefaults(options); + } + + if (decorations.renamed) { + const [newScope, newMethodName] = decorations.renamed; + octokit.log.warn(`octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`); + } + + if (decorations.deprecated) { + octokit.log.warn(decorations.deprecated); + } + + if (decorations.renamedParameters) { + // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 + const options = requestWithDefaults.endpoint.merge(...args); + + for (const [name, alias] of Object.entries(decorations.renamedParameters)) { + if (name in options) { + octokit.log.warn(`"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`); + + if (!(alias in options)) { + options[alias] = options[name]; + } + + delete options[name]; + } + } + + return requestWithDefaults(options); + } // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 + + + return requestWithDefaults(...args); + } + + return Object.assign(withDecorations, requestWithDefaults); +} + +function restEndpointMethods(octokit) { + const api = endpointsToMethods(octokit, Endpoints); + return { + rest: api + }; +} +restEndpointMethods.VERSION = VERSION; +function legacyRestEndpointMethods(octokit) { + const api = endpointsToMethods(octokit, Endpoints); + return _objectSpread2(_objectSpread2({}, api), {}, { + rest: api + }); +} +legacyRestEndpointMethods.VERSION = VERSION; + +exports.legacyRestEndpointMethods = legacyRestEndpointMethods; +exports.restEndpointMethods = restEndpointMethods; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 1659: +/***/ ((module, exports, __nccwpck_require__) => { + +"use strict"; +/** + * @author Toru Nagashima + * See LICENSE file in root directory for full license. + */ + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +var eventTargetShim = __nccwpck_require__(4697); + +/** + * The signal class. + * @see https://dom.spec.whatwg.org/#abortsignal + */ +class AbortSignal extends eventTargetShim.EventTarget { + /** + * AbortSignal cannot be constructed directly. + */ + constructor() { + super(); + throw new TypeError("AbortSignal cannot be constructed directly"); + } + /** + * Returns `true` if this `AbortSignal`'s `AbortController` has signaled to abort, and `false` otherwise. + */ + get aborted() { + const aborted = abortedFlags.get(this); + if (typeof aborted !== "boolean") { + throw new TypeError(`Expected 'this' to be an 'AbortSignal' object, but got ${this === null ? "null" : typeof this}`); + } + return aborted; + } +} +eventTargetShim.defineEventAttribute(AbortSignal.prototype, "abort"); +/** + * Create an AbortSignal object. + */ +function createAbortSignal() { + const signal = Object.create(AbortSignal.prototype); + eventTargetShim.EventTarget.call(signal); + abortedFlags.set(signal, false); + return signal; +} +/** + * Abort a given signal. + */ +function abortSignal(signal) { + if (abortedFlags.get(signal) !== false) { + return; + } + abortedFlags.set(signal, true); + signal.dispatchEvent({ type: "abort" }); +} +/** + * Aborted flag for each instances. + */ +const abortedFlags = new WeakMap(); +// Properties should be enumerable. +Object.defineProperties(AbortSignal.prototype, { + aborted: { enumerable: true }, +}); +// `toString()` should return `"[object AbortSignal]"` +if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { + Object.defineProperty(AbortSignal.prototype, Symbol.toStringTag, { + configurable: true, + value: "AbortSignal", + }); +} + +/** + * The AbortController. + * @see https://dom.spec.whatwg.org/#abortcontroller + */ +class AbortController { + /** + * Initialize this controller. + */ + constructor() { + signals.set(this, createAbortSignal()); + } + /** + * Returns the `AbortSignal` object associated with this object. + */ + get signal() { + return getSignal(this); + } + /** + * Abort and signal to any observers that the associated activity is to be aborted. + */ + abort() { + abortSignal(getSignal(this)); + } +} +/** + * Associated signals. + */ +const signals = new WeakMap(); +/** + * Get the associated signal of a given controller. + */ +function getSignal(controller) { + const signal = signals.get(controller); + if (signal == null) { + throw new TypeError(`Expected 'this' to be an 'AbortController' object, but got ${controller === null ? "null" : typeof controller}`); + } + return signal; +} +// Properties should be enumerable. +Object.defineProperties(AbortController.prototype, { + signal: { enumerable: true }, + abort: { enumerable: true }, +}); +if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { + Object.defineProperty(AbortController.prototype, Symbol.toStringTag, { + configurable: true, + value: "AbortController", + }); +} + +exports.AbortController = AbortController; +exports.AbortSignal = AbortSignal; +exports["default"] = AbortController; + +module.exports = AbortController +module.exports.AbortController = module.exports["default"] = AbortController +module.exports.AbortSignal = AbortSignal +//# sourceMappingURL=abort-controller.js.map + + +/***/ }), + +/***/ 4623: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +module.exports = __nccwpck_require__(5006); +module.exports.HttpsAgent = __nccwpck_require__(5500); +module.exports.constants = __nccwpck_require__(7757); + + +/***/ }), + +/***/ 5006: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +const OriginalAgent = (__nccwpck_require__(3685).Agent); +const ms = __nccwpck_require__(845); +const debug = (__nccwpck_require__(3837).debuglog)('agentkeepalive'); +const { + INIT_SOCKET, + CURRENT_ID, + CREATE_ID, + SOCKET_CREATED_TIME, + SOCKET_NAME, + SOCKET_REQUEST_COUNT, + SOCKET_REQUEST_FINISHED_COUNT, +} = __nccwpck_require__(7757); + +// OriginalAgent come from +// - https://github.com/nodejs/node/blob/v8.12.0/lib/_http_agent.js +// - https://github.com/nodejs/node/blob/v10.12.0/lib/_http_agent.js + +// node <= 10 +let defaultTimeoutListenerCount = 1; +const majorVersion = parseInt(process.version.split('.', 1)[0].substring(1)); +if (majorVersion >= 11 && majorVersion <= 12) { + defaultTimeoutListenerCount = 2; +} else if (majorVersion >= 13) { + defaultTimeoutListenerCount = 3; +} + +function deprecate(message) { + console.log('[agentkeepalive:deprecated] %s', message); +} + +class Agent extends OriginalAgent { + constructor(options) { + options = options || {}; + options.keepAlive = options.keepAlive !== false; + // default is keep-alive and 4s free socket timeout + // see https://medium.com/ssense-tech/reduce-networking-errors-in-nodejs-23b4eb9f2d83 + if (options.freeSocketTimeout === undefined) { + options.freeSocketTimeout = 4000; + } + // Legacy API: keepAliveTimeout should be rename to `freeSocketTimeout` + if (options.keepAliveTimeout) { + deprecate('options.keepAliveTimeout is deprecated, please use options.freeSocketTimeout instead'); + options.freeSocketTimeout = options.keepAliveTimeout; + delete options.keepAliveTimeout; + } + // Legacy API: freeSocketKeepAliveTimeout should be rename to `freeSocketTimeout` + if (options.freeSocketKeepAliveTimeout) { + deprecate('options.freeSocketKeepAliveTimeout is deprecated, please use options.freeSocketTimeout instead'); + options.freeSocketTimeout = options.freeSocketKeepAliveTimeout; + delete options.freeSocketKeepAliveTimeout; + } + + // Sets the socket to timeout after timeout milliseconds of inactivity on the socket. + // By default is double free socket timeout. + if (options.timeout === undefined) { + // make sure socket default inactivity timeout >= 8s + options.timeout = Math.max(options.freeSocketTimeout * 2, 8000); + } + + // support humanize format + options.timeout = ms(options.timeout); + options.freeSocketTimeout = ms(options.freeSocketTimeout); + options.socketActiveTTL = options.socketActiveTTL ? ms(options.socketActiveTTL) : 0; + + super(options); + + this[CURRENT_ID] = 0; + + // create socket success counter + this.createSocketCount = 0; + this.createSocketCountLastCheck = 0; + + this.createSocketErrorCount = 0; + this.createSocketErrorCountLastCheck = 0; + + this.closeSocketCount = 0; + this.closeSocketCountLastCheck = 0; + + // socket error event count + this.errorSocketCount = 0; + this.errorSocketCountLastCheck = 0; + + // request finished counter + this.requestCount = 0; + this.requestCountLastCheck = 0; + + // including free socket timeout counter + this.timeoutSocketCount = 0; + this.timeoutSocketCountLastCheck = 0; + + this.on('free', socket => { + // https://github.com/nodejs/node/pull/32000 + // Node.js native agent will check socket timeout eqs agent.options.timeout. + // Use the ttl or freeSocketTimeout to overwrite. + const timeout = this.calcSocketTimeout(socket); + if (timeout > 0 && socket.timeout !== timeout) { + socket.setTimeout(timeout); + } + }); + } + + get freeSocketKeepAliveTimeout() { + deprecate('agent.freeSocketKeepAliveTimeout is deprecated, please use agent.options.freeSocketTimeout instead'); + return this.options.freeSocketTimeout; + } + + get timeout() { + deprecate('agent.timeout is deprecated, please use agent.options.timeout instead'); + return this.options.timeout; + } + + get socketActiveTTL() { + deprecate('agent.socketActiveTTL is deprecated, please use agent.options.socketActiveTTL instead'); + return this.options.socketActiveTTL; + } + + calcSocketTimeout(socket) { + /** + * return <= 0: should free socket + * return > 0: should update socket timeout + * return undefined: not find custom timeout + */ + let freeSocketTimeout = this.options.freeSocketTimeout; + const socketActiveTTL = this.options.socketActiveTTL; + if (socketActiveTTL) { + // check socketActiveTTL + const aliveTime = Date.now() - socket[SOCKET_CREATED_TIME]; + const diff = socketActiveTTL - aliveTime; + if (diff <= 0) { + return diff; + } + if (freeSocketTimeout && diff < freeSocketTimeout) { + freeSocketTimeout = diff; + } + } + // set freeSocketTimeout + if (freeSocketTimeout) { + // set free keepalive timer + // try to use socket custom freeSocketTimeout first, support headers['keep-alive'] + // https://github.com/node-modules/urllib/blob/b76053020923f4d99a1c93cf2e16e0c5ba10bacf/lib/urllib.js#L498 + const customFreeSocketTimeout = socket.freeSocketTimeout || socket.freeSocketKeepAliveTimeout; + return customFreeSocketTimeout || freeSocketTimeout; + } + } + + keepSocketAlive(socket) { + const result = super.keepSocketAlive(socket); + // should not keepAlive, do nothing + if (!result) return result; + + const customTimeout = this.calcSocketTimeout(socket); + if (typeof customTimeout === 'undefined') { + return true; + } + if (customTimeout <= 0) { + debug('%s(requests: %s, finished: %s) free but need to destroy by TTL, request count %s, diff is %s', + socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], customTimeout); + return false; + } + if (socket.timeout !== customTimeout) { + socket.setTimeout(customTimeout); + } + return true; + } + + // only call on addRequest + reuseSocket(...args) { + // reuseSocket(socket, req) + super.reuseSocket(...args); + const socket = args[0]; + const req = args[1]; + req.reusedSocket = true; + const agentTimeout = this.options.timeout; + if (getSocketTimeout(socket) !== agentTimeout) { + // reset timeout before use + socket.setTimeout(agentTimeout); + debug('%s reset timeout to %sms', socket[SOCKET_NAME], agentTimeout); + } + socket[SOCKET_REQUEST_COUNT]++; + debug('%s(requests: %s, finished: %s) reuse on addRequest, timeout %sms', + socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], + getSocketTimeout(socket)); + } + + [CREATE_ID]() { + const id = this[CURRENT_ID]++; + if (this[CURRENT_ID] === Number.MAX_SAFE_INTEGER) this[CURRENT_ID] = 0; + return id; + } + + [INIT_SOCKET](socket, options) { + // bugfix here. + // https on node 8, 10 won't set agent.options.timeout by default + // TODO: need to fix on node itself + if (options.timeout) { + const timeout = getSocketTimeout(socket); + if (!timeout) { + socket.setTimeout(options.timeout); + } + } + + if (this.options.keepAlive) { + // Disable Nagle's algorithm: http://blog.caustik.com/2012/04/08/scaling-node-js-to-100k-concurrent-connections/ + // https://fengmk2.com/benchmark/nagle-algorithm-delayed-ack-mock.html + socket.setNoDelay(true); + } + this.createSocketCount++; + if (this.options.socketActiveTTL) { + socket[SOCKET_CREATED_TIME] = Date.now(); + } + // don't show the hole '-----BEGIN CERTIFICATE----' key string + socket[SOCKET_NAME] = `sock[${this[CREATE_ID]()}#${options._agentKey}]`.split('-----BEGIN', 1)[0]; + socket[SOCKET_REQUEST_COUNT] = 1; + socket[SOCKET_REQUEST_FINISHED_COUNT] = 0; + installListeners(this, socket, options); + } + + createConnection(options, oncreate) { + let called = false; + const onNewCreate = (err, socket) => { + if (called) return; + called = true; + + if (err) { + this.createSocketErrorCount++; + return oncreate(err); + } + this[INIT_SOCKET](socket, options); + oncreate(err, socket); + }; + + const newSocket = super.createConnection(options, onNewCreate); + if (newSocket) onNewCreate(null, newSocket); + return newSocket; + } + + get statusChanged() { + const changed = this.createSocketCount !== this.createSocketCountLastCheck || + this.createSocketErrorCount !== this.createSocketErrorCountLastCheck || + this.closeSocketCount !== this.closeSocketCountLastCheck || + this.errorSocketCount !== this.errorSocketCountLastCheck || + this.timeoutSocketCount !== this.timeoutSocketCountLastCheck || + this.requestCount !== this.requestCountLastCheck; + if (changed) { + this.createSocketCountLastCheck = this.createSocketCount; + this.createSocketErrorCountLastCheck = this.createSocketErrorCount; + this.closeSocketCountLastCheck = this.closeSocketCount; + this.errorSocketCountLastCheck = this.errorSocketCount; + this.timeoutSocketCountLastCheck = this.timeoutSocketCount; + this.requestCountLastCheck = this.requestCount; + } + return changed; + } + + getCurrentStatus() { + return { + createSocketCount: this.createSocketCount, + createSocketErrorCount: this.createSocketErrorCount, + closeSocketCount: this.closeSocketCount, + errorSocketCount: this.errorSocketCount, + timeoutSocketCount: this.timeoutSocketCount, + requestCount: this.requestCount, + freeSockets: inspect(this.freeSockets), + sockets: inspect(this.sockets), + requests: inspect(this.requests), + }; + } +} + +// node 8 don't has timeout attribute on socket +// https://github.com/nodejs/node/pull/21204/files#diff-e6ef024c3775d787c38487a6309e491dR408 +function getSocketTimeout(socket) { + return socket.timeout || socket._idleTimeout; +} + +function installListeners(agent, socket, options) { + debug('%s create, timeout %sms', socket[SOCKET_NAME], getSocketTimeout(socket)); + + // listener socket events: close, timeout, error, free + function onFree() { + // create and socket.emit('free') logic + // https://github.com/nodejs/node/blob/master/lib/_http_agent.js#L311 + // no req on the socket, it should be the new socket + if (!socket._httpMessage && socket[SOCKET_REQUEST_COUNT] === 1) return; + + socket[SOCKET_REQUEST_FINISHED_COUNT]++; + agent.requestCount++; + debug('%s(requests: %s, finished: %s) free', + socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]); + + // should reuse on pedding requests? + const name = agent.getName(options); + if (socket.writable && agent.requests[name] && agent.requests[name].length) { + // will be reuse on agent free listener + socket[SOCKET_REQUEST_COUNT]++; + debug('%s(requests: %s, finished: %s) will be reuse on agent free event', + socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]); + } + } + socket.on('free', onFree); + + function onClose(isError) { + debug('%s(requests: %s, finished: %s) close, isError: %s', + socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], isError); + agent.closeSocketCount++; + } + socket.on('close', onClose); + + // start socket timeout handler + function onTimeout() { + // onTimeout and emitRequestTimeout(_http_client.js) + // https://github.com/nodejs/node/blob/v12.x/lib/_http_client.js#L711 + const listenerCount = socket.listeners('timeout').length; + // node <= 10, default listenerCount is 1, onTimeout + // 11 < node <= 12, default listenerCount is 2, onTimeout and emitRequestTimeout + // node >= 13, default listenerCount is 3, onTimeout, + // onTimeout(https://github.com/nodejs/node/pull/32000/files#diff-5f7fb0850412c6be189faeddea6c5359R333) + // and emitRequestTimeout + const timeout = getSocketTimeout(socket); + const req = socket._httpMessage; + const reqTimeoutListenerCount = req && req.listeners('timeout').length || 0; + debug('%s(requests: %s, finished: %s) timeout after %sms, listeners %s, defaultTimeoutListenerCount %s, hasHttpRequest %s, HttpRequest timeoutListenerCount %s', + socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], + timeout, listenerCount, defaultTimeoutListenerCount, !!req, reqTimeoutListenerCount); + if (debug.enabled) { + debug('timeout listeners: %s', socket.listeners('timeout').map(f => f.name).join(', ')); + } + agent.timeoutSocketCount++; + const name = agent.getName(options); + if (agent.freeSockets[name] && agent.freeSockets[name].indexOf(socket) !== -1) { + // free socket timeout, destroy quietly + socket.destroy(); + // Remove it from freeSockets list immediately to prevent new requests + // from being sent through this socket. + agent.removeSocket(socket, options); + debug('%s is free, destroy quietly', socket[SOCKET_NAME]); + } else { + // if there is no any request socket timeout handler, + // agent need to handle socket timeout itself. + // + // custom request socket timeout handle logic must follow these rules: + // 1. Destroy socket first + // 2. Must emit socket 'agentRemove' event tell agent remove socket + // from freeSockets list immediately. + // Otherise you may be get 'socket hang up' error when reuse + // free socket and timeout happen in the same time. + if (reqTimeoutListenerCount === 0) { + const error = new Error('Socket timeout'); + error.code = 'ERR_SOCKET_TIMEOUT'; + error.timeout = timeout; + // must manually call socket.end() or socket.destroy() to end the connection. + // https://nodejs.org/dist/latest-v10.x/docs/api/net.html#net_socket_settimeout_timeout_callback + socket.destroy(error); + agent.removeSocket(socket, options); + debug('%s destroy with timeout error', socket[SOCKET_NAME]); + } + } + } + socket.on('timeout', onTimeout); + + function onError(err) { + const listenerCount = socket.listeners('error').length; + debug('%s(requests: %s, finished: %s) error: %s, listenerCount: %s', + socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], + err, listenerCount); + agent.errorSocketCount++; + if (listenerCount === 1) { + // if socket don't contain error event handler, don't catch it, emit it again + debug('%s emit uncaught error event', socket[SOCKET_NAME]); + socket.removeListener('error', onError); + socket.emit('error', err); + } + } + socket.on('error', onError); + + function onRemove() { + debug('%s(requests: %s, finished: %s) agentRemove', + socket[SOCKET_NAME], + socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]); + // We need this function for cases like HTTP 'upgrade' + // (defined by WebSockets) where we need to remove a socket from the + // pool because it'll be locked up indefinitely + socket.removeListener('close', onClose); + socket.removeListener('error', onError); + socket.removeListener('free', onFree); + socket.removeListener('timeout', onTimeout); + socket.removeListener('agentRemove', onRemove); + } + socket.on('agentRemove', onRemove); +} + +module.exports = Agent; + +function inspect(obj) { + const res = {}; + for (const key in obj) { + res[key] = obj[key].length; + } + return res; +} + + +/***/ }), + +/***/ 7757: +/***/ ((module) => { + +"use strict"; + + +module.exports = { + // agent + CURRENT_ID: Symbol('agentkeepalive#currentId'), + CREATE_ID: Symbol('agentkeepalive#createId'), + INIT_SOCKET: Symbol('agentkeepalive#initSocket'), + CREATE_HTTPS_CONNECTION: Symbol('agentkeepalive#createHttpsConnection'), + // socket + SOCKET_CREATED_TIME: Symbol('agentkeepalive#socketCreatedTime'), + SOCKET_NAME: Symbol('agentkeepalive#socketName'), + SOCKET_REQUEST_COUNT: Symbol('agentkeepalive#socketRequestCount'), + SOCKET_REQUEST_FINISHED_COUNT: Symbol('agentkeepalive#socketRequestFinishedCount'), +}; + + +/***/ }), + +/***/ 5500: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +const OriginalHttpsAgent = (__nccwpck_require__(5687).Agent); +const HttpAgent = __nccwpck_require__(5006); +const { + INIT_SOCKET, + CREATE_HTTPS_CONNECTION, +} = __nccwpck_require__(7757); + +class HttpsAgent extends HttpAgent { + constructor(options) { + super(options); + + this.defaultPort = 443; + this.protocol = 'https:'; + this.maxCachedSessions = this.options.maxCachedSessions; + /* istanbul ignore next */ + if (this.maxCachedSessions === undefined) { + this.maxCachedSessions = 100; + } + + this._sessionCache = { + map: {}, + list: [], + }; + } + + createConnection(options, oncreate) { + const socket = this[CREATE_HTTPS_CONNECTION](options, oncreate); + this[INIT_SOCKET](socket, options); + return socket; + } +} + +// https://github.com/nodejs/node/blob/master/lib/https.js#L89 +HttpsAgent.prototype[CREATE_HTTPS_CONNECTION] = OriginalHttpsAgent.prototype.createConnection; + +[ + 'getName', + '_getSession', + '_cacheSession', + // https://github.com/nodejs/node/pull/4982 + '_evictSession', +].forEach(function(method) { + /* istanbul ignore next */ + if (typeof OriginalHttpsAgent.prototype[method] === 'function') { + HttpsAgent.prototype[method] = OriginalHttpsAgent.prototype[method]; + } +}); + +module.exports = HttpsAgent; + + +/***/ }), + +/***/ 3682: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var register = __nccwpck_require__(4670) +var addHook = __nccwpck_require__(5549) +var removeHook = __nccwpck_require__(6819) + +// bind with array of arguments: https://stackoverflow.com/a/21792913 +var bind = Function.bind +var bindable = bind.bind(bind) + +function bindApi (hook, state, name) { + var removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state]) + hook.api = { remove: removeHookRef } + hook.remove = removeHookRef + + ;['before', 'error', 'after', 'wrap'].forEach(function (kind) { + var args = name ? [state, kind, name] : [state, kind] + hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args) + }) +} + +function HookSingular () { + var singularHookName = 'h' + var singularHookState = { + registry: {} + } + var singularHook = register.bind(null, singularHookState, singularHookName) + bindApi(singularHook, singularHookState, singularHookName) + return singularHook +} + +function HookCollection () { + var state = { + registry: {} + } + + var hook = register.bind(null, state) + bindApi(hook, state) + + return hook +} + +var collectionHookDeprecationMessageDisplayed = false +function Hook () { + if (!collectionHookDeprecationMessageDisplayed) { + console.warn('[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4') + collectionHookDeprecationMessageDisplayed = true + } + return HookCollection() +} + +Hook.Singular = HookSingular.bind() +Hook.Collection = HookCollection.bind() + +module.exports = Hook +// expose constructors as a named property for TypeScript +module.exports.Hook = Hook +module.exports.Singular = Hook.Singular +module.exports.Collection = Hook.Collection + + +/***/ }), + +/***/ 5549: +/***/ ((module) => { + +module.exports = addHook; + +function addHook(state, kind, name, hook) { + var orig = hook; + if (!state.registry[name]) { + state.registry[name] = []; + } + + if (kind === "before") { + hook = function (method, options) { + return Promise.resolve() + .then(orig.bind(null, options)) + .then(method.bind(null, options)); + }; + } + + if (kind === "after") { + hook = function (method, options) { + var result; + return Promise.resolve() + .then(method.bind(null, options)) + .then(function (result_) { + result = result_; + return orig(result, options); + }) + .then(function () { + return result; + }); + }; + } + + if (kind === "error") { + hook = function (method, options) { + return Promise.resolve() + .then(method.bind(null, options)) + .catch(function (error) { + return orig(error, options); + }); + }; + } + + state.registry[name].push({ + hook: hook, + orig: orig, + }); +} + + +/***/ }), + +/***/ 4670: +/***/ ((module) => { + +module.exports = register; + +function register(state, name, method, options) { + if (typeof method !== "function") { + throw new Error("method for before hook must be a function"); + } + + if (!options) { + options = {}; + } + + if (Array.isArray(name)) { + return name.reverse().reduce(function (callback, name) { + return register.bind(null, state, name, callback, options); + }, method)(); + } + + return Promise.resolve().then(function () { + if (!state.registry[name]) { + return method(options); + } + + return state.registry[name].reduce(function (method, registered) { + return registered.hook.bind(null, method, options); + }, method)(); + }); +} + + +/***/ }), + +/***/ 6819: +/***/ ((module) => { + +module.exports = removeHook; + +function removeHook(state, name, method) { + if (!state.registry[name]) { + return; + } + + var index = state.registry[name] + .map(function (registered) { + return registered.orig; + }) + .indexOf(method); + + if (index === -1) { + return; + } + + state.registry[name].splice(index, 1); +} + + +/***/ }), + +/***/ 8932: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +class Deprecation extends Error { + constructor(message) { + super(message); // Maintains proper stack trace (only available on V8) + + /* istanbul ignore next */ + + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = 'Deprecation'; + } + +} + +exports.Deprecation = Deprecation; + + +/***/ }), + +/***/ 4697: +/***/ ((module, exports) => { + +"use strict"; +/** + * @author Toru Nagashima + * @copyright 2015 Toru Nagashima. All rights reserved. + * See LICENSE file in root directory for full license. + */ + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +/** + * @typedef {object} PrivateData + * @property {EventTarget} eventTarget The event target. + * @property {{type:string}} event The original event object. + * @property {number} eventPhase The current event phase. + * @property {EventTarget|null} currentTarget The current event target. + * @property {boolean} canceled The flag to prevent default. + * @property {boolean} stopped The flag to stop propagation. + * @property {boolean} immediateStopped The flag to stop propagation immediately. + * @property {Function|null} passiveListener The listener if the current listener is passive. Otherwise this is null. + * @property {number} timeStamp The unix time. + * @private + */ + +/** + * Private data for event wrappers. + * @type {WeakMap} + * @private + */ +const privateData = new WeakMap(); + +/** + * Cache for wrapper classes. + * @type {WeakMap} + * @private + */ +const wrappers = new WeakMap(); + +/** + * Get private data. + * @param {Event} event The event object to get private data. + * @returns {PrivateData} The private data of the event. + * @private + */ +function pd(event) { + const retv = privateData.get(event); + console.assert( + retv != null, + "'this' is expected an Event object, but got", + event + ); + return retv +} + +/** + * https://dom.spec.whatwg.org/#set-the-canceled-flag + * @param data {PrivateData} private data. + */ +function setCancelFlag(data) { + if (data.passiveListener != null) { + if ( + typeof console !== "undefined" && + typeof console.error === "function" + ) { + console.error( + "Unable to preventDefault inside passive event listener invocation.", + data.passiveListener + ); + } + return + } + if (!data.event.cancelable) { + return + } + + data.canceled = true; + if (typeof data.event.preventDefault === "function") { + data.event.preventDefault(); + } +} + +/** + * @see https://dom.spec.whatwg.org/#interface-event + * @private + */ +/** + * The event wrapper. + * @constructor + * @param {EventTarget} eventTarget The event target of this dispatching. + * @param {Event|{type:string}} event The original event to wrap. + */ +function Event(eventTarget, event) { + privateData.set(this, { + eventTarget, + event, + eventPhase: 2, + currentTarget: eventTarget, + canceled: false, + stopped: false, + immediateStopped: false, + passiveListener: null, + timeStamp: event.timeStamp || Date.now(), + }); + + // https://heycam.github.io/webidl/#Unforgeable + Object.defineProperty(this, "isTrusted", { value: false, enumerable: true }); + + // Define accessors + const keys = Object.keys(event); + for (let i = 0; i < keys.length; ++i) { + const key = keys[i]; + if (!(key in this)) { + Object.defineProperty(this, key, defineRedirectDescriptor(key)); + } + } +} + +// Should be enumerable, but class methods are not enumerable. +Event.prototype = { + /** + * The type of this event. + * @type {string} + */ + get type() { + return pd(this).event.type + }, + + /** + * The target of this event. + * @type {EventTarget} + */ + get target() { + return pd(this).eventTarget + }, + + /** + * The target of this event. + * @type {EventTarget} + */ + get currentTarget() { + return pd(this).currentTarget + }, + + /** + * @returns {EventTarget[]} The composed path of this event. + */ + composedPath() { + const currentTarget = pd(this).currentTarget; + if (currentTarget == null) { + return [] + } + return [currentTarget] + }, + + /** + * Constant of NONE. + * @type {number} + */ + get NONE() { + return 0 + }, + + /** + * Constant of CAPTURING_PHASE. + * @type {number} + */ + get CAPTURING_PHASE() { + return 1 + }, + + /** + * Constant of AT_TARGET. + * @type {number} + */ + get AT_TARGET() { + return 2 + }, + + /** + * Constant of BUBBLING_PHASE. + * @type {number} + */ + get BUBBLING_PHASE() { + return 3 + }, + + /** + * The target of this event. + * @type {number} + */ + get eventPhase() { + return pd(this).eventPhase + }, + + /** + * Stop event bubbling. + * @returns {void} + */ + stopPropagation() { + const data = pd(this); + + data.stopped = true; + if (typeof data.event.stopPropagation === "function") { + data.event.stopPropagation(); + } + }, + + /** + * Stop event bubbling. + * @returns {void} + */ + stopImmediatePropagation() { + const data = pd(this); + + data.stopped = true; + data.immediateStopped = true; + if (typeof data.event.stopImmediatePropagation === "function") { + data.event.stopImmediatePropagation(); + } + }, + + /** + * The flag to be bubbling. + * @type {boolean} + */ + get bubbles() { + return Boolean(pd(this).event.bubbles) + }, + + /** + * The flag to be cancelable. + * @type {boolean} + */ + get cancelable() { + return Boolean(pd(this).event.cancelable) + }, + + /** + * Cancel this event. + * @returns {void} + */ + preventDefault() { + setCancelFlag(pd(this)); + }, + + /** + * The flag to indicate cancellation state. + * @type {boolean} + */ + get defaultPrevented() { + return pd(this).canceled + }, + + /** + * The flag to be composed. + * @type {boolean} + */ + get composed() { + return Boolean(pd(this).event.composed) + }, + + /** + * The unix time of this event. + * @type {number} + */ + get timeStamp() { + return pd(this).timeStamp + }, + + /** + * The target of this event. + * @type {EventTarget} + * @deprecated + */ + get srcElement() { + return pd(this).eventTarget + }, + + /** + * The flag to stop event bubbling. + * @type {boolean} + * @deprecated + */ + get cancelBubble() { + return pd(this).stopped + }, + set cancelBubble(value) { + if (!value) { + return + } + const data = pd(this); + + data.stopped = true; + if (typeof data.event.cancelBubble === "boolean") { + data.event.cancelBubble = true; + } + }, + + /** + * The flag to indicate cancellation state. + * @type {boolean} + * @deprecated + */ + get returnValue() { + return !pd(this).canceled + }, + set returnValue(value) { + if (!value) { + setCancelFlag(pd(this)); + } + }, + + /** + * Initialize this event object. But do nothing under event dispatching. + * @param {string} type The event type. + * @param {boolean} [bubbles=false] The flag to be possible to bubble up. + * @param {boolean} [cancelable=false] The flag to be possible to cancel. + * @deprecated + */ + initEvent() { + // Do nothing. + }, +}; + +// `constructor` is not enumerable. +Object.defineProperty(Event.prototype, "constructor", { + value: Event, + configurable: true, + writable: true, +}); + +// Ensure `event instanceof window.Event` is `true`. +if (typeof window !== "undefined" && typeof window.Event !== "undefined") { + Object.setPrototypeOf(Event.prototype, window.Event.prototype); + + // Make association for wrappers. + wrappers.set(window.Event.prototype, Event); +} + +/** + * Get the property descriptor to redirect a given property. + * @param {string} key Property name to define property descriptor. + * @returns {PropertyDescriptor} The property descriptor to redirect the property. + * @private + */ +function defineRedirectDescriptor(key) { + return { + get() { + return pd(this).event[key] + }, + set(value) { + pd(this).event[key] = value; + }, + configurable: true, + enumerable: true, + } +} + +/** + * Get the property descriptor to call a given method property. + * @param {string} key Property name to define property descriptor. + * @returns {PropertyDescriptor} The property descriptor to call the method property. + * @private + */ +function defineCallDescriptor(key) { + return { + value() { + const event = pd(this).event; + return event[key].apply(event, arguments) + }, + configurable: true, + enumerable: true, + } +} + +/** + * Define new wrapper class. + * @param {Function} BaseEvent The base wrapper class. + * @param {Object} proto The prototype of the original event. + * @returns {Function} The defined wrapper class. + * @private + */ +function defineWrapper(BaseEvent, proto) { + const keys = Object.keys(proto); + if (keys.length === 0) { + return BaseEvent + } + + /** CustomEvent */ + function CustomEvent(eventTarget, event) { + BaseEvent.call(this, eventTarget, event); + } + + CustomEvent.prototype = Object.create(BaseEvent.prototype, { + constructor: { value: CustomEvent, configurable: true, writable: true }, + }); + + // Define accessors. + for (let i = 0; i < keys.length; ++i) { + const key = keys[i]; + if (!(key in BaseEvent.prototype)) { + const descriptor = Object.getOwnPropertyDescriptor(proto, key); + const isFunc = typeof descriptor.value === "function"; + Object.defineProperty( + CustomEvent.prototype, + key, + isFunc + ? defineCallDescriptor(key) + : defineRedirectDescriptor(key) + ); + } + } + + return CustomEvent +} + +/** + * Get the wrapper class of a given prototype. + * @param {Object} proto The prototype of the original event to get its wrapper. + * @returns {Function} The wrapper class. + * @private + */ +function getWrapper(proto) { + if (proto == null || proto === Object.prototype) { + return Event + } + + let wrapper = wrappers.get(proto); + if (wrapper == null) { + wrapper = defineWrapper(getWrapper(Object.getPrototypeOf(proto)), proto); + wrappers.set(proto, wrapper); + } + return wrapper +} + +/** + * Wrap a given event to management a dispatching. + * @param {EventTarget} eventTarget The event target of this dispatching. + * @param {Object} event The event to wrap. + * @returns {Event} The wrapper instance. + * @private + */ +function wrapEvent(eventTarget, event) { + const Wrapper = getWrapper(Object.getPrototypeOf(event)); + return new Wrapper(eventTarget, event) +} + +/** + * Get the immediateStopped flag of a given event. + * @param {Event} event The event to get. + * @returns {boolean} The flag to stop propagation immediately. + * @private + */ +function isStopped(event) { + return pd(event).immediateStopped +} + +/** + * Set the current event phase of a given event. + * @param {Event} event The event to set current target. + * @param {number} eventPhase New event phase. + * @returns {void} + * @private + */ +function setEventPhase(event, eventPhase) { + pd(event).eventPhase = eventPhase; +} + +/** + * Set the current target of a given event. + * @param {Event} event The event to set current target. + * @param {EventTarget|null} currentTarget New current target. + * @returns {void} + * @private + */ +function setCurrentTarget(event, currentTarget) { + pd(event).currentTarget = currentTarget; +} + +/** + * Set a passive listener of a given event. + * @param {Event} event The event to set current target. + * @param {Function|null} passiveListener New passive listener. + * @returns {void} + * @private + */ +function setPassiveListener(event, passiveListener) { + pd(event).passiveListener = passiveListener; +} + +/** + * @typedef {object} ListenerNode + * @property {Function} listener + * @property {1|2|3} listenerType + * @property {boolean} passive + * @property {boolean} once + * @property {ListenerNode|null} next + * @private + */ + +/** + * @type {WeakMap>} + * @private + */ +const listenersMap = new WeakMap(); + +// Listener types +const CAPTURE = 1; +const BUBBLE = 2; +const ATTRIBUTE = 3; + +/** + * Check whether a given value is an object or not. + * @param {any} x The value to check. + * @returns {boolean} `true` if the value is an object. + */ +function isObject(x) { + return x !== null && typeof x === "object" //eslint-disable-line no-restricted-syntax +} + +/** + * Get listeners. + * @param {EventTarget} eventTarget The event target to get. + * @returns {Map} The listeners. + * @private + */ +function getListeners(eventTarget) { + const listeners = listenersMap.get(eventTarget); + if (listeners == null) { + throw new TypeError( + "'this' is expected an EventTarget object, but got another value." + ) + } + return listeners +} + +/** + * Get the property descriptor for the event attribute of a given event. + * @param {string} eventName The event name to get property descriptor. + * @returns {PropertyDescriptor} The property descriptor. + * @private + */ +function defineEventAttributeDescriptor(eventName) { + return { + get() { + const listeners = getListeners(this); + let node = listeners.get(eventName); + while (node != null) { + if (node.listenerType === ATTRIBUTE) { + return node.listener + } + node = node.next; + } + return null + }, + + set(listener) { + if (typeof listener !== "function" && !isObject(listener)) { + listener = null; // eslint-disable-line no-param-reassign + } + const listeners = getListeners(this); + + // Traverse to the tail while removing old value. + let prev = null; + let node = listeners.get(eventName); + while (node != null) { + if (node.listenerType === ATTRIBUTE) { + // Remove old value. + if (prev !== null) { + prev.next = node.next; + } else if (node.next !== null) { + listeners.set(eventName, node.next); + } else { + listeners.delete(eventName); + } + } else { + prev = node; + } + + node = node.next; + } + + // Add new value. + if (listener !== null) { + const newNode = { + listener, + listenerType: ATTRIBUTE, + passive: false, + once: false, + next: null, + }; + if (prev === null) { + listeners.set(eventName, newNode); + } else { + prev.next = newNode; + } + } + }, + configurable: true, + enumerable: true, + } +} + +/** + * Define an event attribute (e.g. `eventTarget.onclick`). + * @param {Object} eventTargetPrototype The event target prototype to define an event attrbite. + * @param {string} eventName The event name to define. + * @returns {void} + */ +function defineEventAttribute(eventTargetPrototype, eventName) { + Object.defineProperty( + eventTargetPrototype, + `on${eventName}`, + defineEventAttributeDescriptor(eventName) + ); +} + +/** + * Define a custom EventTarget with event attributes. + * @param {string[]} eventNames Event names for event attributes. + * @returns {EventTarget} The custom EventTarget. + * @private + */ +function defineCustomEventTarget(eventNames) { + /** CustomEventTarget */ + function CustomEventTarget() { + EventTarget.call(this); + } + + CustomEventTarget.prototype = Object.create(EventTarget.prototype, { + constructor: { + value: CustomEventTarget, + configurable: true, + writable: true, + }, + }); + + for (let i = 0; i < eventNames.length; ++i) { + defineEventAttribute(CustomEventTarget.prototype, eventNames[i]); + } + + return CustomEventTarget +} + +/** + * EventTarget. + * + * - This is constructor if no arguments. + * - This is a function which returns a CustomEventTarget constructor if there are arguments. + * + * For example: + * + * class A extends EventTarget {} + * class B extends EventTarget("message") {} + * class C extends EventTarget("message", "error") {} + * class D extends EventTarget(["message", "error"]) {} + */ +function EventTarget() { + /*eslint-disable consistent-return */ + if (this instanceof EventTarget) { + listenersMap.set(this, new Map()); + return + } + if (arguments.length === 1 && Array.isArray(arguments[0])) { + return defineCustomEventTarget(arguments[0]) + } + if (arguments.length > 0) { + const types = new Array(arguments.length); + for (let i = 0; i < arguments.length; ++i) { + types[i] = arguments[i]; + } + return defineCustomEventTarget(types) + } + throw new TypeError("Cannot call a class as a function") + /*eslint-enable consistent-return */ +} + +// Should be enumerable, but class methods are not enumerable. +EventTarget.prototype = { + /** + * Add a given listener to this event target. + * @param {string} eventName The event name to add. + * @param {Function} listener The listener to add. + * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener. + * @returns {void} + */ + addEventListener(eventName, listener, options) { + if (listener == null) { + return + } + if (typeof listener !== "function" && !isObject(listener)) { + throw new TypeError("'listener' should be a function or an object.") + } + + const listeners = getListeners(this); + const optionsIsObj = isObject(options); + const capture = optionsIsObj + ? Boolean(options.capture) + : Boolean(options); + const listenerType = capture ? CAPTURE : BUBBLE; + const newNode = { + listener, + listenerType, + passive: optionsIsObj && Boolean(options.passive), + once: optionsIsObj && Boolean(options.once), + next: null, + }; + + // Set it as the first node if the first node is null. + let node = listeners.get(eventName); + if (node === undefined) { + listeners.set(eventName, newNode); + return + } + + // Traverse to the tail while checking duplication.. + let prev = null; + while (node != null) { + if ( + node.listener === listener && + node.listenerType === listenerType + ) { + // Should ignore duplication. + return + } + prev = node; + node = node.next; + } + + // Add it. + prev.next = newNode; + }, + + /** + * Remove a given listener from this event target. + * @param {string} eventName The event name to remove. + * @param {Function} listener The listener to remove. + * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener. + * @returns {void} + */ + removeEventListener(eventName, listener, options) { + if (listener == null) { + return + } + + const listeners = getListeners(this); + const capture = isObject(options) + ? Boolean(options.capture) + : Boolean(options); + const listenerType = capture ? CAPTURE : BUBBLE; + + let prev = null; + let node = listeners.get(eventName); + while (node != null) { + if ( + node.listener === listener && + node.listenerType === listenerType + ) { + if (prev !== null) { + prev.next = node.next; + } else if (node.next !== null) { + listeners.set(eventName, node.next); + } else { + listeners.delete(eventName); + } + return + } + + prev = node; + node = node.next; + } + }, + + /** + * Dispatch a given event. + * @param {Event|{type:string}} event The event to dispatch. + * @returns {boolean} `false` if canceled. + */ + dispatchEvent(event) { + if (event == null || typeof event.type !== "string") { + throw new TypeError('"event.type" should be a string.') + } + + // If listeners aren't registered, terminate. + const listeners = getListeners(this); + const eventName = event.type; + let node = listeners.get(eventName); + if (node == null) { + return true + } + + // Since we cannot rewrite several properties, so wrap object. + const wrappedEvent = wrapEvent(this, event); + + // This doesn't process capturing phase and bubbling phase. + // This isn't participating in a tree. + let prev = null; + while (node != null) { + // Remove this listener if it's once + if (node.once) { + if (prev !== null) { + prev.next = node.next; + } else if (node.next !== null) { + listeners.set(eventName, node.next); + } else { + listeners.delete(eventName); + } + } else { + prev = node; + } + + // Call this listener + setPassiveListener( + wrappedEvent, + node.passive ? node.listener : null + ); + if (typeof node.listener === "function") { + try { + node.listener.call(this, wrappedEvent); + } catch (err) { + if ( + typeof console !== "undefined" && + typeof console.error === "function" + ) { + console.error(err); + } + } + } else if ( + node.listenerType !== ATTRIBUTE && + typeof node.listener.handleEvent === "function" + ) { + node.listener.handleEvent(wrappedEvent); + } + + // Break if `event.stopImmediatePropagation` was called. + if (isStopped(wrappedEvent)) { + break + } + + node = node.next; + } + setPassiveListener(wrappedEvent, null); + setEventPhase(wrappedEvent, 0); + setCurrentTarget(wrappedEvent, null); + + return !wrappedEvent.defaultPrevented + }, +}; + +// `constructor` is not enumerable. +Object.defineProperty(EventTarget.prototype, "constructor", { + value: EventTarget, + configurable: true, + writable: true, +}); + +// Ensure `eventTarget instanceof window.EventTarget` is `true`. +if ( + typeof window !== "undefined" && + typeof window.EventTarget !== "undefined" +) { + Object.setPrototypeOf(EventTarget.prototype, window.EventTarget.prototype); +} + +exports.defineEventAttribute = defineEventAttribute; +exports.EventTarget = EventTarget; +exports["default"] = EventTarget; + +module.exports = EventTarget +module.exports.EventTarget = module.exports["default"] = EventTarget +module.exports.defineEventAttribute = defineEventAttribute +//# sourceMappingURL=event-target-shim.js.map + + +/***/ }), + +/***/ 6993: +/***/ (function(__unused_webpack_module, exports) { + +/** + * @license + * web-streams-polyfill v4.0.0-beta.3 + * Copyright 2021 Mattias Buelens, Diwank Singh Tomer and other contributors. + * This code is released under the MIT license. + * SPDX-License-Identifier: MIT + */ +!function(e,t){ true?t(exports):0}(this,(function(e){"use strict";const t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol:e=>`Symbol(${e})`;function r(){}function o(e){return"object"==typeof e&&null!==e||"function"==typeof e}const n=r;function a(e,t){try{Object.defineProperty(e,"name",{value:t,configurable:!0})}catch(e){}}const i=Promise,l=Promise.prototype.then,s=Promise.resolve.bind(i),u=Promise.reject.bind(i);function c(e){return new i(e)}function d(e){return s(e)}function f(e){return u(e)}function b(e,t,r){return l.call(e,t,r)}function h(e,t,r){b(b(e,t,r),void 0,n)}function _(e,t){h(e,t)}function p(e,t){h(e,void 0,t)}function m(e,t,r){return b(e,t,r)}function y(e){b(e,void 0,n)}let g=e=>{if("function"==typeof queueMicrotask)g=queueMicrotask;else{const e=d(void 0);g=t=>b(e,t)}return g(e)};function S(e,t,r){if("function"!=typeof e)throw new TypeError("Argument is not a function");return Function.prototype.apply.call(e,t,r)}function w(e,t,r){try{return d(S(e,t,r))}catch(e){return f(e)}}class v{constructor(){this._cursor=0,this._size=0,this._front={_elements:[],_next:void 0},this._back=this._front,this._cursor=0,this._size=0}get length(){return this._size}push(e){const t=this._back;let r=t;16383===t._elements.length&&(r={_elements:[],_next:void 0}),t._elements.push(e),r!==t&&(this._back=r,t._next=r),++this._size}shift(){const e=this._front;let t=e;const r=this._cursor;let o=r+1;const n=e._elements,a=n[r];return 16384===o&&(t=e._next,o=0),--this._size,this._cursor=o,e!==t&&(this._front=t),n[r]=void 0,a}forEach(e){let t=this._cursor,r=this._front,o=r._elements;for(;!(t===o.length&&void 0===r._next||t===o.length&&(r=r._next,o=r._elements,t=0,0===o.length));)e(o[t]),++t}peek(){const e=this._front,t=this._cursor;return e._elements[t]}}const R=t("[[AbortSteps]]"),T=t("[[ErrorSteps]]"),q=t("[[CancelSteps]]"),C=t("[[PullSteps]]"),P=t("[[ReleaseSteps]]");function E(e,t){e._ownerReadableStream=t,t._reader=e,"readable"===t._state?B(e):"closed"===t._state?function(e){B(e),z(e)}(e):A(e,t._storedError)}function W(e,t){return Xt(e._ownerReadableStream,t)}function O(e){const t=e._ownerReadableStream;"readable"===t._state?j(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")):function(e,t){A(e,t)}(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")),t._readableStreamController[P](),t._reader=void 0,e._ownerReadableStream=void 0}function k(e){return new TypeError("Cannot "+e+" a stream using a released reader")}function B(e){e._closedPromise=c(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r}))}function A(e,t){B(e),j(e,t)}function j(e,t){void 0!==e._closedPromise_reject&&(y(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}function z(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}const L=Number.isFinite||function(e){return"number"==typeof e&&isFinite(e)},F=Math.trunc||function(e){return e<0?Math.ceil(e):Math.floor(e)};function D(e,t){if(void 0!==e&&("object"!=typeof(r=e)&&"function"!=typeof r))throw new TypeError(`${t} is not an object.`);var r}function I(e,t){if("function"!=typeof e)throw new TypeError(`${t} is not a function.`)}function $(e,t){if(!function(e){return"object"==typeof e&&null!==e||"function"==typeof e}(e))throw new TypeError(`${t} is not an object.`)}function M(e,t,r){if(void 0===e)throw new TypeError(`Parameter ${t} is required in '${r}'.`)}function Y(e,t,r){if(void 0===e)throw new TypeError(`${t} is required in '${r}'.`)}function Q(e){return Number(e)}function N(e){return 0===e?0:e}function x(e,t){const r=Number.MAX_SAFE_INTEGER;let o=Number(e);if(o=N(o),!L(o))throw new TypeError(`${t} is not a finite number`);if(o=function(e){return N(F(e))}(o),o<0||o>r)throw new TypeError(`${t} is outside the accepted range of 0 to ${r}, inclusive`);return L(o)&&0!==o?o:0}function H(e){if(!o(e))return!1;if("function"!=typeof e.getReader)return!1;try{return"boolean"==typeof e.locked}catch(e){return!1}}function V(e){if(!o(e))return!1;if("function"!=typeof e.getWriter)return!1;try{return"boolean"==typeof e.locked}catch(e){return!1}}function U(e,t){if(!Ut(e))throw new TypeError(`${t} is not a ReadableStream.`)}function G(e,t){e._reader._readRequests.push(t)}function X(e,t,r){const o=e._reader._readRequests.shift();r?o._closeSteps():o._chunkSteps(t)}function J(e){return e._reader._readRequests.length}function K(e){const t=e._reader;return void 0!==t&&!!Z(t)}class ReadableStreamDefaultReader{constructor(e){if(M(e,1,"ReadableStreamDefaultReader"),U(e,"First parameter"),Gt(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");E(this,e),this._readRequests=new v}get closed(){return Z(this)?this._closedPromise:f(te("closed"))}cancel(e){return Z(this)?void 0===this._ownerReadableStream?f(k("cancel")):W(this,e):f(te("cancel"))}read(){if(!Z(this))return f(te("read"));if(void 0===this._ownerReadableStream)return f(k("read from"));let e,t;const r=c(((r,o)=>{e=r,t=o}));return function(e,t){const r=e._ownerReadableStream;r._disturbed=!0,"closed"===r._state?t._closeSteps():"errored"===r._state?t._errorSteps(r._storedError):r._readableStreamController[C](t)}(this,{_chunkSteps:t=>e({value:t,done:!1}),_closeSteps:()=>e({value:void 0,done:!0}),_errorSteps:e=>t(e)}),r}releaseLock(){if(!Z(this))throw te("releaseLock");void 0!==this._ownerReadableStream&&function(e){O(e);const t=new TypeError("Reader was released");ee(e,t)}(this)}}function Z(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readRequests")&&e instanceof ReadableStreamDefaultReader)}function ee(e,t){const r=e._readRequests;e._readRequests=new v,r.forEach((e=>{e._errorSteps(t)}))}function te(e){return new TypeError(`ReadableStreamDefaultReader.prototype.${e} can only be used on a ReadableStreamDefaultReader`)}Object.defineProperties(ReadableStreamDefaultReader.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),a(ReadableStreamDefaultReader.prototype.cancel,"cancel"),a(ReadableStreamDefaultReader.prototype.read,"read"),a(ReadableStreamDefaultReader.prototype.releaseLock,"releaseLock"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStreamDefaultReader.prototype,t.toStringTag,{value:"ReadableStreamDefaultReader",configurable:!0});class re{constructor(e,t){this._ongoingPromise=void 0,this._isFinished=!1,this._reader=e,this._preventCancel=t}next(){const e=()=>this._nextSteps();return this._ongoingPromise=this._ongoingPromise?m(this._ongoingPromise,e,e):e(),this._ongoingPromise}return(e){const t=()=>this._returnSteps(e);return this._ongoingPromise?m(this._ongoingPromise,t,t):t()}_nextSteps(){if(this._isFinished)return Promise.resolve({value:void 0,done:!0});const e=this._reader;return void 0===e?f(k("iterate")):b(e.read(),(e=>{var t;return this._ongoingPromise=void 0,e.done&&(this._isFinished=!0,null===(t=this._reader)||void 0===t||t.releaseLock(),this._reader=void 0),e}),(e=>{var t;throw this._ongoingPromise=void 0,this._isFinished=!0,null===(t=this._reader)||void 0===t||t.releaseLock(),this._reader=void 0,e}))}_returnSteps(e){if(this._isFinished)return Promise.resolve({value:e,done:!0});this._isFinished=!0;const t=this._reader;if(void 0===t)return f(k("finish iterating"));if(this._reader=void 0,!this._preventCancel){const r=t.cancel(e);return t.releaseLock(),m(r,(()=>({value:e,done:!0})))}return t.releaseLock(),d({value:e,done:!0})}}const oe={next(){return ne(this)?this._asyncIteratorImpl.next():f(ae("next"))},return(e){return ne(this)?this._asyncIteratorImpl.return(e):f(ae("return"))}};function ne(e){if(!o(e))return!1;if(!Object.prototype.hasOwnProperty.call(e,"_asyncIteratorImpl"))return!1;try{return e._asyncIteratorImpl instanceof re}catch(e){return!1}}function ae(e){return new TypeError(`ReadableStreamAsyncIterator.${e} can only be used on a ReadableSteamAsyncIterator`)}"symbol"==typeof t.asyncIterator&&Object.defineProperty(oe,t.asyncIterator,{value(){return this},writable:!0,configurable:!0});const ie=Number.isNaN||function(e){return e!=e};function le(e,t,r,o,n){new Uint8Array(e).set(new Uint8Array(r,o,n),t)}function se(e){const t=function(e,t,r){if(e.slice)return e.slice(t,r);const o=r-t,n=new ArrayBuffer(o);return le(n,0,e,t,o),n}(e.buffer,e.byteOffset,e.byteOffset+e.byteLength);return new Uint8Array(t)}function ue(e){const t=e._queue.shift();return e._queueTotalSize-=t.size,e._queueTotalSize<0&&(e._queueTotalSize=0),t.value}function ce(e,t,r){if("number"!=typeof(o=r)||ie(o)||o<0||r===1/0)throw new RangeError("Size must be a finite, non-NaN, non-negative number.");var o;e._queue.push({value:t,size:r}),e._queueTotalSize+=r}function de(e){e._queue=new v,e._queueTotalSize=0}class ReadableStreamBYOBRequest{constructor(){throw new TypeError("Illegal constructor")}get view(){if(!be(this))throw Ae("view");return this._view}respond(e){if(!be(this))throw Ae("respond");if(M(e,1,"respond"),e=x(e,"First parameter"),void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");this._view.buffer,function(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t)throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream")}else{if(0===t)throw new TypeError("bytesWritten must be greater than 0 when calling respond() on a readable stream");if(r.bytesFilled+t>r.byteLength)throw new RangeError("bytesWritten out of range")}r.buffer=r.buffer,Ce(e,t)}(this._associatedReadableByteStreamController,e)}respondWithNewView(e){if(!be(this))throw Ae("respondWithNewView");if(M(e,1,"respondWithNewView"),!ArrayBuffer.isView(e))throw new TypeError("You can only respond with array buffer views");if(void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");e.buffer,function(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t.byteLength)throw new TypeError("The view's length must be 0 when calling respondWithNewView() on a closed stream")}else if(0===t.byteLength)throw new TypeError("The view's length must be greater than 0 when calling respondWithNewView() on a readable stream");if(r.byteOffset+r.bytesFilled!==t.byteOffset)throw new RangeError("The region specified by view does not match byobRequest");if(r.bufferByteLength!==t.buffer.byteLength)throw new RangeError("The buffer of view has different capacity than byobRequest");if(r.bytesFilled+t.byteLength>r.byteLength)throw new RangeError("The region specified by view is larger than byobRequest");const o=t.byteLength;r.buffer=t.buffer,Ce(e,o)}(this._associatedReadableByteStreamController,e)}}Object.defineProperties(ReadableStreamBYOBRequest.prototype,{respond:{enumerable:!0},respondWithNewView:{enumerable:!0},view:{enumerable:!0}}),a(ReadableStreamBYOBRequest.prototype.respond,"respond"),a(ReadableStreamBYOBRequest.prototype.respondWithNewView,"respondWithNewView"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStreamBYOBRequest.prototype,t.toStringTag,{value:"ReadableStreamBYOBRequest",configurable:!0});class ReadableByteStreamController{constructor(){throw new TypeError("Illegal constructor")}get byobRequest(){if(!fe(this))throw je("byobRequest");return function(e){if(null===e._byobRequest&&e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek(),r=new Uint8Array(t.buffer,t.byteOffset+t.bytesFilled,t.byteLength-t.bytesFilled),o=Object.create(ReadableStreamBYOBRequest.prototype);!function(e,t,r){e._associatedReadableByteStreamController=t,e._view=r}(o,e,r),e._byobRequest=o}return e._byobRequest}(this)}get desiredSize(){if(!fe(this))throw je("desiredSize");return ke(this)}close(){if(!fe(this))throw je("close");if(this._closeRequested)throw new TypeError("The stream has already been closed; do not close it again!");const e=this._controlledReadableByteStream._state;if("readable"!==e)throw new TypeError(`The stream (in ${e} state) is not in the readable state and cannot be closed`);!function(e){const t=e._controlledReadableByteStream;if(e._closeRequested||"readable"!==t._state)return;if(e._queueTotalSize>0)return void(e._closeRequested=!0);if(e._pendingPullIntos.length>0){if(e._pendingPullIntos.peek().bytesFilled>0){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");throw We(e,t),t}}Ee(e),Jt(t)}(this)}enqueue(e){if(!fe(this))throw je("enqueue");if(M(e,1,"enqueue"),!ArrayBuffer.isView(e))throw new TypeError("chunk must be an array buffer view");if(0===e.byteLength)throw new TypeError("chunk must have non-zero byteLength");if(0===e.buffer.byteLength)throw new TypeError("chunk's buffer must have non-zero byteLength");if(this._closeRequested)throw new TypeError("stream is closed or draining");const t=this._controlledReadableByteStream._state;if("readable"!==t)throw new TypeError(`The stream (in ${t} state) is not in the readable state and cannot be enqueued to`);!function(e,t){const r=e._controlledReadableByteStream;if(e._closeRequested||"readable"!==r._state)return;const o=t.buffer,n=t.byteOffset,a=t.byteLength,i=o;if(e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek();t.buffer,0,Te(e),t.buffer=t.buffer,"none"===t.readerType&&Se(e,t)}if(K(r))if(function(e){const t=e._controlledReadableByteStream._reader;for(;t._readRequests.length>0;){if(0===e._queueTotalSize)return;Oe(e,t._readRequests.shift())}}(e),0===J(r))ye(e,i,n,a);else{e._pendingPullIntos.length>0&&Pe(e);X(r,new Uint8Array(i,n,a),!1)}else Fe(r)?(ye(e,i,n,a),qe(e)):ye(e,i,n,a);he(e)}(this,e)}error(e){if(!fe(this))throw je("error");We(this,e)}[q](e){_e(this),de(this);const t=this._cancelAlgorithm(e);return Ee(this),t}[C](e){const t=this._controlledReadableByteStream;if(this._queueTotalSize>0)return void Oe(this,e);const r=this._autoAllocateChunkSize;if(void 0!==r){let t;try{t=new ArrayBuffer(r)}catch(t){return void e._errorSteps(t)}const o={buffer:t,bufferByteLength:r,byteOffset:0,byteLength:r,bytesFilled:0,elementSize:1,viewConstructor:Uint8Array,readerType:"default"};this._pendingPullIntos.push(o)}G(t,e),he(this)}[P](){if(this._pendingPullIntos.length>0){const e=this._pendingPullIntos.peek();e.readerType="none",this._pendingPullIntos=new v,this._pendingPullIntos.push(e)}}}function fe(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableByteStream")&&e instanceof ReadableByteStreamController)}function be(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_associatedReadableByteStreamController")&&e instanceof ReadableStreamBYOBRequest)}function he(e){const t=function(e){const t=e._controlledReadableByteStream;if("readable"!==t._state)return!1;if(e._closeRequested)return!1;if(!e._started)return!1;if(K(t)&&J(t)>0)return!0;if(Fe(t)&&Le(t)>0)return!0;if(ke(e)>0)return!0;return!1}(e);if(!t)return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;h(e._pullAlgorithm(),(()=>(e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,he(e)),null)),(t=>(We(e,t),null)))}function _e(e){Te(e),e._pendingPullIntos=new v}function pe(e,t){let r=!1;"closed"===e._state&&(r=!0);const o=me(t);"default"===t.readerType?X(e,o,r):function(e,t,r){const o=e._reader._readIntoRequests.shift();r?o._closeSteps(t):o._chunkSteps(t)}(e,o,r)}function me(e){const t=e.bytesFilled,r=e.elementSize;return new e.viewConstructor(e.buffer,e.byteOffset,t/r)}function ye(e,t,r,o){e._queue.push({buffer:t,byteOffset:r,byteLength:o}),e._queueTotalSize+=o}function ge(e,t,r,o){let n;try{n=t.slice(r,r+o)}catch(t){throw We(e,t),t}ye(e,n,0,o)}function Se(e,t){t.bytesFilled>0&&ge(e,t.buffer,t.byteOffset,t.bytesFilled),Pe(e)}function we(e,t){const r=t.elementSize,o=t.bytesFilled-t.bytesFilled%r,n=Math.min(e._queueTotalSize,t.byteLength-t.bytesFilled),a=t.bytesFilled+n,i=a-a%r;let l=n,s=!1;i>o&&(l=i-t.bytesFilled,s=!0);const u=e._queue;for(;l>0;){const r=u.peek(),o=Math.min(l,r.byteLength),n=t.byteOffset+t.bytesFilled;le(t.buffer,n,r.buffer,r.byteOffset,o),r.byteLength===o?u.shift():(r.byteOffset+=o,r.byteLength-=o),e._queueTotalSize-=o,ve(e,o,t),l-=o}return s}function ve(e,t,r){r.bytesFilled+=t}function Re(e){0===e._queueTotalSize&&e._closeRequested?(Ee(e),Jt(e._controlledReadableByteStream)):he(e)}function Te(e){null!==e._byobRequest&&(e._byobRequest._associatedReadableByteStreamController=void 0,e._byobRequest._view=null,e._byobRequest=null)}function qe(e){for(;e._pendingPullIntos.length>0;){if(0===e._queueTotalSize)return;const t=e._pendingPullIntos.peek();we(e,t)&&(Pe(e),pe(e._controlledReadableByteStream,t))}}function Ce(e,t){const r=e._pendingPullIntos.peek();Te(e);"closed"===e._controlledReadableByteStream._state?function(e,t){"none"===t.readerType&&Pe(e);const r=e._controlledReadableByteStream;if(Fe(r))for(;Le(r)>0;)pe(r,Pe(e))}(e,r):function(e,t,r){if(ve(0,t,r),"none"===r.readerType)return Se(e,r),void qe(e);if(r.bytesFilled0){const t=r.byteOffset+r.bytesFilled;ge(e,r.buffer,t-o,o)}r.bytesFilled-=o,pe(e._controlledReadableByteStream,r),qe(e)}(e,t,r),he(e)}function Pe(e){return e._pendingPullIntos.shift()}function Ee(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0}function We(e,t){const r=e._controlledReadableByteStream;"readable"===r._state&&(_e(e),de(e),Ee(e),Kt(r,t))}function Oe(e,t){const r=e._queue.shift();e._queueTotalSize-=r.byteLength,Re(e);const o=new Uint8Array(r.buffer,r.byteOffset,r.byteLength);t._chunkSteps(o)}function ke(e){const t=e._controlledReadableByteStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Be(e,t,r){const o=Object.create(ReadableByteStreamController.prototype);let n,a,i;n=void 0!==t.start?()=>t.start(o):()=>{},a=void 0!==t.pull?()=>t.pull(o):()=>d(void 0),i=void 0!==t.cancel?e=>t.cancel(e):()=>d(void 0);const l=t.autoAllocateChunkSize;if(0===l)throw new TypeError("autoAllocateChunkSize must be greater than 0");!function(e,t,r,o,n,a,i){t._controlledReadableByteStream=e,t._pullAgain=!1,t._pulling=!1,t._byobRequest=null,t._queue=t._queueTotalSize=void 0,de(t),t._closeRequested=!1,t._started=!1,t._strategyHWM=a,t._pullAlgorithm=o,t._cancelAlgorithm=n,t._autoAllocateChunkSize=i,t._pendingPullIntos=new v,e._readableStreamController=t,h(d(r()),(()=>(t._started=!0,he(t),null)),(e=>(We(t,e),null)))}(e,o,n,a,i,r,l)}function Ae(e){return new TypeError(`ReadableStreamBYOBRequest.prototype.${e} can only be used on a ReadableStreamBYOBRequest`)}function je(e){return new TypeError(`ReadableByteStreamController.prototype.${e} can only be used on a ReadableByteStreamController`)}function ze(e,t){e._reader._readIntoRequests.push(t)}function Le(e){return e._reader._readIntoRequests.length}function Fe(e){const t=e._reader;return void 0!==t&&!!De(t)}Object.defineProperties(ReadableByteStreamController.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},byobRequest:{enumerable:!0},desiredSize:{enumerable:!0}}),a(ReadableByteStreamController.prototype.close,"close"),a(ReadableByteStreamController.prototype.enqueue,"enqueue"),a(ReadableByteStreamController.prototype.error,"error"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableByteStreamController.prototype,t.toStringTag,{value:"ReadableByteStreamController",configurable:!0});class ReadableStreamBYOBReader{constructor(e){if(M(e,1,"ReadableStreamBYOBReader"),U(e,"First parameter"),Gt(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");if(!fe(e._readableStreamController))throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte source");E(this,e),this._readIntoRequests=new v}get closed(){return De(this)?this._closedPromise:f($e("closed"))}cancel(e){return De(this)?void 0===this._ownerReadableStream?f(k("cancel")):W(this,e):f($e("cancel"))}read(e){if(!De(this))return f($e("read"));if(!ArrayBuffer.isView(e))return f(new TypeError("view must be an array buffer view"));if(0===e.byteLength)return f(new TypeError("view must have non-zero byteLength"));if(0===e.buffer.byteLength)return f(new TypeError("view's buffer must have non-zero byteLength"));if(e.buffer,void 0===this._ownerReadableStream)return f(k("read from"));let t,r;const o=c(((e,o)=>{t=e,r=o}));return function(e,t,r){const o=e._ownerReadableStream;o._disturbed=!0,"errored"===o._state?r._errorSteps(o._storedError):function(e,t,r){const o=e._controlledReadableByteStream;let n=1;t.constructor!==DataView&&(n=t.constructor.BYTES_PER_ELEMENT);const a=t.constructor,i=t.buffer,l={buffer:i,bufferByteLength:i.byteLength,byteOffset:t.byteOffset,byteLength:t.byteLength,bytesFilled:0,elementSize:n,viewConstructor:a,readerType:"byob"};if(e._pendingPullIntos.length>0)return e._pendingPullIntos.push(l),void ze(o,r);if("closed"!==o._state){if(e._queueTotalSize>0){if(we(e,l)){const t=me(l);return Re(e),void r._chunkSteps(t)}if(e._closeRequested){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");return We(e,t),void r._errorSteps(t)}}e._pendingPullIntos.push(l),ze(o,r),he(e)}else{const e=new a(l.buffer,l.byteOffset,0);r._closeSteps(e)}}(o._readableStreamController,t,r)}(this,e,{_chunkSteps:e=>t({value:e,done:!1}),_closeSteps:e=>t({value:e,done:!0}),_errorSteps:e=>r(e)}),o}releaseLock(){if(!De(this))throw $e("releaseLock");void 0!==this._ownerReadableStream&&function(e){O(e);const t=new TypeError("Reader was released");Ie(e,t)}(this)}}function De(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readIntoRequests")&&e instanceof ReadableStreamBYOBReader)}function Ie(e,t){const r=e._readIntoRequests;e._readIntoRequests=new v,r.forEach((e=>{e._errorSteps(t)}))}function $e(e){return new TypeError(`ReadableStreamBYOBReader.prototype.${e} can only be used on a ReadableStreamBYOBReader`)}function Me(e,t){const{highWaterMark:r}=e;if(void 0===r)return t;if(ie(r)||r<0)throw new RangeError("Invalid highWaterMark");return r}function Ye(e){const{size:t}=e;return t||(()=>1)}function Qe(e,t){D(e,t);const r=null==e?void 0:e.highWaterMark,o=null==e?void 0:e.size;return{highWaterMark:void 0===r?void 0:Q(r),size:void 0===o?void 0:Ne(o,`${t} has member 'size' that`)}}function Ne(e,t){return I(e,t),t=>Q(e(t))}function xe(e,t,r){return I(e,r),r=>w(e,t,[r])}function He(e,t,r){return I(e,r),()=>w(e,t,[])}function Ve(e,t,r){return I(e,r),r=>S(e,t,[r])}function Ue(e,t,r){return I(e,r),(r,o)=>w(e,t,[r,o])}Object.defineProperties(ReadableStreamBYOBReader.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),a(ReadableStreamBYOBReader.prototype.cancel,"cancel"),a(ReadableStreamBYOBReader.prototype.read,"read"),a(ReadableStreamBYOBReader.prototype.releaseLock,"releaseLock"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStreamBYOBReader.prototype,t.toStringTag,{value:"ReadableStreamBYOBReader",configurable:!0});const Ge="function"==typeof AbortController;class WritableStream{constructor(e={},t={}){void 0===e?e=null:$(e,"First parameter");const r=Qe(t,"Second parameter"),o=function(e,t){D(e,t);const r=null==e?void 0:e.abort,o=null==e?void 0:e.close,n=null==e?void 0:e.start,a=null==e?void 0:e.type,i=null==e?void 0:e.write;return{abort:void 0===r?void 0:xe(r,e,`${t} has member 'abort' that`),close:void 0===o?void 0:He(o,e,`${t} has member 'close' that`),start:void 0===n?void 0:Ve(n,e,`${t} has member 'start' that`),write:void 0===i?void 0:Ue(i,e,`${t} has member 'write' that`),type:a}}(e,"First parameter");var n;(n=this)._state="writable",n._storedError=void 0,n._writer=void 0,n._writableStreamController=void 0,n._writeRequests=new v,n._inFlightWriteRequest=void 0,n._closeRequest=void 0,n._inFlightCloseRequest=void 0,n._pendingAbortRequest=void 0,n._backpressure=!1;if(void 0!==o.type)throw new RangeError("Invalid type is specified");const a=Ye(r);!function(e,t,r,o){const n=Object.create(WritableStreamDefaultController.prototype);let a,i,l,s;a=void 0!==t.start?()=>t.start(n):()=>{};i=void 0!==t.write?e=>t.write(e,n):()=>d(void 0);l=void 0!==t.close?()=>t.close():()=>d(void 0);s=void 0!==t.abort?e=>t.abort(e):()=>d(void 0);!function(e,t,r,o,n,a,i,l){t._controlledWritableStream=e,e._writableStreamController=t,t._queue=void 0,t._queueTotalSize=void 0,de(t),t._abortReason=void 0,t._abortController=function(){if(Ge)return new AbortController}(),t._started=!1,t._strategySizeAlgorithm=l,t._strategyHWM=i,t._writeAlgorithm=o,t._closeAlgorithm=n,t._abortAlgorithm=a;const s=ht(t);at(e,s);const u=r();h(d(u),(()=>(t._started=!0,ft(t),null)),(r=>(t._started=!0,et(e,r),null)))}(e,n,a,i,l,s,r,o)}(this,o,Me(r,1),a)}get locked(){if(!Xe(this))throw pt("locked");return Je(this)}abort(e){return Xe(this)?Je(this)?f(new TypeError("Cannot abort a stream that already has a writer")):Ke(this,e):f(pt("abort"))}close(){return Xe(this)?Je(this)?f(new TypeError("Cannot close a stream that already has a writer")):ot(this)?f(new TypeError("Cannot close an already-closing stream")):Ze(this):f(pt("close"))}getWriter(){if(!Xe(this))throw pt("getWriter");return new WritableStreamDefaultWriter(this)}}function Xe(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_writableStreamController")&&e instanceof WritableStream)}function Je(e){return void 0!==e._writer}function Ke(e,t){var r;if("closed"===e._state||"errored"===e._state)return d(void 0);e._writableStreamController._abortReason=t,null===(r=e._writableStreamController._abortController)||void 0===r||r.abort(t);const o=e._state;if("closed"===o||"errored"===o)return d(void 0);if(void 0!==e._pendingAbortRequest)return e._pendingAbortRequest._promise;let n=!1;"erroring"===o&&(n=!0,t=void 0);const a=c(((r,o)=>{e._pendingAbortRequest={_promise:void 0,_resolve:r,_reject:o,_reason:t,_wasAlreadyErroring:n}}));return e._pendingAbortRequest._promise=a,n||tt(e,t),a}function Ze(e){const t=e._state;if("closed"===t||"errored"===t)return f(new TypeError(`The stream (in ${t} state) is not in the writable state and cannot be closed`));const r=c(((t,r)=>{const o={_resolve:t,_reject:r};e._closeRequest=o})),o=e._writer;var n;return void 0!==o&&e._backpressure&&"writable"===t&&Et(o),ce(n=e._writableStreamController,st,0),ft(n),r}function et(e,t){"writable"!==e._state?rt(e):tt(e,t)}function tt(e,t){const r=e._writableStreamController;e._state="erroring",e._storedError=t;const o=e._writer;void 0!==o&<(o,t),!function(e){if(void 0===e._inFlightWriteRequest&&void 0===e._inFlightCloseRequest)return!1;return!0}(e)&&r._started&&rt(e)}function rt(e){e._state="errored",e._writableStreamController[T]();const t=e._storedError;if(e._writeRequests.forEach((e=>{e._reject(t)})),e._writeRequests=new v,void 0===e._pendingAbortRequest)return void nt(e);const r=e._pendingAbortRequest;if(e._pendingAbortRequest=void 0,r._wasAlreadyErroring)return r._reject(t),void nt(e);h(e._writableStreamController[R](r._reason),(()=>(r._resolve(),nt(e),null)),(t=>(r._reject(t),nt(e),null)))}function ot(e){return void 0!==e._closeRequest||void 0!==e._inFlightCloseRequest}function nt(e){void 0!==e._closeRequest&&(e._closeRequest._reject(e._storedError),e._closeRequest=void 0);const t=e._writer;void 0!==t&&vt(t,e._storedError)}function at(e,t){const r=e._writer;void 0!==r&&t!==e._backpressure&&(t?function(e){Tt(e)}(r):Et(r)),e._backpressure=t}Object.defineProperties(WritableStream.prototype,{abort:{enumerable:!0},close:{enumerable:!0},getWriter:{enumerable:!0},locked:{enumerable:!0}}),a(WritableStream.prototype.abort,"abort"),a(WritableStream.prototype.close,"close"),a(WritableStream.prototype.getWriter,"getWriter"),"symbol"==typeof t.toStringTag&&Object.defineProperty(WritableStream.prototype,t.toStringTag,{value:"WritableStream",configurable:!0});class WritableStreamDefaultWriter{constructor(e){if(M(e,1,"WritableStreamDefaultWriter"),function(e,t){if(!Xe(e))throw new TypeError(`${t} is not a WritableStream.`)}(e,"First parameter"),Je(e))throw new TypeError("This stream has already been locked for exclusive writing by another writer");this._ownerWritableStream=e,e._writer=this;const t=e._state;if("writable"===t)!ot(e)&&e._backpressure?Tt(this):Ct(this),St(this);else if("erroring"===t)qt(this,e._storedError),St(this);else if("closed"===t)Ct(this),St(r=this),Rt(r);else{const t=e._storedError;qt(this,t),wt(this,t)}var r}get closed(){return it(this)?this._closedPromise:f(yt("closed"))}get desiredSize(){if(!it(this))throw yt("desiredSize");if(void 0===this._ownerWritableStream)throw gt("desiredSize");return function(e){const t=e._ownerWritableStream,r=t._state;if("errored"===r||"erroring"===r)return null;if("closed"===r)return 0;return dt(t._writableStreamController)}(this)}get ready(){return it(this)?this._readyPromise:f(yt("ready"))}abort(e){return it(this)?void 0===this._ownerWritableStream?f(gt("abort")):function(e,t){return Ke(e._ownerWritableStream,t)}(this,e):f(yt("abort"))}close(){if(!it(this))return f(yt("close"));const e=this._ownerWritableStream;return void 0===e?f(gt("close")):ot(e)?f(new TypeError("Cannot close an already-closing stream")):Ze(this._ownerWritableStream)}releaseLock(){if(!it(this))throw yt("releaseLock");void 0!==this._ownerWritableStream&&function(e){const t=e._ownerWritableStream,r=new TypeError("Writer was released and can no longer be used to monitor the stream's closedness");lt(e,r),function(e,t){"pending"===e._closedPromiseState?vt(e,t):function(e,t){wt(e,t)}(e,t)}(e,r),t._writer=void 0,e._ownerWritableStream=void 0}(this)}write(e){return it(this)?void 0===this._ownerWritableStream?f(gt("write to")):function(e,t){const r=e._ownerWritableStream,o=r._writableStreamController,n=function(e,t){try{return e._strategySizeAlgorithm(t)}catch(t){return bt(e,t),1}}(o,t);if(r!==e._ownerWritableStream)return f(gt("write to"));const a=r._state;if("errored"===a)return f(r._storedError);if(ot(r)||"closed"===a)return f(new TypeError("The stream is closing or closed and cannot be written to"));if("erroring"===a)return f(r._storedError);const i=function(e){return c(((t,r)=>{const o={_resolve:t,_reject:r};e._writeRequests.push(o)}))}(r);return function(e,t,r){try{ce(e,t,r)}catch(t){return void bt(e,t)}const o=e._controlledWritableStream;if(!ot(o)&&"writable"===o._state){at(o,ht(e))}ft(e)}(o,t,n),i}(this,e):f(yt("write"))}}function it(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_ownerWritableStream")&&e instanceof WritableStreamDefaultWriter)}function lt(e,t){"pending"===e._readyPromiseState?Pt(e,t):function(e,t){qt(e,t)}(e,t)}Object.defineProperties(WritableStreamDefaultWriter.prototype,{abort:{enumerable:!0},close:{enumerable:!0},releaseLock:{enumerable:!0},write:{enumerable:!0},closed:{enumerable:!0},desiredSize:{enumerable:!0},ready:{enumerable:!0}}),a(WritableStreamDefaultWriter.prototype.abort,"abort"),a(WritableStreamDefaultWriter.prototype.close,"close"),a(WritableStreamDefaultWriter.prototype.releaseLock,"releaseLock"),a(WritableStreamDefaultWriter.prototype.write,"write"),"symbol"==typeof t.toStringTag&&Object.defineProperty(WritableStreamDefaultWriter.prototype,t.toStringTag,{value:"WritableStreamDefaultWriter",configurable:!0});const st={};class WritableStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get abortReason(){if(!ut(this))throw mt("abortReason");return this._abortReason}get signal(){if(!ut(this))throw mt("signal");if(void 0===this._abortController)throw new TypeError("WritableStreamDefaultController.prototype.signal is not supported");return this._abortController.signal}error(e){if(!ut(this))throw mt("error");"writable"===this._controlledWritableStream._state&&_t(this,e)}[R](e){const t=this._abortAlgorithm(e);return ct(this),t}[T](){de(this)}}function ut(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledWritableStream")&&e instanceof WritableStreamDefaultController)}function ct(e){e._writeAlgorithm=void 0,e._closeAlgorithm=void 0,e._abortAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function dt(e){return e._strategyHWM-e._queueTotalSize}function ft(e){const t=e._controlledWritableStream;if(!e._started)return;if(void 0!==t._inFlightWriteRequest)return;if("erroring"===t._state)return void rt(t);if(0===e._queue.length)return;const r=e._queue.peek().value;r===st?function(e){const t=e._controlledWritableStream;(function(e){e._inFlightCloseRequest=e._closeRequest,e._closeRequest=void 0})(t),ue(e);const r=e._closeAlgorithm();ct(e),h(r,(()=>(function(e){e._inFlightCloseRequest._resolve(void 0),e._inFlightCloseRequest=void 0,"erroring"===e._state&&(e._storedError=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._resolve(),e._pendingAbortRequest=void 0)),e._state="closed";const t=e._writer;void 0!==t&&Rt(t)}(t),null)),(e=>(function(e,t){e._inFlightCloseRequest._reject(t),e._inFlightCloseRequest=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._reject(t),e._pendingAbortRequest=void 0),et(e,t)}(t,e),null)))}(e):function(e,t){const r=e._controlledWritableStream;!function(e){e._inFlightWriteRequest=e._writeRequests.shift()}(r);h(e._writeAlgorithm(t),(()=>{!function(e){e._inFlightWriteRequest._resolve(void 0),e._inFlightWriteRequest=void 0}(r);const t=r._state;if(ue(e),!ot(r)&&"writable"===t){const t=ht(e);at(r,t)}return ft(e),null}),(t=>("writable"===r._state&&ct(e),function(e,t){e._inFlightWriteRequest._reject(t),e._inFlightWriteRequest=void 0,et(e,t)}(r,t),null)))}(e,r)}function bt(e,t){"writable"===e._controlledWritableStream._state&&_t(e,t)}function ht(e){return dt(e)<=0}function _t(e,t){const r=e._controlledWritableStream;ct(e),tt(r,t)}function pt(e){return new TypeError(`WritableStream.prototype.${e} can only be used on a WritableStream`)}function mt(e){return new TypeError(`WritableStreamDefaultController.prototype.${e} can only be used on a WritableStreamDefaultController`)}function yt(e){return new TypeError(`WritableStreamDefaultWriter.prototype.${e} can only be used on a WritableStreamDefaultWriter`)}function gt(e){return new TypeError("Cannot "+e+" a stream using a released writer")}function St(e){e._closedPromise=c(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r,e._closedPromiseState="pending"}))}function wt(e,t){St(e),vt(e,t)}function vt(e,t){void 0!==e._closedPromise_reject&&(y(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="rejected")}function Rt(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="resolved")}function Tt(e){e._readyPromise=c(((t,r)=>{e._readyPromise_resolve=t,e._readyPromise_reject=r})),e._readyPromiseState="pending"}function qt(e,t){Tt(e),Pt(e,t)}function Ct(e){Tt(e),Et(e)}function Pt(e,t){void 0!==e._readyPromise_reject&&(y(e._readyPromise),e._readyPromise_reject(t),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="rejected")}function Et(e){void 0!==e._readyPromise_resolve&&(e._readyPromise_resolve(void 0),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="fulfilled")}Object.defineProperties(WritableStreamDefaultController.prototype,{abortReason:{enumerable:!0},signal:{enumerable:!0},error:{enumerable:!0}}),"symbol"==typeof t.toStringTag&&Object.defineProperty(WritableStreamDefaultController.prototype,t.toStringTag,{value:"WritableStreamDefaultController",configurable:!0});const Wt="undefined"!=typeof DOMException?DOMException:void 0;const Ot=function(e){if("function"!=typeof e&&"object"!=typeof e)return!1;try{return new e,!0}catch(e){return!1}}(Wt)?Wt:function(){const e=function(e,t){this.message=e||"",this.name=t||"Error",Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)};return e.prototype=Object.create(Error.prototype),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,configurable:!0}),e}();function kt(e,t,r,o,n,a){const i=e.getReader(),l=t.getWriter();Ut(e)&&(e._disturbed=!0);let s,u,p,S=!1,w=!1,v="readable",R="writable",T=!1,q=!1;const C=c((e=>{p=e}));let P=Promise.resolve(void 0);return c(((E,W)=>{let O;function k(){if(S)return;const e=c(((e,t)=>{!function r(o){o?e():b(function(){if(S)return d(!0);return b(l.ready,(()=>b(i.read(),(e=>!!e.done||(P=l.write(e.value),y(P),!1)))))}(),r,t)}(!1)}));y(e)}function B(){return v="closed",r?L():z((()=>(Xe(t)&&(T=ot(t),R=t._state),T||"closed"===R?d(void 0):"erroring"===R||"errored"===R?f(u):(T=!0,l.close()))),!1,void 0),null}function A(e){return S||(v="errored",s=e,o?L(!0,e):z((()=>l.abort(e)),!0,e)),null}function j(e){return w||(R="errored",u=e,n?L(!0,e):z((()=>i.cancel(e)),!0,e)),null}if(void 0!==a&&(O=()=>{const e=void 0!==a.reason?a.reason:new Ot("Aborted","AbortError"),t=[];o||t.push((()=>"writable"===R?l.abort(e):d(void 0))),n||t.push((()=>"readable"===v?i.cancel(e):d(void 0))),z((()=>Promise.all(t.map((e=>e())))),!0,e)},a.aborted?O():a.addEventListener("abort",O)),Ut(e)&&(v=e._state,s=e._storedError),Xe(t)&&(R=t._state,u=t._storedError,T=ot(t)),Ut(e)&&Xe(t)&&(q=!0,p()),"errored"===v)A(s);else if("erroring"===R||"errored"===R)j(u);else if("closed"===v)B();else if(T||"closed"===R){const e=new TypeError("the destination writable stream closed before all data could be piped to it");n?L(!0,e):z((()=>i.cancel(e)),!0,e)}function z(e,t,r){function o(){return"writable"!==R||T?n():_(function(){let e;return d(function t(){if(e!==P)return e=P,m(P,t,t)}())}(),n),null}function n(){return e?h(e(),(()=>F(t,r)),(e=>F(!0,e))):F(t,r),null}S||(S=!0,q?o():_(C,o))}function L(e,t){z(void 0,e,t)}function F(e,t){return w=!0,l.releaseLock(),i.releaseLock(),void 0!==a&&a.removeEventListener("abort",O),e?W(t):E(void 0),null}S||(h(i.closed,B,A),h(l.closed,(function(){return w||(R="closed"),null}),j)),q?k():g((()=>{q=!0,p(),k()}))}))}function Bt(e,t){return function(e){try{return e.getReader({mode:"byob"}).releaseLock(),!0}catch(e){return!1}}(e)?function(e){let t,r,o,n,a,i=e.getReader(),l=!1,s=!1,u=!1,f=!1,b=!1,_=!1;const m=c((e=>{a=e}));function y(e){p(e.closed,(t=>(e!==i||(o.error(t),n.error(t),b&&_||a(void 0)),null)))}function g(){l&&(i.releaseLock(),i=e.getReader(),y(i),l=!1),h(i.read(),(e=>{var t,r;if(u=!1,f=!1,e.done)return b||o.close(),_||n.close(),null===(t=o.byobRequest)||void 0===t||t.respond(0),null===(r=n.byobRequest)||void 0===r||r.respond(0),b&&_||a(void 0),null;const l=e.value,c=l;let d=l;if(!b&&!_)try{d=se(l)}catch(e){return o.error(e),n.error(e),a(i.cancel(e)),null}return b||o.enqueue(c),_||n.enqueue(d),s=!1,u?w():f&&v(),null}),(()=>(s=!1,null)))}function S(t,r){l||(i.releaseLock(),i=e.getReader({mode:"byob"}),y(i),l=!0);const c=r?n:o,d=r?o:n;h(i.read(t),(e=>{var t;u=!1,f=!1;const o=r?_:b,n=r?b:_;if(e.done){o||c.close(),n||d.close();const r=e.value;return void 0!==r&&(o||c.byobRequest.respondWithNewView(r),n||null===(t=d.byobRequest)||void 0===t||t.respond(0)),o&&n||a(void 0),null}const l=e.value;if(n)o||c.byobRequest.respondWithNewView(l);else{let e;try{e=se(l)}catch(e){return c.error(e),d.error(e),a(i.cancel(e)),null}o||c.byobRequest.respondWithNewView(l),d.enqueue(e)}return s=!1,u?w():f&&v(),null}),(()=>(s=!1,null)))}function w(){if(s)return u=!0,d(void 0);s=!0;const e=o.byobRequest;return null===e?g():S(e.view,!1),d(void 0)}function v(){if(s)return f=!0,d(void 0);s=!0;const e=n.byobRequest;return null===e?g():S(e.view,!0),d(void 0)}function R(e){if(b=!0,t=e,_){const e=[t,r],o=i.cancel(e);a(o)}return m}function T(e){if(_=!0,r=e,b){const e=[t,r],o=i.cancel(e);a(o)}return m}const q=new ReadableStream({type:"bytes",start(e){o=e},pull:w,cancel:R}),C=new ReadableStream({type:"bytes",start(e){n=e},pull:v,cancel:T});return y(i),[q,C]}(e):function(e,t){const r=e.getReader();let o,n,a,i,l,s=!1,u=!1,f=!1,b=!1;const _=c((e=>{l=e}));function m(){return s?(u=!0,d(void 0)):(s=!0,h(r.read(),(e=>{if(u=!1,e.done)return f||a.close(),b||i.close(),f&&b||l(void 0),null;const t=e.value,r=t,o=t;return f||a.enqueue(r),b||i.enqueue(o),s=!1,u&&m(),null}),(()=>(s=!1,null))),d(void 0))}function y(e){if(f=!0,o=e,b){const e=[o,n],t=r.cancel(e);l(t)}return _}function g(e){if(b=!0,n=e,f){const e=[o,n],t=r.cancel(e);l(t)}return _}const S=new ReadableStream({start(e){a=e},pull:m,cancel:y}),w=new ReadableStream({start(e){i=e},pull:m,cancel:g});return p(r.closed,(e=>(a.error(e),i.error(e),f&&b||l(void 0),null))),[S,w]}(e)}class ReadableStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!At(this))throw $t("desiredSize");return Ft(this)}close(){if(!At(this))throw $t("close");if(!Dt(this))throw new TypeError("The stream is not in a state that permits close");!function(e){if(!Dt(e))return;const t=e._controlledReadableStream;e._closeRequested=!0,0===e._queue.length&&(zt(e),Jt(t))}(this)}enqueue(e){if(!At(this))throw $t("enqueue");if(!Dt(this))throw new TypeError("The stream is not in a state that permits enqueue");return function(e,t){if(!Dt(e))return;const r=e._controlledReadableStream;if(Gt(r)&&J(r)>0)X(r,t,!1);else{let r;try{r=e._strategySizeAlgorithm(t)}catch(t){throw Lt(e,t),t}try{ce(e,t,r)}catch(t){throw Lt(e,t),t}}jt(e)}(this,e)}error(e){if(!At(this))throw $t("error");Lt(this,e)}[q](e){de(this);const t=this._cancelAlgorithm(e);return zt(this),t}[C](e){const t=this._controlledReadableStream;if(this._queue.length>0){const r=ue(this);this._closeRequested&&0===this._queue.length?(zt(this),Jt(t)):jt(this),e._chunkSteps(r)}else G(t,e),jt(this)}[P](){}}function At(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableStream")&&e instanceof ReadableStreamDefaultController)}function jt(e){const t=function(e){const t=e._controlledReadableStream;if(!Dt(e))return!1;if(!e._started)return!1;if(Gt(t)&&J(t)>0)return!0;if(Ft(e)>0)return!0;return!1}(e);if(!t)return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;h(e._pullAlgorithm(),(()=>(e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,jt(e)),null)),(t=>(Lt(e,t),null)))}function zt(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function Lt(e,t){const r=e._controlledReadableStream;"readable"===r._state&&(de(e),zt(e),Kt(r,t))}function Ft(e){const t=e._controlledReadableStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Dt(e){return!e._closeRequested&&"readable"===e._controlledReadableStream._state}function It(e,t,r,o){const n=Object.create(ReadableStreamDefaultController.prototype);let a,i,l;a=void 0!==t.start?()=>t.start(n):()=>{},i=void 0!==t.pull?()=>t.pull(n):()=>d(void 0),l=void 0!==t.cancel?e=>t.cancel(e):()=>d(void 0),function(e,t,r,o,n,a,i){t._controlledReadableStream=e,t._queue=void 0,t._queueTotalSize=void 0,de(t),t._started=!1,t._closeRequested=!1,t._pullAgain=!1,t._pulling=!1,t._strategySizeAlgorithm=i,t._strategyHWM=a,t._pullAlgorithm=o,t._cancelAlgorithm=n,e._readableStreamController=t,h(d(r()),(()=>(t._started=!0,jt(t),null)),(e=>(Lt(t,e),null)))}(e,n,a,i,l,r,o)}function $t(e){return new TypeError(`ReadableStreamDefaultController.prototype.${e} can only be used on a ReadableStreamDefaultController`)}function Mt(e,t,r){return I(e,r),r=>w(e,t,[r])}function Yt(e,t,r){return I(e,r),r=>w(e,t,[r])}function Qt(e,t,r){return I(e,r),r=>S(e,t,[r])}function Nt(e,t){if("bytes"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamType`);return e}function xt(e,t){if("byob"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamReaderMode`);return e}function Ht(e,t){D(e,t);const r=null==e?void 0:e.preventAbort,o=null==e?void 0:e.preventCancel,n=null==e?void 0:e.preventClose,a=null==e?void 0:e.signal;return void 0!==a&&function(e,t){if(!function(e){if("object"!=typeof e||null===e)return!1;try{return"boolean"==typeof e.aborted}catch(e){return!1}}(e))throw new TypeError(`${t} is not an AbortSignal.`)}(a,`${t} has member 'signal' that`),{preventAbort:Boolean(r),preventCancel:Boolean(o),preventClose:Boolean(n),signal:a}}function Vt(e,t){D(e,t);const r=null==e?void 0:e.readable;Y(r,"readable","ReadableWritablePair"),function(e,t){if(!H(e))throw new TypeError(`${t} is not a ReadableStream.`)}(r,`${t} has member 'readable' that`);const o=null==e?void 0:e.writable;return Y(o,"writable","ReadableWritablePair"),function(e,t){if(!V(e))throw new TypeError(`${t} is not a WritableStream.`)}(o,`${t} has member 'writable' that`),{readable:r,writable:o}}Object.defineProperties(ReadableStreamDefaultController.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},desiredSize:{enumerable:!0}}),a(ReadableStreamDefaultController.prototype.close,"close"),a(ReadableStreamDefaultController.prototype.enqueue,"enqueue"),a(ReadableStreamDefaultController.prototype.error,"error"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStreamDefaultController.prototype,t.toStringTag,{value:"ReadableStreamDefaultController",configurable:!0});class ReadableStream{constructor(e={},t={}){void 0===e?e=null:$(e,"First parameter");const r=Qe(t,"Second parameter"),o=function(e,t){D(e,t);const r=e,o=null==r?void 0:r.autoAllocateChunkSize,n=null==r?void 0:r.cancel,a=null==r?void 0:r.pull,i=null==r?void 0:r.start,l=null==r?void 0:r.type;return{autoAllocateChunkSize:void 0===o?void 0:x(o,`${t} has member 'autoAllocateChunkSize' that`),cancel:void 0===n?void 0:Mt(n,r,`${t} has member 'cancel' that`),pull:void 0===a?void 0:Yt(a,r,`${t} has member 'pull' that`),start:void 0===i?void 0:Qt(i,r,`${t} has member 'start' that`),type:void 0===l?void 0:Nt(l,`${t} has member 'type' that`)}}(e,"First parameter");var n;if((n=this)._state="readable",n._reader=void 0,n._storedError=void 0,n._disturbed=!1,"bytes"===o.type){if(void 0!==r.size)throw new RangeError("The strategy for a byte stream cannot have a size function");Be(this,o,Me(r,0))}else{const e=Ye(r);It(this,o,Me(r,1),e)}}get locked(){if(!Ut(this))throw Zt("locked");return Gt(this)}cancel(e){return Ut(this)?Gt(this)?f(new TypeError("Cannot cancel a stream that already has a reader")):Xt(this,e):f(Zt("cancel"))}getReader(e){if(!Ut(this))throw Zt("getReader");return void 0===function(e,t){D(e,t);const r=null==e?void 0:e.mode;return{mode:void 0===r?void 0:xt(r,`${t} has member 'mode' that`)}}(e,"First parameter").mode?new ReadableStreamDefaultReader(this):function(e){return new ReadableStreamBYOBReader(e)}(this)}pipeThrough(e,t={}){if(!H(this))throw Zt("pipeThrough");M(e,1,"pipeThrough");const r=Vt(e,"First parameter"),o=Ht(t,"Second parameter");if(this.locked)throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream");if(r.writable.locked)throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream");return y(kt(this,r.writable,o.preventClose,o.preventAbort,o.preventCancel,o.signal)),r.readable}pipeTo(e,t={}){if(!H(this))return f(Zt("pipeTo"));if(void 0===e)return f("Parameter 1 is required in 'pipeTo'.");if(!V(e))return f(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream"));let r;try{r=Ht(t,"Second parameter")}catch(e){return f(e)}return this.locked?f(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream")):e.locked?f(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream")):kt(this,e,r.preventClose,r.preventAbort,r.preventCancel,r.signal)}tee(){if(!H(this))throw Zt("tee");if(this.locked)throw new TypeError("Cannot tee a stream that already has a reader");return Bt(this)}values(e){if(!H(this))throw Zt("values");return function(e,t){const r=e.getReader(),o=new re(r,t),n=Object.create(oe);return n._asyncIteratorImpl=o,n}(this,function(e,t){D(e,t);const r=null==e?void 0:e.preventCancel;return{preventCancel:Boolean(r)}}(e,"First parameter").preventCancel)}}function Ut(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readableStreamController")&&e instanceof ReadableStream)}function Gt(e){return void 0!==e._reader}function Xt(e,t){if(e._disturbed=!0,"closed"===e._state)return d(void 0);if("errored"===e._state)return f(e._storedError);Jt(e);const o=e._reader;if(void 0!==o&&De(o)){const e=o._readIntoRequests;o._readIntoRequests=new v,e.forEach((e=>{e._closeSteps(void 0)}))}return m(e._readableStreamController[q](t),r)}function Jt(e){e._state="closed";const t=e._reader;if(void 0!==t&&(z(t),Z(t))){const e=t._readRequests;t._readRequests=new v,e.forEach((e=>{e._closeSteps()}))}}function Kt(e,t){e._state="errored",e._storedError=t;const r=e._reader;void 0!==r&&(j(r,t),Z(r)?ee(r,t):Ie(r,t))}function Zt(e){return new TypeError(`ReadableStream.prototype.${e} can only be used on a ReadableStream`)}function er(e,t){D(e,t);const r=null==e?void 0:e.highWaterMark;return Y(r,"highWaterMark","QueuingStrategyInit"),{highWaterMark:Q(r)}}Object.defineProperties(ReadableStream.prototype,{cancel:{enumerable:!0},getReader:{enumerable:!0},pipeThrough:{enumerable:!0},pipeTo:{enumerable:!0},tee:{enumerable:!0},values:{enumerable:!0},locked:{enumerable:!0}}),a(ReadableStream.prototype.cancel,"cancel"),a(ReadableStream.prototype.getReader,"getReader"),a(ReadableStream.prototype.pipeThrough,"pipeThrough"),a(ReadableStream.prototype.pipeTo,"pipeTo"),a(ReadableStream.prototype.tee,"tee"),a(ReadableStream.prototype.values,"values"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStream.prototype,t.toStringTag,{value:"ReadableStream",configurable:!0}),"symbol"==typeof t.asyncIterator&&Object.defineProperty(ReadableStream.prototype,t.asyncIterator,{value:ReadableStream.prototype.values,writable:!0,configurable:!0});const tr=e=>e.byteLength;a(tr,"size");class ByteLengthQueuingStrategy{constructor(e){M(e,1,"ByteLengthQueuingStrategy"),e=er(e,"First parameter"),this._byteLengthQueuingStrategyHighWaterMark=e.highWaterMark}get highWaterMark(){if(!or(this))throw rr("highWaterMark");return this._byteLengthQueuingStrategyHighWaterMark}get size(){if(!or(this))throw rr("size");return tr}}function rr(e){return new TypeError(`ByteLengthQueuingStrategy.prototype.${e} can only be used on a ByteLengthQueuingStrategy`)}function or(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_byteLengthQueuingStrategyHighWaterMark")&&e instanceof ByteLengthQueuingStrategy)}Object.defineProperties(ByteLengthQueuingStrategy.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof t.toStringTag&&Object.defineProperty(ByteLengthQueuingStrategy.prototype,t.toStringTag,{value:"ByteLengthQueuingStrategy",configurable:!0});const nr=()=>1;a(nr,"size");class CountQueuingStrategy{constructor(e){M(e,1,"CountQueuingStrategy"),e=er(e,"First parameter"),this._countQueuingStrategyHighWaterMark=e.highWaterMark}get highWaterMark(){if(!ir(this))throw ar("highWaterMark");return this._countQueuingStrategyHighWaterMark}get size(){if(!ir(this))throw ar("size");return nr}}function ar(e){return new TypeError(`CountQueuingStrategy.prototype.${e} can only be used on a CountQueuingStrategy`)}function ir(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_countQueuingStrategyHighWaterMark")&&e instanceof CountQueuingStrategy)}function lr(e,t,r){return I(e,r),r=>w(e,t,[r])}function sr(e,t,r){return I(e,r),r=>S(e,t,[r])}function ur(e,t,r){return I(e,r),(r,o)=>w(e,t,[r,o])}Object.defineProperties(CountQueuingStrategy.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof t.toStringTag&&Object.defineProperty(CountQueuingStrategy.prototype,t.toStringTag,{value:"CountQueuingStrategy",configurable:!0});class TransformStream{constructor(e={},t={},r={}){void 0===e&&(e=null);const o=Qe(t,"Second parameter"),n=Qe(r,"Third parameter"),a=function(e,t){D(e,t);const r=null==e?void 0:e.flush,o=null==e?void 0:e.readableType,n=null==e?void 0:e.start,a=null==e?void 0:e.transform,i=null==e?void 0:e.writableType;return{flush:void 0===r?void 0:lr(r,e,`${t} has member 'flush' that`),readableType:o,start:void 0===n?void 0:sr(n,e,`${t} has member 'start' that`),transform:void 0===a?void 0:ur(a,e,`${t} has member 'transform' that`),writableType:i}}(e,"First parameter");if(void 0!==a.readableType)throw new RangeError("Invalid readableType specified");if(void 0!==a.writableType)throw new RangeError("Invalid writableType specified");const i=Me(n,0),l=Ye(n),s=Me(o,1),u=Ye(o);let b;!function(e,t,r,o,n,a){function i(){return t}function l(t){return function(e,t){const r=e._transformStreamController;if(e._backpressure){return m(e._backpressureChangePromise,(()=>{if("erroring"===(Xe(e._writable)?e._writable._state:e._writableState))throw Xe(e._writable)?e._writable._storedError:e._writableStoredError;return mr(r,t)}))}return mr(r,t)}(e,t)}function s(t){return function(e,t){return dr(e,t),d(void 0)}(e,t)}function u(){return function(e){const t=e._transformStreamController,r=t._flushAlgorithm();return _r(t),m(r,(()=>{if("errored"===e._readableState)throw e._readableStoredError;Sr(e)&&wr(e)}),(t=>{throw dr(e,t),e._readableStoredError}))}(e)}function c(){return function(e){return br(e,!1),e._backpressureChangePromise}(e)}function f(t){return fr(e,t),d(void 0)}e._writableState="writable",e._writableStoredError=void 0,e._writableHasInFlightOperation=!1,e._writableStarted=!1,e._writable=function(e,t,r,o,n,a,i){return new WritableStream({start(r){e._writableController=r;try{const t=r.signal;void 0!==t&&t.addEventListener("abort",(()=>{"writable"===e._writableState&&(e._writableState="erroring",t.reason&&(e._writableStoredError=t.reason))}))}catch(e){}return m(t(),(()=>(e._writableStarted=!0,Pr(e),null)),(t=>{throw e._writableStarted=!0,Tr(e,t),t}))},write:t=>(function(e){e._writableHasInFlightOperation=!0}(e),m(r(t),(()=>(function(e){e._writableHasInFlightOperation=!1}(e),Pr(e),null)),(t=>{throw function(e,t){e._writableHasInFlightOperation=!1,Tr(e,t)}(e,t),t}))),close:()=>(function(e){e._writableHasInFlightOperation=!0}(e),m(o(),(()=>(function(e){e._writableHasInFlightOperation=!1;"erroring"===e._writableState&&(e._writableStoredError=void 0);e._writableState="closed"}(e),null)),(t=>{throw function(e,t){e._writableHasInFlightOperation=!1,e._writableState,Tr(e,t)}(e,t),t}))),abort:t=>(e._writableState="errored",e._writableStoredError=t,n(t))},{highWaterMark:a,size:i})}(e,i,l,u,s,r,o),e._readableState="readable",e._readableStoredError=void 0,e._readableCloseRequested=!1,e._readablePulling=!1,e._readable=function(e,t,r,o,n,a){return new ReadableStream({start:r=>(e._readableController=r,t().catch((t=>{vr(e,t)}))),pull:()=>(e._readablePulling=!0,r().catch((t=>{vr(e,t)}))),cancel:t=>(e._readableState="closed",o(t))},{highWaterMark:n,size:a})}(e,i,c,f,n,a),e._backpressure=void 0,e._backpressureChangePromise=void 0,e._backpressureChangePromise_resolve=void 0,br(e,!0),e._transformStreamController=void 0}(this,c((e=>{b=e})),s,u,i,l),function(e,t){const r=Object.create(TransformStreamDefaultController.prototype);let o,n;o=void 0!==t.transform?e=>t.transform(e,r):e=>{try{return pr(r,e),d(void 0)}catch(e){return f(e)}};n=void 0!==t.flush?()=>t.flush(r):()=>d(void 0);!function(e,t,r,o){t._controlledTransformStream=e,e._transformStreamController=t,t._transformAlgorithm=r,t._flushAlgorithm=o}(e,r,o,n)}(this,a),void 0!==a.start?b(a.start(this._transformStreamController)):b(void 0)}get readable(){if(!cr(this))throw gr("readable");return this._readable}get writable(){if(!cr(this))throw gr("writable");return this._writable}}function cr(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_transformStreamController")&&e instanceof TransformStream)}function dr(e,t){vr(e,t),fr(e,t)}function fr(e,t){_r(e._transformStreamController),function(e,t){e._writableController.error(t);"writable"===e._writableState&&qr(e,t)}(e,t),e._backpressure&&br(e,!1)}function br(e,t){void 0!==e._backpressureChangePromise&&e._backpressureChangePromise_resolve(),e._backpressureChangePromise=c((t=>{e._backpressureChangePromise_resolve=t})),e._backpressure=t}Object.defineProperties(TransformStream.prototype,{readable:{enumerable:!0},writable:{enumerable:!0}}),"symbol"==typeof t.toStringTag&&Object.defineProperty(TransformStream.prototype,t.toStringTag,{value:"TransformStream",configurable:!0});class TransformStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!hr(this))throw yr("desiredSize");return Rr(this._controlledTransformStream)}enqueue(e){if(!hr(this))throw yr("enqueue");pr(this,e)}error(e){if(!hr(this))throw yr("error");var t;t=e,dr(this._controlledTransformStream,t)}terminate(){if(!hr(this))throw yr("terminate");!function(e){const t=e._controlledTransformStream;Sr(t)&&wr(t);const r=new TypeError("TransformStream terminated");fr(t,r)}(this)}}function hr(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledTransformStream")&&e instanceof TransformStreamDefaultController)}function _r(e){e._transformAlgorithm=void 0,e._flushAlgorithm=void 0}function pr(e,t){const r=e._controlledTransformStream;if(!Sr(r))throw new TypeError("Readable side is not in a state that permits enqueue");try{!function(e,t){e._readablePulling=!1;try{e._readableController.enqueue(t)}catch(t){throw vr(e,t),t}}(r,t)}catch(e){throw fr(r,e),r._readableStoredError}const o=function(e){return!function(e){if(!Sr(e))return!1;if(e._readablePulling)return!0;if(Rr(e)>0)return!0;return!1}(e)}(r);o!==r._backpressure&&br(r,!0)}function mr(e,t){return m(e._transformAlgorithm(t),void 0,(t=>{throw dr(e._controlledTransformStream,t),t}))}function yr(e){return new TypeError(`TransformStreamDefaultController.prototype.${e} can only be used on a TransformStreamDefaultController`)}function gr(e){return new TypeError(`TransformStream.prototype.${e} can only be used on a TransformStream`)}function Sr(e){return!e._readableCloseRequested&&"readable"===e._readableState}function wr(e){e._readableState="closed",e._readableCloseRequested=!0,e._readableController.close()}function vr(e,t){"readable"===e._readableState&&(e._readableState="errored",e._readableStoredError=t),e._readableController.error(t)}function Rr(e){return e._readableController.desiredSize}function Tr(e,t){"writable"!==e._writableState?Cr(e):qr(e,t)}function qr(e,t){e._writableState="erroring",e._writableStoredError=t,!function(e){return e._writableHasInFlightOperation}(e)&&e._writableStarted&&Cr(e)}function Cr(e){e._writableState="errored"}function Pr(e){"erroring"===e._writableState&&Cr(e)}Object.defineProperties(TransformStreamDefaultController.prototype,{enqueue:{enumerable:!0},error:{enumerable:!0},terminate:{enumerable:!0},desiredSize:{enumerable:!0}}),a(TransformStreamDefaultController.prototype.enqueue,"enqueue"),a(TransformStreamDefaultController.prototype.error,"error"),a(TransformStreamDefaultController.prototype.terminate,"terminate"),"symbol"==typeof t.toStringTag&&Object.defineProperty(TransformStreamDefaultController.prototype,t.toStringTag,{value:"TransformStreamDefaultController",configurable:!0}),e.ByteLengthQueuingStrategy=ByteLengthQueuingStrategy,e.CountQueuingStrategy=CountQueuingStrategy,e.ReadableByteStreamController=ReadableByteStreamController,e.ReadableStream=ReadableStream,e.ReadableStreamBYOBReader=ReadableStreamBYOBReader,e.ReadableStreamBYOBRequest=ReadableStreamBYOBRequest,e.ReadableStreamDefaultController=ReadableStreamDefaultController,e.ReadableStreamDefaultReader=ReadableStreamDefaultReader,e.TransformStream=TransformStream,e.TransformStreamDefaultController=TransformStreamDefaultController,e.WritableStream=WritableStream,e.WritableStreamDefaultController=WritableStreamDefaultController,e.WritableStreamDefaultWriter=WritableStreamDefaultWriter,Object.defineProperty(e,"__esModule",{value:!0})})); + + +/***/ }), + +/***/ 845: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; +/*! + * humanize-ms - index.js + * Copyright(c) 2014 dead_horse + * MIT Licensed + */ + + + +/** + * Module dependencies. + */ + +var util = __nccwpck_require__(3837); +var ms = __nccwpck_require__(900); + +module.exports = function (t) { + if (typeof t === 'number') return t; + var r = ms(t); + if (r === undefined) { + var err = new Error(util.format('humanize-ms(%j) result undefined', t)); + console.warn(err.stack); + } + return r; +}; + + +/***/ }), + +/***/ 3287: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +/*! + * is-plain-object + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + +function isObject(o) { + return Object.prototype.toString.call(o) === '[object Object]'; +} + +function isPlainObject(o) { + var ctor,prot; + + if (isObject(o) === false) return false; + + // If has modified constructor + ctor = o.constructor; + if (ctor === undefined) return true; + + // If has modified prototype + prot = ctor.prototype; + if (isObject(prot) === false) return false; + + // If constructor does not have an Object-specific method + if (prot.hasOwnProperty('isPrototypeOf') === false) { + return false; + } + + // Most likely a plain Object + return true; +} + +exports.isPlainObject = isPlainObject; + + +/***/ }), + +/***/ 900: +/***/ ((module) => { + +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; +var w = d * 7; +var y = d * 365.25; + +/** + * Parse or format the given `val`. + * + * Options: + * + * - `long` verbose formatting [false] + * + * @param {String|Number} val + * @param {Object} [options] + * @throws {Error} throw an error if val is not a non-empty string or a number + * @return {String|Number} + * @api public + */ + +module.exports = function(val, options) { + options = options || {}; + var type = typeof val; + if (type === 'string' && val.length > 0) { + return parse(val); + } else if (type === 'number' && isFinite(val)) { + return options.long ? fmtLong(val) : fmtShort(val); + } + throw new Error( + 'val is not a non-empty string or a valid number. val=' + + JSON.stringify(val) + ); +}; + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + str = String(str); + if (str.length > 100) { + return; + } + var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( + str + ); + if (!match) { + return; + } + var n = parseFloat(match[1]); + var type = (match[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'yrs': + case 'yr': + case 'y': + return n * y; + case 'weeks': + case 'week': + case 'w': + return n * w; + case 'days': + case 'day': + case 'd': + return n * d; + case 'hours': + case 'hour': + case 'hrs': + case 'hr': + case 'h': + return n * h; + case 'minutes': + case 'minute': + case 'mins': + case 'min': + case 'm': + return n * m; + case 'seconds': + case 'second': + case 'secs': + case 'sec': + case 's': + return n * s; + case 'milliseconds': + case 'millisecond': + case 'msecs': + case 'msec': + case 'ms': + return n; + default: + return undefined; + } +} + +/** + * Short format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtShort(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return Math.round(ms / d) + 'd'; + } + if (msAbs >= h) { + return Math.round(ms / h) + 'h'; + } + if (msAbs >= m) { + return Math.round(ms / m) + 'm'; + } + if (msAbs >= s) { + return Math.round(ms / s) + 's'; + } + return ms + 'ms'; +} + +/** + * Long format for `ms`. + * + * @param {Number} ms + * @return {String} + * @api private + */ + +function fmtLong(ms) { + var msAbs = Math.abs(ms); + if (msAbs >= d) { + return plural(ms, msAbs, d, 'day'); + } + if (msAbs >= h) { + return plural(ms, msAbs, h, 'hour'); + } + if (msAbs >= m) { + return plural(ms, msAbs, m, 'minute'); + } + if (msAbs >= s) { + return plural(ms, msAbs, s, 'second'); + } + return ms + ' ms'; +} + +/** + * Pluralization helper. + */ + +function plural(ms, msAbs, n, name) { + var isPlural = msAbs >= n * 1.5; + return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); +} + + +/***/ }), + +/***/ 7760: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +/*! node-domexception. MIT License. Jimmy Wärting */ + +if (!globalThis.DOMException) { + try { + const { MessageChannel } = __nccwpck_require__(1267), + port = new MessageChannel().port1, + ab = new ArrayBuffer() + port.postMessage(ab, [ab, ab]) + } catch (err) { + err.constructor.name === 'DOMException' && ( + globalThis.DOMException = err.constructor + ) + } +} + +module.exports = globalThis.DOMException + + +/***/ }), + +/***/ 467: +/***/ ((module, exports, __nccwpck_require__) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var Stream = _interopDefault(__nccwpck_require__(2781)); +var http = _interopDefault(__nccwpck_require__(3685)); +var Url = _interopDefault(__nccwpck_require__(7310)); +var whatwgUrl = _interopDefault(__nccwpck_require__(3323)); +var https = _interopDefault(__nccwpck_require__(5687)); +var zlib = _interopDefault(__nccwpck_require__(9796)); + +// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js + +// fix for "Readable" isn't a named export issue +const Readable = Stream.Readable; + +const BUFFER = Symbol('buffer'); +const TYPE = Symbol('type'); + +class Blob { + constructor() { + this[TYPE] = ''; + + const blobParts = arguments[0]; + const options = arguments[1]; + + const buffers = []; + let size = 0; + + if (blobParts) { + const a = blobParts; + const length = Number(a.length); + for (let i = 0; i < length; i++) { + const element = a[i]; + let buffer; + if (element instanceof Buffer) { + buffer = element; + } else if (ArrayBuffer.isView(element)) { + buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength); + } else if (element instanceof ArrayBuffer) { + buffer = Buffer.from(element); + } else if (element instanceof Blob) { + buffer = element[BUFFER]; + } else { + buffer = Buffer.from(typeof element === 'string' ? element : String(element)); + } + size += buffer.length; + buffers.push(buffer); + } + } + + this[BUFFER] = Buffer.concat(buffers); + + let type = options && options.type !== undefined && String(options.type).toLowerCase(); + if (type && !/[^\u0020-\u007E]/.test(type)) { + this[TYPE] = type; + } + } + get size() { + return this[BUFFER].length; + } + get type() { + return this[TYPE]; + } + text() { + return Promise.resolve(this[BUFFER].toString()); + } + arrayBuffer() { + const buf = this[BUFFER]; + const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + return Promise.resolve(ab); + } + stream() { + const readable = new Readable(); + readable._read = function () {}; + readable.push(this[BUFFER]); + readable.push(null); + return readable; + } + toString() { + return '[object Blob]'; + } + slice() { + const size = this.size; + + const start = arguments[0]; + const end = arguments[1]; + let relativeStart, relativeEnd; + if (start === undefined) { + relativeStart = 0; + } else if (start < 0) { + relativeStart = Math.max(size + start, 0); + } else { + relativeStart = Math.min(start, size); + } + if (end === undefined) { + relativeEnd = size; + } else if (end < 0) { + relativeEnd = Math.max(size + end, 0); + } else { + relativeEnd = Math.min(end, size); + } + const span = Math.max(relativeEnd - relativeStart, 0); + + const buffer = this[BUFFER]; + const slicedBuffer = buffer.slice(relativeStart, relativeStart + span); + const blob = new Blob([], { type: arguments[2] }); + blob[BUFFER] = slicedBuffer; + return blob; + } +} + +Object.defineProperties(Blob.prototype, { + size: { enumerable: true }, + type: { enumerable: true }, + slice: { enumerable: true } +}); + +Object.defineProperty(Blob.prototype, Symbol.toStringTag, { + value: 'Blob', + writable: false, + enumerable: false, + configurable: true +}); + +/** + * fetch-error.js + * + * FetchError interface for operational errors + */ + +/** + * Create FetchError instance + * + * @param String message Error message for human + * @param String type Error type for machine + * @param String systemError For Node.js system error + * @return FetchError + */ +function FetchError(message, type, systemError) { + Error.call(this, message); + + this.message = message; + this.type = type; + + // when err.type is `system`, err.code contains system error code + if (systemError) { + this.code = this.errno = systemError.code; + } + + // hide custom error implementation details from end-users + Error.captureStackTrace(this, this.constructor); +} + +FetchError.prototype = Object.create(Error.prototype); +FetchError.prototype.constructor = FetchError; +FetchError.prototype.name = 'FetchError'; + +let convert; +try { + convert = (__nccwpck_require__(2877).convert); +} catch (e) {} + +const INTERNALS = Symbol('Body internals'); + +// fix an issue where "PassThrough" isn't a named export for node <10 +const PassThrough = Stream.PassThrough; + +/** + * Body mixin + * + * Ref: https://fetch.spec.whatwg.org/#body + * + * @param Stream body Readable stream + * @param Object opts Response options + * @return Void + */ +function Body(body) { + var _this = this; + + var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, + _ref$size = _ref.size; + + let size = _ref$size === undefined ? 0 : _ref$size; + var _ref$timeout = _ref.timeout; + let timeout = _ref$timeout === undefined ? 0 : _ref$timeout; + + if (body == null) { + // body is undefined or null + body = null; + } else if (isURLSearchParams(body)) { + // body is a URLSearchParams + body = Buffer.from(body.toString()); + } else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') { + // body is ArrayBuffer + body = Buffer.from(body); + } else if (ArrayBuffer.isView(body)) { + // body is ArrayBufferView + body = Buffer.from(body.buffer, body.byteOffset, body.byteLength); + } else if (body instanceof Stream) ; else { + // none of the above + // coerce to string then buffer + body = Buffer.from(String(body)); + } + this[INTERNALS] = { + body, + disturbed: false, + error: null + }; + this.size = size; + this.timeout = timeout; + + if (body instanceof Stream) { + body.on('error', function (err) { + const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err); + _this[INTERNALS].error = error; + }); + } +} + +Body.prototype = { + get body() { + return this[INTERNALS].body; + }, + + get bodyUsed() { + return this[INTERNALS].disturbed; + }, + + /** + * Decode response as ArrayBuffer + * + * @return Promise + */ + arrayBuffer() { + return consumeBody.call(this).then(function (buf) { + return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); + }); + }, + + /** + * Return raw response as Blob + * + * @return Promise + */ + blob() { + let ct = this.headers && this.headers.get('content-type') || ''; + return consumeBody.call(this).then(function (buf) { + return Object.assign( + // Prevent copying + new Blob([], { + type: ct.toLowerCase() + }), { + [BUFFER]: buf + }); + }); + }, + + /** + * Decode response as json + * + * @return Promise + */ + json() { + var _this2 = this; + + return consumeBody.call(this).then(function (buffer) { + try { + return JSON.parse(buffer.toString()); + } catch (err) { + return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json')); + } + }); + }, + + /** + * Decode response as text + * + * @return Promise + */ + text() { + return consumeBody.call(this).then(function (buffer) { + return buffer.toString(); + }); + }, + + /** + * Decode response as buffer (non-spec api) + * + * @return Promise + */ + buffer() { + return consumeBody.call(this); + }, + + /** + * Decode response as text, while automatically detecting the encoding and + * trying to decode to UTF-8 (non-spec api) + * + * @return Promise + */ + textConverted() { + var _this3 = this; + + return consumeBody.call(this).then(function (buffer) { + return convertBody(buffer, _this3.headers); + }); + } +}; + +// In browsers, all properties are enumerable. +Object.defineProperties(Body.prototype, { + body: { enumerable: true }, + bodyUsed: { enumerable: true }, + arrayBuffer: { enumerable: true }, + blob: { enumerable: true }, + json: { enumerable: true }, + text: { enumerable: true } +}); + +Body.mixIn = function (proto) { + for (const name of Object.getOwnPropertyNames(Body.prototype)) { + // istanbul ignore else: future proof + if (!(name in proto)) { + const desc = Object.getOwnPropertyDescriptor(Body.prototype, name); + Object.defineProperty(proto, name, desc); + } + } +}; + +/** + * Consume and convert an entire Body to a Buffer. + * + * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body + * + * @return Promise + */ +function consumeBody() { + var _this4 = this; + + if (this[INTERNALS].disturbed) { + return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`)); + } + + this[INTERNALS].disturbed = true; + + if (this[INTERNALS].error) { + return Body.Promise.reject(this[INTERNALS].error); + } + + let body = this.body; + + // body is null + if (body === null) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + + // body is blob + if (isBlob(body)) { + body = body.stream(); + } + + // body is buffer + if (Buffer.isBuffer(body)) { + return Body.Promise.resolve(body); + } + + // istanbul ignore if: should never happen + if (!(body instanceof Stream)) { + return Body.Promise.resolve(Buffer.alloc(0)); + } + + // body is stream + // get ready to actually consume the body + let accum = []; + let accumBytes = 0; + let abort = false; + + return new Body.Promise(function (resolve, reject) { + let resTimeout; + + // allow timeout on slow response body + if (_this4.timeout) { + resTimeout = setTimeout(function () { + abort = true; + reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout')); + }, _this4.timeout); + } + + // handle stream errors + body.on('error', function (err) { + if (err.name === 'AbortError') { + // if the request was aborted, reject with this Error + abort = true; + reject(err); + } else { + // other errors, such as incorrect content-encoding + reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err)); + } + }); + + body.on('data', function (chunk) { + if (abort || chunk === null) { + return; + } + + if (_this4.size && accumBytes + chunk.length > _this4.size) { + abort = true; + reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size')); + return; + } + + accumBytes += chunk.length; + accum.push(chunk); + }); + + body.on('end', function () { + if (abort) { + return; + } + + clearTimeout(resTimeout); + + try { + resolve(Buffer.concat(accum, accumBytes)); + } catch (err) { + // handle streams that have accumulated too much data (issue #414) + reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err)); + } + }); + }); +} + +/** + * Detect buffer encoding and convert to target encoding + * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding + * + * @param Buffer buffer Incoming buffer + * @param String encoding Target encoding + * @return String + */ +function convertBody(buffer, headers) { + if (typeof convert !== 'function') { + throw new Error('The package `encoding` must be installed to use the textConverted() function'); + } + + const ct = headers.get('content-type'); + let charset = 'utf-8'; + let res, str; + + // header + if (ct) { + res = /charset=([^;]*)/i.exec(ct); + } + + // no charset in content type, peek at response body for at most 1024 bytes + str = buffer.slice(0, 1024).toString(); + + // html5 + if (!res && str) { + res = / 0 && arguments[0] !== undefined ? arguments[0] : undefined; + + this[MAP] = Object.create(null); + + if (init instanceof Headers) { + const rawHeaders = init.raw(); + const headerNames = Object.keys(rawHeaders); + + for (const headerName of headerNames) { + for (const value of rawHeaders[headerName]) { + this.append(headerName, value); + } + } + + return; + } + + // We don't worry about converting prop to ByteString here as append() + // will handle it. + if (init == null) ; else if (typeof init === 'object') { + const method = init[Symbol.iterator]; + if (method != null) { + if (typeof method !== 'function') { + throw new TypeError('Header pairs must be iterable'); + } + + // sequence> + // Note: per spec we have to first exhaust the lists then process them + const pairs = []; + for (const pair of init) { + if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') { + throw new TypeError('Each header pair must be iterable'); + } + pairs.push(Array.from(pair)); + } + + for (const pair of pairs) { + if (pair.length !== 2) { + throw new TypeError('Each header pair must be a name/value tuple'); + } + this.append(pair[0], pair[1]); + } + } else { + // record + for (const key of Object.keys(init)) { + const value = init[key]; + this.append(key, value); + } + } + } else { + throw new TypeError('Provided initializer must be an object'); + } + } + + /** + * Return combined header value given name + * + * @param String name Header name + * @return Mixed + */ + get(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key === undefined) { + return null; + } + + return this[MAP][key].join(', '); + } + + /** + * Iterate over all headers + * + * @param Function callback Executed for each item with parameters (value, name, thisArg) + * @param Boolean thisArg `this` context for callback function + * @return Void + */ + forEach(callback) { + let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; + + let pairs = getHeaders(this); + let i = 0; + while (i < pairs.length) { + var _pairs$i = pairs[i]; + const name = _pairs$i[0], + value = _pairs$i[1]; + + callback.call(thisArg, value, name, this); + pairs = getHeaders(this); + i++; + } + } + + /** + * Overwrite header values given name + * + * @param String name Header name + * @param String value Header value + * @return Void + */ + set(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + this[MAP][key !== undefined ? key : name] = [value]; + } + + /** + * Append a value onto existing header + * + * @param String name Header name + * @param String value Header value + * @return Void + */ + append(name, value) { + name = `${name}`; + value = `${value}`; + validateName(name); + validateValue(value); + const key = find(this[MAP], name); + if (key !== undefined) { + this[MAP][key].push(value); + } else { + this[MAP][name] = [value]; + } + } + + /** + * Check for header name existence + * + * @param String name Header name + * @return Boolean + */ + has(name) { + name = `${name}`; + validateName(name); + return find(this[MAP], name) !== undefined; + } + + /** + * Delete all header values given name + * + * @param String name Header name + * @return Void + */ + delete(name) { + name = `${name}`; + validateName(name); + const key = find(this[MAP], name); + if (key !== undefined) { + delete this[MAP][key]; + } + } + + /** + * Return raw headers (non-spec api) + * + * @return Object + */ + raw() { + return this[MAP]; + } + + /** + * Get an iterator on keys. + * + * @return Iterator + */ + keys() { + return createHeadersIterator(this, 'key'); + } + + /** + * Get an iterator on values. + * + * @return Iterator + */ + values() { + return createHeadersIterator(this, 'value'); + } + + /** + * Get an iterator on entries. + * + * This is the default iterator of the Headers object. + * + * @return Iterator + */ + [Symbol.iterator]() { + return createHeadersIterator(this, 'key+value'); + } +} +Headers.prototype.entries = Headers.prototype[Symbol.iterator]; + +Object.defineProperty(Headers.prototype, Symbol.toStringTag, { + value: 'Headers', + writable: false, + enumerable: false, + configurable: true +}); + +Object.defineProperties(Headers.prototype, { + get: { enumerable: true }, + forEach: { enumerable: true }, + set: { enumerable: true }, + append: { enumerable: true }, + has: { enumerable: true }, + delete: { enumerable: true }, + keys: { enumerable: true }, + values: { enumerable: true }, + entries: { enumerable: true } +}); + +function getHeaders(headers) { + let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value'; + + const keys = Object.keys(headers[MAP]).sort(); + return keys.map(kind === 'key' ? function (k) { + return k.toLowerCase(); + } : kind === 'value' ? function (k) { + return headers[MAP][k].join(', '); + } : function (k) { + return [k.toLowerCase(), headers[MAP][k].join(', ')]; + }); +} + +const INTERNAL = Symbol('internal'); + +function createHeadersIterator(target, kind) { + const iterator = Object.create(HeadersIteratorPrototype); + iterator[INTERNAL] = { + target, + kind, + index: 0 + }; + return iterator; +} + +const HeadersIteratorPrototype = Object.setPrototypeOf({ + next() { + // istanbul ignore if + if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) { + throw new TypeError('Value of `this` is not a HeadersIterator'); + } + + var _INTERNAL = this[INTERNAL]; + const target = _INTERNAL.target, + kind = _INTERNAL.kind, + index = _INTERNAL.index; + + const values = getHeaders(target, kind); + const len = values.length; + if (index >= len) { + return { + value: undefined, + done: true + }; + } + + this[INTERNAL].index = index + 1; + + return { + value: values[index], + done: false + }; + } +}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))); + +Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, { + value: 'HeadersIterator', + writable: false, + enumerable: false, + configurable: true +}); + +/** + * Export the Headers object in a form that Node.js can consume. + * + * @param Headers headers + * @return Object + */ +function exportNodeCompatibleHeaders(headers) { + const obj = Object.assign({ __proto__: null }, headers[MAP]); + + // http.request() only supports string as Host header. This hack makes + // specifying custom Host header possible. + const hostHeaderKey = find(headers[MAP], 'Host'); + if (hostHeaderKey !== undefined) { + obj[hostHeaderKey] = obj[hostHeaderKey][0]; + } + + return obj; +} + +/** + * Create a Headers object from an object of headers, ignoring those that do + * not conform to HTTP grammar productions. + * + * @param Object obj Object of headers + * @return Headers + */ +function createHeadersLenient(obj) { + const headers = new Headers(); + for (const name of Object.keys(obj)) { + if (invalidTokenRegex.test(name)) { + continue; + } + if (Array.isArray(obj[name])) { + for (const val of obj[name]) { + if (invalidHeaderCharRegex.test(val)) { + continue; + } + if (headers[MAP][name] === undefined) { + headers[MAP][name] = [val]; + } else { + headers[MAP][name].push(val); + } + } + } else if (!invalidHeaderCharRegex.test(obj[name])) { + headers[MAP][name] = [obj[name]]; + } + } + return headers; +} + +const INTERNALS$1 = Symbol('Response internals'); + +// fix an issue where "STATUS_CODES" aren't a named export for node <10 +const STATUS_CODES = http.STATUS_CODES; + +/** + * Response class + * + * @param Stream body Readable stream + * @param Object opts Response options + * @return Void + */ +class Response { + constructor() { + let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; + let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + Body.call(this, body, opts); + + const status = opts.status || 200; + const headers = new Headers(opts.headers); + + if (body != null && !headers.has('Content-Type')) { + const contentType = extractContentType(body); + if (contentType) { + headers.append('Content-Type', contentType); + } + } + + this[INTERNALS$1] = { + url: opts.url, + status, + statusText: opts.statusText || STATUS_CODES[status], + headers, + counter: opts.counter + }; + } + + get url() { + return this[INTERNALS$1].url || ''; + } + + get status() { + return this[INTERNALS$1].status; + } + + /** + * Convenience property representing if the request ended normally + */ + get ok() { + return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300; + } + + get redirected() { + return this[INTERNALS$1].counter > 0; + } + + get statusText() { + return this[INTERNALS$1].statusText; + } + + get headers() { + return this[INTERNALS$1].headers; + } + + /** + * Clone this response + * + * @return Response + */ + clone() { + return new Response(clone(this), { + url: this.url, + status: this.status, + statusText: this.statusText, + headers: this.headers, + ok: this.ok, + redirected: this.redirected + }); + } +} + +Body.mixIn(Response.prototype); + +Object.defineProperties(Response.prototype, { + url: { enumerable: true }, + status: { enumerable: true }, + ok: { enumerable: true }, + redirected: { enumerable: true }, + statusText: { enumerable: true }, + headers: { enumerable: true }, + clone: { enumerable: true } +}); + +Object.defineProperty(Response.prototype, Symbol.toStringTag, { + value: 'Response', + writable: false, + enumerable: false, + configurable: true +}); + +const INTERNALS$2 = Symbol('Request internals'); +const URL = Url.URL || whatwgUrl.URL; + +// fix an issue where "format", "parse" aren't a named export for node <10 +const parse_url = Url.parse; +const format_url = Url.format; + +/** + * Wrapper around `new URL` to handle arbitrary URLs + * + * @param {string} urlStr + * @return {void} + */ +function parseURL(urlStr) { + /* + Check whether the URL is absolute or not + Scheme: https://tools.ietf.org/html/rfc3986#section-3.1 + Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3 + */ + if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) { + urlStr = new URL(urlStr).toString(); + } + + // Fallback to old implementation for arbitrary URLs + return parse_url(urlStr); +} + +const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; + +/** + * Check if a value is an instance of Request. + * + * @param Mixed input + * @return Boolean + */ +function isRequest(input) { + return typeof input === 'object' && typeof input[INTERNALS$2] === 'object'; +} + +function isAbortSignal(signal) { + const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal); + return !!(proto && proto.constructor.name === 'AbortSignal'); +} + +/** + * Request class + * + * @param Mixed input Url or Request instance + * @param Object init Custom options + * @return Void + */ +class Request { + constructor(input) { + let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + + let parsedURL; + + // normalize input + if (!isRequest(input)) { + if (input && input.href) { + // in order to support Node.js' Url objects; though WHATWG's URL objects + // will fall into this branch also (since their `toString()` will return + // `href` property anyway) + parsedURL = parseURL(input.href); + } else { + // coerce input to a string before attempting to parse + parsedURL = parseURL(`${input}`); + } + input = {}; + } else { + parsedURL = parseURL(input.url); + } + + let method = init.method || input.method || 'GET'; + method = method.toUpperCase(); + + if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) { + throw new TypeError('Request with GET/HEAD method cannot have body'); + } + + let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null; + + Body.call(this, inputBody, { + timeout: init.timeout || input.timeout || 0, + size: init.size || input.size || 0 + }); + + const headers = new Headers(init.headers || input.headers || {}); + + if (inputBody != null && !headers.has('Content-Type')) { + const contentType = extractContentType(inputBody); + if (contentType) { + headers.append('Content-Type', contentType); + } + } + + let signal = isRequest(input) ? input.signal : null; + if ('signal' in init) signal = init.signal; + + if (signal != null && !isAbortSignal(signal)) { + throw new TypeError('Expected signal to be an instanceof AbortSignal'); + } + + this[INTERNALS$2] = { + method, + redirect: init.redirect || input.redirect || 'follow', + headers, + parsedURL, + signal + }; + + // node-fetch-only options + this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20; + this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true; + this.counter = init.counter || input.counter || 0; + this.agent = init.agent || input.agent; + } + + get method() { + return this[INTERNALS$2].method; + } + + get url() { + return format_url(this[INTERNALS$2].parsedURL); + } + + get headers() { + return this[INTERNALS$2].headers; + } + + get redirect() { + return this[INTERNALS$2].redirect; + } + + get signal() { + return this[INTERNALS$2].signal; + } + + /** + * Clone this request + * + * @return Request + */ + clone() { + return new Request(this); + } +} + +Body.mixIn(Request.prototype); + +Object.defineProperty(Request.prototype, Symbol.toStringTag, { + value: 'Request', + writable: false, + enumerable: false, + configurable: true +}); + +Object.defineProperties(Request.prototype, { + method: { enumerable: true }, + url: { enumerable: true }, + headers: { enumerable: true }, + redirect: { enumerable: true }, + clone: { enumerable: true }, + signal: { enumerable: true } +}); + +/** + * Convert a Request to Node.js http request options. + * + * @param Request A Request instance + * @return Object The options object to be passed to http.request + */ +function getNodeRequestOptions(request) { + const parsedURL = request[INTERNALS$2].parsedURL; + const headers = new Headers(request[INTERNALS$2].headers); + + // fetch step 1.3 + if (!headers.has('Accept')) { + headers.set('Accept', '*/*'); + } + + // Basic fetch + if (!parsedURL.protocol || !parsedURL.hostname) { + throw new TypeError('Only absolute URLs are supported'); + } + + if (!/^https?:$/.test(parsedURL.protocol)) { + throw new TypeError('Only HTTP(S) protocols are supported'); + } + + if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) { + throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8'); + } + + // HTTP-network-or-cache fetch steps 2.4-2.7 + let contentLengthValue = null; + if (request.body == null && /^(POST|PUT)$/i.test(request.method)) { + contentLengthValue = '0'; + } + if (request.body != null) { + const totalBytes = getTotalBytes(request); + if (typeof totalBytes === 'number') { + contentLengthValue = String(totalBytes); + } + } + if (contentLengthValue) { + headers.set('Content-Length', contentLengthValue); + } + + // HTTP-network-or-cache fetch step 2.11 + if (!headers.has('User-Agent')) { + headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)'); + } + + // HTTP-network-or-cache fetch step 2.15 + if (request.compress && !headers.has('Accept-Encoding')) { + headers.set('Accept-Encoding', 'gzip,deflate'); + } + + let agent = request.agent; + if (typeof agent === 'function') { + agent = agent(parsedURL); + } + + if (!headers.has('Connection') && !agent) { + headers.set('Connection', 'close'); + } + + // HTTP-network fetch step 4.2 + // chunked encoding is handled by Node.js + + return Object.assign({}, parsedURL, { + method: request.method, + headers: exportNodeCompatibleHeaders(headers), + agent + }); +} + +/** + * abort-error.js + * + * AbortError interface for cancelled requests + */ + +/** + * Create AbortError instance + * + * @param String message Error message for human + * @return AbortError + */ +function AbortError(message) { + Error.call(this, message); + + this.type = 'aborted'; + this.message = message; + + // hide custom error implementation details from end-users + Error.captureStackTrace(this, this.constructor); +} + +AbortError.prototype = Object.create(Error.prototype); +AbortError.prototype.constructor = AbortError; +AbortError.prototype.name = 'AbortError'; + +const URL$1 = Url.URL || whatwgUrl.URL; + +// fix an issue where "PassThrough", "resolve" aren't a named export for node <10 +const PassThrough$1 = Stream.PassThrough; + +const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) { + const orig = new URL$1(original).hostname; + const dest = new URL$1(destination).hostname; + + return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest); +}; + +/** + * Fetch function + * + * @param Mixed url Absolute url or Request instance + * @param Object opts Fetch options + * @return Promise + */ +function fetch(url, opts) { + + // allow custom promise + if (!fetch.Promise) { + throw new Error('native promise missing, set fetch.Promise to your favorite alternative'); + } + + Body.Promise = fetch.Promise; + + // wrap http.request into fetch + return new fetch.Promise(function (resolve, reject) { + // build request object + const request = new Request(url, opts); + const options = getNodeRequestOptions(request); + + const send = (options.protocol === 'https:' ? https : http).request; + const signal = request.signal; + + let response = null; + + const abort = function abort() { + let error = new AbortError('The user aborted a request.'); + reject(error); + if (request.body && request.body instanceof Stream.Readable) { + request.body.destroy(error); + } + if (!response || !response.body) return; + response.body.emit('error', error); + }; + + if (signal && signal.aborted) { + abort(); + return; + } + + const abortAndFinalize = function abortAndFinalize() { + abort(); + finalize(); + }; + + // send request + const req = send(options); + let reqTimeout; + + if (signal) { + signal.addEventListener('abort', abortAndFinalize); + } + + function finalize() { + req.abort(); + if (signal) signal.removeEventListener('abort', abortAndFinalize); + clearTimeout(reqTimeout); + } + + if (request.timeout) { + req.once('socket', function (socket) { + reqTimeout = setTimeout(function () { + reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout')); + finalize(); + }, request.timeout); + }); + } + + req.on('error', function (err) { + reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err)); + finalize(); + }); + + req.on('response', function (res) { + clearTimeout(reqTimeout); + + const headers = createHeadersLenient(res.headers); + + // HTTP fetch step 5 + if (fetch.isRedirect(res.statusCode)) { + // HTTP fetch step 5.2 + const location = headers.get('Location'); + + // HTTP fetch step 5.3 + let locationURL = null; + try { + locationURL = location === null ? null : new URL$1(location, request.url).toString(); + } catch (err) { + // error here can only be invalid URL in Location: header + // do not throw when options.redirect == manual + // let the user extract the errorneous redirect URL + if (request.redirect !== 'manual') { + reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect')); + finalize(); + return; + } + } + + // HTTP fetch step 5.5 + switch (request.redirect) { + case 'error': + reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect')); + finalize(); + return; + case 'manual': + // node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL. + if (locationURL !== null) { + // handle corrupted header + try { + headers.set('Location', locationURL); + } catch (err) { + // istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request + reject(err); + } + } + break; + case 'follow': + // HTTP-redirect fetch step 2 + if (locationURL === null) { + break; + } + + // HTTP-redirect fetch step 5 + if (request.counter >= request.follow) { + reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect')); + finalize(); + return; + } + + // HTTP-redirect fetch step 6 (counter increment) + // Create a new Request object. + const requestOpts = { + headers: new Headers(request.headers), + follow: request.follow, + counter: request.counter + 1, + agent: request.agent, + compress: request.compress, + method: request.method, + body: request.body, + signal: request.signal, + timeout: request.timeout, + size: request.size + }; + + if (!isDomainOrSubdomain(request.url, locationURL)) { + for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) { + requestOpts.headers.delete(name); + } + } + + // HTTP-redirect fetch step 9 + if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) { + reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect')); + finalize(); + return; + } + + // HTTP-redirect fetch step 11 + if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') { + requestOpts.method = 'GET'; + requestOpts.body = undefined; + requestOpts.headers.delete('content-length'); + } + + // HTTP-redirect fetch step 15 + resolve(fetch(new Request(locationURL, requestOpts))); + finalize(); + return; + } + } + + // prepare response + res.once('end', function () { + if (signal) signal.removeEventListener('abort', abortAndFinalize); + }); + let body = res.pipe(new PassThrough$1()); + + const response_options = { + url: request.url, + status: res.statusCode, + statusText: res.statusMessage, + headers: headers, + size: request.size, + timeout: request.timeout, + counter: request.counter + }; + + // HTTP-network fetch step 12.1.1.3 + const codings = headers.get('Content-Encoding'); + + // HTTP-network fetch step 12.1.1.4: handle content codings + + // in following scenarios we ignore compression support + // 1. compression support is disabled + // 2. HEAD request + // 3. no Content-Encoding header + // 4. no content response (204) + // 5. content not modified response (304) + if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) { + response = new Response(body, response_options); + resolve(response); + return; + } + + // For Node v6+ + // Be less strict when decoding compressed responses, since sometimes + // servers send slightly invalid responses that are still accepted + // by common browsers. + // Always using Z_SYNC_FLUSH is what cURL does. + const zlibOptions = { + flush: zlib.Z_SYNC_FLUSH, + finishFlush: zlib.Z_SYNC_FLUSH + }; + + // for gzip + if (codings == 'gzip' || codings == 'x-gzip') { + body = body.pipe(zlib.createGunzip(zlibOptions)); + response = new Response(body, response_options); + resolve(response); + return; + } + + // for deflate + if (codings == 'deflate' || codings == 'x-deflate') { + // handle the infamous raw deflate response from old servers + // a hack for old IIS and Apache servers + const raw = res.pipe(new PassThrough$1()); + raw.once('data', function (chunk) { + // see http://stackoverflow.com/questions/37519828 + if ((chunk[0] & 0x0F) === 0x08) { + body = body.pipe(zlib.createInflate()); + } else { + body = body.pipe(zlib.createInflateRaw()); + } + response = new Response(body, response_options); + resolve(response); + }); + return; + } + + // for br + if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') { + body = body.pipe(zlib.createBrotliDecompress()); + response = new Response(body, response_options); + resolve(response); + return; + } + + // otherwise, use response as-is + response = new Response(body, response_options); + resolve(response); + }); + + writeToStream(req, request); + }); +} +/** + * Redirect code matching + * + * @param Number code Status code + * @return Boolean + */ +fetch.isRedirect = function (code) { + return code === 301 || code === 302 || code === 303 || code === 307 || code === 308; +}; + +// expose Promise +fetch.Promise = global.Promise; + +module.exports = exports = fetch; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports["default"] = exports; +exports.Headers = Headers; +exports.Request = Request; +exports.Response = Response; +exports.FetchError = FetchError; + + +/***/ }), + +/***/ 2299: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +var punycode = __nccwpck_require__(5477); +var mappingTable = __nccwpck_require__(1907); + +var PROCESSING_OPTIONS = { + TRANSITIONAL: 0, + NONTRANSITIONAL: 1 +}; + +function normalize(str) { // fix bug in v8 + return str.split('\u0000').map(function (s) { return s.normalize('NFC'); }).join('\u0000'); +} + +function findStatus(val) { + var start = 0; + var end = mappingTable.length - 1; + + while (start <= end) { + var mid = Math.floor((start + end) / 2); + + var target = mappingTable[mid]; + if (target[0][0] <= val && target[0][1] >= val) { + return target; + } else if (target[0][0] > val) { + end = mid - 1; + } else { + start = mid + 1; + } + } + + return null; +} + +var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; + +function countSymbols(string) { + return string + // replace every surrogate pair with a BMP symbol + .replace(regexAstralSymbols, '_') + // then get the length + .length; +} + +function mapChars(domain_name, useSTD3, processing_option) { + var hasError = false; + var processed = ""; + + var len = countSymbols(domain_name); + for (var i = 0; i < len; ++i) { + var codePoint = domain_name.codePointAt(i); + var status = findStatus(codePoint); + + switch (status[1]) { + case "disallowed": + hasError = true; + processed += String.fromCodePoint(codePoint); + break; + case "ignored": + break; + case "mapped": + processed += String.fromCodePoint.apply(String, status[2]); + break; + case "deviation": + if (processing_option === PROCESSING_OPTIONS.TRANSITIONAL) { + processed += String.fromCodePoint.apply(String, status[2]); + } else { + processed += String.fromCodePoint(codePoint); + } + break; + case "valid": + processed += String.fromCodePoint(codePoint); + break; + case "disallowed_STD3_mapped": + if (useSTD3) { + hasError = true; + processed += String.fromCodePoint(codePoint); + } else { + processed += String.fromCodePoint.apply(String, status[2]); + } + break; + case "disallowed_STD3_valid": + if (useSTD3) { + hasError = true; + } + + processed += String.fromCodePoint(codePoint); + break; + } + } + + return { + string: processed, + error: hasError + }; +} + +var combiningMarksRegex = /[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08E4-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u18A9\u1920-\u192B\u1930-\u193B\u19B0-\u19C0\u19C8\u19C9\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFC-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C4\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2D]|\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDE2C-\uDE37\uDEDF-\uDEEA\uDF01-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDE30-\uDE40\uDEAB-\uDEB7]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD83A[\uDCD0-\uDCD6]|\uDB40[\uDD00-\uDDEF]/; + +function validateLabel(label, processing_option) { + if (label.substr(0, 4) === "xn--") { + label = punycode.toUnicode(label); + processing_option = PROCESSING_OPTIONS.NONTRANSITIONAL; + } + + var error = false; + + if (normalize(label) !== label || + (label[3] === "-" && label[4] === "-") || + label[0] === "-" || label[label.length - 1] === "-" || + label.indexOf(".") !== -1 || + label.search(combiningMarksRegex) === 0) { + error = true; + } + + var len = countSymbols(label); + for (var i = 0; i < len; ++i) { + var status = findStatus(label.codePointAt(i)); + if ((processing === PROCESSING_OPTIONS.TRANSITIONAL && status[1] !== "valid") || + (processing === PROCESSING_OPTIONS.NONTRANSITIONAL && + status[1] !== "valid" && status[1] !== "deviation")) { + error = true; + break; + } + } + + return { + label: label, + error: error + }; +} + +function processing(domain_name, useSTD3, processing_option) { + var result = mapChars(domain_name, useSTD3, processing_option); + result.string = normalize(result.string); + + var labels = result.string.split("."); + for (var i = 0; i < labels.length; ++i) { + try { + var validation = validateLabel(labels[i]); + labels[i] = validation.label; + result.error = result.error || validation.error; + } catch(e) { + result.error = true; + } + } + + return { + string: labels.join("."), + error: result.error + }; +} + +module.exports.toASCII = function(domain_name, useSTD3, processing_option, verifyDnsLength) { + var result = processing(domain_name, useSTD3, processing_option); + var labels = result.string.split("."); + labels = labels.map(function(l) { + try { + return punycode.toASCII(l); + } catch(e) { + result.error = true; + return l; + } + }); + + if (verifyDnsLength) { + var total = labels.slice(0, labels.length - 1).join(".").length; + if (total.length > 253 || total.length === 0) { + result.error = true; + } + + for (var i=0; i < labels.length; ++i) { + if (labels.length > 63 || labels.length === 0) { + result.error = true; + break; + } + } + } + + if (result.error) return null; + return labels.join("."); +}; + +module.exports.toUnicode = function(domain_name, useSTD3) { + var result = processing(domain_name, useSTD3, PROCESSING_OPTIONS.NONTRANSITIONAL); + + return { + domain: result.string, + error: result.error + }; +}; + +module.exports.PROCESSING_OPTIONS = PROCESSING_OPTIONS; + + +/***/ }), + +/***/ 5871: +/***/ ((module) => { + +"use strict"; + + +var conversions = {}; +module.exports = conversions; + +function sign(x) { + return x < 0 ? -1 : 1; +} + +function evenRound(x) { + // Round x to the nearest integer, choosing the even integer if it lies halfway between two. + if ((x % 1) === 0.5 && (x & 1) === 0) { // [even number].5; round down (i.e. floor) + return Math.floor(x); + } else { + return Math.round(x); + } +} + +function createNumberConversion(bitLength, typeOpts) { + if (!typeOpts.unsigned) { + --bitLength; + } + const lowerBound = typeOpts.unsigned ? 0 : -Math.pow(2, bitLength); + const upperBound = Math.pow(2, bitLength) - 1; + + const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength); + const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1); + + return function(V, opts) { + if (!opts) opts = {}; + + let x = +V; + + if (opts.enforceRange) { + if (!Number.isFinite(x)) { + throw new TypeError("Argument is not a finite number"); + } + + x = sign(x) * Math.floor(Math.abs(x)); + if (x < lowerBound || x > upperBound) { + throw new TypeError("Argument is not in byte range"); + } + + return x; + } + + if (!isNaN(x) && opts.clamp) { + x = evenRound(x); + + if (x < lowerBound) x = lowerBound; + if (x > upperBound) x = upperBound; + return x; + } + + if (!Number.isFinite(x) || x === 0) { + return 0; + } + + x = sign(x) * Math.floor(Math.abs(x)); + x = x % moduloVal; + + if (!typeOpts.unsigned && x >= moduloBound) { + return x - moduloVal; + } else if (typeOpts.unsigned) { + if (x < 0) { + x += moduloVal; + } else if (x === -0) { // don't return negative zero + return 0; + } + } + + return x; + } +} + +conversions["void"] = function () { + return undefined; +}; + +conversions["boolean"] = function (val) { + return !!val; +}; + +conversions["byte"] = createNumberConversion(8, { unsigned: false }); +conversions["octet"] = createNumberConversion(8, { unsigned: true }); + +conversions["short"] = createNumberConversion(16, { unsigned: false }); +conversions["unsigned short"] = createNumberConversion(16, { unsigned: true }); + +conversions["long"] = createNumberConversion(32, { unsigned: false }); +conversions["unsigned long"] = createNumberConversion(32, { unsigned: true }); + +conversions["long long"] = createNumberConversion(32, { unsigned: false, moduloBitLength: 64 }); +conversions["unsigned long long"] = createNumberConversion(32, { unsigned: true, moduloBitLength: 64 }); + +conversions["double"] = function (V) { + const x = +V; + + if (!Number.isFinite(x)) { + throw new TypeError("Argument is not a finite floating-point value"); + } + + return x; +}; + +conversions["unrestricted double"] = function (V) { + const x = +V; + + if (isNaN(x)) { + throw new TypeError("Argument is NaN"); + } + + return x; +}; + +// not quite valid, but good enough for JS +conversions["float"] = conversions["double"]; +conversions["unrestricted float"] = conversions["unrestricted double"]; + +conversions["DOMString"] = function (V, opts) { + if (!opts) opts = {}; + + if (opts.treatNullAsEmptyString && V === null) { + return ""; + } + + return String(V); +}; + +conversions["ByteString"] = function (V, opts) { + const x = String(V); + let c = undefined; + for (let i = 0; (c = x.codePointAt(i)) !== undefined; ++i) { + if (c > 255) { + throw new TypeError("Argument is not a valid bytestring"); + } + } + + return x; +}; + +conversions["USVString"] = function (V) { + const S = String(V); + const n = S.length; + const U = []; + for (let i = 0; i < n; ++i) { + const c = S.charCodeAt(i); + if (c < 0xD800 || c > 0xDFFF) { + U.push(String.fromCodePoint(c)); + } else if (0xDC00 <= c && c <= 0xDFFF) { + U.push(String.fromCodePoint(0xFFFD)); + } else { + if (i === n - 1) { + U.push(String.fromCodePoint(0xFFFD)); + } else { + const d = S.charCodeAt(i + 1); + if (0xDC00 <= d && d <= 0xDFFF) { + const a = c & 0x3FF; + const b = d & 0x3FF; + U.push(String.fromCodePoint((2 << 15) + (2 << 9) * a + b)); + ++i; + } else { + U.push(String.fromCodePoint(0xFFFD)); + } + } + } + } + + return U.join(''); +}; + +conversions["Date"] = function (V, opts) { + if (!(V instanceof Date)) { + throw new TypeError("Argument is not a Date object"); + } + if (isNaN(V)) { + return undefined; + } + + return V; +}; + +conversions["RegExp"] = function (V, opts) { + if (!(V instanceof RegExp)) { + V = new RegExp(V); + } + + return V; +}; + + +/***/ }), + +/***/ 8262: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +const usm = __nccwpck_require__(33); + +exports.implementation = class URLImpl { + constructor(constructorArgs) { + const url = constructorArgs[0]; + const base = constructorArgs[1]; + + let parsedBase = null; + if (base !== undefined) { + parsedBase = usm.basicURLParse(base); + if (parsedBase === "failure") { + throw new TypeError("Invalid base URL"); + } + } + + const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase }); + if (parsedURL === "failure") { + throw new TypeError("Invalid URL"); + } + + this._url = parsedURL; + + // TODO: query stuff + } + + get href() { + return usm.serializeURL(this._url); + } + + set href(v) { + const parsedURL = usm.basicURLParse(v); + if (parsedURL === "failure") { + throw new TypeError("Invalid URL"); + } + + this._url = parsedURL; + } + + get origin() { + return usm.serializeURLOrigin(this._url); + } + + get protocol() { + return this._url.scheme + ":"; + } + + set protocol(v) { + usm.basicURLParse(v + ":", { url: this._url, stateOverride: "scheme start" }); + } + + get username() { + return this._url.username; + } + + set username(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + usm.setTheUsername(this._url, v); + } + + get password() { + return this._url.password; + } + + set password(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + usm.setThePassword(this._url, v); + } + + get host() { + const url = this._url; + + if (url.host === null) { + return ""; + } + + if (url.port === null) { + return usm.serializeHost(url.host); + } + + return usm.serializeHost(url.host) + ":" + usm.serializeInteger(url.port); + } + + set host(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + usm.basicURLParse(v, { url: this._url, stateOverride: "host" }); + } + + get hostname() { + if (this._url.host === null) { + return ""; + } + + return usm.serializeHost(this._url.host); + } + + set hostname(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + usm.basicURLParse(v, { url: this._url, stateOverride: "hostname" }); + } + + get port() { + if (this._url.port === null) { + return ""; + } + + return usm.serializeInteger(this._url.port); + } + + set port(v) { + if (usm.cannotHaveAUsernamePasswordPort(this._url)) { + return; + } + + if (v === "") { + this._url.port = null; + } else { + usm.basicURLParse(v, { url: this._url, stateOverride: "port" }); + } + } + + get pathname() { + if (this._url.cannotBeABaseURL) { + return this._url.path[0]; + } + + if (this._url.path.length === 0) { + return ""; + } + + return "/" + this._url.path.join("/"); + } + + set pathname(v) { + if (this._url.cannotBeABaseURL) { + return; + } + + this._url.path = []; + usm.basicURLParse(v, { url: this._url, stateOverride: "path start" }); + } + + get search() { + if (this._url.query === null || this._url.query === "") { + return ""; + } + + return "?" + this._url.query; + } + + set search(v) { + // TODO: query stuff + + const url = this._url; + + if (v === "") { + url.query = null; + return; + } + + const input = v[0] === "?" ? v.substring(1) : v; + url.query = ""; + usm.basicURLParse(input, { url, stateOverride: "query" }); + } + + get hash() { + if (this._url.fragment === null || this._url.fragment === "") { + return ""; + } + + return "#" + this._url.fragment; + } + + set hash(v) { + if (v === "") { + this._url.fragment = null; + return; + } + + const input = v[0] === "#" ? v.substring(1) : v; + this._url.fragment = ""; + usm.basicURLParse(input, { url: this._url, stateOverride: "fragment" }); + } + + toJSON() { + return this.href; + } +}; + + +/***/ }), + +/***/ 653: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + + +const conversions = __nccwpck_require__(5871); +const utils = __nccwpck_require__(276); +const Impl = __nccwpck_require__(8262); + +const impl = utils.implSymbol; + +function URL(url) { + if (!this || this[impl] || !(this instanceof URL)) { + throw new TypeError("Failed to construct 'URL': Please use the 'new' operator, this DOM object constructor cannot be called as a function."); + } + if (arguments.length < 1) { + throw new TypeError("Failed to construct 'URL': 1 argument required, but only " + arguments.length + " present."); + } + const args = []; + for (let i = 0; i < arguments.length && i < 2; ++i) { + args[i] = arguments[i]; + } + args[0] = conversions["USVString"](args[0]); + if (args[1] !== undefined) { + args[1] = conversions["USVString"](args[1]); + } + + module.exports.setup(this, args); +} + +URL.prototype.toJSON = function toJSON() { + if (!this || !module.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + const args = []; + for (let i = 0; i < arguments.length && i < 0; ++i) { + args[i] = arguments[i]; + } + return this[impl].toJSON.apply(this[impl], args); +}; +Object.defineProperty(URL.prototype, "href", { + get() { + return this[impl].href; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].href = V; + }, + enumerable: true, + configurable: true +}); + +URL.prototype.toString = function () { + if (!this || !module.exports.is(this)) { + throw new TypeError("Illegal invocation"); + } + return this.href; +}; + +Object.defineProperty(URL.prototype, "origin", { + get() { + return this[impl].origin; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "protocol", { + get() { + return this[impl].protocol; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].protocol = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "username", { + get() { + return this[impl].username; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].username = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "password", { + get() { + return this[impl].password; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].password = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "host", { + get() { + return this[impl].host; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].host = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "hostname", { + get() { + return this[impl].hostname; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].hostname = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "port", { + get() { + return this[impl].port; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].port = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "pathname", { + get() { + return this[impl].pathname; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].pathname = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "search", { + get() { + return this[impl].search; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].search = V; + }, + enumerable: true, + configurable: true +}); + +Object.defineProperty(URL.prototype, "hash", { + get() { + return this[impl].hash; + }, + set(V) { + V = conversions["USVString"](V); + this[impl].hash = V; + }, + enumerable: true, + configurable: true +}); + + +module.exports = { + is(obj) { + return !!obj && obj[impl] instanceof Impl.implementation; + }, + create(constructorArgs, privateData) { + let obj = Object.create(URL.prototype); + this.setup(obj, constructorArgs, privateData); + return obj; + }, + setup(obj, constructorArgs, privateData) { + if (!privateData) privateData = {}; + privateData.wrapper = obj; + + obj[impl] = new Impl.implementation(constructorArgs, privateData); + obj[impl][utils.wrapperSymbol] = obj; + }, + interface: URL, + expose: { + Window: { URL: URL }, + Worker: { URL: URL } + } +}; + + + +/***/ }), + +/***/ 3323: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +exports.URL = __nccwpck_require__(653)["interface"]; +exports.serializeURL = __nccwpck_require__(33).serializeURL; +exports.serializeURLOrigin = __nccwpck_require__(33).serializeURLOrigin; +exports.basicURLParse = __nccwpck_require__(33).basicURLParse; +exports.setTheUsername = __nccwpck_require__(33).setTheUsername; +exports.setThePassword = __nccwpck_require__(33).setThePassword; +exports.serializeHost = __nccwpck_require__(33).serializeHost; +exports.serializeInteger = __nccwpck_require__(33).serializeInteger; +exports.parseURL = __nccwpck_require__(33).parseURL; + + +/***/ }), + +/***/ 33: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +"use strict"; + +const punycode = __nccwpck_require__(5477); +const tr46 = __nccwpck_require__(2299); + +const specialSchemes = { + ftp: 21, + file: null, + gopher: 70, + http: 80, + https: 443, + ws: 80, + wss: 443 +}; + +const failure = Symbol("failure"); + +function countSymbols(str) { + return punycode.ucs2.decode(str).length; +} + +function at(input, idx) { + const c = input[idx]; + return isNaN(c) ? undefined : String.fromCodePoint(c); +} + +function isASCIIDigit(c) { + return c >= 0x30 && c <= 0x39; +} + +function isASCIIAlpha(c) { + return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); +} + +function isASCIIAlphanumeric(c) { + return isASCIIAlpha(c) || isASCIIDigit(c); +} + +function isASCIIHex(c) { + return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); +} + +function isSingleDot(buffer) { + return buffer === "." || buffer.toLowerCase() === "%2e"; +} + +function isDoubleDot(buffer) { + buffer = buffer.toLowerCase(); + return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; +} + +function isWindowsDriveLetterCodePoints(cp1, cp2) { + return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); +} + +function isWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); +} + +function isNormalizedWindowsDriveLetterString(string) { + return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; +} + +function containsForbiddenHostCodePoint(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function containsForbiddenHostCodePointExcludingPercent(string) { + return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; +} + +function isSpecialScheme(scheme) { + return specialSchemes[scheme] !== undefined; +} + +function isSpecial(url) { + return isSpecialScheme(url.scheme); +} + +function defaultPort(scheme) { + return specialSchemes[scheme]; +} + +function percentEncode(c) { + let hex = c.toString(16).toUpperCase(); + if (hex.length === 1) { + hex = "0" + hex; + } + + return "%" + hex; +} + +function utf8PercentEncode(c) { + const buf = new Buffer(c); + + let str = ""; + + for (let i = 0; i < buf.length; ++i) { + str += percentEncode(buf[i]); + } + + return str; +} + +function utf8PercentDecode(str) { + const input = new Buffer(str); + const output = []; + for (let i = 0; i < input.length; ++i) { + if (input[i] !== 37) { + output.push(input[i]); + } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { + output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); + i += 2; + } else { + output.push(input[i]); + } + } + return new Buffer(output).toString(); +} + +function isC0ControlPercentEncode(c) { + return c <= 0x1F || c > 0x7E; +} + +const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); +function isPathPercentEncode(c) { + return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); +} + +const extraUserinfoPercentEncodeSet = + new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); +function isUserinfoPercentEncode(c) { + return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); +} + +function percentEncodeChar(c, encodeSetPredicate) { + const cStr = String.fromCodePoint(c); + + if (encodeSetPredicate(c)) { + return utf8PercentEncode(cStr); + } + + return cStr; +} + +function parseIPv4Number(input) { + let R = 10; + + if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { + input = input.substring(2); + R = 16; + } else if (input.length >= 2 && input.charAt(0) === "0") { + input = input.substring(1); + R = 8; + } + + if (input === "") { + return 0; + } + + const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); + if (regex.test(input)) { + return failure; + } + + return parseInt(input, R); +} + +function parseIPv4(input) { + const parts = input.split("."); + if (parts[parts.length - 1] === "") { + if (parts.length > 1) { + parts.pop(); + } + } + + if (parts.length > 4) { + return input; + } + + const numbers = []; + for (const part of parts) { + if (part === "") { + return input; + } + const n = parseIPv4Number(part); + if (n === failure) { + return input; + } + + numbers.push(n); + } + + for (let i = 0; i < numbers.length - 1; ++i) { + if (numbers[i] > 255) { + return failure; + } + } + if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { + return failure; + } + + let ipv4 = numbers.pop(); + let counter = 0; + + for (const n of numbers) { + ipv4 += n * Math.pow(256, 3 - counter); + ++counter; + } + + return ipv4; +} + +function serializeIPv4(address) { + let output = ""; + let n = address; + + for (let i = 1; i <= 4; ++i) { + output = String(n % 256) + output; + if (i !== 4) { + output = "." + output; + } + n = Math.floor(n / 256); + } + + return output; +} + +function parseIPv6(input) { + const address = [0, 0, 0, 0, 0, 0, 0, 0]; + let pieceIndex = 0; + let compress = null; + let pointer = 0; + + input = punycode.ucs2.decode(input); + + if (input[pointer] === 58) { + if (input[pointer + 1] !== 58) { + return failure; + } + + pointer += 2; + ++pieceIndex; + compress = pieceIndex; + } + + while (pointer < input.length) { + if (pieceIndex === 8) { + return failure; + } + + if (input[pointer] === 58) { + if (compress !== null) { + return failure; + } + ++pointer; + ++pieceIndex; + compress = pieceIndex; + continue; + } + + let value = 0; + let length = 0; + + while (length < 4 && isASCIIHex(input[pointer])) { + value = value * 0x10 + parseInt(at(input, pointer), 16); + ++pointer; + ++length; + } + + if (input[pointer] === 46) { + if (length === 0) { + return failure; + } + + pointer -= length; + + if (pieceIndex > 6) { + return failure; + } + + let numbersSeen = 0; + + while (input[pointer] !== undefined) { + let ipv4Piece = null; + + if (numbersSeen > 0) { + if (input[pointer] === 46 && numbersSeen < 4) { + ++pointer; + } else { + return failure; + } + } + + if (!isASCIIDigit(input[pointer])) { + return failure; + } + + while (isASCIIDigit(input[pointer])) { + const number = parseInt(at(input, pointer)); + if (ipv4Piece === null) { + ipv4Piece = number; + } else if (ipv4Piece === 0) { + return failure; + } else { + ipv4Piece = ipv4Piece * 10 + number; + } + if (ipv4Piece > 255) { + return failure; + } + ++pointer; + } + + address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; + + ++numbersSeen; + + if (numbersSeen === 2 || numbersSeen === 4) { + ++pieceIndex; + } + } + + if (numbersSeen !== 4) { + return failure; + } + + break; + } else if (input[pointer] === 58) { + ++pointer; + if (input[pointer] === undefined) { + return failure; + } + } else if (input[pointer] !== undefined) { + return failure; + } + + address[pieceIndex] = value; + ++pieceIndex; + } + + if (compress !== null) { + let swaps = pieceIndex - compress; + pieceIndex = 7; + while (pieceIndex !== 0 && swaps > 0) { + const temp = address[compress + swaps - 1]; + address[compress + swaps - 1] = address[pieceIndex]; + address[pieceIndex] = temp; + --pieceIndex; + --swaps; + } + } else if (compress === null && pieceIndex !== 8) { + return failure; + } + + return address; +} + +function serializeIPv6(address) { + let output = ""; + const seqResult = findLongestZeroSequence(address); + const compress = seqResult.idx; + let ignore0 = false; + + for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { + if (ignore0 && address[pieceIndex] === 0) { + continue; + } else if (ignore0) { + ignore0 = false; + } + + if (compress === pieceIndex) { + const separator = pieceIndex === 0 ? "::" : ":"; + output += separator; + ignore0 = true; + continue; + } + + output += address[pieceIndex].toString(16); + + if (pieceIndex !== 7) { + output += ":"; + } + } + + return output; +} + +function parseHost(input, isSpecialArg) { + if (input[0] === "[") { + if (input[input.length - 1] !== "]") { + return failure; + } + + return parseIPv6(input.substring(1, input.length - 1)); + } + + if (!isSpecialArg) { + return parseOpaqueHost(input); + } + + const domain = utf8PercentDecode(input); + const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); + if (asciiDomain === null) { + return failure; + } + + if (containsForbiddenHostCodePoint(asciiDomain)) { + return failure; + } + + const ipv4Host = parseIPv4(asciiDomain); + if (typeof ipv4Host === "number" || ipv4Host === failure) { + return ipv4Host; + } + + return asciiDomain; +} + +function parseOpaqueHost(input) { + if (containsForbiddenHostCodePointExcludingPercent(input)) { + return failure; + } + + let output = ""; + const decoded = punycode.ucs2.decode(input); + for (let i = 0; i < decoded.length; ++i) { + output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); + } + return output; +} + +function findLongestZeroSequence(arr) { + let maxIdx = null; + let maxLen = 1; // only find elements > 1 + let currStart = null; + let currLen = 0; + + for (let i = 0; i < arr.length; ++i) { + if (arr[i] !== 0) { + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + currStart = null; + currLen = 0; + } else { + if (currStart === null) { + currStart = i; + } + ++currLen; + } + } + + // if trailing zeros + if (currLen > maxLen) { + maxIdx = currStart; + maxLen = currLen; + } + + return { + idx: maxIdx, + len: maxLen + }; +} + +function serializeHost(host) { + if (typeof host === "number") { + return serializeIPv4(host); + } + + // IPv6 serializer + if (host instanceof Array) { + return "[" + serializeIPv6(host) + "]"; + } + + return host; +} + +function trimControlChars(url) { + return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); +} + +function trimTabAndNewline(url) { + return url.replace(/\u0009|\u000A|\u000D/g, ""); +} + +function shortenPath(url) { + const path = url.path; + if (path.length === 0) { + return; + } + if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { + return; + } + + path.pop(); +} + +function includesCredentials(url) { + return url.username !== "" || url.password !== ""; +} + +function cannotHaveAUsernamePasswordPort(url) { + return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; +} + +function isNormalizedWindowsDriveLetter(string) { + return /^[A-Za-z]:$/.test(string); +} + +function URLStateMachine(input, base, encodingOverride, url, stateOverride) { + this.pointer = 0; + this.input = input; + this.base = base || null; + this.encodingOverride = encodingOverride || "utf-8"; + this.stateOverride = stateOverride; + this.url = url; + this.failure = false; + this.parseError = false; + + if (!this.url) { + this.url = { + scheme: "", + username: "", + password: "", + host: null, + port: null, + path: [], + query: null, + fragment: null, + + cannotBeABaseURL: false + }; + + const res = trimControlChars(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + } + + const res = trimTabAndNewline(this.input); + if (res !== this.input) { + this.parseError = true; + } + this.input = res; + + this.state = stateOverride || "scheme start"; + + this.buffer = ""; + this.atFlag = false; + this.arrFlag = false; + this.passwordTokenSeenFlag = false; + + this.input = punycode.ucs2.decode(this.input); + + for (; this.pointer <= this.input.length; ++this.pointer) { + const c = this.input[this.pointer]; + const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); + + // exec state machine + const ret = this["parse " + this.state](c, cStr); + if (!ret) { + break; // terminate algorithm + } else if (ret === failure) { + this.failure = true; + break; + } + } +} + +URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { + if (isASCIIAlpha(c)) { + this.buffer += cStr.toLowerCase(); + this.state = "scheme"; + } else if (!this.stateOverride) { + this.state = "no scheme"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { + if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { + this.buffer += cStr.toLowerCase(); + } else if (c === 58) { + if (this.stateOverride) { + if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { + return false; + } + + if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { + return false; + } + + if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { + return false; + } + + if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { + return false; + } + } + this.url.scheme = this.buffer; + this.buffer = ""; + if (this.stateOverride) { + return false; + } + if (this.url.scheme === "file") { + if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { + this.parseError = true; + } + this.state = "file"; + } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { + this.state = "special relative or authority"; + } else if (isSpecial(this.url)) { + this.state = "special authority slashes"; + } else if (this.input[this.pointer + 1] === 47) { + this.state = "path or authority"; + ++this.pointer; + } else { + this.url.cannotBeABaseURL = true; + this.url.path.push(""); + this.state = "cannot-be-a-base-URL path"; + } + } else if (!this.stateOverride) { + this.buffer = ""; + this.state = "no scheme"; + this.pointer = -1; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { + if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { + return failure; + } else if (this.base.cannotBeABaseURL && c === 35) { + this.url.scheme = this.base.scheme; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.url.cannotBeABaseURL = true; + this.state = "fragment"; + } else if (this.base.scheme === "file") { + this.state = "file"; + --this.pointer; + } else { + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "relative"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { + if (c === 47) { + this.state = "authority"; + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative"] = function parseRelative(c) { + this.url.scheme = this.base.scheme; + if (isNaN(c)) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 47) { + this.state = "relative slash"; + } else if (c === 63) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else if (isSpecial(this.url) && c === 92) { + this.parseError = true; + this.state = "relative slash"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.url.path = this.base.path.slice(0, this.base.path.length - 1); + + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { + if (isSpecial(this.url) && (c === 47 || c === 92)) { + if (c === 92) { + this.parseError = true; + } + this.state = "special authority ignore slashes"; + } else if (c === 47) { + this.state = "authority"; + } else { + this.url.username = this.base.username; + this.url.password = this.base.password; + this.url.host = this.base.host; + this.url.port = this.base.port; + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { + if (c === 47 && this.input[this.pointer + 1] === 47) { + this.state = "special authority ignore slashes"; + ++this.pointer; + } else { + this.parseError = true; + this.state = "special authority ignore slashes"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { + if (c !== 47 && c !== 92) { + this.state = "authority"; + --this.pointer; + } else { + this.parseError = true; + } + + return true; +}; + +URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { + if (c === 64) { + this.parseError = true; + if (this.atFlag) { + this.buffer = "%40" + this.buffer; + } + this.atFlag = true; + + // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars + const len = countSymbols(this.buffer); + for (let pointer = 0; pointer < len; ++pointer) { + const codePoint = this.buffer.codePointAt(pointer); + + if (codePoint === 58 && !this.passwordTokenSeenFlag) { + this.passwordTokenSeenFlag = true; + continue; + } + const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); + if (this.passwordTokenSeenFlag) { + this.url.password += encodedCodePoints; + } else { + this.url.username += encodedCodePoints; + } + } + this.buffer = ""; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + if (this.atFlag && this.buffer === "") { + this.parseError = true; + return failure; + } + this.pointer -= countSymbols(this.buffer) + 1; + this.buffer = ""; + this.state = "host"; + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse hostname"] = +URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { + if (this.stateOverride && this.url.scheme === "file") { + --this.pointer; + this.state = "file host"; + } else if (c === 58 && !this.arrFlag) { + if (this.buffer === "") { + this.parseError = true; + return failure; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "port"; + if (this.stateOverride === "hostname") { + return false; + } + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92)) { + --this.pointer; + if (isSpecial(this.url) && this.buffer === "") { + this.parseError = true; + return failure; + } else if (this.stateOverride && this.buffer === "" && + (includesCredentials(this.url) || this.url.port !== null)) { + this.parseError = true; + return false; + } + + const host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + + this.url.host = host; + this.buffer = ""; + this.state = "path start"; + if (this.stateOverride) { + return false; + } + } else { + if (c === 91) { + this.arrFlag = true; + } else if (c === 93) { + this.arrFlag = false; + } + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { + if (isASCIIDigit(c)) { + this.buffer += cStr; + } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || + (isSpecial(this.url) && c === 92) || + this.stateOverride) { + if (this.buffer !== "") { + const port = parseInt(this.buffer); + if (port > Math.pow(2, 16) - 1) { + this.parseError = true; + return failure; + } + this.url.port = port === defaultPort(this.url.scheme) ? null : port; + this.buffer = ""; + } + if (this.stateOverride) { + return false; + } + this.state = "path start"; + --this.pointer; + } else { + this.parseError = true; + return failure; + } + + return true; +}; + +const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); + +URLStateMachine.prototype["parse file"] = function parseFile(c) { + this.url.scheme = "file"; + + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file slash"; + } else if (this.base !== null && this.base.scheme === "file") { + if (isNaN(c)) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + } else if (c === 63) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + this.url.query = this.base.query; + this.url.fragment = ""; + this.state = "fragment"; + } else { + if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points + !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || + (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points + !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { + this.url.host = this.base.host; + this.url.path = this.base.path.slice(); + shortenPath(this.url); + } else { + this.parseError = true; + } + + this.state = "path"; + --this.pointer; + } + } else { + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { + if (c === 47 || c === 92) { + if (c === 92) { + this.parseError = true; + } + this.state = "file host"; + } else { + if (this.base !== null && this.base.scheme === "file") { + if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { + this.url.path.push(this.base.path[0]); + } else { + this.url.host = this.base.host; + } + } + this.state = "path"; + --this.pointer; + } + + return true; +}; + +URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { + if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { + --this.pointer; + if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { + this.parseError = true; + this.state = "path"; + } else if (this.buffer === "") { + this.url.host = ""; + if (this.stateOverride) { + return false; + } + this.state = "path start"; + } else { + let host = parseHost(this.buffer, isSpecial(this.url)); + if (host === failure) { + return failure; + } + if (host === "localhost") { + host = ""; + } + this.url.host = host; + + if (this.stateOverride) { + return false; + } + + this.buffer = ""; + this.state = "path start"; + } + } else { + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { + if (isSpecial(this.url)) { + if (c === 92) { + this.parseError = true; + } + this.state = "path"; + + if (c !== 47 && c !== 92) { + --this.pointer; + } + } else if (!this.stateOverride && c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (!this.stateOverride && c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else if (c !== undefined) { + this.state = "path"; + if (c !== 47) { + --this.pointer; + } + } + + return true; +}; + +URLStateMachine.prototype["parse path"] = function parsePath(c) { + if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || + (!this.stateOverride && (c === 63 || c === 35))) { + if (isSpecial(this.url) && c === 92) { + this.parseError = true; + } + + if (isDoubleDot(this.buffer)) { + shortenPath(this.url); + if (c !== 47 && !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } + } else if (isSingleDot(this.buffer) && c !== 47 && + !(isSpecial(this.url) && c === 92)) { + this.url.path.push(""); + } else if (!isSingleDot(this.buffer)) { + if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { + if (this.url.host !== "" && this.url.host !== null) { + this.parseError = true; + this.url.host = ""; + } + this.buffer = this.buffer[0] + ":"; + } + this.url.path.push(this.buffer); + } + this.buffer = ""; + if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { + while (this.url.path.length > 1 && this.url.path[0] === "") { + this.parseError = true; + this.url.path.shift(); + } + } + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += percentEncodeChar(c, isPathPercentEncode); + } + + return true; +}; + +URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { + if (c === 63) { + this.url.query = ""; + this.state = "query"; + } else if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } else { + // TODO: Add: not a URL code point + if (!isNaN(c) && c !== 37) { + this.parseError = true; + } + + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + if (!isNaN(c)) { + this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); + } + } + + return true; +}; + +URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { + if (isNaN(c) || (!this.stateOverride && c === 35)) { + if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { + this.encodingOverride = "utf-8"; + } + + const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead + for (let i = 0; i < buffer.length; ++i) { + if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || + buffer[i] === 0x3C || buffer[i] === 0x3E) { + this.url.query += percentEncode(buffer[i]); + } else { + this.url.query += String.fromCodePoint(buffer[i]); + } + } + + this.buffer = ""; + if (c === 35) { + this.url.fragment = ""; + this.state = "fragment"; + } + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.buffer += cStr; + } + + return true; +}; + +URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { + if (isNaN(c)) { // do nothing + } else if (c === 0x0) { + this.parseError = true; + } else { + // TODO: If c is not a URL code point and not "%", parse error. + if (c === 37 && + (!isASCIIHex(this.input[this.pointer + 1]) || + !isASCIIHex(this.input[this.pointer + 2]))) { + this.parseError = true; + } + + this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); + } + + return true; +}; + +function serializeURL(url, excludeFragment) { + let output = url.scheme + ":"; + if (url.host !== null) { + output += "//"; + + if (url.username !== "" || url.password !== "") { + output += url.username; + if (url.password !== "") { + output += ":" + url.password; + } + output += "@"; + } + + output += serializeHost(url.host); + + if (url.port !== null) { + output += ":" + url.port; + } + } else if (url.host === null && url.scheme === "file") { + output += "//"; + } + + if (url.cannotBeABaseURL) { + output += url.path[0]; + } else { + for (const string of url.path) { + output += "/" + string; + } + } + + if (url.query !== null) { + output += "?" + url.query; + } + + if (!excludeFragment && url.fragment !== null) { + output += "#" + url.fragment; + } + + return output; +} + +function serializeOrigin(tuple) { + let result = tuple.scheme + "://"; + result += serializeHost(tuple.host); + + if (tuple.port !== null) { + result += ":" + tuple.port; + } + + return result; +} + +module.exports.serializeURL = serializeURL; + +module.exports.serializeURLOrigin = function (url) { + // https://url.spec.whatwg.org/#concept-url-origin + switch (url.scheme) { + case "blob": + try { + return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); + } catch (e) { + // serializing an opaque origin returns "null" + return "null"; + } + case "ftp": + case "gopher": + case "http": + case "https": + case "ws": + case "wss": + return serializeOrigin({ + scheme: url.scheme, + host: url.host, + port: url.port + }); + case "file": + // spec says "exercise to the reader", chrome says "file://" + return "file://"; + default: + // serializing an opaque origin returns "null" + return "null"; + } +}; + +module.exports.basicURLParse = function (input, options) { + if (options === undefined) { + options = {}; + } + + const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); + if (usm.failure) { + return "failure"; + } + + return usm.url; +}; + +module.exports.setTheUsername = function (url, username) { + url.username = ""; + const decoded = punycode.ucs2.decode(username); + for (let i = 0; i < decoded.length; ++i) { + url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.setThePassword = function (url, password) { + url.password = ""; + const decoded = punycode.ucs2.decode(password); + for (let i = 0; i < decoded.length; ++i) { + url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); + } +}; + +module.exports.serializeHost = serializeHost; + +module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; + +module.exports.serializeInteger = function (integer) { + return String(integer); +}; + +module.exports.parseURL = function (input, options) { + if (options === undefined) { + options = {}; + } + + // We don't handle blobs, so this just delegates: + return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); +}; + + +/***/ }), + +/***/ 276: +/***/ ((module) => { + +"use strict"; + + +module.exports.mixin = function mixin(target, source) { + const keys = Object.getOwnPropertyNames(source); + for (let i = 0; i < keys.length; ++i) { + Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i])); + } +}; + +module.exports.wrapperSymbol = Symbol("wrapper"); +module.exports.implSymbol = Symbol("impl"); + +module.exports.wrapperForImpl = function (impl) { + return impl[module.exports.wrapperSymbol]; +}; + +module.exports.implForWrapper = function (wrapper) { + return wrapper[module.exports.implSymbol]; +}; + + + +/***/ }), + +/***/ 1223: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +var wrappy = __nccwpck_require__(2940) +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) + + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) + +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f +} + +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f +} + + +/***/ }), + +/***/ 4294: +/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { + +module.exports = __nccwpck_require__(4219); + + +/***/ }), + +/***/ 4219: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + + +var net = __nccwpck_require__(1808); +var tls = __nccwpck_require__(4404); +var http = __nccwpck_require__(3685); +var https = __nccwpck_require__(5687); +var events = __nccwpck_require__(2361); +var assert = __nccwpck_require__(9491); +var util = __nccwpck_require__(3837); + + +exports.httpOverHttp = httpOverHttp; +exports.httpsOverHttp = httpsOverHttp; +exports.httpOverHttps = httpOverHttps; +exports.httpsOverHttps = httpsOverHttps; + + +function httpOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + return agent; +} + +function httpsOverHttp(options) { + var agent = new TunnelingAgent(options); + agent.request = http.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; +} + +function httpOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + return agent; +} + +function httpsOverHttps(options) { + var agent = new TunnelingAgent(options); + agent.request = https.request; + agent.createSocket = createSecureSocket; + agent.defaultPort = 443; + return agent; +} + + +function TunnelingAgent(options) { + var self = this; + self.options = options || {}; + self.proxyOptions = self.options.proxy || {}; + self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; + self.requests = []; + self.sockets = []; + + self.on('free', function onFree(socket, host, port, localAddress) { + var options = toOptions(host, port, localAddress); + for (var i = 0, len = self.requests.length; i < len; ++i) { + var pending = self.requests[i]; + if (pending.host === options.host && pending.port === options.port) { + // Detect the request to connect same origin server, + // reuse the connection. + self.requests.splice(i, 1); + pending.request.onSocket(socket); + return; + } + } + socket.destroy(); + self.removeSocket(socket); + }); +} +util.inherits(TunnelingAgent, events.EventEmitter); + +TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { + var self = this; + var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress)); + + if (self.sockets.length >= this.maxSockets) { + // We are over limit so we'll add it to the queue. + self.requests.push(options); + return; + } + + // If we are under maxSockets create a new one. + self.createSocket(options, function(socket) { + socket.on('free', onFree); + socket.on('close', onCloseOrRemove); + socket.on('agentRemove', onCloseOrRemove); + req.onSocket(socket); + + function onFree() { + self.emit('free', socket, options); + } + + function onCloseOrRemove(err) { + self.removeSocket(socket); + socket.removeListener('free', onFree); + socket.removeListener('close', onCloseOrRemove); + socket.removeListener('agentRemove', onCloseOrRemove); + } + }); +}; + +TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { + var self = this; + var placeholder = {}; + self.sockets.push(placeholder); + + var connectOptions = mergeOptions({}, self.proxyOptions, { + method: 'CONNECT', + path: options.host + ':' + options.port, + agent: false, + headers: { + host: options.host + ':' + options.port + } + }); + if (options.localAddress) { + connectOptions.localAddress = options.localAddress; + } + if (connectOptions.proxyAuth) { + connectOptions.headers = connectOptions.headers || {}; + connectOptions.headers['Proxy-Authorization'] = 'Basic ' + + new Buffer(connectOptions.proxyAuth).toString('base64'); + } + + debug('making CONNECT request'); + var connectReq = self.request(connectOptions); + connectReq.useChunkedEncodingByDefault = false; // for v0.6 + connectReq.once('response', onResponse); // for v0.6 + connectReq.once('upgrade', onUpgrade); // for v0.6 + connectReq.once('connect', onConnect); // for v0.7 or later + connectReq.once('error', onError); + connectReq.end(); + + function onResponse(res) { + // Very hacky. This is necessary to avoid http-parser leaks. + res.upgrade = true; + } + + function onUpgrade(res, socket, head) { + // Hacky. + process.nextTick(function() { + onConnect(res, socket, head); + }); + } + + function onConnect(res, socket, head) { + connectReq.removeAllListeners(); + socket.removeAllListeners(); + + if (res.statusCode !== 200) { + debug('tunneling socket could not be established, statusCode=%d', + res.statusCode); + socket.destroy(); + var error = new Error('tunneling socket could not be established, ' + + 'statusCode=' + res.statusCode); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; + } + if (head.length > 0) { + debug('got illegal response body from proxy'); + socket.destroy(); + var error = new Error('got illegal response body from proxy'); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + return; + } + debug('tunneling connection has established'); + self.sockets[self.sockets.indexOf(placeholder)] = socket; + return cb(socket); + } + + function onError(cause) { + connectReq.removeAllListeners(); + + debug('tunneling socket could not be established, cause=%s\n', + cause.message, cause.stack); + var error = new Error('tunneling socket could not be established, ' + + 'cause=' + cause.message); + error.code = 'ECONNRESET'; + options.request.emit('error', error); + self.removeSocket(placeholder); + } +}; + +TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { + var pos = this.sockets.indexOf(socket) + if (pos === -1) { + return; + } + this.sockets.splice(pos, 1); + + var pending = this.requests.shift(); + if (pending) { + // If we have pending requests and a socket gets closed a new one + // needs to be created to take over in the pool for the one that closed. + this.createSocket(pending, function(socket) { + pending.request.onSocket(socket); + }); + } +}; + +function createSecureSocket(options, cb) { + var self = this; + TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { + var hostHeader = options.request.getHeader('host'); + var tlsOptions = mergeOptions({}, self.options, { + socket: socket, + servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host + }); + + // 0 is dummy port for v0.6 + var secureSocket = tls.connect(0, tlsOptions); + self.sockets[self.sockets.indexOf(socket)] = secureSocket; + cb(secureSocket); + }); +} + + +function toOptions(host, port, localAddress) { + if (typeof host === 'string') { // since v0.10 + return { + host: host, + port: port, + localAddress: localAddress + }; + } + return host; // for v0.11 or later +} + +function mergeOptions(target) { + for (var i = 1, len = arguments.length; i < len; ++i) { + var overrides = arguments[i]; + if (typeof overrides === 'object') { + var keys = Object.keys(overrides); + for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { + var k = keys[j]; + if (overrides[k] !== undefined) { + target[k] = overrides[k]; + } + } + } + } + return target; +} + + +var debug; +if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { + debug = function() { + var args = Array.prototype.slice.call(arguments); + if (typeof args[0] === 'string') { + args[0] = 'TUNNEL: ' + args[0]; + } else { + args.unshift('TUNNEL:'); + } + console.error.apply(console, args); + } +} else { + debug = function() {}; +} +exports.debug = debug; // for test + + +/***/ }), + +/***/ 5030: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + + +Object.defineProperty(exports, "__esModule", ({ value: true })); + +function getUserAgent() { + if (typeof navigator === "object" && "userAgent" in navigator) { + return navigator.userAgent; + } + + if (typeof process === "object" && "version" in process) { + return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`; + } + + return ""; +} + +exports.getUserAgent = getUserAgent; +//# sourceMappingURL=index.js.map + + +/***/ }), + +/***/ 1452: +/***/ (function(__unused_webpack_module, exports) { + +/** + * web-streams-polyfill v3.2.1 + */ +(function (global, factory) { + true ? factory(exports) : + 0; +}(this, (function (exports) { 'use strict'; + + /// + const SymbolPolyfill = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? + Symbol : + description => `Symbol(${description})`; + + /// + function noop() { + return undefined; + } + function getGlobals() { + if (typeof self !== 'undefined') { + return self; + } + else if (typeof window !== 'undefined') { + return window; + } + else if (typeof global !== 'undefined') { + return global; + } + return undefined; + } + const globals = getGlobals(); + + function typeIsObject(x) { + return (typeof x === 'object' && x !== null) || typeof x === 'function'; + } + const rethrowAssertionErrorRejection = noop; + + const originalPromise = Promise; + const originalPromiseThen = Promise.prototype.then; + const originalPromiseResolve = Promise.resolve.bind(originalPromise); + const originalPromiseReject = Promise.reject.bind(originalPromise); + function newPromise(executor) { + return new originalPromise(executor); + } + function promiseResolvedWith(value) { + return originalPromiseResolve(value); + } + function promiseRejectedWith(reason) { + return originalPromiseReject(reason); + } + function PerformPromiseThen(promise, onFulfilled, onRejected) { + // There doesn't appear to be any way to correctly emulate the behaviour from JavaScript, so this is just an + // approximation. + return originalPromiseThen.call(promise, onFulfilled, onRejected); + } + function uponPromise(promise, onFulfilled, onRejected) { + PerformPromiseThen(PerformPromiseThen(promise, onFulfilled, onRejected), undefined, rethrowAssertionErrorRejection); + } + function uponFulfillment(promise, onFulfilled) { + uponPromise(promise, onFulfilled); + } + function uponRejection(promise, onRejected) { + uponPromise(promise, undefined, onRejected); + } + function transformPromiseWith(promise, fulfillmentHandler, rejectionHandler) { + return PerformPromiseThen(promise, fulfillmentHandler, rejectionHandler); + } + function setPromiseIsHandledToTrue(promise) { + PerformPromiseThen(promise, undefined, rethrowAssertionErrorRejection); + } + const queueMicrotask = (() => { + const globalQueueMicrotask = globals && globals.queueMicrotask; + if (typeof globalQueueMicrotask === 'function') { + return globalQueueMicrotask; + } + const resolvedPromise = promiseResolvedWith(undefined); + return (fn) => PerformPromiseThen(resolvedPromise, fn); + })(); + function reflectCall(F, V, args) { + if (typeof F !== 'function') { + throw new TypeError('Argument is not a function'); + } + return Function.prototype.apply.call(F, V, args); + } + function promiseCall(F, V, args) { + try { + return promiseResolvedWith(reflectCall(F, V, args)); + } + catch (value) { + return promiseRejectedWith(value); + } + } + + // Original from Chromium + // https://chromium.googlesource.com/chromium/src/+/0aee4434a4dba42a42abaea9bfbc0cd196a63bc1/third_party/blink/renderer/core/streams/SimpleQueue.js + const QUEUE_MAX_ARRAY_SIZE = 16384; + /** + * Simple queue structure. + * + * Avoids scalability issues with using a packed array directly by using + * multiple arrays in a linked list and keeping the array size bounded. + */ + class SimpleQueue { + constructor() { + this._cursor = 0; + this._size = 0; + // _front and _back are always defined. + this._front = { + _elements: [], + _next: undefined + }; + this._back = this._front; + // The cursor is used to avoid calling Array.shift(). + // It contains the index of the front element of the array inside the + // front-most node. It is always in the range [0, QUEUE_MAX_ARRAY_SIZE). + this._cursor = 0; + // When there is only one node, size === elements.length - cursor. + this._size = 0; + } + get length() { + return this._size; + } + // For exception safety, this method is structured in order: + // 1. Read state + // 2. Calculate required state mutations + // 3. Perform state mutations + push(element) { + const oldBack = this._back; + let newBack = oldBack; + if (oldBack._elements.length === QUEUE_MAX_ARRAY_SIZE - 1) { + newBack = { + _elements: [], + _next: undefined + }; + } + // push() is the mutation most likely to throw an exception, so it + // goes first. + oldBack._elements.push(element); + if (newBack !== oldBack) { + this._back = newBack; + oldBack._next = newBack; + } + ++this._size; + } + // Like push(), shift() follows the read -> calculate -> mutate pattern for + // exception safety. + shift() { // must not be called on an empty queue + const oldFront = this._front; + let newFront = oldFront; + const oldCursor = this._cursor; + let newCursor = oldCursor + 1; + const elements = oldFront._elements; + const element = elements[oldCursor]; + if (newCursor === QUEUE_MAX_ARRAY_SIZE) { + newFront = oldFront._next; + newCursor = 0; + } + // No mutations before this point. + --this._size; + this._cursor = newCursor; + if (oldFront !== newFront) { + this._front = newFront; + } + // Permit shifted element to be garbage collected. + elements[oldCursor] = undefined; + return element; + } + // The tricky thing about forEach() is that it can be called + // re-entrantly. The queue may be mutated inside the callback. It is easy to + // see that push() within the callback has no negative effects since the end + // of the queue is checked for on every iteration. If shift() is called + // repeatedly within the callback then the next iteration may return an + // element that has been removed. In this case the callback will be called + // with undefined values until we either "catch up" with elements that still + // exist or reach the back of the queue. + forEach(callback) { + let i = this._cursor; + let node = this._front; + let elements = node._elements; + while (i !== elements.length || node._next !== undefined) { + if (i === elements.length) { + node = node._next; + elements = node._elements; + i = 0; + if (elements.length === 0) { + break; + } + } + callback(elements[i]); + ++i; + } + } + // Return the element that would be returned if shift() was called now, + // without modifying the queue. + peek() { // must not be called on an empty queue + const front = this._front; + const cursor = this._cursor; + return front._elements[cursor]; + } + } + + function ReadableStreamReaderGenericInitialize(reader, stream) { + reader._ownerReadableStream = stream; + stream._reader = reader; + if (stream._state === 'readable') { + defaultReaderClosedPromiseInitialize(reader); + } + else if (stream._state === 'closed') { + defaultReaderClosedPromiseInitializeAsResolved(reader); + } + else { + defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError); + } + } + // A client of ReadableStreamDefaultReader and ReadableStreamBYOBReader may use these functions directly to bypass state + // check. + function ReadableStreamReaderGenericCancel(reader, reason) { + const stream = reader._ownerReadableStream; + return ReadableStreamCancel(stream, reason); + } + function ReadableStreamReaderGenericRelease(reader) { + if (reader._ownerReadableStream._state === 'readable') { + defaultReaderClosedPromiseReject(reader, new TypeError(`Reader was released and can no longer be used to monitor the stream's closedness`)); + } + else { + defaultReaderClosedPromiseResetToRejected(reader, new TypeError(`Reader was released and can no longer be used to monitor the stream's closedness`)); + } + reader._ownerReadableStream._reader = undefined; + reader._ownerReadableStream = undefined; + } + // Helper functions for the readers. + function readerLockException(name) { + return new TypeError('Cannot ' + name + ' a stream using a released reader'); + } + // Helper functions for the ReadableStreamDefaultReader. + function defaultReaderClosedPromiseInitialize(reader) { + reader._closedPromise = newPromise((resolve, reject) => { + reader._closedPromise_resolve = resolve; + reader._closedPromise_reject = reject; + }); + } + function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) { + defaultReaderClosedPromiseInitialize(reader); + defaultReaderClosedPromiseReject(reader, reason); + } + function defaultReaderClosedPromiseInitializeAsResolved(reader) { + defaultReaderClosedPromiseInitialize(reader); + defaultReaderClosedPromiseResolve(reader); + } + function defaultReaderClosedPromiseReject(reader, reason) { + if (reader._closedPromise_reject === undefined) { + return; + } + setPromiseIsHandledToTrue(reader._closedPromise); + reader._closedPromise_reject(reason); + reader._closedPromise_resolve = undefined; + reader._closedPromise_reject = undefined; + } + function defaultReaderClosedPromiseResetToRejected(reader, reason) { + defaultReaderClosedPromiseInitializeAsRejected(reader, reason); + } + function defaultReaderClosedPromiseResolve(reader) { + if (reader._closedPromise_resolve === undefined) { + return; + } + reader._closedPromise_resolve(undefined); + reader._closedPromise_resolve = undefined; + reader._closedPromise_reject = undefined; + } + + const AbortSteps = SymbolPolyfill('[[AbortSteps]]'); + const ErrorSteps = SymbolPolyfill('[[ErrorSteps]]'); + const CancelSteps = SymbolPolyfill('[[CancelSteps]]'); + const PullSteps = SymbolPolyfill('[[PullSteps]]'); + + /// + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite#Polyfill + const NumberIsFinite = Number.isFinite || function (x) { + return typeof x === 'number' && isFinite(x); + }; + + /// + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc#Polyfill + const MathTrunc = Math.trunc || function (v) { + return v < 0 ? Math.ceil(v) : Math.floor(v); + }; + + // https://heycam.github.io/webidl/#idl-dictionaries + function isDictionary(x) { + return typeof x === 'object' || typeof x === 'function'; + } + function assertDictionary(obj, context) { + if (obj !== undefined && !isDictionary(obj)) { + throw new TypeError(`${context} is not an object.`); + } + } + // https://heycam.github.io/webidl/#idl-callback-functions + function assertFunction(x, context) { + if (typeof x !== 'function') { + throw new TypeError(`${context} is not a function.`); + } + } + // https://heycam.github.io/webidl/#idl-object + function isObject(x) { + return (typeof x === 'object' && x !== null) || typeof x === 'function'; + } + function assertObject(x, context) { + if (!isObject(x)) { + throw new TypeError(`${context} is not an object.`); + } + } + function assertRequiredArgument(x, position, context) { + if (x === undefined) { + throw new TypeError(`Parameter ${position} is required in '${context}'.`); + } + } + function assertRequiredField(x, field, context) { + if (x === undefined) { + throw new TypeError(`${field} is required in '${context}'.`); + } + } + // https://heycam.github.io/webidl/#idl-unrestricted-double + function convertUnrestrictedDouble(value) { + return Number(value); + } + function censorNegativeZero(x) { + return x === 0 ? 0 : x; + } + function integerPart(x) { + return censorNegativeZero(MathTrunc(x)); + } + // https://heycam.github.io/webidl/#idl-unsigned-long-long + function convertUnsignedLongLongWithEnforceRange(value, context) { + const lowerBound = 0; + const upperBound = Number.MAX_SAFE_INTEGER; + let x = Number(value); + x = censorNegativeZero(x); + if (!NumberIsFinite(x)) { + throw new TypeError(`${context} is not a finite number`); + } + x = integerPart(x); + if (x < lowerBound || x > upperBound) { + throw new TypeError(`${context} is outside the accepted range of ${lowerBound} to ${upperBound}, inclusive`); + } + if (!NumberIsFinite(x) || x === 0) { + return 0; + } + // TODO Use BigInt if supported? + // let xBigInt = BigInt(integerPart(x)); + // xBigInt = BigInt.asUintN(64, xBigInt); + // return Number(xBigInt); + return x; + } + + function assertReadableStream(x, context) { + if (!IsReadableStream(x)) { + throw new TypeError(`${context} is not a ReadableStream.`); + } + } + + // Abstract operations for the ReadableStream. + function AcquireReadableStreamDefaultReader(stream) { + return new ReadableStreamDefaultReader(stream); + } + // ReadableStream API exposed for controllers. + function ReadableStreamAddReadRequest(stream, readRequest) { + stream._reader._readRequests.push(readRequest); + } + function ReadableStreamFulfillReadRequest(stream, chunk, done) { + const reader = stream._reader; + const readRequest = reader._readRequests.shift(); + if (done) { + readRequest._closeSteps(); + } + else { + readRequest._chunkSteps(chunk); + } + } + function ReadableStreamGetNumReadRequests(stream) { + return stream._reader._readRequests.length; + } + function ReadableStreamHasDefaultReader(stream) { + const reader = stream._reader; + if (reader === undefined) { + return false; + } + if (!IsReadableStreamDefaultReader(reader)) { + return false; + } + return true; + } + /** + * A default reader vended by a {@link ReadableStream}. + * + * @public + */ + class ReadableStreamDefaultReader { + constructor(stream) { + assertRequiredArgument(stream, 1, 'ReadableStreamDefaultReader'); + assertReadableStream(stream, 'First parameter'); + if (IsReadableStreamLocked(stream)) { + throw new TypeError('This stream has already been locked for exclusive reading by another reader'); + } + ReadableStreamReaderGenericInitialize(this, stream); + this._readRequests = new SimpleQueue(); + } + /** + * Returns a promise that will be fulfilled when the stream becomes closed, + * or rejected if the stream ever errors or the reader's lock is released before the stream finishes closing. + */ + get closed() { + if (!IsReadableStreamDefaultReader(this)) { + return promiseRejectedWith(defaultReaderBrandCheckException('closed')); + } + return this._closedPromise; + } + /** + * If the reader is active, behaves the same as {@link ReadableStream.cancel | stream.cancel(reason)}. + */ + cancel(reason = undefined) { + if (!IsReadableStreamDefaultReader(this)) { + return promiseRejectedWith(defaultReaderBrandCheckException('cancel')); + } + if (this._ownerReadableStream === undefined) { + return promiseRejectedWith(readerLockException('cancel')); + } + return ReadableStreamReaderGenericCancel(this, reason); + } + /** + * Returns a promise that allows access to the next chunk from the stream's internal queue, if available. + * + * If reading a chunk causes the queue to become empty, more data will be pulled from the underlying source. + */ + read() { + if (!IsReadableStreamDefaultReader(this)) { + return promiseRejectedWith(defaultReaderBrandCheckException('read')); + } + if (this._ownerReadableStream === undefined) { + return promiseRejectedWith(readerLockException('read from')); + } + let resolvePromise; + let rejectPromise; + const promise = newPromise((resolve, reject) => { + resolvePromise = resolve; + rejectPromise = reject; + }); + const readRequest = { + _chunkSteps: chunk => resolvePromise({ value: chunk, done: false }), + _closeSteps: () => resolvePromise({ value: undefined, done: true }), + _errorSteps: e => rejectPromise(e) + }; + ReadableStreamDefaultReaderRead(this, readRequest); + return promise; + } + /** + * Releases the reader's lock on the corresponding stream. After the lock is released, the reader is no longer active. + * If the associated stream is errored when the lock is released, the reader will appear errored in the same way + * from now on; otherwise, the reader will appear closed. + * + * A reader's lock cannot be released while it still has a pending read request, i.e., if a promise returned by + * the reader's {@link ReadableStreamDefaultReader.read | read()} method has not yet been settled. Attempting to + * do so will throw a `TypeError` and leave the reader locked to the stream. + */ + releaseLock() { + if (!IsReadableStreamDefaultReader(this)) { + throw defaultReaderBrandCheckException('releaseLock'); + } + if (this._ownerReadableStream === undefined) { + return; + } + if (this._readRequests.length > 0) { + throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled'); + } + ReadableStreamReaderGenericRelease(this); + } + } + Object.defineProperties(ReadableStreamDefaultReader.prototype, { + cancel: { enumerable: true }, + read: { enumerable: true }, + releaseLock: { enumerable: true }, + closed: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamDefaultReader.prototype, SymbolPolyfill.toStringTag, { + value: 'ReadableStreamDefaultReader', + configurable: true + }); + } + // Abstract operations for the readers. + function IsReadableStreamDefaultReader(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) { + return false; + } + return x instanceof ReadableStreamDefaultReader; + } + function ReadableStreamDefaultReaderRead(reader, readRequest) { + const stream = reader._ownerReadableStream; + stream._disturbed = true; + if (stream._state === 'closed') { + readRequest._closeSteps(); + } + else if (stream._state === 'errored') { + readRequest._errorSteps(stream._storedError); + } + else { + stream._readableStreamController[PullSteps](readRequest); + } + } + // Helper functions for the ReadableStreamDefaultReader. + function defaultReaderBrandCheckException(name) { + return new TypeError(`ReadableStreamDefaultReader.prototype.${name} can only be used on a ReadableStreamDefaultReader`); + } + + /// + /* eslint-disable @typescript-eslint/no-empty-function */ + const AsyncIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf(async function* () { }).prototype); + + /// + class ReadableStreamAsyncIteratorImpl { + constructor(reader, preventCancel) { + this._ongoingPromise = undefined; + this._isFinished = false; + this._reader = reader; + this._preventCancel = preventCancel; + } + next() { + const nextSteps = () => this._nextSteps(); + this._ongoingPromise = this._ongoingPromise ? + transformPromiseWith(this._ongoingPromise, nextSteps, nextSteps) : + nextSteps(); + return this._ongoingPromise; + } + return(value) { + const returnSteps = () => this._returnSteps(value); + return this._ongoingPromise ? + transformPromiseWith(this._ongoingPromise, returnSteps, returnSteps) : + returnSteps(); + } + _nextSteps() { + if (this._isFinished) { + return Promise.resolve({ value: undefined, done: true }); + } + const reader = this._reader; + if (reader._ownerReadableStream === undefined) { + return promiseRejectedWith(readerLockException('iterate')); + } + let resolvePromise; + let rejectPromise; + const promise = newPromise((resolve, reject) => { + resolvePromise = resolve; + rejectPromise = reject; + }); + const readRequest = { + _chunkSteps: chunk => { + this._ongoingPromise = undefined; + // This needs to be delayed by one microtask, otherwise we stop pulling too early which breaks a test. + // FIXME Is this a bug in the specification, or in the test? + queueMicrotask(() => resolvePromise({ value: chunk, done: false })); + }, + _closeSteps: () => { + this._ongoingPromise = undefined; + this._isFinished = true; + ReadableStreamReaderGenericRelease(reader); + resolvePromise({ value: undefined, done: true }); + }, + _errorSteps: reason => { + this._ongoingPromise = undefined; + this._isFinished = true; + ReadableStreamReaderGenericRelease(reader); + rejectPromise(reason); + } + }; + ReadableStreamDefaultReaderRead(reader, readRequest); + return promise; + } + _returnSteps(value) { + if (this._isFinished) { + return Promise.resolve({ value, done: true }); + } + this._isFinished = true; + const reader = this._reader; + if (reader._ownerReadableStream === undefined) { + return promiseRejectedWith(readerLockException('finish iterating')); + } + if (!this._preventCancel) { + const result = ReadableStreamReaderGenericCancel(reader, value); + ReadableStreamReaderGenericRelease(reader); + return transformPromiseWith(result, () => ({ value, done: true })); + } + ReadableStreamReaderGenericRelease(reader); + return promiseResolvedWith({ value, done: true }); + } + } + const ReadableStreamAsyncIteratorPrototype = { + next() { + if (!IsReadableStreamAsyncIterator(this)) { + return promiseRejectedWith(streamAsyncIteratorBrandCheckException('next')); + } + return this._asyncIteratorImpl.next(); + }, + return(value) { + if (!IsReadableStreamAsyncIterator(this)) { + return promiseRejectedWith(streamAsyncIteratorBrandCheckException('return')); + } + return this._asyncIteratorImpl.return(value); + } + }; + if (AsyncIteratorPrototype !== undefined) { + Object.setPrototypeOf(ReadableStreamAsyncIteratorPrototype, AsyncIteratorPrototype); + } + // Abstract operations for the ReadableStream. + function AcquireReadableStreamAsyncIterator(stream, preventCancel) { + const reader = AcquireReadableStreamDefaultReader(stream); + const impl = new ReadableStreamAsyncIteratorImpl(reader, preventCancel); + const iterator = Object.create(ReadableStreamAsyncIteratorPrototype); + iterator._asyncIteratorImpl = impl; + return iterator; + } + function IsReadableStreamAsyncIterator(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_asyncIteratorImpl')) { + return false; + } + try { + // noinspection SuspiciousTypeOfGuard + return x._asyncIteratorImpl instanceof + ReadableStreamAsyncIteratorImpl; + } + catch (_a) { + return false; + } + } + // Helper functions for the ReadableStream. + function streamAsyncIteratorBrandCheckException(name) { + return new TypeError(`ReadableStreamAsyncIterator.${name} can only be used on a ReadableSteamAsyncIterator`); + } + + /// + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN#Polyfill + const NumberIsNaN = Number.isNaN || function (x) { + // eslint-disable-next-line no-self-compare + return x !== x; + }; + + function CreateArrayFromList(elements) { + // We use arrays to represent lists, so this is basically a no-op. + // Do a slice though just in case we happen to depend on the unique-ness. + return elements.slice(); + } + function CopyDataBlockBytes(dest, destOffset, src, srcOffset, n) { + new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset); + } + // Not implemented correctly + function TransferArrayBuffer(O) { + return O; + } + // Not implemented correctly + // eslint-disable-next-line @typescript-eslint/no-unused-vars + function IsDetachedBuffer(O) { + return false; + } + function ArrayBufferSlice(buffer, begin, end) { + // ArrayBuffer.prototype.slice is not available on IE10 + // https://www.caniuse.com/mdn-javascript_builtins_arraybuffer_slice + if (buffer.slice) { + return buffer.slice(begin, end); + } + const length = end - begin; + const slice = new ArrayBuffer(length); + CopyDataBlockBytes(slice, 0, buffer, begin, length); + return slice; + } + + function IsNonNegativeNumber(v) { + if (typeof v !== 'number') { + return false; + } + if (NumberIsNaN(v)) { + return false; + } + if (v < 0) { + return false; + } + return true; + } + function CloneAsUint8Array(O) { + const buffer = ArrayBufferSlice(O.buffer, O.byteOffset, O.byteOffset + O.byteLength); + return new Uint8Array(buffer); + } + + function DequeueValue(container) { + const pair = container._queue.shift(); + container._queueTotalSize -= pair.size; + if (container._queueTotalSize < 0) { + container._queueTotalSize = 0; + } + return pair.value; + } + function EnqueueValueWithSize(container, value, size) { + if (!IsNonNegativeNumber(size) || size === Infinity) { + throw new RangeError('Size must be a finite, non-NaN, non-negative number.'); + } + container._queue.push({ value, size }); + container._queueTotalSize += size; + } + function PeekQueueValue(container) { + const pair = container._queue.peek(); + return pair.value; + } + function ResetQueue(container) { + container._queue = new SimpleQueue(); + container._queueTotalSize = 0; + } + + /** + * A pull-into request in a {@link ReadableByteStreamController}. + * + * @public + */ + class ReadableStreamBYOBRequest { + constructor() { + throw new TypeError('Illegal constructor'); + } + /** + * Returns the view for writing in to, or `null` if the BYOB request has already been responded to. + */ + get view() { + if (!IsReadableStreamBYOBRequest(this)) { + throw byobRequestBrandCheckException('view'); + } + return this._view; + } + respond(bytesWritten) { + if (!IsReadableStreamBYOBRequest(this)) { + throw byobRequestBrandCheckException('respond'); + } + assertRequiredArgument(bytesWritten, 1, 'respond'); + bytesWritten = convertUnsignedLongLongWithEnforceRange(bytesWritten, 'First parameter'); + if (this._associatedReadableByteStreamController === undefined) { + throw new TypeError('This BYOB request has been invalidated'); + } + if (IsDetachedBuffer(this._view.buffer)) ; + ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten); + } + respondWithNewView(view) { + if (!IsReadableStreamBYOBRequest(this)) { + throw byobRequestBrandCheckException('respondWithNewView'); + } + assertRequiredArgument(view, 1, 'respondWithNewView'); + if (!ArrayBuffer.isView(view)) { + throw new TypeError('You can only respond with array buffer views'); + } + if (this._associatedReadableByteStreamController === undefined) { + throw new TypeError('This BYOB request has been invalidated'); + } + if (IsDetachedBuffer(view.buffer)) ; + ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view); + } + } + Object.defineProperties(ReadableStreamBYOBRequest.prototype, { + respond: { enumerable: true }, + respondWithNewView: { enumerable: true }, + view: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamBYOBRequest.prototype, SymbolPolyfill.toStringTag, { + value: 'ReadableStreamBYOBRequest', + configurable: true + }); + } + /** + * Allows control of a {@link ReadableStream | readable byte stream}'s state and internal queue. + * + * @public + */ + class ReadableByteStreamController { + constructor() { + throw new TypeError('Illegal constructor'); + } + /** + * Returns the current BYOB pull request, or `null` if there isn't one. + */ + get byobRequest() { + if (!IsReadableByteStreamController(this)) { + throw byteStreamControllerBrandCheckException('byobRequest'); + } + return ReadableByteStreamControllerGetBYOBRequest(this); + } + /** + * Returns the desired size to fill the controlled stream's internal queue. It can be negative, if the queue is + * over-full. An underlying byte source ought to use this information to determine when and how to apply backpressure. + */ + get desiredSize() { + if (!IsReadableByteStreamController(this)) { + throw byteStreamControllerBrandCheckException('desiredSize'); + } + return ReadableByteStreamControllerGetDesiredSize(this); + } + /** + * Closes the controlled readable stream. Consumers will still be able to read any previously-enqueued chunks from + * the stream, but once those are read, the stream will become closed. + */ + close() { + if (!IsReadableByteStreamController(this)) { + throw byteStreamControllerBrandCheckException('close'); + } + if (this._closeRequested) { + throw new TypeError('The stream has already been closed; do not close it again!'); + } + const state = this._controlledReadableByteStream._state; + if (state !== 'readable') { + throw new TypeError(`The stream (in ${state} state) is not in the readable state and cannot be closed`); + } + ReadableByteStreamControllerClose(this); + } + enqueue(chunk) { + if (!IsReadableByteStreamController(this)) { + throw byteStreamControllerBrandCheckException('enqueue'); + } + assertRequiredArgument(chunk, 1, 'enqueue'); + if (!ArrayBuffer.isView(chunk)) { + throw new TypeError('chunk must be an array buffer view'); + } + if (chunk.byteLength === 0) { + throw new TypeError('chunk must have non-zero byteLength'); + } + if (chunk.buffer.byteLength === 0) { + throw new TypeError(`chunk's buffer must have non-zero byteLength`); + } + if (this._closeRequested) { + throw new TypeError('stream is closed or draining'); + } + const state = this._controlledReadableByteStream._state; + if (state !== 'readable') { + throw new TypeError(`The stream (in ${state} state) is not in the readable state and cannot be enqueued to`); + } + ReadableByteStreamControllerEnqueue(this, chunk); + } + /** + * Errors the controlled readable stream, making all future interactions with it fail with the given error `e`. + */ + error(e = undefined) { + if (!IsReadableByteStreamController(this)) { + throw byteStreamControllerBrandCheckException('error'); + } + ReadableByteStreamControllerError(this, e); + } + /** @internal */ + [CancelSteps](reason) { + ReadableByteStreamControllerClearPendingPullIntos(this); + ResetQueue(this); + const result = this._cancelAlgorithm(reason); + ReadableByteStreamControllerClearAlgorithms(this); + return result; + } + /** @internal */ + [PullSteps](readRequest) { + const stream = this._controlledReadableByteStream; + if (this._queueTotalSize > 0) { + const entry = this._queue.shift(); + this._queueTotalSize -= entry.byteLength; + ReadableByteStreamControllerHandleQueueDrain(this); + const view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength); + readRequest._chunkSteps(view); + return; + } + const autoAllocateChunkSize = this._autoAllocateChunkSize; + if (autoAllocateChunkSize !== undefined) { + let buffer; + try { + buffer = new ArrayBuffer(autoAllocateChunkSize); + } + catch (bufferE) { + readRequest._errorSteps(bufferE); + return; + } + const pullIntoDescriptor = { + buffer, + bufferByteLength: autoAllocateChunkSize, + byteOffset: 0, + byteLength: autoAllocateChunkSize, + bytesFilled: 0, + elementSize: 1, + viewConstructor: Uint8Array, + readerType: 'default' + }; + this._pendingPullIntos.push(pullIntoDescriptor); + } + ReadableStreamAddReadRequest(stream, readRequest); + ReadableByteStreamControllerCallPullIfNeeded(this); + } + } + Object.defineProperties(ReadableByteStreamController.prototype, { + close: { enumerable: true }, + enqueue: { enumerable: true }, + error: { enumerable: true }, + byobRequest: { enumerable: true }, + desiredSize: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(ReadableByteStreamController.prototype, SymbolPolyfill.toStringTag, { + value: 'ReadableByteStreamController', + configurable: true + }); + } + // Abstract operations for the ReadableByteStreamController. + function IsReadableByteStreamController(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_controlledReadableByteStream')) { + return false; + } + return x instanceof ReadableByteStreamController; + } + function IsReadableStreamBYOBRequest(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) { + return false; + } + return x instanceof ReadableStreamBYOBRequest; + } + function ReadableByteStreamControllerCallPullIfNeeded(controller) { + const shouldPull = ReadableByteStreamControllerShouldCallPull(controller); + if (!shouldPull) { + return; + } + if (controller._pulling) { + controller._pullAgain = true; + return; + } + controller._pulling = true; + // TODO: Test controller argument + const pullPromise = controller._pullAlgorithm(); + uponPromise(pullPromise, () => { + controller._pulling = false; + if (controller._pullAgain) { + controller._pullAgain = false; + ReadableByteStreamControllerCallPullIfNeeded(controller); + } + }, e => { + ReadableByteStreamControllerError(controller, e); + }); + } + function ReadableByteStreamControllerClearPendingPullIntos(controller) { + ReadableByteStreamControllerInvalidateBYOBRequest(controller); + controller._pendingPullIntos = new SimpleQueue(); + } + function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) { + let done = false; + if (stream._state === 'closed') { + done = true; + } + const filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor); + if (pullIntoDescriptor.readerType === 'default') { + ReadableStreamFulfillReadRequest(stream, filledView, done); + } + else { + ReadableStreamFulfillReadIntoRequest(stream, filledView, done); + } + } + function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) { + const bytesFilled = pullIntoDescriptor.bytesFilled; + const elementSize = pullIntoDescriptor.elementSize; + return new pullIntoDescriptor.viewConstructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize); + } + function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) { + controller._queue.push({ buffer, byteOffset, byteLength }); + controller._queueTotalSize += byteLength; + } + function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) { + const elementSize = pullIntoDescriptor.elementSize; + const currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize; + const maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled); + const maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy; + const maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize; + let totalBytesToCopyRemaining = maxBytesToCopy; + let ready = false; + if (maxAlignedBytes > currentAlignedBytes) { + totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled; + ready = true; + } + const queue = controller._queue; + while (totalBytesToCopyRemaining > 0) { + const headOfQueue = queue.peek(); + const bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength); + const destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled; + CopyDataBlockBytes(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy); + if (headOfQueue.byteLength === bytesToCopy) { + queue.shift(); + } + else { + headOfQueue.byteOffset += bytesToCopy; + headOfQueue.byteLength -= bytesToCopy; + } + controller._queueTotalSize -= bytesToCopy; + ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor); + totalBytesToCopyRemaining -= bytesToCopy; + } + return ready; + } + function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) { + pullIntoDescriptor.bytesFilled += size; + } + function ReadableByteStreamControllerHandleQueueDrain(controller) { + if (controller._queueTotalSize === 0 && controller._closeRequested) { + ReadableByteStreamControllerClearAlgorithms(controller); + ReadableStreamClose(controller._controlledReadableByteStream); + } + else { + ReadableByteStreamControllerCallPullIfNeeded(controller); + } + } + function ReadableByteStreamControllerInvalidateBYOBRequest(controller) { + if (controller._byobRequest === null) { + return; + } + controller._byobRequest._associatedReadableByteStreamController = undefined; + controller._byobRequest._view = null; + controller._byobRequest = null; + } + function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) { + while (controller._pendingPullIntos.length > 0) { + if (controller._queueTotalSize === 0) { + return; + } + const pullIntoDescriptor = controller._pendingPullIntos.peek(); + if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor)) { + ReadableByteStreamControllerShiftPendingPullInto(controller); + ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableByteStream, pullIntoDescriptor); + } + } + } + function ReadableByteStreamControllerPullInto(controller, view, readIntoRequest) { + const stream = controller._controlledReadableByteStream; + let elementSize = 1; + if (view.constructor !== DataView) { + elementSize = view.constructor.BYTES_PER_ELEMENT; + } + const ctor = view.constructor; + // try { + const buffer = TransferArrayBuffer(view.buffer); + // } catch (e) { + // readIntoRequest._errorSteps(e); + // return; + // } + const pullIntoDescriptor = { + buffer, + bufferByteLength: buffer.byteLength, + byteOffset: view.byteOffset, + byteLength: view.byteLength, + bytesFilled: 0, + elementSize, + viewConstructor: ctor, + readerType: 'byob' + }; + if (controller._pendingPullIntos.length > 0) { + controller._pendingPullIntos.push(pullIntoDescriptor); + // No ReadableByteStreamControllerCallPullIfNeeded() call since: + // - No change happens on desiredSize + // - The source has already been notified of that there's at least 1 pending read(view) + ReadableStreamAddReadIntoRequest(stream, readIntoRequest); + return; + } + if (stream._state === 'closed') { + const emptyView = new ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0); + readIntoRequest._closeSteps(emptyView); + return; + } + if (controller._queueTotalSize > 0) { + if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor)) { + const filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor); + ReadableByteStreamControllerHandleQueueDrain(controller); + readIntoRequest._chunkSteps(filledView); + return; + } + if (controller._closeRequested) { + const e = new TypeError('Insufficient bytes to fill elements in the given buffer'); + ReadableByteStreamControllerError(controller, e); + readIntoRequest._errorSteps(e); + return; + } + } + controller._pendingPullIntos.push(pullIntoDescriptor); + ReadableStreamAddReadIntoRequest(stream, readIntoRequest); + ReadableByteStreamControllerCallPullIfNeeded(controller); + } + function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) { + const stream = controller._controlledReadableByteStream; + if (ReadableStreamHasBYOBReader(stream)) { + while (ReadableStreamGetNumReadIntoRequests(stream) > 0) { + const pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller); + ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor); + } + } + } + function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) { + ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor); + if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) { + return; + } + ReadableByteStreamControllerShiftPendingPullInto(controller); + const remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize; + if (remainderSize > 0) { + const end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled; + const remainder = ArrayBufferSlice(pullIntoDescriptor.buffer, end - remainderSize, end); + ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength); + } + pullIntoDescriptor.bytesFilled -= remainderSize; + ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableByteStream, pullIntoDescriptor); + ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); + } + function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) { + const firstDescriptor = controller._pendingPullIntos.peek(); + ReadableByteStreamControllerInvalidateBYOBRequest(controller); + const state = controller._controlledReadableByteStream._state; + if (state === 'closed') { + ReadableByteStreamControllerRespondInClosedState(controller); + } + else { + ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor); + } + ReadableByteStreamControllerCallPullIfNeeded(controller); + } + function ReadableByteStreamControllerShiftPendingPullInto(controller) { + const descriptor = controller._pendingPullIntos.shift(); + return descriptor; + } + function ReadableByteStreamControllerShouldCallPull(controller) { + const stream = controller._controlledReadableByteStream; + if (stream._state !== 'readable') { + return false; + } + if (controller._closeRequested) { + return false; + } + if (!controller._started) { + return false; + } + if (ReadableStreamHasDefaultReader(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { + return true; + } + if (ReadableStreamHasBYOBReader(stream) && ReadableStreamGetNumReadIntoRequests(stream) > 0) { + return true; + } + const desiredSize = ReadableByteStreamControllerGetDesiredSize(controller); + if (desiredSize > 0) { + return true; + } + return false; + } + function ReadableByteStreamControllerClearAlgorithms(controller) { + controller._pullAlgorithm = undefined; + controller._cancelAlgorithm = undefined; + } + // A client of ReadableByteStreamController may use these functions directly to bypass state check. + function ReadableByteStreamControllerClose(controller) { + const stream = controller._controlledReadableByteStream; + if (controller._closeRequested || stream._state !== 'readable') { + return; + } + if (controller._queueTotalSize > 0) { + controller._closeRequested = true; + return; + } + if (controller._pendingPullIntos.length > 0) { + const firstPendingPullInto = controller._pendingPullIntos.peek(); + if (firstPendingPullInto.bytesFilled > 0) { + const e = new TypeError('Insufficient bytes to fill elements in the given buffer'); + ReadableByteStreamControllerError(controller, e); + throw e; + } + } + ReadableByteStreamControllerClearAlgorithms(controller); + ReadableStreamClose(stream); + } + function ReadableByteStreamControllerEnqueue(controller, chunk) { + const stream = controller._controlledReadableByteStream; + if (controller._closeRequested || stream._state !== 'readable') { + return; + } + const buffer = chunk.buffer; + const byteOffset = chunk.byteOffset; + const byteLength = chunk.byteLength; + const transferredBuffer = TransferArrayBuffer(buffer); + if (controller._pendingPullIntos.length > 0) { + const firstPendingPullInto = controller._pendingPullIntos.peek(); + if (IsDetachedBuffer(firstPendingPullInto.buffer)) ; + firstPendingPullInto.buffer = TransferArrayBuffer(firstPendingPullInto.buffer); + } + ReadableByteStreamControllerInvalidateBYOBRequest(controller); + if (ReadableStreamHasDefaultReader(stream)) { + if (ReadableStreamGetNumReadRequests(stream) === 0) { + ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); + } + else { + if (controller._pendingPullIntos.length > 0) { + ReadableByteStreamControllerShiftPendingPullInto(controller); + } + const transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength); + ReadableStreamFulfillReadRequest(stream, transferredView, false); + } + } + else if (ReadableStreamHasBYOBReader(stream)) { + // TODO: Ideally in this branch detaching should happen only if the buffer is not consumed fully. + ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); + ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); + } + else { + ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); + } + ReadableByteStreamControllerCallPullIfNeeded(controller); + } + function ReadableByteStreamControllerError(controller, e) { + const stream = controller._controlledReadableByteStream; + if (stream._state !== 'readable') { + return; + } + ReadableByteStreamControllerClearPendingPullIntos(controller); + ResetQueue(controller); + ReadableByteStreamControllerClearAlgorithms(controller); + ReadableStreamError(stream, e); + } + function ReadableByteStreamControllerGetBYOBRequest(controller) { + if (controller._byobRequest === null && controller._pendingPullIntos.length > 0) { + const firstDescriptor = controller._pendingPullIntos.peek(); + const view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled); + const byobRequest = Object.create(ReadableStreamBYOBRequest.prototype); + SetUpReadableStreamBYOBRequest(byobRequest, controller, view); + controller._byobRequest = byobRequest; + } + return controller._byobRequest; + } + function ReadableByteStreamControllerGetDesiredSize(controller) { + const state = controller._controlledReadableByteStream._state; + if (state === 'errored') { + return null; + } + if (state === 'closed') { + return 0; + } + return controller._strategyHWM - controller._queueTotalSize; + } + function ReadableByteStreamControllerRespond(controller, bytesWritten) { + const firstDescriptor = controller._pendingPullIntos.peek(); + const state = controller._controlledReadableByteStream._state; + if (state === 'closed') { + if (bytesWritten !== 0) { + throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream'); + } + } + else { + if (bytesWritten === 0) { + throw new TypeError('bytesWritten must be greater than 0 when calling respond() on a readable stream'); + } + if (firstDescriptor.bytesFilled + bytesWritten > firstDescriptor.byteLength) { + throw new RangeError('bytesWritten out of range'); + } + } + firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer); + ReadableByteStreamControllerRespondInternal(controller, bytesWritten); + } + function ReadableByteStreamControllerRespondWithNewView(controller, view) { + const firstDescriptor = controller._pendingPullIntos.peek(); + const state = controller._controlledReadableByteStream._state; + if (state === 'closed') { + if (view.byteLength !== 0) { + throw new TypeError('The view\'s length must be 0 when calling respondWithNewView() on a closed stream'); + } + } + else { + if (view.byteLength === 0) { + throw new TypeError('The view\'s length must be greater than 0 when calling respondWithNewView() on a readable stream'); + } + } + if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) { + throw new RangeError('The region specified by view does not match byobRequest'); + } + if (firstDescriptor.bufferByteLength !== view.buffer.byteLength) { + throw new RangeError('The buffer of view has different capacity than byobRequest'); + } + if (firstDescriptor.bytesFilled + view.byteLength > firstDescriptor.byteLength) { + throw new RangeError('The region specified by view is larger than byobRequest'); + } + const viewByteLength = view.byteLength; + firstDescriptor.buffer = TransferArrayBuffer(view.buffer); + ReadableByteStreamControllerRespondInternal(controller, viewByteLength); + } + function SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, autoAllocateChunkSize) { + controller._controlledReadableByteStream = stream; + controller._pullAgain = false; + controller._pulling = false; + controller._byobRequest = null; + // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly. + controller._queue = controller._queueTotalSize = undefined; + ResetQueue(controller); + controller._closeRequested = false; + controller._started = false; + controller._strategyHWM = highWaterMark; + controller._pullAlgorithm = pullAlgorithm; + controller._cancelAlgorithm = cancelAlgorithm; + controller._autoAllocateChunkSize = autoAllocateChunkSize; + controller._pendingPullIntos = new SimpleQueue(); + stream._readableStreamController = controller; + const startResult = startAlgorithm(); + uponPromise(promiseResolvedWith(startResult), () => { + controller._started = true; + ReadableByteStreamControllerCallPullIfNeeded(controller); + }, r => { + ReadableByteStreamControllerError(controller, r); + }); + } + function SetUpReadableByteStreamControllerFromUnderlyingSource(stream, underlyingByteSource, highWaterMark) { + const controller = Object.create(ReadableByteStreamController.prototype); + let startAlgorithm = () => undefined; + let pullAlgorithm = () => promiseResolvedWith(undefined); + let cancelAlgorithm = () => promiseResolvedWith(undefined); + if (underlyingByteSource.start !== undefined) { + startAlgorithm = () => underlyingByteSource.start(controller); + } + if (underlyingByteSource.pull !== undefined) { + pullAlgorithm = () => underlyingByteSource.pull(controller); + } + if (underlyingByteSource.cancel !== undefined) { + cancelAlgorithm = reason => underlyingByteSource.cancel(reason); + } + const autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize; + if (autoAllocateChunkSize === 0) { + throw new TypeError('autoAllocateChunkSize must be greater than 0'); + } + SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, autoAllocateChunkSize); + } + function SetUpReadableStreamBYOBRequest(request, controller, view) { + request._associatedReadableByteStreamController = controller; + request._view = view; + } + // Helper functions for the ReadableStreamBYOBRequest. + function byobRequestBrandCheckException(name) { + return new TypeError(`ReadableStreamBYOBRequest.prototype.${name} can only be used on a ReadableStreamBYOBRequest`); + } + // Helper functions for the ReadableByteStreamController. + function byteStreamControllerBrandCheckException(name) { + return new TypeError(`ReadableByteStreamController.prototype.${name} can only be used on a ReadableByteStreamController`); + } + + // Abstract operations for the ReadableStream. + function AcquireReadableStreamBYOBReader(stream) { + return new ReadableStreamBYOBReader(stream); + } + // ReadableStream API exposed for controllers. + function ReadableStreamAddReadIntoRequest(stream, readIntoRequest) { + stream._reader._readIntoRequests.push(readIntoRequest); + } + function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) { + const reader = stream._reader; + const readIntoRequest = reader._readIntoRequests.shift(); + if (done) { + readIntoRequest._closeSteps(chunk); + } + else { + readIntoRequest._chunkSteps(chunk); + } + } + function ReadableStreamGetNumReadIntoRequests(stream) { + return stream._reader._readIntoRequests.length; + } + function ReadableStreamHasBYOBReader(stream) { + const reader = stream._reader; + if (reader === undefined) { + return false; + } + if (!IsReadableStreamBYOBReader(reader)) { + return false; + } + return true; + } + /** + * A BYOB reader vended by a {@link ReadableStream}. + * + * @public + */ + class ReadableStreamBYOBReader { + constructor(stream) { + assertRequiredArgument(stream, 1, 'ReadableStreamBYOBReader'); + assertReadableStream(stream, 'First parameter'); + if (IsReadableStreamLocked(stream)) { + throw new TypeError('This stream has already been locked for exclusive reading by another reader'); + } + if (!IsReadableByteStreamController(stream._readableStreamController)) { + throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + + 'source'); + } + ReadableStreamReaderGenericInitialize(this, stream); + this._readIntoRequests = new SimpleQueue(); + } + /** + * Returns a promise that will be fulfilled when the stream becomes closed, or rejected if the stream ever errors or + * the reader's lock is released before the stream finishes closing. + */ + get closed() { + if (!IsReadableStreamBYOBReader(this)) { + return promiseRejectedWith(byobReaderBrandCheckException('closed')); + } + return this._closedPromise; + } + /** + * If the reader is active, behaves the same as {@link ReadableStream.cancel | stream.cancel(reason)}. + */ + cancel(reason = undefined) { + if (!IsReadableStreamBYOBReader(this)) { + return promiseRejectedWith(byobReaderBrandCheckException('cancel')); + } + if (this._ownerReadableStream === undefined) { + return promiseRejectedWith(readerLockException('cancel')); + } + return ReadableStreamReaderGenericCancel(this, reason); + } + /** + * Attempts to reads bytes into view, and returns a promise resolved with the result. + * + * If reading a chunk causes the queue to become empty, more data will be pulled from the underlying source. + */ + read(view) { + if (!IsReadableStreamBYOBReader(this)) { + return promiseRejectedWith(byobReaderBrandCheckException('read')); + } + if (!ArrayBuffer.isView(view)) { + return promiseRejectedWith(new TypeError('view must be an array buffer view')); + } + if (view.byteLength === 0) { + return promiseRejectedWith(new TypeError('view must have non-zero byteLength')); + } + if (view.buffer.byteLength === 0) { + return promiseRejectedWith(new TypeError(`view's buffer must have non-zero byteLength`)); + } + if (IsDetachedBuffer(view.buffer)) ; + if (this._ownerReadableStream === undefined) { + return promiseRejectedWith(readerLockException('read from')); + } + let resolvePromise; + let rejectPromise; + const promise = newPromise((resolve, reject) => { + resolvePromise = resolve; + rejectPromise = reject; + }); + const readIntoRequest = { + _chunkSteps: chunk => resolvePromise({ value: chunk, done: false }), + _closeSteps: chunk => resolvePromise({ value: chunk, done: true }), + _errorSteps: e => rejectPromise(e) + }; + ReadableStreamBYOBReaderRead(this, view, readIntoRequest); + return promise; + } + /** + * Releases the reader's lock on the corresponding stream. After the lock is released, the reader is no longer active. + * If the associated stream is errored when the lock is released, the reader will appear errored in the same way + * from now on; otherwise, the reader will appear closed. + * + * A reader's lock cannot be released while it still has a pending read request, i.e., if a promise returned by + * the reader's {@link ReadableStreamBYOBReader.read | read()} method has not yet been settled. Attempting to + * do so will throw a `TypeError` and leave the reader locked to the stream. + */ + releaseLock() { + if (!IsReadableStreamBYOBReader(this)) { + throw byobReaderBrandCheckException('releaseLock'); + } + if (this._ownerReadableStream === undefined) { + return; + } + if (this._readIntoRequests.length > 0) { + throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled'); + } + ReadableStreamReaderGenericRelease(this); + } + } + Object.defineProperties(ReadableStreamBYOBReader.prototype, { + cancel: { enumerable: true }, + read: { enumerable: true }, + releaseLock: { enumerable: true }, + closed: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamBYOBReader.prototype, SymbolPolyfill.toStringTag, { + value: 'ReadableStreamBYOBReader', + configurable: true + }); + } + // Abstract operations for the readers. + function IsReadableStreamBYOBReader(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) { + return false; + } + return x instanceof ReadableStreamBYOBReader; + } + function ReadableStreamBYOBReaderRead(reader, view, readIntoRequest) { + const stream = reader._ownerReadableStream; + stream._disturbed = true; + if (stream._state === 'errored') { + readIntoRequest._errorSteps(stream._storedError); + } + else { + ReadableByteStreamControllerPullInto(stream._readableStreamController, view, readIntoRequest); + } + } + // Helper functions for the ReadableStreamBYOBReader. + function byobReaderBrandCheckException(name) { + return new TypeError(`ReadableStreamBYOBReader.prototype.${name} can only be used on a ReadableStreamBYOBReader`); + } + + function ExtractHighWaterMark(strategy, defaultHWM) { + const { highWaterMark } = strategy; + if (highWaterMark === undefined) { + return defaultHWM; + } + if (NumberIsNaN(highWaterMark) || highWaterMark < 0) { + throw new RangeError('Invalid highWaterMark'); + } + return highWaterMark; + } + function ExtractSizeAlgorithm(strategy) { + const { size } = strategy; + if (!size) { + return () => 1; + } + return size; + } + + function convertQueuingStrategy(init, context) { + assertDictionary(init, context); + const highWaterMark = init === null || init === void 0 ? void 0 : init.highWaterMark; + const size = init === null || init === void 0 ? void 0 : init.size; + return { + highWaterMark: highWaterMark === undefined ? undefined : convertUnrestrictedDouble(highWaterMark), + size: size === undefined ? undefined : convertQueuingStrategySize(size, `${context} has member 'size' that`) + }; + } + function convertQueuingStrategySize(fn, context) { + assertFunction(fn, context); + return chunk => convertUnrestrictedDouble(fn(chunk)); + } + + function convertUnderlyingSink(original, context) { + assertDictionary(original, context); + const abort = original === null || original === void 0 ? void 0 : original.abort; + const close = original === null || original === void 0 ? void 0 : original.close; + const start = original === null || original === void 0 ? void 0 : original.start; + const type = original === null || original === void 0 ? void 0 : original.type; + const write = original === null || original === void 0 ? void 0 : original.write; + return { + abort: abort === undefined ? + undefined : + convertUnderlyingSinkAbortCallback(abort, original, `${context} has member 'abort' that`), + close: close === undefined ? + undefined : + convertUnderlyingSinkCloseCallback(close, original, `${context} has member 'close' that`), + start: start === undefined ? + undefined : + convertUnderlyingSinkStartCallback(start, original, `${context} has member 'start' that`), + write: write === undefined ? + undefined : + convertUnderlyingSinkWriteCallback(write, original, `${context} has member 'write' that`), + type + }; + } + function convertUnderlyingSinkAbortCallback(fn, original, context) { + assertFunction(fn, context); + return (reason) => promiseCall(fn, original, [reason]); + } + function convertUnderlyingSinkCloseCallback(fn, original, context) { + assertFunction(fn, context); + return () => promiseCall(fn, original, []); + } + function convertUnderlyingSinkStartCallback(fn, original, context) { + assertFunction(fn, context); + return (controller) => reflectCall(fn, original, [controller]); + } + function convertUnderlyingSinkWriteCallback(fn, original, context) { + assertFunction(fn, context); + return (chunk, controller) => promiseCall(fn, original, [chunk, controller]); + } + + function assertWritableStream(x, context) { + if (!IsWritableStream(x)) { + throw new TypeError(`${context} is not a WritableStream.`); + } + } + + function isAbortSignal(value) { + if (typeof value !== 'object' || value === null) { + return false; + } + try { + return typeof value.aborted === 'boolean'; + } + catch (_a) { + // AbortSignal.prototype.aborted throws if its brand check fails + return false; + } + } + const supportsAbortController = typeof AbortController === 'function'; + /** + * Construct a new AbortController, if supported by the platform. + * + * @internal + */ + function createAbortController() { + if (supportsAbortController) { + return new AbortController(); + } + return undefined; + } + + /** + * A writable stream represents a destination for data, into which you can write. + * + * @public + */ + class WritableStream { + constructor(rawUnderlyingSink = {}, rawStrategy = {}) { + if (rawUnderlyingSink === undefined) { + rawUnderlyingSink = null; + } + else { + assertObject(rawUnderlyingSink, 'First parameter'); + } + const strategy = convertQueuingStrategy(rawStrategy, 'Second parameter'); + const underlyingSink = convertUnderlyingSink(rawUnderlyingSink, 'First parameter'); + InitializeWritableStream(this); + const type = underlyingSink.type; + if (type !== undefined) { + throw new RangeError('Invalid type is specified'); + } + const sizeAlgorithm = ExtractSizeAlgorithm(strategy); + const highWaterMark = ExtractHighWaterMark(strategy, 1); + SetUpWritableStreamDefaultControllerFromUnderlyingSink(this, underlyingSink, highWaterMark, sizeAlgorithm); + } + /** + * Returns whether or not the writable stream is locked to a writer. + */ + get locked() { + if (!IsWritableStream(this)) { + throw streamBrandCheckException$2('locked'); + } + return IsWritableStreamLocked(this); + } + /** + * Aborts the stream, signaling that the producer can no longer successfully write to the stream and it is to be + * immediately moved to an errored state, with any queued-up writes discarded. This will also execute any abort + * mechanism of the underlying sink. + * + * The returned promise will fulfill if the stream shuts down successfully, or reject if the underlying sink signaled + * that there was an error doing so. Additionally, it will reject with a `TypeError` (without attempting to cancel + * the stream) if the stream is currently locked. + */ + abort(reason = undefined) { + if (!IsWritableStream(this)) { + return promiseRejectedWith(streamBrandCheckException$2('abort')); + } + if (IsWritableStreamLocked(this)) { + return promiseRejectedWith(new TypeError('Cannot abort a stream that already has a writer')); + } + return WritableStreamAbort(this, reason); + } + /** + * Closes the stream. The underlying sink will finish processing any previously-written chunks, before invoking its + * close behavior. During this time any further attempts to write will fail (without erroring the stream). + * + * The method returns a promise that will fulfill if all remaining chunks are successfully written and the stream + * successfully closes, or rejects if an error is encountered during this process. Additionally, it will reject with + * a `TypeError` (without attempting to cancel the stream) if the stream is currently locked. + */ + close() { + if (!IsWritableStream(this)) { + return promiseRejectedWith(streamBrandCheckException$2('close')); + } + if (IsWritableStreamLocked(this)) { + return promiseRejectedWith(new TypeError('Cannot close a stream that already has a writer')); + } + if (WritableStreamCloseQueuedOrInFlight(this)) { + return promiseRejectedWith(new TypeError('Cannot close an already-closing stream')); + } + return WritableStreamClose(this); + } + /** + * Creates a {@link WritableStreamDefaultWriter | writer} and locks the stream to the new writer. While the stream + * is locked, no other writer can be acquired until this one is released. + * + * This functionality is especially useful for creating abstractions that desire the ability to write to a stream + * without interruption or interleaving. By getting a writer for the stream, you can ensure nobody else can write at + * the same time, which would cause the resulting written data to be unpredictable and probably useless. + */ + getWriter() { + if (!IsWritableStream(this)) { + throw streamBrandCheckException$2('getWriter'); + } + return AcquireWritableStreamDefaultWriter(this); + } + } + Object.defineProperties(WritableStream.prototype, { + abort: { enumerable: true }, + close: { enumerable: true }, + getWriter: { enumerable: true }, + locked: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(WritableStream.prototype, SymbolPolyfill.toStringTag, { + value: 'WritableStream', + configurable: true + }); + } + // Abstract operations for the WritableStream. + function AcquireWritableStreamDefaultWriter(stream) { + return new WritableStreamDefaultWriter(stream); + } + // Throws if and only if startAlgorithm throws. + function CreateWritableStream(startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark = 1, sizeAlgorithm = () => 1) { + const stream = Object.create(WritableStream.prototype); + InitializeWritableStream(stream); + const controller = Object.create(WritableStreamDefaultController.prototype); + SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm); + return stream; + } + function InitializeWritableStream(stream) { + stream._state = 'writable'; + // The error that will be reported by new method calls once the state becomes errored. Only set when [[state]] is + // 'erroring' or 'errored'. May be set to an undefined value. + stream._storedError = undefined; + stream._writer = undefined; + // Initialize to undefined first because the constructor of the controller checks this + // variable to validate the caller. + stream._writableStreamController = undefined; + // This queue is placed here instead of the writer class in order to allow for passing a writer to the next data + // producer without waiting for the queued writes to finish. + stream._writeRequests = new SimpleQueue(); + // Write requests are removed from _writeRequests when write() is called on the underlying sink. This prevents + // them from being erroneously rejected on error. If a write() call is in-flight, the request is stored here. + stream._inFlightWriteRequest = undefined; + // The promise that was returned from writer.close(). Stored here because it may be fulfilled after the writer + // has been detached. + stream._closeRequest = undefined; + // Close request is removed from _closeRequest when close() is called on the underlying sink. This prevents it + // from being erroneously rejected on error. If a close() call is in-flight, the request is stored here. + stream._inFlightCloseRequest = undefined; + // The promise that was returned from writer.abort(). This may also be fulfilled after the writer has detached. + stream._pendingAbortRequest = undefined; + // The backpressure signal set by the controller. + stream._backpressure = false; + } + function IsWritableStream(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) { + return false; + } + return x instanceof WritableStream; + } + function IsWritableStreamLocked(stream) { + if (stream._writer === undefined) { + return false; + } + return true; + } + function WritableStreamAbort(stream, reason) { + var _a; + if (stream._state === 'closed' || stream._state === 'errored') { + return promiseResolvedWith(undefined); + } + stream._writableStreamController._abortReason = reason; + (_a = stream._writableStreamController._abortController) === null || _a === void 0 ? void 0 : _a.abort(); + // TypeScript narrows the type of `stream._state` down to 'writable' | 'erroring', + // but it doesn't know that signaling abort runs author code that might have changed the state. + // Widen the type again by casting to WritableStreamState. + const state = stream._state; + if (state === 'closed' || state === 'errored') { + return promiseResolvedWith(undefined); + } + if (stream._pendingAbortRequest !== undefined) { + return stream._pendingAbortRequest._promise; + } + let wasAlreadyErroring = false; + if (state === 'erroring') { + wasAlreadyErroring = true; + // reason will not be used, so don't keep a reference to it. + reason = undefined; + } + const promise = newPromise((resolve, reject) => { + stream._pendingAbortRequest = { + _promise: undefined, + _resolve: resolve, + _reject: reject, + _reason: reason, + _wasAlreadyErroring: wasAlreadyErroring + }; + }); + stream._pendingAbortRequest._promise = promise; + if (!wasAlreadyErroring) { + WritableStreamStartErroring(stream, reason); + } + return promise; + } + function WritableStreamClose(stream) { + const state = stream._state; + if (state === 'closed' || state === 'errored') { + return promiseRejectedWith(new TypeError(`The stream (in ${state} state) is not in the writable state and cannot be closed`)); + } + const promise = newPromise((resolve, reject) => { + const closeRequest = { + _resolve: resolve, + _reject: reject + }; + stream._closeRequest = closeRequest; + }); + const writer = stream._writer; + if (writer !== undefined && stream._backpressure && state === 'writable') { + defaultWriterReadyPromiseResolve(writer); + } + WritableStreamDefaultControllerClose(stream._writableStreamController); + return promise; + } + // WritableStream API exposed for controllers. + function WritableStreamAddWriteRequest(stream) { + const promise = newPromise((resolve, reject) => { + const writeRequest = { + _resolve: resolve, + _reject: reject + }; + stream._writeRequests.push(writeRequest); + }); + return promise; + } + function WritableStreamDealWithRejection(stream, error) { + const state = stream._state; + if (state === 'writable') { + WritableStreamStartErroring(stream, error); + return; + } + WritableStreamFinishErroring(stream); + } + function WritableStreamStartErroring(stream, reason) { + const controller = stream._writableStreamController; + stream._state = 'erroring'; + stream._storedError = reason; + const writer = stream._writer; + if (writer !== undefined) { + WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason); + } + if (!WritableStreamHasOperationMarkedInFlight(stream) && controller._started) { + WritableStreamFinishErroring(stream); + } + } + function WritableStreamFinishErroring(stream) { + stream._state = 'errored'; + stream._writableStreamController[ErrorSteps](); + const storedError = stream._storedError; + stream._writeRequests.forEach(writeRequest => { + writeRequest._reject(storedError); + }); + stream._writeRequests = new SimpleQueue(); + if (stream._pendingAbortRequest === undefined) { + WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); + return; + } + const abortRequest = stream._pendingAbortRequest; + stream._pendingAbortRequest = undefined; + if (abortRequest._wasAlreadyErroring) { + abortRequest._reject(storedError); + WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); + return; + } + const promise = stream._writableStreamController[AbortSteps](abortRequest._reason); + uponPromise(promise, () => { + abortRequest._resolve(); + WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); + }, (reason) => { + abortRequest._reject(reason); + WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); + }); + } + function WritableStreamFinishInFlightWrite(stream) { + stream._inFlightWriteRequest._resolve(undefined); + stream._inFlightWriteRequest = undefined; + } + function WritableStreamFinishInFlightWriteWithError(stream, error) { + stream._inFlightWriteRequest._reject(error); + stream._inFlightWriteRequest = undefined; + WritableStreamDealWithRejection(stream, error); + } + function WritableStreamFinishInFlightClose(stream) { + stream._inFlightCloseRequest._resolve(undefined); + stream._inFlightCloseRequest = undefined; + const state = stream._state; + if (state === 'erroring') { + // The error was too late to do anything, so it is ignored. + stream._storedError = undefined; + if (stream._pendingAbortRequest !== undefined) { + stream._pendingAbortRequest._resolve(); + stream._pendingAbortRequest = undefined; + } + } + stream._state = 'closed'; + const writer = stream._writer; + if (writer !== undefined) { + defaultWriterClosedPromiseResolve(writer); + } + } + function WritableStreamFinishInFlightCloseWithError(stream, error) { + stream._inFlightCloseRequest._reject(error); + stream._inFlightCloseRequest = undefined; + // Never execute sink abort() after sink close(). + if (stream._pendingAbortRequest !== undefined) { + stream._pendingAbortRequest._reject(error); + stream._pendingAbortRequest = undefined; + } + WritableStreamDealWithRejection(stream, error); + } + // TODO(ricea): Fix alphabetical order. + function WritableStreamCloseQueuedOrInFlight(stream) { + if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) { + return false; + } + return true; + } + function WritableStreamHasOperationMarkedInFlight(stream) { + if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) { + return false; + } + return true; + } + function WritableStreamMarkCloseRequestInFlight(stream) { + stream._inFlightCloseRequest = stream._closeRequest; + stream._closeRequest = undefined; + } + function WritableStreamMarkFirstWriteRequestInFlight(stream) { + stream._inFlightWriteRequest = stream._writeRequests.shift(); + } + function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) { + if (stream._closeRequest !== undefined) { + stream._closeRequest._reject(stream._storedError); + stream._closeRequest = undefined; + } + const writer = stream._writer; + if (writer !== undefined) { + defaultWriterClosedPromiseReject(writer, stream._storedError); + } + } + function WritableStreamUpdateBackpressure(stream, backpressure) { + const writer = stream._writer; + if (writer !== undefined && backpressure !== stream._backpressure) { + if (backpressure) { + defaultWriterReadyPromiseReset(writer); + } + else { + defaultWriterReadyPromiseResolve(writer); + } + } + stream._backpressure = backpressure; + } + /** + * A default writer vended by a {@link WritableStream}. + * + * @public + */ + class WritableStreamDefaultWriter { + constructor(stream) { + assertRequiredArgument(stream, 1, 'WritableStreamDefaultWriter'); + assertWritableStream(stream, 'First parameter'); + if (IsWritableStreamLocked(stream)) { + throw new TypeError('This stream has already been locked for exclusive writing by another writer'); + } + this._ownerWritableStream = stream; + stream._writer = this; + const state = stream._state; + if (state === 'writable') { + if (!WritableStreamCloseQueuedOrInFlight(stream) && stream._backpressure) { + defaultWriterReadyPromiseInitialize(this); + } + else { + defaultWriterReadyPromiseInitializeAsResolved(this); + } + defaultWriterClosedPromiseInitialize(this); + } + else if (state === 'erroring') { + defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError); + defaultWriterClosedPromiseInitialize(this); + } + else if (state === 'closed') { + defaultWriterReadyPromiseInitializeAsResolved(this); + defaultWriterClosedPromiseInitializeAsResolved(this); + } + else { + const storedError = stream._storedError; + defaultWriterReadyPromiseInitializeAsRejected(this, storedError); + defaultWriterClosedPromiseInitializeAsRejected(this, storedError); + } + } + /** + * Returns a promise that will be fulfilled when the stream becomes closed, or rejected if the stream ever errors or + * the writer’s lock is released before the stream finishes closing. + */ + get closed() { + if (!IsWritableStreamDefaultWriter(this)) { + return promiseRejectedWith(defaultWriterBrandCheckException('closed')); + } + return this._closedPromise; + } + /** + * Returns the desired size to fill the stream’s internal queue. It can be negative, if the queue is over-full. + * A producer can use this information to determine the right amount of data to write. + * + * It will be `null` if the stream cannot be successfully written to (due to either being errored, or having an abort + * queued up). It will return zero if the stream is closed. And the getter will throw an exception if invoked when + * the writer’s lock is released. + */ + get desiredSize() { + if (!IsWritableStreamDefaultWriter(this)) { + throw defaultWriterBrandCheckException('desiredSize'); + } + if (this._ownerWritableStream === undefined) { + throw defaultWriterLockException('desiredSize'); + } + return WritableStreamDefaultWriterGetDesiredSize(this); + } + /** + * Returns a promise that will be fulfilled when the desired size to fill the stream’s internal queue transitions + * from non-positive to positive, signaling that it is no longer applying backpressure. Once the desired size dips + * back to zero or below, the getter will return a new promise that stays pending until the next transition. + * + * If the stream becomes errored or aborted, or the writer’s lock is released, the returned promise will become + * rejected. + */ + get ready() { + if (!IsWritableStreamDefaultWriter(this)) { + return promiseRejectedWith(defaultWriterBrandCheckException('ready')); + } + return this._readyPromise; + } + /** + * If the reader is active, behaves the same as {@link WritableStream.abort | stream.abort(reason)}. + */ + abort(reason = undefined) { + if (!IsWritableStreamDefaultWriter(this)) { + return promiseRejectedWith(defaultWriterBrandCheckException('abort')); + } + if (this._ownerWritableStream === undefined) { + return promiseRejectedWith(defaultWriterLockException('abort')); + } + return WritableStreamDefaultWriterAbort(this, reason); + } + /** + * If the reader is active, behaves the same as {@link WritableStream.close | stream.close()}. + */ + close() { + if (!IsWritableStreamDefaultWriter(this)) { + return promiseRejectedWith(defaultWriterBrandCheckException('close')); + } + const stream = this._ownerWritableStream; + if (stream === undefined) { + return promiseRejectedWith(defaultWriterLockException('close')); + } + if (WritableStreamCloseQueuedOrInFlight(stream)) { + return promiseRejectedWith(new TypeError('Cannot close an already-closing stream')); + } + return WritableStreamDefaultWriterClose(this); + } + /** + * Releases the writer’s lock on the corresponding stream. After the lock is released, the writer is no longer active. + * If the associated stream is errored when the lock is released, the writer will appear errored in the same way from + * now on; otherwise, the writer will appear closed. + * + * Note that the lock can still be released even if some ongoing writes have not yet finished (i.e. even if the + * promises returned from previous calls to {@link WritableStreamDefaultWriter.write | write()} have not yet settled). + * It’s not necessary to hold the lock on the writer for the duration of the write; the lock instead simply prevents + * other producers from writing in an interleaved manner. + */ + releaseLock() { + if (!IsWritableStreamDefaultWriter(this)) { + throw defaultWriterBrandCheckException('releaseLock'); + } + const stream = this._ownerWritableStream; + if (stream === undefined) { + return; + } + WritableStreamDefaultWriterRelease(this); + } + write(chunk = undefined) { + if (!IsWritableStreamDefaultWriter(this)) { + return promiseRejectedWith(defaultWriterBrandCheckException('write')); + } + if (this._ownerWritableStream === undefined) { + return promiseRejectedWith(defaultWriterLockException('write to')); + } + return WritableStreamDefaultWriterWrite(this, chunk); + } + } + Object.defineProperties(WritableStreamDefaultWriter.prototype, { + abort: { enumerable: true }, + close: { enumerable: true }, + releaseLock: { enumerable: true }, + write: { enumerable: true }, + closed: { enumerable: true }, + desiredSize: { enumerable: true }, + ready: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(WritableStreamDefaultWriter.prototype, SymbolPolyfill.toStringTag, { + value: 'WritableStreamDefaultWriter', + configurable: true + }); + } + // Abstract operations for the WritableStreamDefaultWriter. + function IsWritableStreamDefaultWriter(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) { + return false; + } + return x instanceof WritableStreamDefaultWriter; + } + // A client of WritableStreamDefaultWriter may use these functions directly to bypass state check. + function WritableStreamDefaultWriterAbort(writer, reason) { + const stream = writer._ownerWritableStream; + return WritableStreamAbort(stream, reason); + } + function WritableStreamDefaultWriterClose(writer) { + const stream = writer._ownerWritableStream; + return WritableStreamClose(stream); + } + function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) { + const stream = writer._ownerWritableStream; + const state = stream._state; + if (WritableStreamCloseQueuedOrInFlight(stream) || state === 'closed') { + return promiseResolvedWith(undefined); + } + if (state === 'errored') { + return promiseRejectedWith(stream._storedError); + } + return WritableStreamDefaultWriterClose(writer); + } + function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) { + if (writer._closedPromiseState === 'pending') { + defaultWriterClosedPromiseReject(writer, error); + } + else { + defaultWriterClosedPromiseResetToRejected(writer, error); + } + } + function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) { + if (writer._readyPromiseState === 'pending') { + defaultWriterReadyPromiseReject(writer, error); + } + else { + defaultWriterReadyPromiseResetToRejected(writer, error); + } + } + function WritableStreamDefaultWriterGetDesiredSize(writer) { + const stream = writer._ownerWritableStream; + const state = stream._state; + if (state === 'errored' || state === 'erroring') { + return null; + } + if (state === 'closed') { + return 0; + } + return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController); + } + function WritableStreamDefaultWriterRelease(writer) { + const stream = writer._ownerWritableStream; + const releasedError = new TypeError(`Writer was released and can no longer be used to monitor the stream's closedness`); + WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError); + // The state transitions to "errored" before the sink abort() method runs, but the writer.closed promise is not + // rejected until afterwards. This means that simply testing state will not work. + WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError); + stream._writer = undefined; + writer._ownerWritableStream = undefined; + } + function WritableStreamDefaultWriterWrite(writer, chunk) { + const stream = writer._ownerWritableStream; + const controller = stream._writableStreamController; + const chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk); + if (stream !== writer._ownerWritableStream) { + return promiseRejectedWith(defaultWriterLockException('write to')); + } + const state = stream._state; + if (state === 'errored') { + return promiseRejectedWith(stream._storedError); + } + if (WritableStreamCloseQueuedOrInFlight(stream) || state === 'closed') { + return promiseRejectedWith(new TypeError('The stream is closing or closed and cannot be written to')); + } + if (state === 'erroring') { + return promiseRejectedWith(stream._storedError); + } + const promise = WritableStreamAddWriteRequest(stream); + WritableStreamDefaultControllerWrite(controller, chunk, chunkSize); + return promise; + } + const closeSentinel = {}; + /** + * Allows control of a {@link WritableStream | writable stream}'s state and internal queue. + * + * @public + */ + class WritableStreamDefaultController { + constructor() { + throw new TypeError('Illegal constructor'); + } + /** + * The reason which was passed to `WritableStream.abort(reason)` when the stream was aborted. + * + * @deprecated + * This property has been removed from the specification, see https://github.com/whatwg/streams/pull/1177. + * Use {@link WritableStreamDefaultController.signal}'s `reason` instead. + */ + get abortReason() { + if (!IsWritableStreamDefaultController(this)) { + throw defaultControllerBrandCheckException$2('abortReason'); + } + return this._abortReason; + } + /** + * An `AbortSignal` that can be used to abort the pending write or close operation when the stream is aborted. + */ + get signal() { + if (!IsWritableStreamDefaultController(this)) { + throw defaultControllerBrandCheckException$2('signal'); + } + if (this._abortController === undefined) { + // Older browsers or older Node versions may not support `AbortController` or `AbortSignal`. + // We don't want to bundle and ship an `AbortController` polyfill together with our polyfill, + // so instead we only implement support for `signal` if we find a global `AbortController` constructor. + throw new TypeError('WritableStreamDefaultController.prototype.signal is not supported'); + } + return this._abortController.signal; + } + /** + * Closes the controlled writable stream, making all future interactions with it fail with the given error `e`. + * + * This method is rarely used, since usually it suffices to return a rejected promise from one of the underlying + * sink's methods. However, it can be useful for suddenly shutting down a stream in response to an event outside the + * normal lifecycle of interactions with the underlying sink. + */ + error(e = undefined) { + if (!IsWritableStreamDefaultController(this)) { + throw defaultControllerBrandCheckException$2('error'); + } + const state = this._controlledWritableStream._state; + if (state !== 'writable') { + // The stream is closed, errored or will be soon. The sink can't do anything useful if it gets an error here, so + // just treat it as a no-op. + return; + } + WritableStreamDefaultControllerError(this, e); + } + /** @internal */ + [AbortSteps](reason) { + const result = this._abortAlgorithm(reason); + WritableStreamDefaultControllerClearAlgorithms(this); + return result; + } + /** @internal */ + [ErrorSteps]() { + ResetQueue(this); + } + } + Object.defineProperties(WritableStreamDefaultController.prototype, { + abortReason: { enumerable: true }, + signal: { enumerable: true }, + error: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(WritableStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { + value: 'WritableStreamDefaultController', + configurable: true + }); + } + // Abstract operations implementing interface required by the WritableStream. + function IsWritableStreamDefaultController(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_controlledWritableStream')) { + return false; + } + return x instanceof WritableStreamDefaultController; + } + function SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm) { + controller._controlledWritableStream = stream; + stream._writableStreamController = controller; + // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly. + controller._queue = undefined; + controller._queueTotalSize = undefined; + ResetQueue(controller); + controller._abortReason = undefined; + controller._abortController = createAbortController(); + controller._started = false; + controller._strategySizeAlgorithm = sizeAlgorithm; + controller._strategyHWM = highWaterMark; + controller._writeAlgorithm = writeAlgorithm; + controller._closeAlgorithm = closeAlgorithm; + controller._abortAlgorithm = abortAlgorithm; + const backpressure = WritableStreamDefaultControllerGetBackpressure(controller); + WritableStreamUpdateBackpressure(stream, backpressure); + const startResult = startAlgorithm(); + const startPromise = promiseResolvedWith(startResult); + uponPromise(startPromise, () => { + controller._started = true; + WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); + }, r => { + controller._started = true; + WritableStreamDealWithRejection(stream, r); + }); + } + function SetUpWritableStreamDefaultControllerFromUnderlyingSink(stream, underlyingSink, highWaterMark, sizeAlgorithm) { + const controller = Object.create(WritableStreamDefaultController.prototype); + let startAlgorithm = () => undefined; + let writeAlgorithm = () => promiseResolvedWith(undefined); + let closeAlgorithm = () => promiseResolvedWith(undefined); + let abortAlgorithm = () => promiseResolvedWith(undefined); + if (underlyingSink.start !== undefined) { + startAlgorithm = () => underlyingSink.start(controller); + } + if (underlyingSink.write !== undefined) { + writeAlgorithm = chunk => underlyingSink.write(chunk, controller); + } + if (underlyingSink.close !== undefined) { + closeAlgorithm = () => underlyingSink.close(); + } + if (underlyingSink.abort !== undefined) { + abortAlgorithm = reason => underlyingSink.abort(reason); + } + SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm); + } + // ClearAlgorithms may be called twice. Erroring the same stream in multiple ways will often result in redundant calls. + function WritableStreamDefaultControllerClearAlgorithms(controller) { + controller._writeAlgorithm = undefined; + controller._closeAlgorithm = undefined; + controller._abortAlgorithm = undefined; + controller._strategySizeAlgorithm = undefined; + } + function WritableStreamDefaultControllerClose(controller) { + EnqueueValueWithSize(controller, closeSentinel, 0); + WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); + } + function WritableStreamDefaultControllerGetChunkSize(controller, chunk) { + try { + return controller._strategySizeAlgorithm(chunk); + } + catch (chunkSizeE) { + WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE); + return 1; + } + } + function WritableStreamDefaultControllerGetDesiredSize(controller) { + return controller._strategyHWM - controller._queueTotalSize; + } + function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) { + try { + EnqueueValueWithSize(controller, chunk, chunkSize); + } + catch (enqueueE) { + WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE); + return; + } + const stream = controller._controlledWritableStream; + if (!WritableStreamCloseQueuedOrInFlight(stream) && stream._state === 'writable') { + const backpressure = WritableStreamDefaultControllerGetBackpressure(controller); + WritableStreamUpdateBackpressure(stream, backpressure); + } + WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); + } + // Abstract operations for the WritableStreamDefaultController. + function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) { + const stream = controller._controlledWritableStream; + if (!controller._started) { + return; + } + if (stream._inFlightWriteRequest !== undefined) { + return; + } + const state = stream._state; + if (state === 'erroring') { + WritableStreamFinishErroring(stream); + return; + } + if (controller._queue.length === 0) { + return; + } + const value = PeekQueueValue(controller); + if (value === closeSentinel) { + WritableStreamDefaultControllerProcessClose(controller); + } + else { + WritableStreamDefaultControllerProcessWrite(controller, value); + } + } + function WritableStreamDefaultControllerErrorIfNeeded(controller, error) { + if (controller._controlledWritableStream._state === 'writable') { + WritableStreamDefaultControllerError(controller, error); + } + } + function WritableStreamDefaultControllerProcessClose(controller) { + const stream = controller._controlledWritableStream; + WritableStreamMarkCloseRequestInFlight(stream); + DequeueValue(controller); + const sinkClosePromise = controller._closeAlgorithm(); + WritableStreamDefaultControllerClearAlgorithms(controller); + uponPromise(sinkClosePromise, () => { + WritableStreamFinishInFlightClose(stream); + }, reason => { + WritableStreamFinishInFlightCloseWithError(stream, reason); + }); + } + function WritableStreamDefaultControllerProcessWrite(controller, chunk) { + const stream = controller._controlledWritableStream; + WritableStreamMarkFirstWriteRequestInFlight(stream); + const sinkWritePromise = controller._writeAlgorithm(chunk); + uponPromise(sinkWritePromise, () => { + WritableStreamFinishInFlightWrite(stream); + const state = stream._state; + DequeueValue(controller); + if (!WritableStreamCloseQueuedOrInFlight(stream) && state === 'writable') { + const backpressure = WritableStreamDefaultControllerGetBackpressure(controller); + WritableStreamUpdateBackpressure(stream, backpressure); + } + WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); + }, reason => { + if (stream._state === 'writable') { + WritableStreamDefaultControllerClearAlgorithms(controller); + } + WritableStreamFinishInFlightWriteWithError(stream, reason); + }); + } + function WritableStreamDefaultControllerGetBackpressure(controller) { + const desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller); + return desiredSize <= 0; + } + // A client of WritableStreamDefaultController may use these functions directly to bypass state check. + function WritableStreamDefaultControllerError(controller, error) { + const stream = controller._controlledWritableStream; + WritableStreamDefaultControllerClearAlgorithms(controller); + WritableStreamStartErroring(stream, error); + } + // Helper functions for the WritableStream. + function streamBrandCheckException$2(name) { + return new TypeError(`WritableStream.prototype.${name} can only be used on a WritableStream`); + } + // Helper functions for the WritableStreamDefaultController. + function defaultControllerBrandCheckException$2(name) { + return new TypeError(`WritableStreamDefaultController.prototype.${name} can only be used on a WritableStreamDefaultController`); + } + // Helper functions for the WritableStreamDefaultWriter. + function defaultWriterBrandCheckException(name) { + return new TypeError(`WritableStreamDefaultWriter.prototype.${name} can only be used on a WritableStreamDefaultWriter`); + } + function defaultWriterLockException(name) { + return new TypeError('Cannot ' + name + ' a stream using a released writer'); + } + function defaultWriterClosedPromiseInitialize(writer) { + writer._closedPromise = newPromise((resolve, reject) => { + writer._closedPromise_resolve = resolve; + writer._closedPromise_reject = reject; + writer._closedPromiseState = 'pending'; + }); + } + function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) { + defaultWriterClosedPromiseInitialize(writer); + defaultWriterClosedPromiseReject(writer, reason); + } + function defaultWriterClosedPromiseInitializeAsResolved(writer) { + defaultWriterClosedPromiseInitialize(writer); + defaultWriterClosedPromiseResolve(writer); + } + function defaultWriterClosedPromiseReject(writer, reason) { + if (writer._closedPromise_reject === undefined) { + return; + } + setPromiseIsHandledToTrue(writer._closedPromise); + writer._closedPromise_reject(reason); + writer._closedPromise_resolve = undefined; + writer._closedPromise_reject = undefined; + writer._closedPromiseState = 'rejected'; + } + function defaultWriterClosedPromiseResetToRejected(writer, reason) { + defaultWriterClosedPromiseInitializeAsRejected(writer, reason); + } + function defaultWriterClosedPromiseResolve(writer) { + if (writer._closedPromise_resolve === undefined) { + return; + } + writer._closedPromise_resolve(undefined); + writer._closedPromise_resolve = undefined; + writer._closedPromise_reject = undefined; + writer._closedPromiseState = 'resolved'; + } + function defaultWriterReadyPromiseInitialize(writer) { + writer._readyPromise = newPromise((resolve, reject) => { + writer._readyPromise_resolve = resolve; + writer._readyPromise_reject = reject; + }); + writer._readyPromiseState = 'pending'; + } + function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) { + defaultWriterReadyPromiseInitialize(writer); + defaultWriterReadyPromiseReject(writer, reason); + } + function defaultWriterReadyPromiseInitializeAsResolved(writer) { + defaultWriterReadyPromiseInitialize(writer); + defaultWriterReadyPromiseResolve(writer); + } + function defaultWriterReadyPromiseReject(writer, reason) { + if (writer._readyPromise_reject === undefined) { + return; + } + setPromiseIsHandledToTrue(writer._readyPromise); + writer._readyPromise_reject(reason); + writer._readyPromise_resolve = undefined; + writer._readyPromise_reject = undefined; + writer._readyPromiseState = 'rejected'; + } + function defaultWriterReadyPromiseReset(writer) { + defaultWriterReadyPromiseInitialize(writer); + } + function defaultWriterReadyPromiseResetToRejected(writer, reason) { + defaultWriterReadyPromiseInitializeAsRejected(writer, reason); + } + function defaultWriterReadyPromiseResolve(writer) { + if (writer._readyPromise_resolve === undefined) { + return; + } + writer._readyPromise_resolve(undefined); + writer._readyPromise_resolve = undefined; + writer._readyPromise_reject = undefined; + writer._readyPromiseState = 'fulfilled'; + } + + /// + const NativeDOMException = typeof DOMException !== 'undefined' ? DOMException : undefined; + + /// + function isDOMExceptionConstructor(ctor) { + if (!(typeof ctor === 'function' || typeof ctor === 'object')) { + return false; + } + try { + new ctor(); + return true; + } + catch (_a) { + return false; + } + } + function createDOMExceptionPolyfill() { + // eslint-disable-next-line no-shadow + const ctor = function DOMException(message, name) { + this.message = message || ''; + this.name = name || 'Error'; + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + }; + ctor.prototype = Object.create(Error.prototype); + Object.defineProperty(ctor.prototype, 'constructor', { value: ctor, writable: true, configurable: true }); + return ctor; + } + // eslint-disable-next-line no-redeclare + const DOMException$1 = isDOMExceptionConstructor(NativeDOMException) ? NativeDOMException : createDOMExceptionPolyfill(); + + function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventCancel, signal) { + const reader = AcquireReadableStreamDefaultReader(source); + const writer = AcquireWritableStreamDefaultWriter(dest); + source._disturbed = true; + let shuttingDown = false; + // This is used to keep track of the spec's requirement that we wait for ongoing writes during shutdown. + let currentWrite = promiseResolvedWith(undefined); + return newPromise((resolve, reject) => { + let abortAlgorithm; + if (signal !== undefined) { + abortAlgorithm = () => { + const error = new DOMException$1('Aborted', 'AbortError'); + const actions = []; + if (!preventAbort) { + actions.push(() => { + if (dest._state === 'writable') { + return WritableStreamAbort(dest, error); + } + return promiseResolvedWith(undefined); + }); + } + if (!preventCancel) { + actions.push(() => { + if (source._state === 'readable') { + return ReadableStreamCancel(source, error); + } + return promiseResolvedWith(undefined); + }); + } + shutdownWithAction(() => Promise.all(actions.map(action => action())), true, error); + }; + if (signal.aborted) { + abortAlgorithm(); + return; + } + signal.addEventListener('abort', abortAlgorithm); + } + // Using reader and writer, read all chunks from this and write them to dest + // - Backpressure must be enforced + // - Shutdown must stop all activity + function pipeLoop() { + return newPromise((resolveLoop, rejectLoop) => { + function next(done) { + if (done) { + resolveLoop(); + } + else { + // Use `PerformPromiseThen` instead of `uponPromise` to avoid + // adding unnecessary `.catch(rethrowAssertionErrorRejection)` handlers + PerformPromiseThen(pipeStep(), next, rejectLoop); + } + } + next(false); + }); + } + function pipeStep() { + if (shuttingDown) { + return promiseResolvedWith(true); + } + return PerformPromiseThen(writer._readyPromise, () => { + return newPromise((resolveRead, rejectRead) => { + ReadableStreamDefaultReaderRead(reader, { + _chunkSteps: chunk => { + currentWrite = PerformPromiseThen(WritableStreamDefaultWriterWrite(writer, chunk), undefined, noop); + resolveRead(false); + }, + _closeSteps: () => resolveRead(true), + _errorSteps: rejectRead + }); + }); + }); + } + // Errors must be propagated forward + isOrBecomesErrored(source, reader._closedPromise, storedError => { + if (!preventAbort) { + shutdownWithAction(() => WritableStreamAbort(dest, storedError), true, storedError); + } + else { + shutdown(true, storedError); + } + }); + // Errors must be propagated backward + isOrBecomesErrored(dest, writer._closedPromise, storedError => { + if (!preventCancel) { + shutdownWithAction(() => ReadableStreamCancel(source, storedError), true, storedError); + } + else { + shutdown(true, storedError); + } + }); + // Closing must be propagated forward + isOrBecomesClosed(source, reader._closedPromise, () => { + if (!preventClose) { + shutdownWithAction(() => WritableStreamDefaultWriterCloseWithErrorPropagation(writer)); + } + else { + shutdown(); + } + }); + // Closing must be propagated backward + if (WritableStreamCloseQueuedOrInFlight(dest) || dest._state === 'closed') { + const destClosed = new TypeError('the destination writable stream closed before all data could be piped to it'); + if (!preventCancel) { + shutdownWithAction(() => ReadableStreamCancel(source, destClosed), true, destClosed); + } + else { + shutdown(true, destClosed); + } + } + setPromiseIsHandledToTrue(pipeLoop()); + function waitForWritesToFinish() { + // Another write may have started while we were waiting on this currentWrite, so we have to be sure to wait + // for that too. + const oldCurrentWrite = currentWrite; + return PerformPromiseThen(currentWrite, () => oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined); + } + function isOrBecomesErrored(stream, promise, action) { + if (stream._state === 'errored') { + action(stream._storedError); + } + else { + uponRejection(promise, action); + } + } + function isOrBecomesClosed(stream, promise, action) { + if (stream._state === 'closed') { + action(); + } + else { + uponFulfillment(promise, action); + } + } + function shutdownWithAction(action, originalIsError, originalError) { + if (shuttingDown) { + return; + } + shuttingDown = true; + if (dest._state === 'writable' && !WritableStreamCloseQueuedOrInFlight(dest)) { + uponFulfillment(waitForWritesToFinish(), doTheRest); + } + else { + doTheRest(); + } + function doTheRest() { + uponPromise(action(), () => finalize(originalIsError, originalError), newError => finalize(true, newError)); + } + } + function shutdown(isError, error) { + if (shuttingDown) { + return; + } + shuttingDown = true; + if (dest._state === 'writable' && !WritableStreamCloseQueuedOrInFlight(dest)) { + uponFulfillment(waitForWritesToFinish(), () => finalize(isError, error)); + } + else { + finalize(isError, error); + } + } + function finalize(isError, error) { + WritableStreamDefaultWriterRelease(writer); + ReadableStreamReaderGenericRelease(reader); + if (signal !== undefined) { + signal.removeEventListener('abort', abortAlgorithm); + } + if (isError) { + reject(error); + } + else { + resolve(undefined); + } + } + }); + } + + /** + * Allows control of a {@link ReadableStream | readable stream}'s state and internal queue. + * + * @public + */ + class ReadableStreamDefaultController { + constructor() { + throw new TypeError('Illegal constructor'); + } + /** + * Returns the desired size to fill the controlled stream's internal queue. It can be negative, if the queue is + * over-full. An underlying source ought to use this information to determine when and how to apply backpressure. + */ + get desiredSize() { + if (!IsReadableStreamDefaultController(this)) { + throw defaultControllerBrandCheckException$1('desiredSize'); + } + return ReadableStreamDefaultControllerGetDesiredSize(this); + } + /** + * Closes the controlled readable stream. Consumers will still be able to read any previously-enqueued chunks from + * the stream, but once those are read, the stream will become closed. + */ + close() { + if (!IsReadableStreamDefaultController(this)) { + throw defaultControllerBrandCheckException$1('close'); + } + if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(this)) { + throw new TypeError('The stream is not in a state that permits close'); + } + ReadableStreamDefaultControllerClose(this); + } + enqueue(chunk = undefined) { + if (!IsReadableStreamDefaultController(this)) { + throw defaultControllerBrandCheckException$1('enqueue'); + } + if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(this)) { + throw new TypeError('The stream is not in a state that permits enqueue'); + } + return ReadableStreamDefaultControllerEnqueue(this, chunk); + } + /** + * Errors the controlled readable stream, making all future interactions with it fail with the given error `e`. + */ + error(e = undefined) { + if (!IsReadableStreamDefaultController(this)) { + throw defaultControllerBrandCheckException$1('error'); + } + ReadableStreamDefaultControllerError(this, e); + } + /** @internal */ + [CancelSteps](reason) { + ResetQueue(this); + const result = this._cancelAlgorithm(reason); + ReadableStreamDefaultControllerClearAlgorithms(this); + return result; + } + /** @internal */ + [PullSteps](readRequest) { + const stream = this._controlledReadableStream; + if (this._queue.length > 0) { + const chunk = DequeueValue(this); + if (this._closeRequested && this._queue.length === 0) { + ReadableStreamDefaultControllerClearAlgorithms(this); + ReadableStreamClose(stream); + } + else { + ReadableStreamDefaultControllerCallPullIfNeeded(this); + } + readRequest._chunkSteps(chunk); + } + else { + ReadableStreamAddReadRequest(stream, readRequest); + ReadableStreamDefaultControllerCallPullIfNeeded(this); + } + } + } + Object.defineProperties(ReadableStreamDefaultController.prototype, { + close: { enumerable: true }, + enqueue: { enumerable: true }, + error: { enumerable: true }, + desiredSize: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { + value: 'ReadableStreamDefaultController', + configurable: true + }); + } + // Abstract operations for the ReadableStreamDefaultController. + function IsReadableStreamDefaultController(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_controlledReadableStream')) { + return false; + } + return x instanceof ReadableStreamDefaultController; + } + function ReadableStreamDefaultControllerCallPullIfNeeded(controller) { + const shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller); + if (!shouldPull) { + return; + } + if (controller._pulling) { + controller._pullAgain = true; + return; + } + controller._pulling = true; + const pullPromise = controller._pullAlgorithm(); + uponPromise(pullPromise, () => { + controller._pulling = false; + if (controller._pullAgain) { + controller._pullAgain = false; + ReadableStreamDefaultControllerCallPullIfNeeded(controller); + } + }, e => { + ReadableStreamDefaultControllerError(controller, e); + }); + } + function ReadableStreamDefaultControllerShouldCallPull(controller) { + const stream = controller._controlledReadableStream; + if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { + return false; + } + if (!controller._started) { + return false; + } + if (IsReadableStreamLocked(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { + return true; + } + const desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller); + if (desiredSize > 0) { + return true; + } + return false; + } + function ReadableStreamDefaultControllerClearAlgorithms(controller) { + controller._pullAlgorithm = undefined; + controller._cancelAlgorithm = undefined; + controller._strategySizeAlgorithm = undefined; + } + // A client of ReadableStreamDefaultController may use these functions directly to bypass state check. + function ReadableStreamDefaultControllerClose(controller) { + if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { + return; + } + const stream = controller._controlledReadableStream; + controller._closeRequested = true; + if (controller._queue.length === 0) { + ReadableStreamDefaultControllerClearAlgorithms(controller); + ReadableStreamClose(stream); + } + } + function ReadableStreamDefaultControllerEnqueue(controller, chunk) { + if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { + return; + } + const stream = controller._controlledReadableStream; + if (IsReadableStreamLocked(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { + ReadableStreamFulfillReadRequest(stream, chunk, false); + } + else { + let chunkSize; + try { + chunkSize = controller._strategySizeAlgorithm(chunk); + } + catch (chunkSizeE) { + ReadableStreamDefaultControllerError(controller, chunkSizeE); + throw chunkSizeE; + } + try { + EnqueueValueWithSize(controller, chunk, chunkSize); + } + catch (enqueueE) { + ReadableStreamDefaultControllerError(controller, enqueueE); + throw enqueueE; + } + } + ReadableStreamDefaultControllerCallPullIfNeeded(controller); + } + function ReadableStreamDefaultControllerError(controller, e) { + const stream = controller._controlledReadableStream; + if (stream._state !== 'readable') { + return; + } + ResetQueue(controller); + ReadableStreamDefaultControllerClearAlgorithms(controller); + ReadableStreamError(stream, e); + } + function ReadableStreamDefaultControllerGetDesiredSize(controller) { + const state = controller._controlledReadableStream._state; + if (state === 'errored') { + return null; + } + if (state === 'closed') { + return 0; + } + return controller._strategyHWM - controller._queueTotalSize; + } + // This is used in the implementation of TransformStream. + function ReadableStreamDefaultControllerHasBackpressure(controller) { + if (ReadableStreamDefaultControllerShouldCallPull(controller)) { + return false; + } + return true; + } + function ReadableStreamDefaultControllerCanCloseOrEnqueue(controller) { + const state = controller._controlledReadableStream._state; + if (!controller._closeRequested && state === 'readable') { + return true; + } + return false; + } + function SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm) { + controller._controlledReadableStream = stream; + controller._queue = undefined; + controller._queueTotalSize = undefined; + ResetQueue(controller); + controller._started = false; + controller._closeRequested = false; + controller._pullAgain = false; + controller._pulling = false; + controller._strategySizeAlgorithm = sizeAlgorithm; + controller._strategyHWM = highWaterMark; + controller._pullAlgorithm = pullAlgorithm; + controller._cancelAlgorithm = cancelAlgorithm; + stream._readableStreamController = controller; + const startResult = startAlgorithm(); + uponPromise(promiseResolvedWith(startResult), () => { + controller._started = true; + ReadableStreamDefaultControllerCallPullIfNeeded(controller); + }, r => { + ReadableStreamDefaultControllerError(controller, r); + }); + } + function SetUpReadableStreamDefaultControllerFromUnderlyingSource(stream, underlyingSource, highWaterMark, sizeAlgorithm) { + const controller = Object.create(ReadableStreamDefaultController.prototype); + let startAlgorithm = () => undefined; + let pullAlgorithm = () => promiseResolvedWith(undefined); + let cancelAlgorithm = () => promiseResolvedWith(undefined); + if (underlyingSource.start !== undefined) { + startAlgorithm = () => underlyingSource.start(controller); + } + if (underlyingSource.pull !== undefined) { + pullAlgorithm = () => underlyingSource.pull(controller); + } + if (underlyingSource.cancel !== undefined) { + cancelAlgorithm = reason => underlyingSource.cancel(reason); + } + SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm); + } + // Helper functions for the ReadableStreamDefaultController. + function defaultControllerBrandCheckException$1(name) { + return new TypeError(`ReadableStreamDefaultController.prototype.${name} can only be used on a ReadableStreamDefaultController`); + } + + function ReadableStreamTee(stream, cloneForBranch2) { + if (IsReadableByteStreamController(stream._readableStreamController)) { + return ReadableByteStreamTee(stream); + } + return ReadableStreamDefaultTee(stream); + } + function ReadableStreamDefaultTee(stream, cloneForBranch2) { + const reader = AcquireReadableStreamDefaultReader(stream); + let reading = false; + let readAgain = false; + let canceled1 = false; + let canceled2 = false; + let reason1; + let reason2; + let branch1; + let branch2; + let resolveCancelPromise; + const cancelPromise = newPromise(resolve => { + resolveCancelPromise = resolve; + }); + function pullAlgorithm() { + if (reading) { + readAgain = true; + return promiseResolvedWith(undefined); + } + reading = true; + const readRequest = { + _chunkSteps: chunk => { + // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using + // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let + // successful synchronously-available reads get ahead of asynchronously-available errors. + queueMicrotask(() => { + readAgain = false; + const chunk1 = chunk; + const chunk2 = chunk; + // There is no way to access the cloning code right now in the reference implementation. + // If we add one then we'll need an implementation for serializable objects. + // if (!canceled2 && cloneForBranch2) { + // chunk2 = StructuredDeserialize(StructuredSerialize(chunk2)); + // } + if (!canceled1) { + ReadableStreamDefaultControllerEnqueue(branch1._readableStreamController, chunk1); + } + if (!canceled2) { + ReadableStreamDefaultControllerEnqueue(branch2._readableStreamController, chunk2); + } + reading = false; + if (readAgain) { + pullAlgorithm(); + } + }); + }, + _closeSteps: () => { + reading = false; + if (!canceled1) { + ReadableStreamDefaultControllerClose(branch1._readableStreamController); + } + if (!canceled2) { + ReadableStreamDefaultControllerClose(branch2._readableStreamController); + } + if (!canceled1 || !canceled2) { + resolveCancelPromise(undefined); + } + }, + _errorSteps: () => { + reading = false; + } + }; + ReadableStreamDefaultReaderRead(reader, readRequest); + return promiseResolvedWith(undefined); + } + function cancel1Algorithm(reason) { + canceled1 = true; + reason1 = reason; + if (canceled2) { + const compositeReason = CreateArrayFromList([reason1, reason2]); + const cancelResult = ReadableStreamCancel(stream, compositeReason); + resolveCancelPromise(cancelResult); + } + return cancelPromise; + } + function cancel2Algorithm(reason) { + canceled2 = true; + reason2 = reason; + if (canceled1) { + const compositeReason = CreateArrayFromList([reason1, reason2]); + const cancelResult = ReadableStreamCancel(stream, compositeReason); + resolveCancelPromise(cancelResult); + } + return cancelPromise; + } + function startAlgorithm() { + // do nothing + } + branch1 = CreateReadableStream(startAlgorithm, pullAlgorithm, cancel1Algorithm); + branch2 = CreateReadableStream(startAlgorithm, pullAlgorithm, cancel2Algorithm); + uponRejection(reader._closedPromise, (r) => { + ReadableStreamDefaultControllerError(branch1._readableStreamController, r); + ReadableStreamDefaultControllerError(branch2._readableStreamController, r); + if (!canceled1 || !canceled2) { + resolveCancelPromise(undefined); + } + }); + return [branch1, branch2]; + } + function ReadableByteStreamTee(stream) { + let reader = AcquireReadableStreamDefaultReader(stream); + let reading = false; + let readAgainForBranch1 = false; + let readAgainForBranch2 = false; + let canceled1 = false; + let canceled2 = false; + let reason1; + let reason2; + let branch1; + let branch2; + let resolveCancelPromise; + const cancelPromise = newPromise(resolve => { + resolveCancelPromise = resolve; + }); + function forwardReaderError(thisReader) { + uponRejection(thisReader._closedPromise, r => { + if (thisReader !== reader) { + return; + } + ReadableByteStreamControllerError(branch1._readableStreamController, r); + ReadableByteStreamControllerError(branch2._readableStreamController, r); + if (!canceled1 || !canceled2) { + resolveCancelPromise(undefined); + } + }); + } + function pullWithDefaultReader() { + if (IsReadableStreamBYOBReader(reader)) { + ReadableStreamReaderGenericRelease(reader); + reader = AcquireReadableStreamDefaultReader(stream); + forwardReaderError(reader); + } + const readRequest = { + _chunkSteps: chunk => { + // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using + // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let + // successful synchronously-available reads get ahead of asynchronously-available errors. + queueMicrotask(() => { + readAgainForBranch1 = false; + readAgainForBranch2 = false; + const chunk1 = chunk; + let chunk2 = chunk; + if (!canceled1 && !canceled2) { + try { + chunk2 = CloneAsUint8Array(chunk); + } + catch (cloneE) { + ReadableByteStreamControllerError(branch1._readableStreamController, cloneE); + ReadableByteStreamControllerError(branch2._readableStreamController, cloneE); + resolveCancelPromise(ReadableStreamCancel(stream, cloneE)); + return; + } + } + if (!canceled1) { + ReadableByteStreamControllerEnqueue(branch1._readableStreamController, chunk1); + } + if (!canceled2) { + ReadableByteStreamControllerEnqueue(branch2._readableStreamController, chunk2); + } + reading = false; + if (readAgainForBranch1) { + pull1Algorithm(); + } + else if (readAgainForBranch2) { + pull2Algorithm(); + } + }); + }, + _closeSteps: () => { + reading = false; + if (!canceled1) { + ReadableByteStreamControllerClose(branch1._readableStreamController); + } + if (!canceled2) { + ReadableByteStreamControllerClose(branch2._readableStreamController); + } + if (branch1._readableStreamController._pendingPullIntos.length > 0) { + ReadableByteStreamControllerRespond(branch1._readableStreamController, 0); + } + if (branch2._readableStreamController._pendingPullIntos.length > 0) { + ReadableByteStreamControllerRespond(branch2._readableStreamController, 0); + } + if (!canceled1 || !canceled2) { + resolveCancelPromise(undefined); + } + }, + _errorSteps: () => { + reading = false; + } + }; + ReadableStreamDefaultReaderRead(reader, readRequest); + } + function pullWithBYOBReader(view, forBranch2) { + if (IsReadableStreamDefaultReader(reader)) { + ReadableStreamReaderGenericRelease(reader); + reader = AcquireReadableStreamBYOBReader(stream); + forwardReaderError(reader); + } + const byobBranch = forBranch2 ? branch2 : branch1; + const otherBranch = forBranch2 ? branch1 : branch2; + const readIntoRequest = { + _chunkSteps: chunk => { + // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using + // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let + // successful synchronously-available reads get ahead of asynchronously-available errors. + queueMicrotask(() => { + readAgainForBranch1 = false; + readAgainForBranch2 = false; + const byobCanceled = forBranch2 ? canceled2 : canceled1; + const otherCanceled = forBranch2 ? canceled1 : canceled2; + if (!otherCanceled) { + let clonedChunk; + try { + clonedChunk = CloneAsUint8Array(chunk); + } + catch (cloneE) { + ReadableByteStreamControllerError(byobBranch._readableStreamController, cloneE); + ReadableByteStreamControllerError(otherBranch._readableStreamController, cloneE); + resolveCancelPromise(ReadableStreamCancel(stream, cloneE)); + return; + } + if (!byobCanceled) { + ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); + } + ReadableByteStreamControllerEnqueue(otherBranch._readableStreamController, clonedChunk); + } + else if (!byobCanceled) { + ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); + } + reading = false; + if (readAgainForBranch1) { + pull1Algorithm(); + } + else if (readAgainForBranch2) { + pull2Algorithm(); + } + }); + }, + _closeSteps: chunk => { + reading = false; + const byobCanceled = forBranch2 ? canceled2 : canceled1; + const otherCanceled = forBranch2 ? canceled1 : canceled2; + if (!byobCanceled) { + ReadableByteStreamControllerClose(byobBranch._readableStreamController); + } + if (!otherCanceled) { + ReadableByteStreamControllerClose(otherBranch._readableStreamController); + } + if (chunk !== undefined) { + if (!byobCanceled) { + ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); + } + if (!otherCanceled && otherBranch._readableStreamController._pendingPullIntos.length > 0) { + ReadableByteStreamControllerRespond(otherBranch._readableStreamController, 0); + } + } + if (!byobCanceled || !otherCanceled) { + resolveCancelPromise(undefined); + } + }, + _errorSteps: () => { + reading = false; + } + }; + ReadableStreamBYOBReaderRead(reader, view, readIntoRequest); + } + function pull1Algorithm() { + if (reading) { + readAgainForBranch1 = true; + return promiseResolvedWith(undefined); + } + reading = true; + const byobRequest = ReadableByteStreamControllerGetBYOBRequest(branch1._readableStreamController); + if (byobRequest === null) { + pullWithDefaultReader(); + } + else { + pullWithBYOBReader(byobRequest._view, false); + } + return promiseResolvedWith(undefined); + } + function pull2Algorithm() { + if (reading) { + readAgainForBranch2 = true; + return promiseResolvedWith(undefined); + } + reading = true; + const byobRequest = ReadableByteStreamControllerGetBYOBRequest(branch2._readableStreamController); + if (byobRequest === null) { + pullWithDefaultReader(); + } + else { + pullWithBYOBReader(byobRequest._view, true); + } + return promiseResolvedWith(undefined); + } + function cancel1Algorithm(reason) { + canceled1 = true; + reason1 = reason; + if (canceled2) { + const compositeReason = CreateArrayFromList([reason1, reason2]); + const cancelResult = ReadableStreamCancel(stream, compositeReason); + resolveCancelPromise(cancelResult); + } + return cancelPromise; + } + function cancel2Algorithm(reason) { + canceled2 = true; + reason2 = reason; + if (canceled1) { + const compositeReason = CreateArrayFromList([reason1, reason2]); + const cancelResult = ReadableStreamCancel(stream, compositeReason); + resolveCancelPromise(cancelResult); + } + return cancelPromise; + } + function startAlgorithm() { + return; + } + branch1 = CreateReadableByteStream(startAlgorithm, pull1Algorithm, cancel1Algorithm); + branch2 = CreateReadableByteStream(startAlgorithm, pull2Algorithm, cancel2Algorithm); + forwardReaderError(reader); + return [branch1, branch2]; + } + + function convertUnderlyingDefaultOrByteSource(source, context) { + assertDictionary(source, context); + const original = source; + const autoAllocateChunkSize = original === null || original === void 0 ? void 0 : original.autoAllocateChunkSize; + const cancel = original === null || original === void 0 ? void 0 : original.cancel; + const pull = original === null || original === void 0 ? void 0 : original.pull; + const start = original === null || original === void 0 ? void 0 : original.start; + const type = original === null || original === void 0 ? void 0 : original.type; + return { + autoAllocateChunkSize: autoAllocateChunkSize === undefined ? + undefined : + convertUnsignedLongLongWithEnforceRange(autoAllocateChunkSize, `${context} has member 'autoAllocateChunkSize' that`), + cancel: cancel === undefined ? + undefined : + convertUnderlyingSourceCancelCallback(cancel, original, `${context} has member 'cancel' that`), + pull: pull === undefined ? + undefined : + convertUnderlyingSourcePullCallback(pull, original, `${context} has member 'pull' that`), + start: start === undefined ? + undefined : + convertUnderlyingSourceStartCallback(start, original, `${context} has member 'start' that`), + type: type === undefined ? undefined : convertReadableStreamType(type, `${context} has member 'type' that`) + }; + } + function convertUnderlyingSourceCancelCallback(fn, original, context) { + assertFunction(fn, context); + return (reason) => promiseCall(fn, original, [reason]); + } + function convertUnderlyingSourcePullCallback(fn, original, context) { + assertFunction(fn, context); + return (controller) => promiseCall(fn, original, [controller]); + } + function convertUnderlyingSourceStartCallback(fn, original, context) { + assertFunction(fn, context); + return (controller) => reflectCall(fn, original, [controller]); + } + function convertReadableStreamType(type, context) { + type = `${type}`; + if (type !== 'bytes') { + throw new TypeError(`${context} '${type}' is not a valid enumeration value for ReadableStreamType`); + } + return type; + } + + function convertReaderOptions(options, context) { + assertDictionary(options, context); + const mode = options === null || options === void 0 ? void 0 : options.mode; + return { + mode: mode === undefined ? undefined : convertReadableStreamReaderMode(mode, `${context} has member 'mode' that`) + }; + } + function convertReadableStreamReaderMode(mode, context) { + mode = `${mode}`; + if (mode !== 'byob') { + throw new TypeError(`${context} '${mode}' is not a valid enumeration value for ReadableStreamReaderMode`); + } + return mode; + } + + function convertIteratorOptions(options, context) { + assertDictionary(options, context); + const preventCancel = options === null || options === void 0 ? void 0 : options.preventCancel; + return { preventCancel: Boolean(preventCancel) }; + } + + function convertPipeOptions(options, context) { + assertDictionary(options, context); + const preventAbort = options === null || options === void 0 ? void 0 : options.preventAbort; + const preventCancel = options === null || options === void 0 ? void 0 : options.preventCancel; + const preventClose = options === null || options === void 0 ? void 0 : options.preventClose; + const signal = options === null || options === void 0 ? void 0 : options.signal; + if (signal !== undefined) { + assertAbortSignal(signal, `${context} has member 'signal' that`); + } + return { + preventAbort: Boolean(preventAbort), + preventCancel: Boolean(preventCancel), + preventClose: Boolean(preventClose), + signal + }; + } + function assertAbortSignal(signal, context) { + if (!isAbortSignal(signal)) { + throw new TypeError(`${context} is not an AbortSignal.`); + } + } + + function convertReadableWritablePair(pair, context) { + assertDictionary(pair, context); + const readable = pair === null || pair === void 0 ? void 0 : pair.readable; + assertRequiredField(readable, 'readable', 'ReadableWritablePair'); + assertReadableStream(readable, `${context} has member 'readable' that`); + const writable = pair === null || pair === void 0 ? void 0 : pair.writable; + assertRequiredField(writable, 'writable', 'ReadableWritablePair'); + assertWritableStream(writable, `${context} has member 'writable' that`); + return { readable, writable }; + } + + /** + * A readable stream represents a source of data, from which you can read. + * + * @public + */ + class ReadableStream { + constructor(rawUnderlyingSource = {}, rawStrategy = {}) { + if (rawUnderlyingSource === undefined) { + rawUnderlyingSource = null; + } + else { + assertObject(rawUnderlyingSource, 'First parameter'); + } + const strategy = convertQueuingStrategy(rawStrategy, 'Second parameter'); + const underlyingSource = convertUnderlyingDefaultOrByteSource(rawUnderlyingSource, 'First parameter'); + InitializeReadableStream(this); + if (underlyingSource.type === 'bytes') { + if (strategy.size !== undefined) { + throw new RangeError('The strategy for a byte stream cannot have a size function'); + } + const highWaterMark = ExtractHighWaterMark(strategy, 0); + SetUpReadableByteStreamControllerFromUnderlyingSource(this, underlyingSource, highWaterMark); + } + else { + const sizeAlgorithm = ExtractSizeAlgorithm(strategy); + const highWaterMark = ExtractHighWaterMark(strategy, 1); + SetUpReadableStreamDefaultControllerFromUnderlyingSource(this, underlyingSource, highWaterMark, sizeAlgorithm); + } + } + /** + * Whether or not the readable stream is locked to a {@link ReadableStreamDefaultReader | reader}. + */ + get locked() { + if (!IsReadableStream(this)) { + throw streamBrandCheckException$1('locked'); + } + return IsReadableStreamLocked(this); + } + /** + * Cancels the stream, signaling a loss of interest in the stream by a consumer. + * + * The supplied `reason` argument will be given to the underlying source's {@link UnderlyingSource.cancel | cancel()} + * method, which might or might not use it. + */ + cancel(reason = undefined) { + if (!IsReadableStream(this)) { + return promiseRejectedWith(streamBrandCheckException$1('cancel')); + } + if (IsReadableStreamLocked(this)) { + return promiseRejectedWith(new TypeError('Cannot cancel a stream that already has a reader')); + } + return ReadableStreamCancel(this, reason); + } + getReader(rawOptions = undefined) { + if (!IsReadableStream(this)) { + throw streamBrandCheckException$1('getReader'); + } + const options = convertReaderOptions(rawOptions, 'First parameter'); + if (options.mode === undefined) { + return AcquireReadableStreamDefaultReader(this); + } + return AcquireReadableStreamBYOBReader(this); + } + pipeThrough(rawTransform, rawOptions = {}) { + if (!IsReadableStream(this)) { + throw streamBrandCheckException$1('pipeThrough'); + } + assertRequiredArgument(rawTransform, 1, 'pipeThrough'); + const transform = convertReadableWritablePair(rawTransform, 'First parameter'); + const options = convertPipeOptions(rawOptions, 'Second parameter'); + if (IsReadableStreamLocked(this)) { + throw new TypeError('ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream'); + } + if (IsWritableStreamLocked(transform.writable)) { + throw new TypeError('ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream'); + } + const promise = ReadableStreamPipeTo(this, transform.writable, options.preventClose, options.preventAbort, options.preventCancel, options.signal); + setPromiseIsHandledToTrue(promise); + return transform.readable; + } + pipeTo(destination, rawOptions = {}) { + if (!IsReadableStream(this)) { + return promiseRejectedWith(streamBrandCheckException$1('pipeTo')); + } + if (destination === undefined) { + return promiseRejectedWith(`Parameter 1 is required in 'pipeTo'.`); + } + if (!IsWritableStream(destination)) { + return promiseRejectedWith(new TypeError(`ReadableStream.prototype.pipeTo's first argument must be a WritableStream`)); + } + let options; + try { + options = convertPipeOptions(rawOptions, 'Second parameter'); + } + catch (e) { + return promiseRejectedWith(e); + } + if (IsReadableStreamLocked(this)) { + return promiseRejectedWith(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream')); + } + if (IsWritableStreamLocked(destination)) { + return promiseRejectedWith(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream')); + } + return ReadableStreamPipeTo(this, destination, options.preventClose, options.preventAbort, options.preventCancel, options.signal); + } + /** + * Tees this readable stream, returning a two-element array containing the two resulting branches as + * new {@link ReadableStream} instances. + * + * Teeing a stream will lock it, preventing any other consumer from acquiring a reader. + * To cancel the stream, cancel both of the resulting branches; a composite cancellation reason will then be + * propagated to the stream's underlying source. + * + * Note that the chunks seen in each branch will be the same object. If the chunks are not immutable, + * this could allow interference between the two branches. + */ + tee() { + if (!IsReadableStream(this)) { + throw streamBrandCheckException$1('tee'); + } + const branches = ReadableStreamTee(this); + return CreateArrayFromList(branches); + } + values(rawOptions = undefined) { + if (!IsReadableStream(this)) { + throw streamBrandCheckException$1('values'); + } + const options = convertIteratorOptions(rawOptions, 'First parameter'); + return AcquireReadableStreamAsyncIterator(this, options.preventCancel); + } + } + Object.defineProperties(ReadableStream.prototype, { + cancel: { enumerable: true }, + getReader: { enumerable: true }, + pipeThrough: { enumerable: true }, + pipeTo: { enumerable: true }, + tee: { enumerable: true }, + values: { enumerable: true }, + locked: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(ReadableStream.prototype, SymbolPolyfill.toStringTag, { + value: 'ReadableStream', + configurable: true + }); + } + if (typeof SymbolPolyfill.asyncIterator === 'symbol') { + Object.defineProperty(ReadableStream.prototype, SymbolPolyfill.asyncIterator, { + value: ReadableStream.prototype.values, + writable: true, + configurable: true + }); + } + // Abstract operations for the ReadableStream. + // Throws if and only if startAlgorithm throws. + function CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark = 1, sizeAlgorithm = () => 1) { + const stream = Object.create(ReadableStream.prototype); + InitializeReadableStream(stream); + const controller = Object.create(ReadableStreamDefaultController.prototype); + SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm); + return stream; + } + // Throws if and only if startAlgorithm throws. + function CreateReadableByteStream(startAlgorithm, pullAlgorithm, cancelAlgorithm) { + const stream = Object.create(ReadableStream.prototype); + InitializeReadableStream(stream); + const controller = Object.create(ReadableByteStreamController.prototype); + SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, 0, undefined); + return stream; + } + function InitializeReadableStream(stream) { + stream._state = 'readable'; + stream._reader = undefined; + stream._storedError = undefined; + stream._disturbed = false; + } + function IsReadableStream(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) { + return false; + } + return x instanceof ReadableStream; + } + function IsReadableStreamLocked(stream) { + if (stream._reader === undefined) { + return false; + } + return true; + } + // ReadableStream API exposed for controllers. + function ReadableStreamCancel(stream, reason) { + stream._disturbed = true; + if (stream._state === 'closed') { + return promiseResolvedWith(undefined); + } + if (stream._state === 'errored') { + return promiseRejectedWith(stream._storedError); + } + ReadableStreamClose(stream); + const reader = stream._reader; + if (reader !== undefined && IsReadableStreamBYOBReader(reader)) { + reader._readIntoRequests.forEach(readIntoRequest => { + readIntoRequest._closeSteps(undefined); + }); + reader._readIntoRequests = new SimpleQueue(); + } + const sourceCancelPromise = stream._readableStreamController[CancelSteps](reason); + return transformPromiseWith(sourceCancelPromise, noop); + } + function ReadableStreamClose(stream) { + stream._state = 'closed'; + const reader = stream._reader; + if (reader === undefined) { + return; + } + defaultReaderClosedPromiseResolve(reader); + if (IsReadableStreamDefaultReader(reader)) { + reader._readRequests.forEach(readRequest => { + readRequest._closeSteps(); + }); + reader._readRequests = new SimpleQueue(); + } + } + function ReadableStreamError(stream, e) { + stream._state = 'errored'; + stream._storedError = e; + const reader = stream._reader; + if (reader === undefined) { + return; + } + defaultReaderClosedPromiseReject(reader, e); + if (IsReadableStreamDefaultReader(reader)) { + reader._readRequests.forEach(readRequest => { + readRequest._errorSteps(e); + }); + reader._readRequests = new SimpleQueue(); + } + else { + reader._readIntoRequests.forEach(readIntoRequest => { + readIntoRequest._errorSteps(e); + }); + reader._readIntoRequests = new SimpleQueue(); + } + } + // Helper functions for the ReadableStream. + function streamBrandCheckException$1(name) { + return new TypeError(`ReadableStream.prototype.${name} can only be used on a ReadableStream`); + } + + function convertQueuingStrategyInit(init, context) { + assertDictionary(init, context); + const highWaterMark = init === null || init === void 0 ? void 0 : init.highWaterMark; + assertRequiredField(highWaterMark, 'highWaterMark', 'QueuingStrategyInit'); + return { + highWaterMark: convertUnrestrictedDouble(highWaterMark) + }; + } + + // The size function must not have a prototype property nor be a constructor + const byteLengthSizeFunction = (chunk) => { + return chunk.byteLength; + }; + try { + Object.defineProperty(byteLengthSizeFunction, 'name', { + value: 'size', + configurable: true + }); + } + catch (_a) { + // This property is non-configurable in older browsers, so ignore if this throws. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility + } + /** + * A queuing strategy that counts the number of bytes in each chunk. + * + * @public + */ + class ByteLengthQueuingStrategy { + constructor(options) { + assertRequiredArgument(options, 1, 'ByteLengthQueuingStrategy'); + options = convertQueuingStrategyInit(options, 'First parameter'); + this._byteLengthQueuingStrategyHighWaterMark = options.highWaterMark; + } + /** + * Returns the high water mark provided to the constructor. + */ + get highWaterMark() { + if (!IsByteLengthQueuingStrategy(this)) { + throw byteLengthBrandCheckException('highWaterMark'); + } + return this._byteLengthQueuingStrategyHighWaterMark; + } + /** + * Measures the size of `chunk` by returning the value of its `byteLength` property. + */ + get size() { + if (!IsByteLengthQueuingStrategy(this)) { + throw byteLengthBrandCheckException('size'); + } + return byteLengthSizeFunction; + } + } + Object.defineProperties(ByteLengthQueuingStrategy.prototype, { + highWaterMark: { enumerable: true }, + size: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(ByteLengthQueuingStrategy.prototype, SymbolPolyfill.toStringTag, { + value: 'ByteLengthQueuingStrategy', + configurable: true + }); + } + // Helper functions for the ByteLengthQueuingStrategy. + function byteLengthBrandCheckException(name) { + return new TypeError(`ByteLengthQueuingStrategy.prototype.${name} can only be used on a ByteLengthQueuingStrategy`); + } + function IsByteLengthQueuingStrategy(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_byteLengthQueuingStrategyHighWaterMark')) { + return false; + } + return x instanceof ByteLengthQueuingStrategy; + } + + // The size function must not have a prototype property nor be a constructor + const countSizeFunction = () => { + return 1; + }; + try { + Object.defineProperty(countSizeFunction, 'name', { + value: 'size', + configurable: true + }); + } + catch (_a) { + // This property is non-configurable in older browsers, so ignore if this throws. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility + } + /** + * A queuing strategy that counts the number of chunks. + * + * @public + */ + class CountQueuingStrategy { + constructor(options) { + assertRequiredArgument(options, 1, 'CountQueuingStrategy'); + options = convertQueuingStrategyInit(options, 'First parameter'); + this._countQueuingStrategyHighWaterMark = options.highWaterMark; + } + /** + * Returns the high water mark provided to the constructor. + */ + get highWaterMark() { + if (!IsCountQueuingStrategy(this)) { + throw countBrandCheckException('highWaterMark'); + } + return this._countQueuingStrategyHighWaterMark; + } + /** + * Measures the size of `chunk` by always returning 1. + * This ensures that the total queue size is a count of the number of chunks in the queue. + */ + get size() { + if (!IsCountQueuingStrategy(this)) { + throw countBrandCheckException('size'); + } + return countSizeFunction; + } + } + Object.defineProperties(CountQueuingStrategy.prototype, { + highWaterMark: { enumerable: true }, + size: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(CountQueuingStrategy.prototype, SymbolPolyfill.toStringTag, { + value: 'CountQueuingStrategy', + configurable: true + }); + } + // Helper functions for the CountQueuingStrategy. + function countBrandCheckException(name) { + return new TypeError(`CountQueuingStrategy.prototype.${name} can only be used on a CountQueuingStrategy`); + } + function IsCountQueuingStrategy(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_countQueuingStrategyHighWaterMark')) { + return false; + } + return x instanceof CountQueuingStrategy; + } + + function convertTransformer(original, context) { + assertDictionary(original, context); + const flush = original === null || original === void 0 ? void 0 : original.flush; + const readableType = original === null || original === void 0 ? void 0 : original.readableType; + const start = original === null || original === void 0 ? void 0 : original.start; + const transform = original === null || original === void 0 ? void 0 : original.transform; + const writableType = original === null || original === void 0 ? void 0 : original.writableType; + return { + flush: flush === undefined ? + undefined : + convertTransformerFlushCallback(flush, original, `${context} has member 'flush' that`), + readableType, + start: start === undefined ? + undefined : + convertTransformerStartCallback(start, original, `${context} has member 'start' that`), + transform: transform === undefined ? + undefined : + convertTransformerTransformCallback(transform, original, `${context} has member 'transform' that`), + writableType + }; + } + function convertTransformerFlushCallback(fn, original, context) { + assertFunction(fn, context); + return (controller) => promiseCall(fn, original, [controller]); + } + function convertTransformerStartCallback(fn, original, context) { + assertFunction(fn, context); + return (controller) => reflectCall(fn, original, [controller]); + } + function convertTransformerTransformCallback(fn, original, context) { + assertFunction(fn, context); + return (chunk, controller) => promiseCall(fn, original, [chunk, controller]); + } + + // Class TransformStream + /** + * A transform stream consists of a pair of streams: a {@link WritableStream | writable stream}, + * known as its writable side, and a {@link ReadableStream | readable stream}, known as its readable side. + * In a manner specific to the transform stream in question, writes to the writable side result in new data being + * made available for reading from the readable side. + * + * @public + */ + class TransformStream { + constructor(rawTransformer = {}, rawWritableStrategy = {}, rawReadableStrategy = {}) { + if (rawTransformer === undefined) { + rawTransformer = null; + } + const writableStrategy = convertQueuingStrategy(rawWritableStrategy, 'Second parameter'); + const readableStrategy = convertQueuingStrategy(rawReadableStrategy, 'Third parameter'); + const transformer = convertTransformer(rawTransformer, 'First parameter'); + if (transformer.readableType !== undefined) { + throw new RangeError('Invalid readableType specified'); + } + if (transformer.writableType !== undefined) { + throw new RangeError('Invalid writableType specified'); + } + const readableHighWaterMark = ExtractHighWaterMark(readableStrategy, 0); + const readableSizeAlgorithm = ExtractSizeAlgorithm(readableStrategy); + const writableHighWaterMark = ExtractHighWaterMark(writableStrategy, 1); + const writableSizeAlgorithm = ExtractSizeAlgorithm(writableStrategy); + let startPromise_resolve; + const startPromise = newPromise(resolve => { + startPromise_resolve = resolve; + }); + InitializeTransformStream(this, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm); + SetUpTransformStreamDefaultControllerFromTransformer(this, transformer); + if (transformer.start !== undefined) { + startPromise_resolve(transformer.start(this._transformStreamController)); + } + else { + startPromise_resolve(undefined); + } + } + /** + * The readable side of the transform stream. + */ + get readable() { + if (!IsTransformStream(this)) { + throw streamBrandCheckException('readable'); + } + return this._readable; + } + /** + * The writable side of the transform stream. + */ + get writable() { + if (!IsTransformStream(this)) { + throw streamBrandCheckException('writable'); + } + return this._writable; + } + } + Object.defineProperties(TransformStream.prototype, { + readable: { enumerable: true }, + writable: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(TransformStream.prototype, SymbolPolyfill.toStringTag, { + value: 'TransformStream', + configurable: true + }); + } + function InitializeTransformStream(stream, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm) { + function startAlgorithm() { + return startPromise; + } + function writeAlgorithm(chunk) { + return TransformStreamDefaultSinkWriteAlgorithm(stream, chunk); + } + function abortAlgorithm(reason) { + return TransformStreamDefaultSinkAbortAlgorithm(stream, reason); + } + function closeAlgorithm() { + return TransformStreamDefaultSinkCloseAlgorithm(stream); + } + stream._writable = CreateWritableStream(startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, writableHighWaterMark, writableSizeAlgorithm); + function pullAlgorithm() { + return TransformStreamDefaultSourcePullAlgorithm(stream); + } + function cancelAlgorithm(reason) { + TransformStreamErrorWritableAndUnblockWrite(stream, reason); + return promiseResolvedWith(undefined); + } + stream._readable = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, readableHighWaterMark, readableSizeAlgorithm); + // The [[backpressure]] slot is set to undefined so that it can be initialised by TransformStreamSetBackpressure. + stream._backpressure = undefined; + stream._backpressureChangePromise = undefined; + stream._backpressureChangePromise_resolve = undefined; + TransformStreamSetBackpressure(stream, true); + stream._transformStreamController = undefined; + } + function IsTransformStream(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) { + return false; + } + return x instanceof TransformStream; + } + // This is a no-op if both sides are already errored. + function TransformStreamError(stream, e) { + ReadableStreamDefaultControllerError(stream._readable._readableStreamController, e); + TransformStreamErrorWritableAndUnblockWrite(stream, e); + } + function TransformStreamErrorWritableAndUnblockWrite(stream, e) { + TransformStreamDefaultControllerClearAlgorithms(stream._transformStreamController); + WritableStreamDefaultControllerErrorIfNeeded(stream._writable._writableStreamController, e); + if (stream._backpressure) { + // Pretend that pull() was called to permit any pending write() calls to complete. TransformStreamSetBackpressure() + // cannot be called from enqueue() or pull() once the ReadableStream is errored, so this will will be the final time + // _backpressure is set. + TransformStreamSetBackpressure(stream, false); + } + } + function TransformStreamSetBackpressure(stream, backpressure) { + // Passes also when called during construction. + if (stream._backpressureChangePromise !== undefined) { + stream._backpressureChangePromise_resolve(); + } + stream._backpressureChangePromise = newPromise(resolve => { + stream._backpressureChangePromise_resolve = resolve; + }); + stream._backpressure = backpressure; + } + // Class TransformStreamDefaultController + /** + * Allows control of the {@link ReadableStream} and {@link WritableStream} of the associated {@link TransformStream}. + * + * @public + */ + class TransformStreamDefaultController { + constructor() { + throw new TypeError('Illegal constructor'); + } + /** + * Returns the desired size to fill the readable side’s internal queue. It can be negative, if the queue is over-full. + */ + get desiredSize() { + if (!IsTransformStreamDefaultController(this)) { + throw defaultControllerBrandCheckException('desiredSize'); + } + const readableController = this._controlledTransformStream._readable._readableStreamController; + return ReadableStreamDefaultControllerGetDesiredSize(readableController); + } + enqueue(chunk = undefined) { + if (!IsTransformStreamDefaultController(this)) { + throw defaultControllerBrandCheckException('enqueue'); + } + TransformStreamDefaultControllerEnqueue(this, chunk); + } + /** + * Errors both the readable side and the writable side of the controlled transform stream, making all future + * interactions with it fail with the given error `e`. Any chunks queued for transformation will be discarded. + */ + error(reason = undefined) { + if (!IsTransformStreamDefaultController(this)) { + throw defaultControllerBrandCheckException('error'); + } + TransformStreamDefaultControllerError(this, reason); + } + /** + * Closes the readable side and errors the writable side of the controlled transform stream. This is useful when the + * transformer only needs to consume a portion of the chunks written to the writable side. + */ + terminate() { + if (!IsTransformStreamDefaultController(this)) { + throw defaultControllerBrandCheckException('terminate'); + } + TransformStreamDefaultControllerTerminate(this); + } + } + Object.defineProperties(TransformStreamDefaultController.prototype, { + enqueue: { enumerable: true }, + error: { enumerable: true }, + terminate: { enumerable: true }, + desiredSize: { enumerable: true } + }); + if (typeof SymbolPolyfill.toStringTag === 'symbol') { + Object.defineProperty(TransformStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { + value: 'TransformStreamDefaultController', + configurable: true + }); + } + // Transform Stream Default Controller Abstract Operations + function IsTransformStreamDefaultController(x) { + if (!typeIsObject(x)) { + return false; + } + if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) { + return false; + } + return x instanceof TransformStreamDefaultController; + } + function SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm) { + controller._controlledTransformStream = stream; + stream._transformStreamController = controller; + controller._transformAlgorithm = transformAlgorithm; + controller._flushAlgorithm = flushAlgorithm; + } + function SetUpTransformStreamDefaultControllerFromTransformer(stream, transformer) { + const controller = Object.create(TransformStreamDefaultController.prototype); + let transformAlgorithm = (chunk) => { + try { + TransformStreamDefaultControllerEnqueue(controller, chunk); + return promiseResolvedWith(undefined); + } + catch (transformResultE) { + return promiseRejectedWith(transformResultE); + } + }; + let flushAlgorithm = () => promiseResolvedWith(undefined); + if (transformer.transform !== undefined) { + transformAlgorithm = chunk => transformer.transform(chunk, controller); + } + if (transformer.flush !== undefined) { + flushAlgorithm = () => transformer.flush(controller); + } + SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm); + } + function TransformStreamDefaultControllerClearAlgorithms(controller) { + controller._transformAlgorithm = undefined; + controller._flushAlgorithm = undefined; + } + function TransformStreamDefaultControllerEnqueue(controller, chunk) { + const stream = controller._controlledTransformStream; + const readableController = stream._readable._readableStreamController; + if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(readableController)) { + throw new TypeError('Readable side is not in a state that permits enqueue'); + } + // We throttle transform invocations based on the backpressure of the ReadableStream, but we still + // accept TransformStreamDefaultControllerEnqueue() calls. + try { + ReadableStreamDefaultControllerEnqueue(readableController, chunk); + } + catch (e) { + // This happens when readableStrategy.size() throws. + TransformStreamErrorWritableAndUnblockWrite(stream, e); + throw stream._readable._storedError; + } + const backpressure = ReadableStreamDefaultControllerHasBackpressure(readableController); + if (backpressure !== stream._backpressure) { + TransformStreamSetBackpressure(stream, true); + } + } + function TransformStreamDefaultControllerError(controller, e) { + TransformStreamError(controller._controlledTransformStream, e); + } + function TransformStreamDefaultControllerPerformTransform(controller, chunk) { + const transformPromise = controller._transformAlgorithm(chunk); + return transformPromiseWith(transformPromise, undefined, r => { + TransformStreamError(controller._controlledTransformStream, r); + throw r; + }); + } + function TransformStreamDefaultControllerTerminate(controller) { + const stream = controller._controlledTransformStream; + const readableController = stream._readable._readableStreamController; + ReadableStreamDefaultControllerClose(readableController); + const error = new TypeError('TransformStream terminated'); + TransformStreamErrorWritableAndUnblockWrite(stream, error); + } + // TransformStreamDefaultSink Algorithms + function TransformStreamDefaultSinkWriteAlgorithm(stream, chunk) { + const controller = stream._transformStreamController; + if (stream._backpressure) { + const backpressureChangePromise = stream._backpressureChangePromise; + return transformPromiseWith(backpressureChangePromise, () => { + const writable = stream._writable; + const state = writable._state; + if (state === 'erroring') { + throw writable._storedError; + } + return TransformStreamDefaultControllerPerformTransform(controller, chunk); + }); + } + return TransformStreamDefaultControllerPerformTransform(controller, chunk); + } + function TransformStreamDefaultSinkAbortAlgorithm(stream, reason) { + // abort() is not called synchronously, so it is possible for abort() to be called when the stream is already + // errored. + TransformStreamError(stream, reason); + return promiseResolvedWith(undefined); + } + function TransformStreamDefaultSinkCloseAlgorithm(stream) { + // stream._readable cannot change after construction, so caching it across a call to user code is safe. + const readable = stream._readable; + const controller = stream._transformStreamController; + const flushPromise = controller._flushAlgorithm(); + TransformStreamDefaultControllerClearAlgorithms(controller); + // Return a promise that is fulfilled with undefined on success. + return transformPromiseWith(flushPromise, () => { + if (readable._state === 'errored') { + throw readable._storedError; + } + ReadableStreamDefaultControllerClose(readable._readableStreamController); + }, r => { + TransformStreamError(stream, r); + throw readable._storedError; + }); + } + // TransformStreamDefaultSource Algorithms + function TransformStreamDefaultSourcePullAlgorithm(stream) { + // Invariant. Enforced by the promises returned by start() and pull(). + TransformStreamSetBackpressure(stream, false); + // Prevent the next pull() call until there is backpressure. + return stream._backpressureChangePromise; + } + // Helper functions for the TransformStreamDefaultController. + function defaultControllerBrandCheckException(name) { + return new TypeError(`TransformStreamDefaultController.prototype.${name} can only be used on a TransformStreamDefaultController`); + } + // Helper functions for the TransformStream. + function streamBrandCheckException(name) { + return new TypeError(`TransformStream.prototype.${name} can only be used on a TransformStream`); + } + + exports.ByteLengthQueuingStrategy = ByteLengthQueuingStrategy; + exports.CountQueuingStrategy = CountQueuingStrategy; + exports.ReadableByteStreamController = ReadableByteStreamController; + exports.ReadableStream = ReadableStream; + exports.ReadableStreamBYOBReader = ReadableStreamBYOBReader; + exports.ReadableStreamBYOBRequest = ReadableStreamBYOBRequest; + exports.ReadableStreamDefaultController = ReadableStreamDefaultController; + exports.ReadableStreamDefaultReader = ReadableStreamDefaultReader; + exports.TransformStream = TransformStream; + exports.TransformStreamDefaultController = TransformStreamDefaultController; + exports.WritableStream = WritableStream; + exports.WritableStreamDefaultController = WritableStreamDefaultController; + exports.WritableStreamDefaultWriter = WritableStreamDefaultWriter; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); +//# sourceMappingURL=ponyfill.es2018.js.map + + +/***/ }), + +/***/ 2940: +/***/ ((module) => { + +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') + + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] + } + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) + } + return ret + } +} + + +/***/ }), + +/***/ 3571: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +// Import GitHub toolkit and Octokit REST client +const github_1 = __nccwpck_require__(5438); +const openai_1 = __importDefault(__nccwpck_require__(47)); +// @ts-ignore - process is not imported +const OpenAI = new openai_1.default({ apiKey: process.env.OPENAI_API_KEY }); +async function handleIssueCommentEdited(octokit, labelNames) { + const payload = github_1.context.payload; + // @ts-ignore - process is not imported + const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; + // check if the issue is opened and the has all passed labels + if (payload.issue?.state === 'open' && labelNames.every((labelName) => payload.issue?.labels.some((issueLabel) => issueLabel.name === labelName))) { + if (!OPENAI_ASSISTANT_ID) { + console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); + return; + } + // You need to adapt this part to fit the Edit Use Case as in the original function + const content = `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body?.from}.\n\nEdited comment content: ${payload.comment?.body}`; + // create thread with first user message and run it + const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ + assistant_id: OPENAI_ASSISTANT_ID ?? '', + thread: { messages: [{ role: 'user', content }] }, + }); + // count calls for debug purposes + let count = 0; + // poll for run completion + const intervalID = setInterval(() => { + OpenAI.beta.threads.runs + .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) + .then((run) => { + // return if run is not completed yet + if (run.status !== 'completed') { + console.log('issue_comment.edited - run pending completion'); + return; + } + // get assistant response + OpenAI.beta.threads.messages + .list(createAndRunResponse.thread_id) + .then((threadMessages) => { + // list thread messages content + threadMessages.data.forEach((message, index) => { + // @ts-ignore - we do have text value in content[0] but typescript doesn't know that + // this is a 'openai' package type issue + let assistantResponse = message.content?.[index]?.text?.value; + console.log('issue_comment.edited - assistantResponse', assistantResponse); + if (!assistantResponse) { + return console.log('issue_comment.edited - assistantResponse is empty'); + } + // check if assistant response is either NO_ACTION or "NO_ACTION" strings + // as sometimes the assistant response varies + const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; + // if assistant response is NO_ACTION or message role is 'user', do nothing + if (isNoAction || threadMessages.data?.[index]?.role === 'user') { + if (threadMessages.data?.[index]?.role === 'user') { + return; + } + return console.log('issue_comment.edited - NO_ACTION'); + } + // edit comment if assistant detected substantial changes and if the comment was not edited already by the bot + if (assistantResponse.includes('[EDIT_COMMENT]') && !payload.comment?.body.includes('Edited by **proposal-police**')) { + // extract the text after [EDIT_COMMENT] from assistantResponse since this is a + // bot related action keyword + let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); + // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC + const date = new Date(payload.comment?.updated_at); + const formattedDate = date.toISOString()?.split('.')?.[0]?.replace('T', ' ') + ' UTC'; + extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); + console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment?.id}`); + return octokit.issues.updateComment({ + ...github_1.context.repo, + comment_id: payload.comment?.id, + body: `${extractedNotice}\n\n` + payload.comment?.body, + }); + } + return false; + }); + }) + .catch((err) => console.log('threads.messages.list - err', err)); + // stop polling + clearInterval(intervalID); + }) + .catch((err) => console.log('threads.runs.retrieve - err', err)); + // increment count for every threads.runs.retrieve call + count++; + console.log('threads.runs.retrieve - called:', count); + }, 1500); + } + // return so that the script doesn't hang + return false; +} +async function run() { + // @ts-ignore - process is not imported + const octokit = (0, github_1.getOctokit)(process.env.GITHUB_TOKEN); + await handleIssueCommentEdited(octokit, ['Help Wanted']); +} +run().catch((error) => { + console.error(error); + // @ts-ignore - process is not imported + process.exit(1); +}); + + +/***/ }), + +/***/ 2877: +/***/ ((module) => { + +module.exports = eval("require")("encoding"); + + +/***/ }), + +/***/ 9491: +/***/ ((module) => { + +"use strict"; +module.exports = require("assert"); + +/***/ }), + +/***/ 2361: +/***/ ((module) => { + +"use strict"; +module.exports = require("events"); + +/***/ }), + +/***/ 7147: +/***/ ((module) => { + +"use strict"; +module.exports = require("fs"); + +/***/ }), + +/***/ 3685: +/***/ ((module) => { + +"use strict"; +module.exports = require("http"); + +/***/ }), + +/***/ 5687: +/***/ ((module) => { + +"use strict"; +module.exports = require("https"); + +/***/ }), + +/***/ 1808: +/***/ ((module) => { + +"use strict"; +module.exports = require("net"); + +/***/ }), + +/***/ 7561: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:fs"); + +/***/ }), + +/***/ 4492: +/***/ ((module) => { + +"use strict"; +module.exports = require("node:stream"); + +/***/ }), + +/***/ 2037: +/***/ ((module) => { + +"use strict"; +module.exports = require("os"); + +/***/ }), + +/***/ 1017: +/***/ ((module) => { + +"use strict"; +module.exports = require("path"); + +/***/ }), + +/***/ 5477: +/***/ ((module) => { + +"use strict"; +module.exports = require("punycode"); + +/***/ }), + +/***/ 2781: +/***/ ((module) => { + +"use strict"; +module.exports = require("stream"); + +/***/ }), + +/***/ 4404: +/***/ ((module) => { + +"use strict"; +module.exports = require("tls"); + +/***/ }), + +/***/ 7310: +/***/ ((module) => { + +"use strict"; +module.exports = require("url"); + +/***/ }), + +/***/ 3837: +/***/ ((module) => { + +"use strict"; +module.exports = require("util"); + +/***/ }), + +/***/ 1267: +/***/ ((module) => { + +"use strict"; +module.exports = require("worker_threads"); + +/***/ }), + +/***/ 9796: +/***/ ((module) => { + +"use strict"; +module.exports = require("zlib"); + +/***/ }), + +/***/ 1778: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 5860: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var _FormDataEncoder_instances, _FormDataEncoder_CRLF, _FormDataEncoder_CRLF_BYTES, _FormDataEncoder_CRLF_BYTES_LENGTH, _FormDataEncoder_DASHES, _FormDataEncoder_encoder, _FormDataEncoder_footer, _FormDataEncoder_form, _FormDataEncoder_options, _FormDataEncoder_getFieldHeader; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Encoder = exports.FormDataEncoder = void 0; +const createBoundary_1 = __importDefault(__nccwpck_require__(7956)); +const isPlainObject_1 = __importDefault(__nccwpck_require__(5240)); +const normalizeValue_1 = __importDefault(__nccwpck_require__(1391)); +const escapeName_1 = __importDefault(__nccwpck_require__(3864)); +const isFileLike_1 = __nccwpck_require__(6860); +const isFormData_1 = __nccwpck_require__(1633); +const defaultOptions = { + enableAdditionalHeaders: false +}; +class FormDataEncoder { + constructor(form, boundaryOrOptions, options) { + _FormDataEncoder_instances.add(this); + _FormDataEncoder_CRLF.set(this, "\r\n"); + _FormDataEncoder_CRLF_BYTES.set(this, void 0); + _FormDataEncoder_CRLF_BYTES_LENGTH.set(this, void 0); + _FormDataEncoder_DASHES.set(this, "-".repeat(2)); + _FormDataEncoder_encoder.set(this, new TextEncoder()); + _FormDataEncoder_footer.set(this, void 0); + _FormDataEncoder_form.set(this, void 0); + _FormDataEncoder_options.set(this, void 0); + if (!(0, isFormData_1.isFormData)(form)) { + throw new TypeError("Expected first argument to be a FormData instance."); + } + let boundary; + if ((0, isPlainObject_1.default)(boundaryOrOptions)) { + options = boundaryOrOptions; + } + else { + boundary = boundaryOrOptions; + } + if (!boundary) { + boundary = (0, createBoundary_1.default)(); + } + if (typeof boundary !== "string") { + throw new TypeError("Expected boundary argument to be a string."); + } + if (options && !(0, isPlainObject_1.default)(options)) { + throw new TypeError("Expected options argument to be an object."); + } + __classPrivateFieldSet(this, _FormDataEncoder_form, form, "f"); + __classPrivateFieldSet(this, _FormDataEncoder_options, { ...defaultOptions, ...options }, "f"); + __classPrivateFieldSet(this, _FormDataEncoder_CRLF_BYTES, __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode(__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")), "f"); + __classPrivateFieldSet(this, _FormDataEncoder_CRLF_BYTES_LENGTH, __classPrivateFieldGet(this, _FormDataEncoder_CRLF_BYTES, "f").byteLength, "f"); + this.boundary = `form-data-boundary-${boundary}`; + this.contentType = `multipart/form-data; boundary=${this.boundary}`; + __classPrivateFieldSet(this, _FormDataEncoder_footer, __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode(`${__classPrivateFieldGet(this, _FormDataEncoder_DASHES, "f")}${this.boundary}${__classPrivateFieldGet(this, _FormDataEncoder_DASHES, "f")}${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f").repeat(2)}`), "f"); + this.contentLength = String(this.getContentLength()); + this.headers = Object.freeze({ + "Content-Type": this.contentType, + "Content-Length": this.contentLength + }); + Object.defineProperties(this, { + boundary: { writable: false, configurable: false }, + contentType: { writable: false, configurable: false }, + contentLength: { writable: false, configurable: false }, + headers: { writable: false, configurable: false } + }); + } + getContentLength() { + let length = 0; + for (const [name, raw] of __classPrivateFieldGet(this, _FormDataEncoder_form, "f")) { + const value = (0, isFileLike_1.isFileLike)(raw) ? raw : __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode((0, normalizeValue_1.default)(raw)); + length += __classPrivateFieldGet(this, _FormDataEncoder_instances, "m", _FormDataEncoder_getFieldHeader).call(this, name, value).byteLength; + length += (0, isFileLike_1.isFileLike)(value) ? value.size : value.byteLength; + length += __classPrivateFieldGet(this, _FormDataEncoder_CRLF_BYTES_LENGTH, "f"); + } + return length + __classPrivateFieldGet(this, _FormDataEncoder_footer, "f").byteLength; + } + *values() { + for (const [name, raw] of __classPrivateFieldGet(this, _FormDataEncoder_form, "f").entries()) { + const value = (0, isFileLike_1.isFileLike)(raw) ? raw : __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode((0, normalizeValue_1.default)(raw)); + yield __classPrivateFieldGet(this, _FormDataEncoder_instances, "m", _FormDataEncoder_getFieldHeader).call(this, name, value); + yield value; + yield __classPrivateFieldGet(this, _FormDataEncoder_CRLF_BYTES, "f"); + } + yield __classPrivateFieldGet(this, _FormDataEncoder_footer, "f"); + } + async *encode() { + for (const part of this.values()) { + if ((0, isFileLike_1.isFileLike)(part)) { + yield* part.stream(); + } + else { + yield part; + } + } + } + [(_FormDataEncoder_CRLF = new WeakMap(), _FormDataEncoder_CRLF_BYTES = new WeakMap(), _FormDataEncoder_CRLF_BYTES_LENGTH = new WeakMap(), _FormDataEncoder_DASHES = new WeakMap(), _FormDataEncoder_encoder = new WeakMap(), _FormDataEncoder_footer = new WeakMap(), _FormDataEncoder_form = new WeakMap(), _FormDataEncoder_options = new WeakMap(), _FormDataEncoder_instances = new WeakSet(), _FormDataEncoder_getFieldHeader = function _FormDataEncoder_getFieldHeader(name, value) { + let header = ""; + header += `${__classPrivateFieldGet(this, _FormDataEncoder_DASHES, "f")}${this.boundary}${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")}`; + header += `Content-Disposition: form-data; name="${(0, escapeName_1.default)(name)}"`; + if ((0, isFileLike_1.isFileLike)(value)) { + header += `; filename="${(0, escapeName_1.default)(value.name)}"${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")}`; + header += `Content-Type: ${value.type || "application/octet-stream"}`; + } + if (__classPrivateFieldGet(this, _FormDataEncoder_options, "f").enableAdditionalHeaders === true) { + header += `${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")}Content-Length: ${(0, isFileLike_1.isFileLike)(value) ? value.size : value.byteLength}`; + } + return __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode(`${header}${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f").repeat(2)}`); + }, Symbol.iterator)]() { + return this.values(); + } + [Symbol.asyncIterator]() { + return this.encode(); + } +} +exports.FormDataEncoder = FormDataEncoder; +exports.Encoder = FormDataEncoder; + + +/***/ }), + +/***/ 6921: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ 8824: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +__exportStar(__nccwpck_require__(5860), exports); +__exportStar(__nccwpck_require__(1778), exports); +__exportStar(__nccwpck_require__(6921), exports); +__exportStar(__nccwpck_require__(6860), exports); +__exportStar(__nccwpck_require__(1633), exports); + + +/***/ }), + +/***/ 7956: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"; +function createBoundary() { + let size = 16; + let res = ""; + while (size--) { + res += alphabet[(Math.random() * alphabet.length) << 0]; + } + return res; +} +exports["default"] = createBoundary; + + +/***/ }), + +/***/ 3864: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const escapeName = (name) => String(name) + .replace(/\r/g, "%0D") + .replace(/\n/g, "%0A") + .replace(/"/g, "%22"); +exports["default"] = escapeName; + + +/***/ }), + +/***/ 6860: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isFileLike = void 0; +const isFunction_1 = __importDefault(__nccwpck_require__(2498)); +const isFileLike = (value) => Boolean(value + && typeof value === "object" + && (0, isFunction_1.default)(value.constructor) + && value[Symbol.toStringTag] === "File" + && (0, isFunction_1.default)(value.stream) + && value.name != null + && value.size != null + && value.lastModified != null); +exports.isFileLike = isFileLike; + + +/***/ }), + +/***/ 1633: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isFormDataLike = exports.isFormData = void 0; +const isFunction_1 = __importDefault(__nccwpck_require__(2498)); +const isFormData = (value) => Boolean(value + && (0, isFunction_1.default)(value.constructor) + && value[Symbol.toStringTag] === "FormData" + && (0, isFunction_1.default)(value.append) + && (0, isFunction_1.default)(value.getAll) + && (0, isFunction_1.default)(value.entries) + && (0, isFunction_1.default)(value[Symbol.iterator])); +exports.isFormData = isFormData; +exports.isFormDataLike = exports.isFormData; + + +/***/ }), + +/***/ 2498: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const isFunction = (value) => (typeof value === "function"); +exports["default"] = isFunction; + + +/***/ }), + +/***/ 5240: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const getType = (value) => (Object.prototype.toString.call(value).slice(8, -1).toLowerCase()); +function isPlainObject(value) { + if (getType(value) !== "object") { + return false; + } + const pp = Object.getPrototypeOf(value); + if (pp === null || pp === undefined) { + return true; + } + const Ctor = pp.constructor && pp.constructor.toString(); + return Ctor === Object.toString(); +} +exports["default"] = isPlainObject; + + +/***/ }), + +/***/ 1391: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const normalizeValue = (value) => String(value) + .replace(/\r|\n/g, (match, i, str) => { + if ((match === "\r" && str[i + 1] !== "\n") + || (match === "\n" && str[i - 1] !== "\r")) { + return "\r\n"; + } + return match; +}); +exports["default"] = normalizeValue; + + +/***/ }), + +/***/ 6637: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +/*! Based on fetch-blob. MIT License. Jimmy Wärting & David Frank */ +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var _Blob_parts, _Blob_type, _Blob_size; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Blob = void 0; +const web_streams_polyfill_1 = __nccwpck_require__(6993); +const isFunction_1 = __nccwpck_require__(4245); +const blobHelpers_1 = __nccwpck_require__(7058); +class Blob { + constructor(blobParts = [], options = {}) { + _Blob_parts.set(this, []); + _Blob_type.set(this, ""); + _Blob_size.set(this, 0); + options !== null && options !== void 0 ? options : (options = {}); + if (typeof blobParts !== "object" || blobParts === null) { + throw new TypeError("Failed to construct 'Blob': " + + "The provided value cannot be converted to a sequence."); + } + if (!(0, isFunction_1.isFunction)(blobParts[Symbol.iterator])) { + throw new TypeError("Failed to construct 'Blob': " + + "The object must have a callable @@iterator property."); + } + if (typeof options !== "object" && !(0, isFunction_1.isFunction)(options)) { + throw new TypeError("Failed to construct 'Blob': parameter 2 cannot convert to dictionary."); + } + const encoder = new TextEncoder(); + for (const raw of blobParts) { + let part; + if (ArrayBuffer.isView(raw)) { + part = new Uint8Array(raw.buffer.slice(raw.byteOffset, raw.byteOffset + raw.byteLength)); + } + else if (raw instanceof ArrayBuffer) { + part = new Uint8Array(raw.slice(0)); + } + else if (raw instanceof Blob) { + part = raw; + } + else { + part = encoder.encode(String(raw)); + } + __classPrivateFieldSet(this, _Blob_size, __classPrivateFieldGet(this, _Blob_size, "f") + (ArrayBuffer.isView(part) ? part.byteLength : part.size), "f"); + __classPrivateFieldGet(this, _Blob_parts, "f").push(part); + } + const type = options.type === undefined ? "" : String(options.type); + __classPrivateFieldSet(this, _Blob_type, /^[\x20-\x7E]*$/.test(type) ? type : "", "f"); + } + static [(_Blob_parts = new WeakMap(), _Blob_type = new WeakMap(), _Blob_size = new WeakMap(), Symbol.hasInstance)](value) { + return Boolean(value + && typeof value === "object" + && (0, isFunction_1.isFunction)(value.constructor) + && ((0, isFunction_1.isFunction)(value.stream) + || (0, isFunction_1.isFunction)(value.arrayBuffer)) + && /^(Blob|File)$/.test(value[Symbol.toStringTag])); + } + get type() { + return __classPrivateFieldGet(this, _Blob_type, "f"); + } + get size() { + return __classPrivateFieldGet(this, _Blob_size, "f"); + } + slice(start, end, contentType) { + return new Blob((0, blobHelpers_1.sliceBlob)(__classPrivateFieldGet(this, _Blob_parts, "f"), this.size, start, end), { + type: contentType + }); + } + async text() { + const decoder = new TextDecoder(); + let result = ""; + for await (const chunk of (0, blobHelpers_1.consumeBlobParts)(__classPrivateFieldGet(this, _Blob_parts, "f"))) { + result += decoder.decode(chunk, { stream: true }); + } + result += decoder.decode(); + return result; + } + async arrayBuffer() { + const view = new Uint8Array(this.size); + let offset = 0; + for await (const chunk of (0, blobHelpers_1.consumeBlobParts)(__classPrivateFieldGet(this, _Blob_parts, "f"))) { + view.set(chunk, offset); + offset += chunk.length; + } + return view.buffer; + } + stream() { + const iterator = (0, blobHelpers_1.consumeBlobParts)(__classPrivateFieldGet(this, _Blob_parts, "f"), true); + return new web_streams_polyfill_1.ReadableStream({ + async pull(controller) { + const { value, done } = await iterator.next(); + if (done) { + return queueMicrotask(() => controller.close()); + } + controller.enqueue(value); + }, + async cancel() { + await iterator.return(); + } + }); + } + get [Symbol.toStringTag]() { + return "Blob"; + } +} +exports.Blob = Blob; +Object.defineProperties(Blob.prototype, { + type: { enumerable: true }, + size: { enumerable: true }, + slice: { enumerable: true }, + stream: { enumerable: true }, + text: { enumerable: true }, + arrayBuffer: { enumerable: true } +}); + + +/***/ }), + +/***/ 3637: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _File_name, _File_lastModified; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.File = void 0; +const Blob_1 = __nccwpck_require__(6637); +class File extends Blob_1.Blob { + constructor(fileBits, name, options = {}) { + super(fileBits, options); + _File_name.set(this, void 0); + _File_lastModified.set(this, 0); + if (arguments.length < 2) { + throw new TypeError("Failed to construct 'File': 2 arguments required, " + + `but only ${arguments.length} present.`); + } + __classPrivateFieldSet(this, _File_name, String(name), "f"); + const lastModified = options.lastModified === undefined + ? Date.now() + : Number(options.lastModified); + if (!Number.isNaN(lastModified)) { + __classPrivateFieldSet(this, _File_lastModified, lastModified, "f"); + } + } + static [(_File_name = new WeakMap(), _File_lastModified = new WeakMap(), Symbol.hasInstance)](value) { + return value instanceof Blob_1.Blob + && value[Symbol.toStringTag] === "File" + && typeof value.name === "string"; + } + get name() { + return __classPrivateFieldGet(this, _File_name, "f"); + } + get lastModified() { + return __classPrivateFieldGet(this, _File_lastModified, "f"); + } + get webkitRelativePath() { + return ""; + } + get [Symbol.toStringTag]() { + return "File"; + } +} +exports.File = File; + + +/***/ }), + +/***/ 7268: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _FormData_instances, _FormData_entries, _FormData_setEntry; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FormData = void 0; +const util_1 = __nccwpck_require__(3837); +const File_1 = __nccwpck_require__(3637); +const isFile_1 = __nccwpck_require__(4529); +const isBlob_1 = __nccwpck_require__(5493); +const isFunction_1 = __nccwpck_require__(4245); +const deprecateConstructorEntries_1 = __nccwpck_require__(2689); +class FormData { + constructor(entries) { + _FormData_instances.add(this); + _FormData_entries.set(this, new Map()); + if (entries) { + (0, deprecateConstructorEntries_1.deprecateConstructorEntries)(); + entries.forEach(({ name, value, fileName }) => this.append(name, value, fileName)); + } + } + static [(_FormData_entries = new WeakMap(), _FormData_instances = new WeakSet(), Symbol.hasInstance)](value) { + return Boolean(value + && (0, isFunction_1.isFunction)(value.constructor) + && value[Symbol.toStringTag] === "FormData" + && (0, isFunction_1.isFunction)(value.append) + && (0, isFunction_1.isFunction)(value.set) + && (0, isFunction_1.isFunction)(value.get) + && (0, isFunction_1.isFunction)(value.getAll) + && (0, isFunction_1.isFunction)(value.has) + && (0, isFunction_1.isFunction)(value.delete) + && (0, isFunction_1.isFunction)(value.entries) + && (0, isFunction_1.isFunction)(value.values) + && (0, isFunction_1.isFunction)(value.keys) + && (0, isFunction_1.isFunction)(value[Symbol.iterator]) + && (0, isFunction_1.isFunction)(value.forEach)); + } + append(name, value, fileName) { + __classPrivateFieldGet(this, _FormData_instances, "m", _FormData_setEntry).call(this, { + name, + fileName, + append: true, + rawValue: value, + argsLength: arguments.length + }); + } + set(name, value, fileName) { + __classPrivateFieldGet(this, _FormData_instances, "m", _FormData_setEntry).call(this, { + name, + fileName, + append: false, + rawValue: value, + argsLength: arguments.length + }); + } + get(name) { + const field = __classPrivateFieldGet(this, _FormData_entries, "f").get(String(name)); + if (!field) { + return null; + } + return field[0]; + } + getAll(name) { + const field = __classPrivateFieldGet(this, _FormData_entries, "f").get(String(name)); + if (!field) { + return []; + } + return field.slice(); + } + has(name) { + return __classPrivateFieldGet(this, _FormData_entries, "f").has(String(name)); + } + delete(name) { + __classPrivateFieldGet(this, _FormData_entries, "f").delete(String(name)); + } + *keys() { + for (const key of __classPrivateFieldGet(this, _FormData_entries, "f").keys()) { + yield key; + } + } + *entries() { + for (const name of this.keys()) { + const values = this.getAll(name); + for (const value of values) { + yield [name, value]; + } + } + } + *values() { + for (const [, value] of this) { + yield value; + } + } + [(_FormData_setEntry = function _FormData_setEntry({ name, rawValue, append, fileName, argsLength }) { + const methodName = append ? "append" : "set"; + if (argsLength < 2) { + throw new TypeError(`Failed to execute '${methodName}' on 'FormData': ` + + `2 arguments required, but only ${argsLength} present.`); + } + name = String(name); + let value; + if ((0, isFile_1.isFile)(rawValue)) { + value = fileName === undefined + ? rawValue + : new File_1.File([rawValue], fileName, { + type: rawValue.type, + lastModified: rawValue.lastModified + }); + } + else if ((0, isBlob_1.isBlob)(rawValue)) { + value = new File_1.File([rawValue], fileName === undefined ? "blob" : fileName, { + type: rawValue.type + }); + } + else if (fileName) { + throw new TypeError(`Failed to execute '${methodName}' on 'FormData': ` + + "parameter 2 is not of type 'Blob'."); + } + else { + value = String(rawValue); + } + const values = __classPrivateFieldGet(this, _FormData_entries, "f").get(name); + if (!values) { + return void __classPrivateFieldGet(this, _FormData_entries, "f").set(name, [value]); + } + if (!append) { + return void __classPrivateFieldGet(this, _FormData_entries, "f").set(name, [value]); + } + values.push(value); + }, Symbol.iterator)]() { + return this.entries(); + } + forEach(callback, thisArg) { + for (const [name, value] of this) { + callback.call(thisArg, value, name, this); + } + } + get [Symbol.toStringTag]() { + return "FormData"; + } + [util_1.inspect.custom]() { + return this[Symbol.toStringTag]; + } +} +exports.FormData = FormData; + + +/***/ }), + +/***/ 7058: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +/*! Based on fetch-blob. MIT License. Jimmy Wärting & David Frank */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.sliceBlob = exports.consumeBlobParts = void 0; +const isFunction_1 = __nccwpck_require__(4245); +const CHUNK_SIZE = 65536; +async function* clonePart(part) { + const end = part.byteOffset + part.byteLength; + let position = part.byteOffset; + while (position !== end) { + const size = Math.min(end - position, CHUNK_SIZE); + const chunk = part.buffer.slice(position, position + size); + position += chunk.byteLength; + yield new Uint8Array(chunk); + } +} +async function* consumeNodeBlob(blob) { + let position = 0; + while (position !== blob.size) { + const chunk = blob.slice(position, Math.min(blob.size, position + CHUNK_SIZE)); + const buffer = await chunk.arrayBuffer(); + position += buffer.byteLength; + yield new Uint8Array(buffer); + } +} +async function* consumeBlobParts(parts, clone = false) { + for (const part of parts) { + if (ArrayBuffer.isView(part)) { + if (clone) { + yield* clonePart(part); + } + else { + yield part; + } + } + else if ((0, isFunction_1.isFunction)(part.stream)) { + yield* part.stream(); + } + else { + yield* consumeNodeBlob(part); + } + } +} +exports.consumeBlobParts = consumeBlobParts; +function* sliceBlob(blobParts, blobSize, start = 0, end) { + end !== null && end !== void 0 ? end : (end = blobSize); + let relativeStart = start < 0 + ? Math.max(blobSize + start, 0) + : Math.min(start, blobSize); + let relativeEnd = end < 0 + ? Math.max(blobSize + end, 0) + : Math.min(end, blobSize); + const span = Math.max(relativeEnd - relativeStart, 0); + let added = 0; + for (const part of blobParts) { + if (added >= span) { + break; + } + const partSize = ArrayBuffer.isView(part) ? part.byteLength : part.size; + if (relativeStart && partSize <= relativeStart) { + relativeStart -= partSize; + relativeEnd -= partSize; + } + else { + let chunk; + if (ArrayBuffer.isView(part)) { + chunk = part.subarray(relativeStart, Math.min(partSize, relativeEnd)); + added += chunk.byteLength; + } + else { + chunk = part.slice(relativeStart, Math.min(partSize, relativeEnd)); + added += chunk.size; + } + relativeEnd -= partSize; + relativeStart = 0; + yield chunk; + } + } +} +exports.sliceBlob = sliceBlob; + + +/***/ }), + +/***/ 2689: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.deprecateConstructorEntries = void 0; +const util_1 = __nccwpck_require__(3837); +exports.deprecateConstructorEntries = (0, util_1.deprecate)(() => { }, "Constructor \"entries\" argument is not spec-compliant " + + "and will be removed in next major release."); + + +/***/ }), + +/***/ 8735: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +var _FileFromPath_path, _FileFromPath_start; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fileFromPath = exports.fileFromPathSync = void 0; +const fs_1 = __nccwpck_require__(7147); +const path_1 = __nccwpck_require__(1017); +const node_domexception_1 = __importDefault(__nccwpck_require__(7760)); +const File_1 = __nccwpck_require__(3637); +const isPlainObject_1 = __importDefault(__nccwpck_require__(4722)); +__exportStar(__nccwpck_require__(4529), exports); +const MESSAGE = "The requested file could not be read, " + + "typically due to permission problems that have occurred after a reference " + + "to a file was acquired."; +class FileFromPath { + constructor(input) { + _FileFromPath_path.set(this, void 0); + _FileFromPath_start.set(this, void 0); + __classPrivateFieldSet(this, _FileFromPath_path, input.path, "f"); + __classPrivateFieldSet(this, _FileFromPath_start, input.start || 0, "f"); + this.name = (0, path_1.basename)(__classPrivateFieldGet(this, _FileFromPath_path, "f")); + this.size = input.size; + this.lastModified = input.lastModified; + } + slice(start, end) { + return new FileFromPath({ + path: __classPrivateFieldGet(this, _FileFromPath_path, "f"), + lastModified: this.lastModified, + size: end - start, + start + }); + } + async *stream() { + const { mtimeMs } = await fs_1.promises.stat(__classPrivateFieldGet(this, _FileFromPath_path, "f")); + if (mtimeMs > this.lastModified) { + throw new node_domexception_1.default(MESSAGE, "NotReadableError"); + } + if (this.size) { + yield* (0, fs_1.createReadStream)(__classPrivateFieldGet(this, _FileFromPath_path, "f"), { + start: __classPrivateFieldGet(this, _FileFromPath_start, "f"), + end: __classPrivateFieldGet(this, _FileFromPath_start, "f") + this.size - 1 + }); + } + } + get [(_FileFromPath_path = new WeakMap(), _FileFromPath_start = new WeakMap(), Symbol.toStringTag)]() { + return "File"; + } +} +function createFileFromPath(path, { mtimeMs, size }, filenameOrOptions, options = {}) { + let filename; + if ((0, isPlainObject_1.default)(filenameOrOptions)) { + [options, filename] = [filenameOrOptions, undefined]; + } + else { + filename = filenameOrOptions; + } + const file = new FileFromPath({ path, size, lastModified: mtimeMs }); + if (!filename) { + filename = file.name; + } + return new File_1.File([file], filename, { + ...options, lastModified: file.lastModified + }); +} +function fileFromPathSync(path, filenameOrOptions, options = {}) { + const stats = (0, fs_1.statSync)(path); + return createFileFromPath(path, stats, filenameOrOptions, options); +} +exports.fileFromPathSync = fileFromPathSync; +async function fileFromPath(path, filenameOrOptions, options) { + const stats = await fs_1.promises.stat(path); + return createFileFromPath(path, stats, filenameOrOptions, options); +} +exports.fileFromPath = fileFromPath; + + +/***/ }), + +/***/ 880: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +__exportStar(__nccwpck_require__(7268), exports); +__exportStar(__nccwpck_require__(6637), exports); +__exportStar(__nccwpck_require__(3637), exports); + + +/***/ }), + +/***/ 5493: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isBlob = void 0; +const Blob_1 = __nccwpck_require__(6637); +const isBlob = (value) => value instanceof Blob_1.Blob; +exports.isBlob = isBlob; + + +/***/ }), + +/***/ 4529: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isFile = void 0; +const File_1 = __nccwpck_require__(3637); +const isFile = (value) => value instanceof File_1.File; +exports.isFile = isFile; + + +/***/ }), + +/***/ 4245: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isFunction = void 0; +const isFunction = (value) => (typeof value === "function"); +exports.isFunction = isFunction; + + +/***/ }), + +/***/ 4722: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const getType = (value) => (Object.prototype.toString.call(value).slice(8, -1).toLowerCase()); +function isPlainObject(value) { + if (getType(value) !== "object") { + return false; + } + const pp = Object.getPrototypeOf(value); + if (pp === null || pp === undefined) { + return true; + } + const Ctor = pp.constructor && pp.constructor.toString(); + return Ctor === Object.toString(); +} +exports["default"] = isPlainObject; + + +/***/ }), + +/***/ 4595: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.MultipartBody = void 0; +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +class MultipartBody { + constructor(body) { + this.body = body; + } + get [Symbol.toStringTag]() { + return 'MultipartBody'; + } +} +exports.MultipartBody = MultipartBody; +//# sourceMappingURL=MultipartBody.js.map + +/***/ }), + +/***/ 3506: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +__exportStar(__nccwpck_require__(1749), exports); +//# sourceMappingURL=runtime-node.js.map + +/***/ }), + +/***/ 6678: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +const shims = __nccwpck_require__(4437); +const auto = __nccwpck_require__(3506); +if (!shims.kind) shims.setShims(auto.getRuntime(), { auto: true }); +for (const property of Object.keys(shims)) { + Object.defineProperty(exports, property, { + get() { + return shims[property]; + }, + }); +} + + +/***/ }), + +/***/ 1749: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.getRuntime = void 0; +/** + * Disclaimer: modules in _shims aren't intended to be imported by SDK users. + */ +const nf = __importStar(__nccwpck_require__(467)); +const fd = __importStar(__nccwpck_require__(880)); +const agentkeepalive_1 = __importDefault(__nccwpck_require__(4623)); +const abort_controller_1 = __nccwpck_require__(1659); +const node_fs_1 = __nccwpck_require__(7561); +const form_data_encoder_1 = __nccwpck_require__(8824); +const node_stream_1 = __nccwpck_require__(4492); +const MultipartBody_1 = __nccwpck_require__(4595); +// @ts-ignore (this package does not have proper export maps for this export) +const ponyfill_es2018_js_1 = __nccwpck_require__(1452); +let fileFromPathWarned = false; +async function fileFromPath(path, ...args) { + // this import fails in environments that don't handle export maps correctly, like old versions of Jest + const { fileFromPath: _fileFromPath } = await Promise.resolve().then(() => __importStar(__nccwpck_require__(8735))); + if (!fileFromPathWarned) { + console.warn(`fileFromPath is deprecated; use fs.createReadStream(${JSON.stringify(path)}) instead`); + fileFromPathWarned = true; + } + // @ts-ignore + return await _fileFromPath(path, ...args); +} +const defaultHttpAgent = new agentkeepalive_1.default({ keepAlive: true, timeout: 5 * 60 * 1000 }); +const defaultHttpsAgent = new agentkeepalive_1.default.HttpsAgent({ keepAlive: true, timeout: 5 * 60 * 1000 }); +async function getMultipartRequestOptions(form, opts) { + const encoder = new form_data_encoder_1.FormDataEncoder(form); + const readable = node_stream_1.Readable.from(encoder); + const body = new MultipartBody_1.MultipartBody(readable); + const headers = { + ...opts.headers, + ...encoder.headers, + 'Content-Length': encoder.contentLength, + }; + return { ...opts, body: body, headers }; +} +function getRuntime() { + // Polyfill global object if needed. + if (typeof AbortController === 'undefined') { + // @ts-expect-error (the types are subtly different, but compatible in practice) + globalThis.AbortController = abort_controller_1.AbortController; + } + return { + kind: 'node', + fetch: nf.default, + Request: nf.Request, + Response: nf.Response, + Headers: nf.Headers, + FormData: fd.FormData, + Blob: fd.Blob, + File: fd.File, + ReadableStream: ponyfill_es2018_js_1.ReadableStream, + getMultipartRequestOptions, + getDefaultAgent: (url) => (url.startsWith('https') ? defaultHttpsAgent : defaultHttpAgent), + fileFromPath, + isFsReadStream: (value) => value instanceof node_fs_1.ReadStream, + }; +} +exports.getRuntime = getRuntime; +//# sourceMappingURL=node-runtime.js.map + +/***/ }), + +/***/ 4437: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.setShims = exports.isFsReadStream = exports.fileFromPath = exports.getDefaultAgent = exports.getMultipartRequestOptions = exports.ReadableStream = exports.File = exports.Blob = exports.FormData = exports.Headers = exports.Response = exports.Request = exports.fetch = exports.kind = exports.auto = void 0; +exports.auto = false; +exports.kind = undefined; +exports.fetch = undefined; +exports.Request = undefined; +exports.Response = undefined; +exports.Headers = undefined; +exports.FormData = undefined; +exports.Blob = undefined; +exports.File = undefined; +exports.ReadableStream = undefined; +exports.getMultipartRequestOptions = undefined; +exports.getDefaultAgent = undefined; +exports.fileFromPath = undefined; +exports.isFsReadStream = undefined; +function setShims(shims, options = { auto: false }) { + if (exports.auto) { + throw new Error(`you must \`import 'openai/shims/${shims.kind}'\` before importing anything else from openai`); + } + if (exports.kind) { + throw new Error(`can't \`import 'openai/shims/${shims.kind}'\` after \`import 'openai/shims/${exports.kind}'\``); + } + exports.auto = options.auto; + exports.kind = shims.kind; + exports.fetch = shims.fetch; + exports.Request = shims.Request; + exports.Response = shims.Response; + exports.Headers = shims.Headers; + exports.FormData = shims.FormData; + exports.Blob = shims.Blob; + exports.File = shims.File; + exports.ReadableStream = shims.ReadableStream; + exports.getMultipartRequestOptions = shims.getMultipartRequestOptions; + exports.getDefaultAgent = shims.getDefaultAgent; + exports.fileFromPath = shims.fileFromPath; + exports.isFsReadStream = shims.isFsReadStream; +} +exports.setShims = setShims; +//# sourceMappingURL=registry.js.map + +/***/ }), + +/***/ 1798: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _AbstractPage_client; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isObj = exports.toBase64 = exports.getRequiredHeader = exports.isHeadersProtocol = exports.isRunningInBrowser = exports.debug = exports.hasOwn = exports.isEmptyObj = exports.maybeCoerceBoolean = exports.maybeCoerceFloat = exports.maybeCoerceInteger = exports.coerceBoolean = exports.coerceFloat = exports.coerceInteger = exports.readEnv = exports.ensurePresent = exports.castToError = exports.sleep = exports.safeJSON = exports.isRequestOptions = exports.createResponseHeaders = exports.PagePromise = exports.AbstractPage = exports.APIClient = exports.APIPromise = exports.createForm = exports.multipartFormRequestOptions = exports.maybeMultipartFormRequestOptions = void 0; +const version_1 = __nccwpck_require__(6417); +const streaming_1 = __nccwpck_require__(884); +const error_1 = __nccwpck_require__(8905); +const index_1 = __nccwpck_require__(6678); +const uploads_1 = __nccwpck_require__(3394); +var uploads_2 = __nccwpck_require__(3394); +Object.defineProperty(exports, "maybeMultipartFormRequestOptions", ({ enumerable: true, get: function () { return uploads_2.maybeMultipartFormRequestOptions; } })); +Object.defineProperty(exports, "multipartFormRequestOptions", ({ enumerable: true, get: function () { return uploads_2.multipartFormRequestOptions; } })); +Object.defineProperty(exports, "createForm", ({ enumerable: true, get: function () { return uploads_2.createForm; } })); +async function defaultParseResponse(props) { + const { response } = props; + if (props.options.stream) { + debug('response', response.status, response.url, response.headers, response.body); + // Note: there is an invariant here that isn't represented in the type system + // that if you set `stream: true` the response type must also be `Stream` + if (props.options.__streamClass) { + return props.options.__streamClass.fromSSEResponse(response, props.controller); + } + return streaming_1.Stream.fromSSEResponse(response, props.controller); + } + // fetch refuses to read the body when the status code is 204. + if (response.status === 204) { + return null; + } + if (props.options.__binaryResponse) { + return response; + } + const contentType = response.headers.get('content-type'); + const isJSON = contentType?.includes('application/json') || contentType?.includes('application/vnd.api+json'); + if (isJSON) { + const json = await response.json(); + debug('response', response.status, response.url, response.headers, json); + return json; + } + const text = await response.text(); + debug('response', response.status, response.url, response.headers, text); + // TODO handle blob, arraybuffer, other content types, etc. + return text; +} +/** + * A subclass of `Promise` providing additional helper methods + * for interacting with the SDK. + */ +class APIPromise extends Promise { + constructor(responsePromise, parseResponse = defaultParseResponse) { + super((resolve) => { + // this is maybe a bit weird but this has to be a no-op to not implicitly + // parse the response body; instead .then, .catch, .finally are overridden + // to parse the response + resolve(null); + }); + this.responsePromise = responsePromise; + this.parseResponse = parseResponse; + } + _thenUnwrap(transform) { + return new APIPromise(this.responsePromise, async (props) => transform(await this.parseResponse(props))); + } + /** + * Gets the raw `Response` instance instead of parsing the response + * data. + * + * If you want to parse the response body but still get the `Response` + * instance, you can use {@link withResponse()}. + * + * 👋 Getting the wrong TypeScript type for `Response`? + * Try setting `"moduleResolution": "NodeNext"` if you can, + * or add one of these imports before your first `import … from 'openai'`: + * - `import 'openai/shims/node'` (if you're running on Node) + * - `import 'openai/shims/web'` (otherwise) + */ + asResponse() { + return this.responsePromise.then((p) => p.response); + } + /** + * Gets the parsed response data and the raw `Response` instance. + * + * If you just want to get the raw `Response` instance without parsing it, + * you can use {@link asResponse()}. + * + * + * 👋 Getting the wrong TypeScript type for `Response`? + * Try setting `"moduleResolution": "NodeNext"` if you can, + * or add one of these imports before your first `import … from 'openai'`: + * - `import 'openai/shims/node'` (if you're running on Node) + * - `import 'openai/shims/web'` (otherwise) + */ + async withResponse() { + const [data, response] = await Promise.all([this.parse(), this.asResponse()]); + return { data, response }; + } + parse() { + if (!this.parsedPromise) { + this.parsedPromise = this.responsePromise.then(this.parseResponse); + } + return this.parsedPromise; + } + then(onfulfilled, onrejected) { + return this.parse().then(onfulfilled, onrejected); + } + catch(onrejected) { + return this.parse().catch(onrejected); + } + finally(onfinally) { + return this.parse().finally(onfinally); + } +} +exports.APIPromise = APIPromise; +class APIClient { + constructor({ baseURL, maxRetries = 2, timeout = 600000, // 10 minutes + httpAgent, fetch: overridenFetch, }) { + this.baseURL = baseURL; + this.maxRetries = validatePositiveInteger('maxRetries', maxRetries); + this.timeout = validatePositiveInteger('timeout', timeout); + this.httpAgent = httpAgent; + this.fetch = overridenFetch ?? index_1.fetch; + } + authHeaders(opts) { + return {}; + } + /** + * Override this to add your own default headers, for example: + * + * { + * ...super.defaultHeaders(), + * Authorization: 'Bearer 123', + * } + */ + defaultHeaders(opts) { + return { + Accept: 'application/json', + 'Content-Type': 'application/json', + 'User-Agent': this.getUserAgent(), + ...getPlatformHeaders(), + ...this.authHeaders(opts), + }; + } + /** + * Override this to add your own headers validation: + */ + validateHeaders(headers, customHeaders) { } + defaultIdempotencyKey() { + return `stainless-node-retry-${uuid4()}`; + } + get(path, opts) { + return this.methodRequest('get', path, opts); + } + post(path, opts) { + return this.methodRequest('post', path, opts); + } + patch(path, opts) { + return this.methodRequest('patch', path, opts); + } + put(path, opts) { + return this.methodRequest('put', path, opts); + } + delete(path, opts) { + return this.methodRequest('delete', path, opts); + } + methodRequest(method, path, opts) { + return this.request(Promise.resolve(opts).then((opts) => ({ method, path, ...opts }))); + } + getAPIList(path, Page, opts) { + return this.requestAPIList(Page, { method: 'get', path, ...opts }); + } + calculateContentLength(body) { + if (typeof body === 'string') { + if (typeof Buffer !== 'undefined') { + return Buffer.byteLength(body, 'utf8').toString(); + } + if (typeof TextEncoder !== 'undefined') { + const encoder = new TextEncoder(); + const encoded = encoder.encode(body); + return encoded.length.toString(); + } + } + return null; + } + buildRequest(options) { + const { method, path, query, headers: headers = {} } = options; + const body = (0, uploads_1.isMultipartBody)(options.body) ? options.body.body + : options.body ? JSON.stringify(options.body, null, 2) + : null; + const contentLength = this.calculateContentLength(body); + const url = this.buildURL(path, query); + if ('timeout' in options) + validatePositiveInteger('timeout', options.timeout); + const timeout = options.timeout ?? this.timeout; + const httpAgent = options.httpAgent ?? this.httpAgent ?? (0, index_1.getDefaultAgent)(url); + const minAgentTimeout = timeout + 1000; + if (typeof httpAgent?.options?.timeout === 'number' && + minAgentTimeout > (httpAgent.options.timeout ?? 0)) { + // Allow any given request to bump our agent active socket timeout. + // This may seem strange, but leaking active sockets should be rare and not particularly problematic, + // and without mutating agent we would need to create more of them. + // This tradeoff optimizes for performance. + httpAgent.options.timeout = minAgentTimeout; + } + if (this.idempotencyHeader && method !== 'get') { + if (!options.idempotencyKey) + options.idempotencyKey = this.defaultIdempotencyKey(); + headers[this.idempotencyHeader] = options.idempotencyKey; + } + const reqHeaders = this.buildHeaders({ options, headers, contentLength }); + const req = { + method, + ...(body && { body: body }), + headers: reqHeaders, + ...(httpAgent && { agent: httpAgent }), + // @ts-ignore node-fetch uses a custom AbortSignal type that is + // not compatible with standard web types + signal: options.signal ?? null, + }; + return { req, url, timeout }; + } + buildHeaders({ options, headers, contentLength, }) { + const reqHeaders = {}; + if (contentLength) { + reqHeaders['content-length'] = contentLength; + } + const defaultHeaders = this.defaultHeaders(options); + applyHeadersMut(reqHeaders, defaultHeaders); + applyHeadersMut(reqHeaders, headers); + // let builtin fetch set the Content-Type for multipart bodies + if ((0, uploads_1.isMultipartBody)(options.body) && index_1.kind !== 'node') { + delete reqHeaders['content-type']; + } + this.validateHeaders(reqHeaders, headers); + return reqHeaders; + } + /** + * Used as a callback for mutating the given `FinalRequestOptions` object. + */ + async prepareOptions(options) { } + /** + * Used as a callback for mutating the given `RequestInit` object. + * + * This is useful for cases where you want to add certain headers based off of + * the request properties, e.g. `method` or `url`. + */ + async prepareRequest(request, { url, options }) { } + parseHeaders(headers) { + return (!headers ? {} + : Symbol.iterator in headers ? + Object.fromEntries(Array.from(headers).map((header) => [...header])) + : { ...headers }); + } + makeStatusError(status, error, message, headers) { + return error_1.APIError.generate(status, error, message, headers); + } + request(options, remainingRetries = null) { + return new APIPromise(this.makeRequest(options, remainingRetries)); + } + async makeRequest(optionsInput, retriesRemaining) { + const options = await optionsInput; + if (retriesRemaining == null) { + retriesRemaining = options.maxRetries ?? this.maxRetries; + } + await this.prepareOptions(options); + const { req, url, timeout } = this.buildRequest(options); + await this.prepareRequest(req, { url, options }); + debug('request', url, options, req.headers); + if (options.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + const controller = new AbortController(); + const response = await this.fetchWithTimeout(url, req, timeout, controller).catch(exports.castToError); + if (response instanceof Error) { + if (options.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + if (retriesRemaining) { + return this.retryRequest(options, retriesRemaining); + } + if (response.name === 'AbortError') { + throw new error_1.APIConnectionTimeoutError(); + } + throw new error_1.APIConnectionError({ cause: response }); + } + const responseHeaders = (0, exports.createResponseHeaders)(response.headers); + if (!response.ok) { + if (retriesRemaining && this.shouldRetry(response)) { + const retryMessage = `retrying, ${retriesRemaining} attempts remaining`; + debug(`response (error; ${retryMessage})`, response.status, url, responseHeaders); + return this.retryRequest(options, retriesRemaining, responseHeaders); + } + const errText = await response.text().catch((e) => (0, exports.castToError)(e).message); + const errJSON = (0, exports.safeJSON)(errText); + const errMessage = errJSON ? undefined : errText; + const retryMessage = retriesRemaining ? `(error; no more retries left)` : `(error; not retryable)`; + debug(`response (error; ${retryMessage})`, response.status, url, responseHeaders, errMessage); + const err = this.makeStatusError(response.status, errJSON, errMessage, responseHeaders); + throw err; + } + return { response, options, controller }; + } + requestAPIList(Page, options) { + const request = this.makeRequest(options, null); + return new PagePromise(this, request, Page); + } + buildURL(path, query) { + const url = isAbsoluteURL(path) ? + new URL(path) + : new URL(this.baseURL + (this.baseURL.endsWith('/') && path.startsWith('/') ? path.slice(1) : path)); + const defaultQuery = this.defaultQuery(); + if (!isEmptyObj(defaultQuery)) { + query = { ...defaultQuery, ...query }; + } + if (typeof query === 'object' && query && !Array.isArray(query)) { + url.search = this.stringifyQuery(query); + } + return url.toString(); + } + stringifyQuery(query) { + return Object.entries(query) + .filter(([_, value]) => typeof value !== 'undefined') + .map(([key, value]) => { + if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { + return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`; + } + if (value === null) { + return `${encodeURIComponent(key)}=`; + } + throw new error_1.OpenAIError(`Cannot stringify type ${typeof value}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`); + }) + .join('&'); + } + async fetchWithTimeout(url, init, ms, controller) { + const { signal, ...options } = init || {}; + if (signal) + signal.addEventListener('abort', () => controller.abort()); + const timeout = setTimeout(() => controller.abort(), ms); + return (this.getRequestClient() + // use undefined this binding; fetch errors if bound to something else in browser/cloudflare + .fetch.call(undefined, url, { signal: controller.signal, ...options }) + .finally(() => { + clearTimeout(timeout); + })); + } + getRequestClient() { + return { fetch: this.fetch }; + } + shouldRetry(response) { + // Note this is not a standard header. + const shouldRetryHeader = response.headers.get('x-should-retry'); + // If the server explicitly says whether or not to retry, obey. + if (shouldRetryHeader === 'true') + return true; + if (shouldRetryHeader === 'false') + return false; + // Retry on request timeouts. + if (response.status === 408) + return true; + // Retry on lock timeouts. + if (response.status === 409) + return true; + // Retry on rate limits. + if (response.status === 429) + return true; + // Retry internal errors. + if (response.status >= 500) + return true; + return false; + } + async retryRequest(options, retriesRemaining, responseHeaders) { + let timeoutMillis; + // Note the `retry-after-ms` header may not be standard, but is a good idea and we'd like proactive support for it. + const retryAfterMillisHeader = responseHeaders?.['retry-after-ms']; + if (retryAfterMillisHeader) { + const timeoutMs = parseFloat(retryAfterMillisHeader); + if (!Number.isNaN(timeoutMs)) { + timeoutMillis = timeoutMs; + } + } + // About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After + const retryAfterHeader = responseHeaders?.['retry-after']; + if (retryAfterHeader && !timeoutMillis) { + const timeoutSeconds = parseFloat(retryAfterHeader); + if (!Number.isNaN(timeoutSeconds)) { + timeoutMillis = timeoutSeconds * 1000; + } + else { + timeoutMillis = Date.parse(retryAfterHeader) - Date.now(); + } + } + // If the API asks us to wait a certain amount of time (and it's a reasonable amount), + // just do what it says, but otherwise calculate a default + if (!(timeoutMillis && 0 <= timeoutMillis && timeoutMillis < 60 * 1000)) { + const maxRetries = options.maxRetries ?? this.maxRetries; + timeoutMillis = this.calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries); + } + await (0, exports.sleep)(timeoutMillis); + return this.makeRequest(options, retriesRemaining - 1); + } + calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries) { + const initialRetryDelay = 0.5; + const maxRetryDelay = 8.0; + const numRetries = maxRetries - retriesRemaining; + // Apply exponential backoff, but not more than the max. + const sleepSeconds = Math.min(initialRetryDelay * Math.pow(2, numRetries), maxRetryDelay); + // Apply some jitter, take up to at most 25 percent of the retry time. + const jitter = 1 - Math.random() * 0.25; + return sleepSeconds * jitter * 1000; + } + getUserAgent() { + return `${this.constructor.name}/JS ${version_1.VERSION}`; + } +} +exports.APIClient = APIClient; +class AbstractPage { + constructor(client, response, body, options) { + _AbstractPage_client.set(this, void 0); + __classPrivateFieldSet(this, _AbstractPage_client, client, "f"); + this.options = options; + this.response = response; + this.body = body; + } + hasNextPage() { + const items = this.getPaginatedItems(); + if (!items.length) + return false; + return this.nextPageInfo() != null; + } + async getNextPage() { + const nextInfo = this.nextPageInfo(); + if (!nextInfo) { + throw new error_1.OpenAIError('No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.'); + } + const nextOptions = { ...this.options }; + if ('params' in nextInfo && typeof nextOptions.query === 'object') { + nextOptions.query = { ...nextOptions.query, ...nextInfo.params }; + } + else if ('url' in nextInfo) { + const params = [...Object.entries(nextOptions.query || {}), ...nextInfo.url.searchParams.entries()]; + for (const [key, value] of params) { + nextInfo.url.searchParams.set(key, value); + } + nextOptions.query = undefined; + nextOptions.path = nextInfo.url.toString(); + } + return await __classPrivateFieldGet(this, _AbstractPage_client, "f").requestAPIList(this.constructor, nextOptions); + } + async *iterPages() { + // eslint-disable-next-line @typescript-eslint/no-this-alias + let page = this; + yield page; + while (page.hasNextPage()) { + page = await page.getNextPage(); + yield page; + } + } + async *[(_AbstractPage_client = new WeakMap(), Symbol.asyncIterator)]() { + for await (const page of this.iterPages()) { + for (const item of page.getPaginatedItems()) { + yield item; + } + } + } +} +exports.AbstractPage = AbstractPage; +/** + * This subclass of Promise will resolve to an instantiated Page once the request completes. + * + * It also implements AsyncIterable to allow auto-paginating iteration on an unawaited list call, eg: + * + * for await (const item of client.items.list()) { + * console.log(item) + * } + */ +class PagePromise extends APIPromise { + constructor(client, request, Page) { + super(request, async (props) => new Page(client, props.response, await defaultParseResponse(props), props.options)); + } + /** + * Allow auto-paginating iteration on an unawaited list call, eg: + * + * for await (const item of client.items.list()) { + * console.log(item) + * } + */ + async *[Symbol.asyncIterator]() { + const page = await this; + for await (const item of page) { + yield item; + } + } +} +exports.PagePromise = PagePromise; +const createResponseHeaders = (headers) => { + return new Proxy(Object.fromEntries( + // @ts-ignore + headers.entries()), { + get(target, name) { + const key = name.toString(); + return target[key.toLowerCase()] || target[key]; + }, + }); +}; +exports.createResponseHeaders = createResponseHeaders; +// This is required so that we can determine if a given object matches the RequestOptions +// type at runtime. While this requires duplication, it is enforced by the TypeScript +// compiler such that any missing / extraneous keys will cause an error. +const requestOptionsKeys = { + method: true, + path: true, + query: true, + body: true, + headers: true, + maxRetries: true, + stream: true, + timeout: true, + httpAgent: true, + signal: true, + idempotencyKey: true, + __binaryResponse: true, + __streamClass: true, +}; +const isRequestOptions = (obj) => { + return (typeof obj === 'object' && + obj !== null && + !isEmptyObj(obj) && + Object.keys(obj).every((k) => hasOwn(requestOptionsKeys, k))); +}; +exports.isRequestOptions = isRequestOptions; +const getPlatformProperties = () => { + if (typeof Deno !== 'undefined' && Deno.build != null) { + return { + 'X-Stainless-Lang': 'js', + 'X-Stainless-Package-Version': version_1.VERSION, + 'X-Stainless-OS': normalizePlatform(Deno.build.os), + 'X-Stainless-Arch': normalizeArch(Deno.build.arch), + 'X-Stainless-Runtime': 'deno', + 'X-Stainless-Runtime-Version': typeof Deno.version === 'string' ? Deno.version : Deno.version?.deno ?? 'unknown', + }; + } + if (typeof EdgeRuntime !== 'undefined') { + return { + 'X-Stainless-Lang': 'js', + 'X-Stainless-Package-Version': version_1.VERSION, + 'X-Stainless-OS': 'Unknown', + 'X-Stainless-Arch': `other:${EdgeRuntime}`, + 'X-Stainless-Runtime': 'edge', + 'X-Stainless-Runtime-Version': process.version, + }; + } + // Check if Node.js + if (Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]') { + return { + 'X-Stainless-Lang': 'js', + 'X-Stainless-Package-Version': version_1.VERSION, + 'X-Stainless-OS': normalizePlatform(process.platform), + 'X-Stainless-Arch': normalizeArch(process.arch), + 'X-Stainless-Runtime': 'node', + 'X-Stainless-Runtime-Version': process.version, + }; + } + const browserInfo = getBrowserInfo(); + if (browserInfo) { + return { + 'X-Stainless-Lang': 'js', + 'X-Stainless-Package-Version': version_1.VERSION, + 'X-Stainless-OS': 'Unknown', + 'X-Stainless-Arch': 'unknown', + 'X-Stainless-Runtime': `browser:${browserInfo.browser}`, + 'X-Stainless-Runtime-Version': browserInfo.version, + }; + } + // TODO add support for Cloudflare workers, etc. + return { + 'X-Stainless-Lang': 'js', + 'X-Stainless-Package-Version': version_1.VERSION, + 'X-Stainless-OS': 'Unknown', + 'X-Stainless-Arch': 'unknown', + 'X-Stainless-Runtime': 'unknown', + 'X-Stainless-Runtime-Version': 'unknown', + }; +}; +// Note: modified from https://github.com/JS-DevTools/host-environment/blob/b1ab79ecde37db5d6e163c050e54fe7d287d7c92/src/isomorphic.browser.ts +function getBrowserInfo() { + if (typeof navigator === 'undefined' || !navigator) { + return null; + } + // NOTE: The order matters here! + const browserPatterns = [ + { key: 'edge', pattern: /Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, + { key: 'ie', pattern: /MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, + { key: 'ie', pattern: /Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/ }, + { key: 'chrome', pattern: /Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, + { key: 'firefox', pattern: /Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, + { key: 'safari', pattern: /(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/ }, + ]; + // Find the FIRST matching browser + for (const { key, pattern } of browserPatterns) { + const match = pattern.exec(navigator.userAgent); + if (match) { + const major = match[1] || 0; + const minor = match[2] || 0; + const patch = match[3] || 0; + return { browser: key, version: `${major}.${minor}.${patch}` }; + } + } + return null; +} +const normalizeArch = (arch) => { + // Node docs: + // - https://nodejs.org/api/process.html#processarch + // Deno docs: + // - https://doc.deno.land/deno/stable/~/Deno.build + if (arch === 'x32') + return 'x32'; + if (arch === 'x86_64' || arch === 'x64') + return 'x64'; + if (arch === 'arm') + return 'arm'; + if (arch === 'aarch64' || arch === 'arm64') + return 'arm64'; + if (arch) + return `other:${arch}`; + return 'unknown'; +}; +const normalizePlatform = (platform) => { + // Node platforms: + // - https://nodejs.org/api/process.html#processplatform + // Deno platforms: + // - https://doc.deno.land/deno/stable/~/Deno.build + // - https://github.com/denoland/deno/issues/14799 + platform = platform.toLowerCase(); + // NOTE: this iOS check is untested and may not work + // Node does not work natively on IOS, there is a fork at + // https://github.com/nodejs-mobile/nodejs-mobile + // however it is unknown at the time of writing how to detect if it is running + if (platform.includes('ios')) + return 'iOS'; + if (platform === 'android') + return 'Android'; + if (platform === 'darwin') + return 'MacOS'; + if (platform === 'win32') + return 'Windows'; + if (platform === 'freebsd') + return 'FreeBSD'; + if (platform === 'openbsd') + return 'OpenBSD'; + if (platform === 'linux') + return 'Linux'; + if (platform) + return `Other:${platform}`; + return 'Unknown'; +}; +let _platformHeaders; +const getPlatformHeaders = () => { + return (_platformHeaders ?? (_platformHeaders = getPlatformProperties())); +}; +const safeJSON = (text) => { + try { + return JSON.parse(text); + } + catch (err) { + return undefined; + } +}; +exports.safeJSON = safeJSON; +// https://stackoverflow.com/a/19709846 +const startsWithSchemeRegexp = new RegExp('^(?:[a-z]+:)?//', 'i'); +const isAbsoluteURL = (url) => { + return startsWithSchemeRegexp.test(url); +}; +const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); +exports.sleep = sleep; +const validatePositiveInteger = (name, n) => { + if (typeof n !== 'number' || !Number.isInteger(n)) { + throw new error_1.OpenAIError(`${name} must be an integer`); + } + if (n < 0) { + throw new error_1.OpenAIError(`${name} must be a positive integer`); + } + return n; +}; +const castToError = (err) => { + if (err instanceof Error) + return err; + return new Error(err); +}; +exports.castToError = castToError; +const ensurePresent = (value) => { + if (value == null) + throw new error_1.OpenAIError(`Expected a value to be given but received ${value} instead.`); + return value; +}; +exports.ensurePresent = ensurePresent; +/** + * Read an environment variable. + * + * Trims beginning and trailing whitespace. + * + * Will return undefined if the environment variable doesn't exist or cannot be accessed. + */ +const readEnv = (env) => { + if (typeof process !== 'undefined') { + return process.env?.[env]?.trim() ?? undefined; + } + if (typeof Deno !== 'undefined') { + return Deno.env?.get?.(env)?.trim(); + } + return undefined; +}; +exports.readEnv = readEnv; +const coerceInteger = (value) => { + if (typeof value === 'number') + return Math.round(value); + if (typeof value === 'string') + return parseInt(value, 10); + throw new error_1.OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`); +}; +exports.coerceInteger = coerceInteger; +const coerceFloat = (value) => { + if (typeof value === 'number') + return value; + if (typeof value === 'string') + return parseFloat(value); + throw new error_1.OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`); +}; +exports.coerceFloat = coerceFloat; +const coerceBoolean = (value) => { + if (typeof value === 'boolean') + return value; + if (typeof value === 'string') + return value === 'true'; + return Boolean(value); +}; +exports.coerceBoolean = coerceBoolean; +const maybeCoerceInteger = (value) => { + if (value === undefined) { + return undefined; + } + return (0, exports.coerceInteger)(value); +}; +exports.maybeCoerceInteger = maybeCoerceInteger; +const maybeCoerceFloat = (value) => { + if (value === undefined) { + return undefined; + } + return (0, exports.coerceFloat)(value); +}; +exports.maybeCoerceFloat = maybeCoerceFloat; +const maybeCoerceBoolean = (value) => { + if (value === undefined) { + return undefined; + } + return (0, exports.coerceBoolean)(value); +}; +exports.maybeCoerceBoolean = maybeCoerceBoolean; +// https://stackoverflow.com/a/34491287 +function isEmptyObj(obj) { + if (!obj) + return true; + for (const _k in obj) + return false; + return true; +} +exports.isEmptyObj = isEmptyObj; +// https://eslint.org/docs/latest/rules/no-prototype-builtins +function hasOwn(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); +} +exports.hasOwn = hasOwn; +/** + * Copies headers from "newHeaders" onto "targetHeaders", + * using lower-case for all properties, + * ignoring any keys with undefined values, + * and deleting any keys with null values. + */ +function applyHeadersMut(targetHeaders, newHeaders) { + for (const k in newHeaders) { + if (!hasOwn(newHeaders, k)) + continue; + const lowerKey = k.toLowerCase(); + if (!lowerKey) + continue; + const val = newHeaders[k]; + if (val === null) { + delete targetHeaders[lowerKey]; + } + else if (val !== undefined) { + targetHeaders[lowerKey] = val; + } + } +} +function debug(action, ...args) { + if (typeof process !== 'undefined' && process?.env?.['DEBUG'] === 'true') { + console.log(`OpenAI:DEBUG:${action}`, ...args); + } +} +exports.debug = debug; +/** + * https://stackoverflow.com/a/2117523 + */ +const uuid4 = () => { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { + const r = (Math.random() * 16) | 0; + const v = c === 'x' ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); +}; +const isRunningInBrowser = () => { + return ( + // @ts-ignore + typeof window !== 'undefined' && + // @ts-ignore + typeof window.document !== 'undefined' && + // @ts-ignore + typeof navigator !== 'undefined'); +}; +exports.isRunningInBrowser = isRunningInBrowser; +const isHeadersProtocol = (headers) => { + return typeof headers?.get === 'function'; +}; +exports.isHeadersProtocol = isHeadersProtocol; +const getRequiredHeader = (headers, header) => { + const lowerCasedHeader = header.toLowerCase(); + if ((0, exports.isHeadersProtocol)(headers)) { + // to deal with the case where the header looks like Stainless-Event-Id + const intercapsHeader = header[0]?.toUpperCase() + + header.substring(1).replace(/([^\w])(\w)/g, (_m, g1, g2) => g1 + g2.toUpperCase()); + for (const key of [header, lowerCasedHeader, header.toUpperCase(), intercapsHeader]) { + const value = headers.get(key); + if (value) { + return value; + } + } + } + for (const [key, value] of Object.entries(headers)) { + if (key.toLowerCase() === lowerCasedHeader) { + if (Array.isArray(value)) { + if (value.length <= 1) + return value[0]; + console.warn(`Received ${value.length} entries for the ${header} header, using the first entry.`); + return value[0]; + } + return value; + } + } + throw new Error(`Could not find ${header} header`); +}; +exports.getRequiredHeader = getRequiredHeader; +/** + * Encodes a string to Base64 format. + */ +const toBase64 = (str) => { + if (!str) + return ''; + if (typeof Buffer !== 'undefined') { + return Buffer.from(str).toString('base64'); + } + if (typeof btoa !== 'undefined') { + return btoa(str); + } + throw new error_1.OpenAIError('Cannot generate b64 string; Expected `Buffer` or `btoa` to be defined'); +}; +exports.toBase64 = toBase64; +function isObj(obj) { + return obj != null && typeof obj === 'object' && !Array.isArray(obj); +} +exports.isObj = isObj; +//# sourceMappingURL=core.js.map + +/***/ }), + +/***/ 8905: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.InternalServerError = exports.RateLimitError = exports.UnprocessableEntityError = exports.ConflictError = exports.NotFoundError = exports.PermissionDeniedError = exports.AuthenticationError = exports.BadRequestError = exports.APIConnectionTimeoutError = exports.APIConnectionError = exports.APIUserAbortError = exports.APIError = exports.OpenAIError = void 0; +const core_1 = __nccwpck_require__(1798); +class OpenAIError extends Error { +} +exports.OpenAIError = OpenAIError; +class APIError extends OpenAIError { + constructor(status, error, message, headers) { + super(`${APIError.makeMessage(status, error, message)}`); + this.status = status; + this.headers = headers; + this.request_id = headers?.['x-request-id']; + const data = error; + this.error = data; + this.code = data?.['code']; + this.param = data?.['param']; + this.type = data?.['type']; + } + static makeMessage(status, error, message) { + const msg = error?.message ? + typeof error.message === 'string' ? + error.message + : JSON.stringify(error.message) + : error ? JSON.stringify(error) + : message; + if (status && msg) { + return `${status} ${msg}`; + } + if (status) { + return `${status} status code (no body)`; + } + if (msg) { + return msg; + } + return '(no status code or body)'; + } + static generate(status, errorResponse, message, headers) { + if (!status) { + return new APIConnectionError({ cause: (0, core_1.castToError)(errorResponse) }); + } + const error = errorResponse?.['error']; + if (status === 400) { + return new BadRequestError(status, error, message, headers); + } + if (status === 401) { + return new AuthenticationError(status, error, message, headers); + } + if (status === 403) { + return new PermissionDeniedError(status, error, message, headers); + } + if (status === 404) { + return new NotFoundError(status, error, message, headers); + } + if (status === 409) { + return new ConflictError(status, error, message, headers); + } + if (status === 422) { + return new UnprocessableEntityError(status, error, message, headers); + } + if (status === 429) { + return new RateLimitError(status, error, message, headers); + } + if (status >= 500) { + return new InternalServerError(status, error, message, headers); + } + return new APIError(status, error, message, headers); + } +} +exports.APIError = APIError; +class APIUserAbortError extends APIError { + constructor({ message } = {}) { + super(undefined, undefined, message || 'Request was aborted.', undefined); + this.status = undefined; + } +} +exports.APIUserAbortError = APIUserAbortError; +class APIConnectionError extends APIError { + constructor({ message, cause }) { + super(undefined, undefined, message || 'Connection error.', undefined); + this.status = undefined; + // in some environments the 'cause' property is already declared + // @ts-ignore + if (cause) + this.cause = cause; + } +} +exports.APIConnectionError = APIConnectionError; +class APIConnectionTimeoutError extends APIConnectionError { + constructor({ message } = {}) { + super({ message: message ?? 'Request timed out.' }); + } +} +exports.APIConnectionTimeoutError = APIConnectionTimeoutError; +class BadRequestError extends APIError { + constructor() { + super(...arguments); + this.status = 400; + } +} +exports.BadRequestError = BadRequestError; +class AuthenticationError extends APIError { + constructor() { + super(...arguments); + this.status = 401; + } +} +exports.AuthenticationError = AuthenticationError; +class PermissionDeniedError extends APIError { + constructor() { + super(...arguments); + this.status = 403; + } +} +exports.PermissionDeniedError = PermissionDeniedError; +class NotFoundError extends APIError { + constructor() { + super(...arguments); + this.status = 404; + } +} +exports.NotFoundError = NotFoundError; +class ConflictError extends APIError { + constructor() { + super(...arguments); + this.status = 409; + } +} +exports.ConflictError = ConflictError; +class UnprocessableEntityError extends APIError { + constructor() { + super(...arguments); + this.status = 422; + } +} +exports.UnprocessableEntityError = UnprocessableEntityError; +class RateLimitError extends APIError { + constructor() { + super(...arguments); + this.status = 429; + } +} +exports.RateLimitError = RateLimitError; +class InternalServerError extends APIError { +} +exports.InternalServerError = InternalServerError; +//# sourceMappingURL=error.js.map + +/***/ }), + +/***/ 47: +/***/ (function(module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var _a; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fileFromPath = exports.toFile = exports.UnprocessableEntityError = exports.PermissionDeniedError = exports.InternalServerError = exports.AuthenticationError = exports.BadRequestError = exports.RateLimitError = exports.ConflictError = exports.NotFoundError = exports.APIUserAbortError = exports.APIConnectionTimeoutError = exports.APIConnectionError = exports.APIError = exports.OpenAIError = exports.OpenAI = void 0; +const Core = __importStar(__nccwpck_require__(1798)); +const Errors = __importStar(__nccwpck_require__(8905)); +const Uploads = __importStar(__nccwpck_require__(3394)); +const Pagination = __importStar(__nccwpck_require__(7401)); +const API = __importStar(__nccwpck_require__(5690)); +/** API Client for interfacing with the OpenAI API. */ +class OpenAI extends Core.APIClient { + /** + * API Client for interfacing with the OpenAI API. + * + * @param {string | undefined} [opts.apiKey=process.env['OPENAI_API_KEY'] ?? undefined] + * @param {string | null | undefined} [opts.organization=process.env['OPENAI_ORG_ID'] ?? null] + * @param {string | null | undefined} [opts.project=process.env['OPENAI_PROJECT_ID'] ?? null] + * @param {string} [opts.baseURL=process.env['OPENAI_BASE_URL'] ?? https://api.openai.com/v1] - Override the default base URL for the API. + * @param {number} [opts.timeout=10 minutes] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out. + * @param {number} [opts.httpAgent] - An HTTP agent used to manage HTTP(s) connections. + * @param {Core.Fetch} [opts.fetch] - Specify a custom `fetch` function implementation. + * @param {number} [opts.maxRetries=2] - The maximum number of times the client will retry a request. + * @param {Core.Headers} opts.defaultHeaders - Default headers to include with every request to the API. + * @param {Core.DefaultQuery} opts.defaultQuery - Default query parameters to include with every request to the API. + * @param {boolean} [opts.dangerouslyAllowBrowser=false] - By default, client-side use of this library is not allowed, as it risks exposing your secret API credentials to attackers. + */ + constructor({ baseURL = Core.readEnv('OPENAI_BASE_URL'), apiKey = Core.readEnv('OPENAI_API_KEY'), organization = Core.readEnv('OPENAI_ORG_ID') ?? null, project = Core.readEnv('OPENAI_PROJECT_ID') ?? null, ...opts } = {}) { + if (apiKey === undefined) { + throw new Errors.OpenAIError("The OPENAI_API_KEY environment variable is missing or empty; either provide it, or instantiate the OpenAI client with an apiKey option, like new OpenAI({ apiKey: 'My API Key' })."); + } + const options = { + apiKey, + organization, + project, + ...opts, + baseURL: baseURL || `https://api.openai.com/v1`, + }; + if (!options.dangerouslyAllowBrowser && Core.isRunningInBrowser()) { + throw new Errors.OpenAIError("It looks like you're running in a browser-like environment.\n\nThis is disabled by default, as it risks exposing your secret API credentials to attackers.\nIf you understand the risks and have appropriate mitigations in place,\nyou can set the `dangerouslyAllowBrowser` option to `true`, e.g.,\n\nnew OpenAI({ apiKey, dangerouslyAllowBrowser: true });\n\nhttps://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety\n"); + } + super({ + baseURL: options.baseURL, + timeout: options.timeout ?? 600000 /* 10 minutes */, + httpAgent: options.httpAgent, + maxRetries: options.maxRetries, + fetch: options.fetch, + }); + this.completions = new API.Completions(this); + this.chat = new API.Chat(this); + this.embeddings = new API.Embeddings(this); + this.files = new API.Files(this); + this.images = new API.Images(this); + this.audio = new API.Audio(this); + this.moderations = new API.Moderations(this); + this.models = new API.Models(this); + this.fineTuning = new API.FineTuning(this); + this.beta = new API.Beta(this); + this.batches = new API.Batches(this); + this._options = options; + this.apiKey = apiKey; + this.organization = organization; + this.project = project; + } + defaultQuery() { + return this._options.defaultQuery; + } + defaultHeaders(opts) { + return { + ...super.defaultHeaders(opts), + 'OpenAI-Organization': this.organization, + 'OpenAI-Project': this.project, + ...this._options.defaultHeaders, + }; + } + authHeaders(opts) { + return { Authorization: `Bearer ${this.apiKey}` }; + } +} +exports.OpenAI = OpenAI; +_a = OpenAI; +OpenAI.OpenAI = _a; +OpenAI.OpenAIError = Errors.OpenAIError; +OpenAI.APIError = Errors.APIError; +OpenAI.APIConnectionError = Errors.APIConnectionError; +OpenAI.APIConnectionTimeoutError = Errors.APIConnectionTimeoutError; +OpenAI.APIUserAbortError = Errors.APIUserAbortError; +OpenAI.NotFoundError = Errors.NotFoundError; +OpenAI.ConflictError = Errors.ConflictError; +OpenAI.RateLimitError = Errors.RateLimitError; +OpenAI.BadRequestError = Errors.BadRequestError; +OpenAI.AuthenticationError = Errors.AuthenticationError; +OpenAI.InternalServerError = Errors.InternalServerError; +OpenAI.PermissionDeniedError = Errors.PermissionDeniedError; +OpenAI.UnprocessableEntityError = Errors.UnprocessableEntityError; +OpenAI.toFile = Uploads.toFile; +OpenAI.fileFromPath = Uploads.fileFromPath; +exports.OpenAIError = Errors.OpenAIError, exports.APIError = Errors.APIError, exports.APIConnectionError = Errors.APIConnectionError, exports.APIConnectionTimeoutError = Errors.APIConnectionTimeoutError, exports.APIUserAbortError = Errors.APIUserAbortError, exports.NotFoundError = Errors.NotFoundError, exports.ConflictError = Errors.ConflictError, exports.RateLimitError = Errors.RateLimitError, exports.BadRequestError = Errors.BadRequestError, exports.AuthenticationError = Errors.AuthenticationError, exports.InternalServerError = Errors.InternalServerError, exports.PermissionDeniedError = Errors.PermissionDeniedError, exports.UnprocessableEntityError = Errors.UnprocessableEntityError; +exports.toFile = Uploads.toFile; +exports.fileFromPath = Uploads.fileFromPath; +(function (OpenAI) { + OpenAI.Page = Pagination.Page; + OpenAI.CursorPage = Pagination.CursorPage; + OpenAI.Completions = API.Completions; + OpenAI.Chat = API.Chat; + OpenAI.Embeddings = API.Embeddings; + OpenAI.Files = API.Files; + OpenAI.FileObjectsPage = API.FileObjectsPage; + OpenAI.Images = API.Images; + OpenAI.Audio = API.Audio; + OpenAI.Moderations = API.Moderations; + OpenAI.Models = API.Models; + OpenAI.ModelsPage = API.ModelsPage; + OpenAI.FineTuning = API.FineTuning; + OpenAI.Beta = API.Beta; + OpenAI.Batches = API.Batches; + OpenAI.BatchesPage = API.BatchesPage; +})(OpenAI = exports.OpenAI || (exports.OpenAI = {})); +exports = module.exports = OpenAI; +exports["default"] = OpenAI; +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ 9365: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _AbstractAssistantStreamRunner_connectedPromise, _AbstractAssistantStreamRunner_resolveConnectedPromise, _AbstractAssistantStreamRunner_rejectConnectedPromise, _AbstractAssistantStreamRunner_endPromise, _AbstractAssistantStreamRunner_resolveEndPromise, _AbstractAssistantStreamRunner_rejectEndPromise, _AbstractAssistantStreamRunner_listeners, _AbstractAssistantStreamRunner_ended, _AbstractAssistantStreamRunner_errored, _AbstractAssistantStreamRunner_aborted, _AbstractAssistantStreamRunner_catchingPromiseCreated, _AbstractAssistantStreamRunner_handleError; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AbstractAssistantStreamRunner = void 0; +const error_1 = __nccwpck_require__(8905); +class AbstractAssistantStreamRunner { + constructor() { + this.controller = new AbortController(); + _AbstractAssistantStreamRunner_connectedPromise.set(this, void 0); + _AbstractAssistantStreamRunner_resolveConnectedPromise.set(this, () => { }); + _AbstractAssistantStreamRunner_rejectConnectedPromise.set(this, () => { }); + _AbstractAssistantStreamRunner_endPromise.set(this, void 0); + _AbstractAssistantStreamRunner_resolveEndPromise.set(this, () => { }); + _AbstractAssistantStreamRunner_rejectEndPromise.set(this, () => { }); + _AbstractAssistantStreamRunner_listeners.set(this, {}); + _AbstractAssistantStreamRunner_ended.set(this, false); + _AbstractAssistantStreamRunner_errored.set(this, false); + _AbstractAssistantStreamRunner_aborted.set(this, false); + _AbstractAssistantStreamRunner_catchingPromiseCreated.set(this, false); + _AbstractAssistantStreamRunner_handleError.set(this, (error) => { + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_errored, true, "f"); + if (error instanceof Error && error.name === 'AbortError') { + error = new error_1.APIUserAbortError(); + } + if (error instanceof error_1.APIUserAbortError) { + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_aborted, true, "f"); + return this._emit('abort', error); + } + if (error instanceof error_1.OpenAIError) { + return this._emit('error', error); + } + if (error instanceof Error) { + const openAIError = new error_1.OpenAIError(error.message); + // @ts-ignore + openAIError.cause = error; + return this._emit('error', openAIError); + } + return this._emit('error', new error_1.OpenAIError(String(error))); + }); + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_connectedPromise, new Promise((resolve, reject) => { + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_resolveConnectedPromise, resolve, "f"); + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_rejectConnectedPromise, reject, "f"); + }), "f"); + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_endPromise, new Promise((resolve, reject) => { + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_resolveEndPromise, resolve, "f"); + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_rejectEndPromise, reject, "f"); + }), "f"); + // Don't let these promises cause unhandled rejection errors. + // we will manually cause an unhandled rejection error later + // if the user hasn't registered any error listener or called + // any promise-returning method. + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_connectedPromise, "f").catch(() => { }); + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_endPromise, "f").catch(() => { }); + } + _run(executor) { + // Unfortunately if we call `executor()` immediately we get runtime errors about + // references to `this` before the `super()` constructor call returns. + setTimeout(() => { + executor().then(() => { + // this._emitFinal(); + this._emit('end'); + }, __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_handleError, "f")); + }, 0); + } + _addRun(run) { + return run; + } + _connected() { + if (this.ended) + return; + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_resolveConnectedPromise, "f").call(this); + this._emit('connect'); + } + get ended() { + return __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_ended, "f"); + } + get errored() { + return __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_errored, "f"); + } + get aborted() { + return __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_aborted, "f"); + } + abort() { + this.controller.abort(); + } + /** + * Adds the listener function to the end of the listeners array for the event. + * No checks are made to see if the listener has already been added. Multiple calls passing + * the same combination of event and listener will result in the listener being added, and + * called, multiple times. + * @returns this ChatCompletionStream, so that calls can be chained + */ + on(event, listener) { + const listeners = __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] || (__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] = []); + listeners.push({ listener }); + return this; + } + /** + * Removes the specified listener from the listener array for the event. + * off() will remove, at most, one instance of a listener from the listener array. If any single + * listener has been added multiple times to the listener array for the specified event, then + * off() must be called multiple times to remove each instance. + * @returns this ChatCompletionStream, so that calls can be chained + */ + off(event, listener) { + const listeners = __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event]; + if (!listeners) + return this; + const index = listeners.findIndex((l) => l.listener === listener); + if (index >= 0) + listeners.splice(index, 1); + return this; + } + /** + * Adds a one-time listener function for the event. The next time the event is triggered, + * this listener is removed and then invoked. + * @returns this ChatCompletionStream, so that calls can be chained + */ + once(event, listener) { + const listeners = __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] || (__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] = []); + listeners.push({ listener, once: true }); + return this; + } + /** + * This is similar to `.once()`, but returns a Promise that resolves the next time + * the event is triggered, instead of calling a listener callback. + * @returns a Promise that resolves the next time given event is triggered, + * or rejects if an error is emitted. (If you request the 'error' event, + * returns a promise that resolves with the error). + * + * Example: + * + * const message = await stream.emitted('message') // rejects if the stream errors + */ + emitted(event) { + return new Promise((resolve, reject) => { + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_catchingPromiseCreated, true, "f"); + if (event !== 'error') + this.once('error', reject); + this.once(event, resolve); + }); + } + async done() { + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_catchingPromiseCreated, true, "f"); + await __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_endPromise, "f"); + } + _emit(event, ...args) { + // make sure we don't emit any events after end + if (__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_ended, "f")) { + return; + } + if (event === 'end') { + __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_ended, true, "f"); + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_resolveEndPromise, "f").call(this); + } + const listeners = __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event]; + if (listeners) { + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] = listeners.filter((l) => !l.once); + listeners.forEach(({ listener }) => listener(...args)); + } + if (event === 'abort') { + const error = args[0]; + if (!__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_catchingPromiseCreated, "f") && !listeners?.length) { + Promise.reject(error); + } + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_rejectConnectedPromise, "f").call(this, error); + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_rejectEndPromise, "f").call(this, error); + this._emit('end'); + return; + } + if (event === 'error') { + // NOTE: _emit('error', error) should only be called from #handleError(). + const error = args[0]; + if (!__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_catchingPromiseCreated, "f") && !listeners?.length) { + // Trigger an unhandled rejection if the user hasn't registered any error handlers. + // If you are seeing stack traces here, make sure to handle errors via either: + // - runner.on('error', () => ...) + // - await runner.done() + // - await runner.finalChatCompletion() + // - etc. + Promise.reject(error); + } + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_rejectConnectedPromise, "f").call(this, error); + __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_rejectEndPromise, "f").call(this, error); + this._emit('end'); + } + } + async _threadAssistantStream(body, thread, options) { + return await this._createThreadAssistantStream(thread, body, options); + } + async _runAssistantStream(threadId, runs, params, options) { + return await this._createAssistantStream(runs, threadId, params, options); + } + async _runToolAssistantStream(threadId, runId, runs, params, options) { + return await this._createToolAssistantStream(runs, threadId, runId, params, options); + } + async _createThreadAssistantStream(thread, body, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + // this.#validateParams(params); + const runResult = await thread.createAndRun({ ...body, stream: false }, { ...options, signal: this.controller.signal }); + this._connected(); + return this._addRun(runResult); + } + async _createToolAssistantStream(run, threadId, runId, params, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + const runResult = await run.submitToolOutputs(threadId, runId, { ...params, stream: false }, { ...options, signal: this.controller.signal }); + this._connected(); + return this._addRun(runResult); + } + async _createAssistantStream(run, threadId, params, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + // this.#validateParams(params); + const runResult = await run.create(threadId, { ...params, stream: false }, { ...options, signal: this.controller.signal }); + this._connected(); + return this._addRun(runResult); + } +} +exports.AbstractAssistantStreamRunner = AbstractAssistantStreamRunner; +_AbstractAssistantStreamRunner_connectedPromise = new WeakMap(), _AbstractAssistantStreamRunner_resolveConnectedPromise = new WeakMap(), _AbstractAssistantStreamRunner_rejectConnectedPromise = new WeakMap(), _AbstractAssistantStreamRunner_endPromise = new WeakMap(), _AbstractAssistantStreamRunner_resolveEndPromise = new WeakMap(), _AbstractAssistantStreamRunner_rejectEndPromise = new WeakMap(), _AbstractAssistantStreamRunner_listeners = new WeakMap(), _AbstractAssistantStreamRunner_ended = new WeakMap(), _AbstractAssistantStreamRunner_errored = new WeakMap(), _AbstractAssistantStreamRunner_aborted = new WeakMap(), _AbstractAssistantStreamRunner_catchingPromiseCreated = new WeakMap(), _AbstractAssistantStreamRunner_handleError = new WeakMap(); +//# sourceMappingURL=AbstractAssistantStreamRunner.js.map + +/***/ }), + +/***/ 8398: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var _AbstractChatCompletionRunner_instances, _AbstractChatCompletionRunner_connectedPromise, _AbstractChatCompletionRunner_resolveConnectedPromise, _AbstractChatCompletionRunner_rejectConnectedPromise, _AbstractChatCompletionRunner_endPromise, _AbstractChatCompletionRunner_resolveEndPromise, _AbstractChatCompletionRunner_rejectEndPromise, _AbstractChatCompletionRunner_listeners, _AbstractChatCompletionRunner_ended, _AbstractChatCompletionRunner_errored, _AbstractChatCompletionRunner_aborted, _AbstractChatCompletionRunner_catchingPromiseCreated, _AbstractChatCompletionRunner_getFinalContent, _AbstractChatCompletionRunner_getFinalMessage, _AbstractChatCompletionRunner_getFinalFunctionCall, _AbstractChatCompletionRunner_getFinalFunctionCallResult, _AbstractChatCompletionRunner_calculateTotalUsage, _AbstractChatCompletionRunner_handleError, _AbstractChatCompletionRunner_validateParams, _AbstractChatCompletionRunner_stringifyFunctionCallResult; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AbstractChatCompletionRunner = void 0; +const error_1 = __nccwpck_require__(8905); +const RunnableFunction_1 = __nccwpck_require__(5464); +const chatCompletionUtils_1 = __nccwpck_require__(7858); +const DEFAULT_MAX_CHAT_COMPLETIONS = 10; +class AbstractChatCompletionRunner { + constructor() { + _AbstractChatCompletionRunner_instances.add(this); + this.controller = new AbortController(); + _AbstractChatCompletionRunner_connectedPromise.set(this, void 0); + _AbstractChatCompletionRunner_resolveConnectedPromise.set(this, () => { }); + _AbstractChatCompletionRunner_rejectConnectedPromise.set(this, () => { }); + _AbstractChatCompletionRunner_endPromise.set(this, void 0); + _AbstractChatCompletionRunner_resolveEndPromise.set(this, () => { }); + _AbstractChatCompletionRunner_rejectEndPromise.set(this, () => { }); + _AbstractChatCompletionRunner_listeners.set(this, {}); + this._chatCompletions = []; + this.messages = []; + _AbstractChatCompletionRunner_ended.set(this, false); + _AbstractChatCompletionRunner_errored.set(this, false); + _AbstractChatCompletionRunner_aborted.set(this, false); + _AbstractChatCompletionRunner_catchingPromiseCreated.set(this, false); + _AbstractChatCompletionRunner_handleError.set(this, (error) => { + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_errored, true, "f"); + if (error instanceof Error && error.name === 'AbortError') { + error = new error_1.APIUserAbortError(); + } + if (error instanceof error_1.APIUserAbortError) { + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_aborted, true, "f"); + return this._emit('abort', error); + } + if (error instanceof error_1.OpenAIError) { + return this._emit('error', error); + } + if (error instanceof Error) { + const openAIError = new error_1.OpenAIError(error.message); + // @ts-ignore + openAIError.cause = error; + return this._emit('error', openAIError); + } + return this._emit('error', new error_1.OpenAIError(String(error))); + }); + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_connectedPromise, new Promise((resolve, reject) => { + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_resolveConnectedPromise, resolve, "f"); + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_rejectConnectedPromise, reject, "f"); + }), "f"); + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_endPromise, new Promise((resolve, reject) => { + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_resolveEndPromise, resolve, "f"); + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_rejectEndPromise, reject, "f"); + }), "f"); + // Don't let these promises cause unhandled rejection errors. + // we will manually cause an unhandled rejection error later + // if the user hasn't registered any error listener or called + // any promise-returning method. + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_connectedPromise, "f").catch(() => { }); + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_endPromise, "f").catch(() => { }); + } + _run(executor) { + // Unfortunately if we call `executor()` immediately we get runtime errors about + // references to `this` before the `super()` constructor call returns. + setTimeout(() => { + executor().then(() => { + this._emitFinal(); + this._emit('end'); + }, __classPrivateFieldGet(this, _AbstractChatCompletionRunner_handleError, "f")); + }, 0); + } + _addChatCompletion(chatCompletion) { + this._chatCompletions.push(chatCompletion); + this._emit('chatCompletion', chatCompletion); + const message = chatCompletion.choices[0]?.message; + if (message) + this._addMessage(message); + return chatCompletion; + } + _addMessage(message, emit = true) { + if (!('content' in message)) + message.content = null; + this.messages.push(message); + if (emit) { + this._emit('message', message); + if (((0, chatCompletionUtils_1.isFunctionMessage)(message) || (0, chatCompletionUtils_1.isToolMessage)(message)) && message.content) { + // Note, this assumes that {role: 'tool', content: …} is always the result of a call of tool of type=function. + this._emit('functionCallResult', message.content); + } + else if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message.function_call) { + this._emit('functionCall', message.function_call); + } + else if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message.tool_calls) { + for (const tool_call of message.tool_calls) { + if (tool_call.type === 'function') { + this._emit('functionCall', tool_call.function); + } + } + } + } + } + _connected() { + if (this.ended) + return; + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_resolveConnectedPromise, "f").call(this); + this._emit('connect'); + } + get ended() { + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_ended, "f"); + } + get errored() { + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_errored, "f"); + } + get aborted() { + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_aborted, "f"); + } + abort() { + this.controller.abort(); + } + /** + * Adds the listener function to the end of the listeners array for the event. + * No checks are made to see if the listener has already been added. Multiple calls passing + * the same combination of event and listener will result in the listener being added, and + * called, multiple times. + * @returns this ChatCompletionStream, so that calls can be chained + */ + on(event, listener) { + const listeners = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] || (__classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] = []); + listeners.push({ listener }); + return this; + } + /** + * Removes the specified listener from the listener array for the event. + * off() will remove, at most, one instance of a listener from the listener array. If any single + * listener has been added multiple times to the listener array for the specified event, then + * off() must be called multiple times to remove each instance. + * @returns this ChatCompletionStream, so that calls can be chained + */ + off(event, listener) { + const listeners = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event]; + if (!listeners) + return this; + const index = listeners.findIndex((l) => l.listener === listener); + if (index >= 0) + listeners.splice(index, 1); + return this; + } + /** + * Adds a one-time listener function for the event. The next time the event is triggered, + * this listener is removed and then invoked. + * @returns this ChatCompletionStream, so that calls can be chained + */ + once(event, listener) { + const listeners = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] || (__classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] = []); + listeners.push({ listener, once: true }); + return this; + } + /** + * This is similar to `.once()`, but returns a Promise that resolves the next time + * the event is triggered, instead of calling a listener callback. + * @returns a Promise that resolves the next time given event is triggered, + * or rejects if an error is emitted. (If you request the 'error' event, + * returns a promise that resolves with the error). + * + * Example: + * + * const message = await stream.emitted('message') // rejects if the stream errors + */ + emitted(event) { + return new Promise((resolve, reject) => { + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_catchingPromiseCreated, true, "f"); + if (event !== 'error') + this.once('error', reject); + this.once(event, resolve); + }); + } + async done() { + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_catchingPromiseCreated, true, "f"); + await __classPrivateFieldGet(this, _AbstractChatCompletionRunner_endPromise, "f"); + } + /** + * @returns a promise that resolves with the final ChatCompletion, or rejects + * if an error occurred or the stream ended prematurely without producing a ChatCompletion. + */ + async finalChatCompletion() { + await this.done(); + const completion = this._chatCompletions[this._chatCompletions.length - 1]; + if (!completion) + throw new error_1.OpenAIError('stream ended without producing a ChatCompletion'); + return completion; + } + /** + * @returns a promise that resolves with the content of the final ChatCompletionMessage, or rejects + * if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage. + */ + async finalContent() { + await this.done(); + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalContent).call(this); + } + /** + * @returns a promise that resolves with the the final assistant ChatCompletionMessage response, + * or rejects if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage. + */ + async finalMessage() { + await this.done(); + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalMessage).call(this); + } + /** + * @returns a promise that resolves with the content of the final FunctionCall, or rejects + * if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage. + */ + async finalFunctionCall() { + await this.done(); + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalFunctionCall).call(this); + } + async finalFunctionCallResult() { + await this.done(); + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalFunctionCallResult).call(this); + } + async totalUsage() { + await this.done(); + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_calculateTotalUsage).call(this); + } + allChatCompletions() { + return [...this._chatCompletions]; + } + _emit(event, ...args) { + // make sure we don't emit any events after end + if (__classPrivateFieldGet(this, _AbstractChatCompletionRunner_ended, "f")) { + return; + } + if (event === 'end') { + __classPrivateFieldSet(this, _AbstractChatCompletionRunner_ended, true, "f"); + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_resolveEndPromise, "f").call(this); + } + const listeners = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event]; + if (listeners) { + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] = listeners.filter((l) => !l.once); + listeners.forEach(({ listener }) => listener(...args)); + } + if (event === 'abort') { + const error = args[0]; + if (!__classPrivateFieldGet(this, _AbstractChatCompletionRunner_catchingPromiseCreated, "f") && !listeners?.length) { + Promise.reject(error); + } + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_rejectConnectedPromise, "f").call(this, error); + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_rejectEndPromise, "f").call(this, error); + this._emit('end'); + return; + } + if (event === 'error') { + // NOTE: _emit('error', error) should only be called from #handleError(). + const error = args[0]; + if (!__classPrivateFieldGet(this, _AbstractChatCompletionRunner_catchingPromiseCreated, "f") && !listeners?.length) { + // Trigger an unhandled rejection if the user hasn't registered any error handlers. + // If you are seeing stack traces here, make sure to handle errors via either: + // - runner.on('error', () => ...) + // - await runner.done() + // - await runner.finalChatCompletion() + // - etc. + Promise.reject(error); + } + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_rejectConnectedPromise, "f").call(this, error); + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_rejectEndPromise, "f").call(this, error); + this._emit('end'); + } + } + _emitFinal() { + const completion = this._chatCompletions[this._chatCompletions.length - 1]; + if (completion) + this._emit('finalChatCompletion', completion); + const finalMessage = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalMessage).call(this); + if (finalMessage) + this._emit('finalMessage', finalMessage); + const finalContent = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalContent).call(this); + if (finalContent) + this._emit('finalContent', finalContent); + const finalFunctionCall = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalFunctionCall).call(this); + if (finalFunctionCall) + this._emit('finalFunctionCall', finalFunctionCall); + const finalFunctionCallResult = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalFunctionCallResult).call(this); + if (finalFunctionCallResult != null) + this._emit('finalFunctionCallResult', finalFunctionCallResult); + if (this._chatCompletions.some((c) => c.usage)) { + this._emit('totalUsage', __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_calculateTotalUsage).call(this)); + } + } + async _createChatCompletion(completions, params, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_validateParams).call(this, params); + const chatCompletion = await completions.create({ ...params, stream: false }, { ...options, signal: this.controller.signal }); + this._connected(); + return this._addChatCompletion(chatCompletion); + } + async _runChatCompletion(completions, params, options) { + for (const message of params.messages) { + this._addMessage(message, false); + } + return await this._createChatCompletion(completions, params, options); + } + async _runFunctions(completions, params, options) { + const role = 'function'; + const { function_call = 'auto', stream, ...restParams } = params; + const singleFunctionToCall = typeof function_call !== 'string' && function_call?.name; + const { maxChatCompletions = DEFAULT_MAX_CHAT_COMPLETIONS } = options || {}; + const functionsByName = {}; + for (const f of params.functions) { + functionsByName[f.name || f.function.name] = f; + } + const functions = params.functions.map((f) => ({ + name: f.name || f.function.name, + parameters: f.parameters, + description: f.description, + })); + for (const message of params.messages) { + this._addMessage(message, false); + } + for (let i = 0; i < maxChatCompletions; ++i) { + const chatCompletion = await this._createChatCompletion(completions, { + ...restParams, + function_call, + functions, + messages: [...this.messages], + }, options); + const message = chatCompletion.choices[0]?.message; + if (!message) { + throw new error_1.OpenAIError(`missing message in ChatCompletion response`); + } + if (!message.function_call) + return; + const { name, arguments: args } = message.function_call; + const fn = functionsByName[name]; + if (!fn) { + const content = `Invalid function_call: ${JSON.stringify(name)}. Available options are: ${functions + .map((f) => JSON.stringify(f.name)) + .join(', ')}. Please try again`; + this._addMessage({ role, name, content }); + continue; + } + else if (singleFunctionToCall && singleFunctionToCall !== name) { + const content = `Invalid function_call: ${JSON.stringify(name)}. ${JSON.stringify(singleFunctionToCall)} requested. Please try again`; + this._addMessage({ role, name, content }); + continue; + } + let parsed; + try { + parsed = (0, RunnableFunction_1.isRunnableFunctionWithParse)(fn) ? await fn.parse(args) : args; + } + catch (error) { + this._addMessage({ + role, + name, + content: error instanceof Error ? error.message : String(error), + }); + continue; + } + // @ts-expect-error it can't rule out `never` type. + const rawContent = await fn.function(parsed, this); + const content = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_stringifyFunctionCallResult).call(this, rawContent); + this._addMessage({ role, name, content }); + if (singleFunctionToCall) + return; + } + } + async _runTools(completions, params, options) { + const role = 'tool'; + const { tool_choice = 'auto', stream, ...restParams } = params; + const singleFunctionToCall = typeof tool_choice !== 'string' && tool_choice?.function?.name; + const { maxChatCompletions = DEFAULT_MAX_CHAT_COMPLETIONS } = options || {}; + const functionsByName = {}; + for (const f of params.tools) { + if (f.type === 'function') { + functionsByName[f.function.name || f.function.function.name] = f.function; + } + } + const tools = 'tools' in params ? + params.tools.map((t) => t.type === 'function' ? + { + type: 'function', + function: { + name: t.function.name || t.function.function.name, + parameters: t.function.parameters, + description: t.function.description, + }, + } + : t) + : undefined; + for (const message of params.messages) { + this._addMessage(message, false); + } + for (let i = 0; i < maxChatCompletions; ++i) { + const chatCompletion = await this._createChatCompletion(completions, { + ...restParams, + tool_choice, + tools, + messages: [...this.messages], + }, options); + const message = chatCompletion.choices[0]?.message; + if (!message) { + throw new error_1.OpenAIError(`missing message in ChatCompletion response`); + } + if (!message.tool_calls) { + return; + } + for (const tool_call of message.tool_calls) { + if (tool_call.type !== 'function') + continue; + const tool_call_id = tool_call.id; + const { name, arguments: args } = tool_call.function; + const fn = functionsByName[name]; + if (!fn) { + const content = `Invalid tool_call: ${JSON.stringify(name)}. Available options are: ${tools + .map((f) => JSON.stringify(f.function.name)) + .join(', ')}. Please try again`; + this._addMessage({ role, tool_call_id, content }); + continue; + } + else if (singleFunctionToCall && singleFunctionToCall !== name) { + const content = `Invalid tool_call: ${JSON.stringify(name)}. ${JSON.stringify(singleFunctionToCall)} requested. Please try again`; + this._addMessage({ role, tool_call_id, content }); + continue; + } + let parsed; + try { + parsed = (0, RunnableFunction_1.isRunnableFunctionWithParse)(fn) ? await fn.parse(args) : args; + } + catch (error) { + const content = error instanceof Error ? error.message : String(error); + this._addMessage({ role, tool_call_id, content }); + continue; + } + // @ts-expect-error it can't rule out `never` type. + const rawContent = await fn.function(parsed, this); + const content = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_stringifyFunctionCallResult).call(this, rawContent); + this._addMessage({ role, tool_call_id, content }); + if (singleFunctionToCall) { + return; + } + } + } + return; + } +} +exports.AbstractChatCompletionRunner = AbstractChatCompletionRunner; +_AbstractChatCompletionRunner_connectedPromise = new WeakMap(), _AbstractChatCompletionRunner_resolveConnectedPromise = new WeakMap(), _AbstractChatCompletionRunner_rejectConnectedPromise = new WeakMap(), _AbstractChatCompletionRunner_endPromise = new WeakMap(), _AbstractChatCompletionRunner_resolveEndPromise = new WeakMap(), _AbstractChatCompletionRunner_rejectEndPromise = new WeakMap(), _AbstractChatCompletionRunner_listeners = new WeakMap(), _AbstractChatCompletionRunner_ended = new WeakMap(), _AbstractChatCompletionRunner_errored = new WeakMap(), _AbstractChatCompletionRunner_aborted = new WeakMap(), _AbstractChatCompletionRunner_catchingPromiseCreated = new WeakMap(), _AbstractChatCompletionRunner_handleError = new WeakMap(), _AbstractChatCompletionRunner_instances = new WeakSet(), _AbstractChatCompletionRunner_getFinalContent = function _AbstractChatCompletionRunner_getFinalContent() { + return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalMessage).call(this).content ?? null; +}, _AbstractChatCompletionRunner_getFinalMessage = function _AbstractChatCompletionRunner_getFinalMessage() { + let i = this.messages.length; + while (i-- > 0) { + const message = this.messages[i]; + if ((0, chatCompletionUtils_1.isAssistantMessage)(message)) { + return { ...message, content: message.content ?? null }; + } + } + throw new error_1.OpenAIError('stream ended without producing a ChatCompletionMessage with role=assistant'); +}, _AbstractChatCompletionRunner_getFinalFunctionCall = function _AbstractChatCompletionRunner_getFinalFunctionCall() { + for (let i = this.messages.length - 1; i >= 0; i--) { + const message = this.messages[i]; + if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message?.function_call) { + return message.function_call; + } + if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message?.tool_calls?.length) { + return message.tool_calls.at(-1)?.function; + } + } + return; +}, _AbstractChatCompletionRunner_getFinalFunctionCallResult = function _AbstractChatCompletionRunner_getFinalFunctionCallResult() { + for (let i = this.messages.length - 1; i >= 0; i--) { + const message = this.messages[i]; + if ((0, chatCompletionUtils_1.isFunctionMessage)(message) && message.content != null) { + return message.content; + } + if ((0, chatCompletionUtils_1.isToolMessage)(message) && + message.content != null && + this.messages.some((x) => x.role === 'assistant' && + x.tool_calls?.some((y) => y.type === 'function' && y.id === message.tool_call_id))) { + return message.content; + } + } + return; +}, _AbstractChatCompletionRunner_calculateTotalUsage = function _AbstractChatCompletionRunner_calculateTotalUsage() { + const total = { + completion_tokens: 0, + prompt_tokens: 0, + total_tokens: 0, + }; + for (const { usage } of this._chatCompletions) { + if (usage) { + total.completion_tokens += usage.completion_tokens; + total.prompt_tokens += usage.prompt_tokens; + total.total_tokens += usage.total_tokens; + } + } + return total; +}, _AbstractChatCompletionRunner_validateParams = function _AbstractChatCompletionRunner_validateParams(params) { + if (params.n != null && params.n > 1) { + throw new error_1.OpenAIError('ChatCompletion convenience helpers only support n=1 at this time. To use n>1, please use chat.completions.create() directly.'); + } +}, _AbstractChatCompletionRunner_stringifyFunctionCallResult = function _AbstractChatCompletionRunner_stringifyFunctionCallResult(rawContent) { + return (typeof rawContent === 'string' ? rawContent + : rawContent === undefined ? 'undefined' + : JSON.stringify(rawContent)); +}; +//# sourceMappingURL=AbstractChatCompletionRunner.js.map + +/***/ }), + +/***/ 7514: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var _AssistantStream_instances, _AssistantStream_events, _AssistantStream_runStepSnapshots, _AssistantStream_messageSnapshots, _AssistantStream_messageSnapshot, _AssistantStream_finalRun, _AssistantStream_currentContentIndex, _AssistantStream_currentContent, _AssistantStream_currentToolCallIndex, _AssistantStream_currentToolCall, _AssistantStream_currentEvent, _AssistantStream_currentRunSnapshot, _AssistantStream_currentRunStepSnapshot, _AssistantStream_addEvent, _AssistantStream_endRequest, _AssistantStream_handleMessage, _AssistantStream_handleRunStep, _AssistantStream_handleEvent, _AssistantStream_accumulateRunStep, _AssistantStream_accumulateMessage, _AssistantStream_accumulateContent, _AssistantStream_handleRun; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AssistantStream = void 0; +const Core = __importStar(__nccwpck_require__(1798)); +const AbstractAssistantStreamRunner_1 = __nccwpck_require__(9365); +const streaming_1 = __nccwpck_require__(884); +const error_1 = __nccwpck_require__(8905); +class AssistantStream extends AbstractAssistantStreamRunner_1.AbstractAssistantStreamRunner { + constructor() { + super(...arguments); + _AssistantStream_instances.add(this); + //Track all events in a single list for reference + _AssistantStream_events.set(this, []); + //Used to accumulate deltas + //We are accumulating many types so the value here is not strict + _AssistantStream_runStepSnapshots.set(this, {}); + _AssistantStream_messageSnapshots.set(this, {}); + _AssistantStream_messageSnapshot.set(this, void 0); + _AssistantStream_finalRun.set(this, void 0); + _AssistantStream_currentContentIndex.set(this, void 0); + _AssistantStream_currentContent.set(this, void 0); + _AssistantStream_currentToolCallIndex.set(this, void 0); + _AssistantStream_currentToolCall.set(this, void 0); + //For current snapshot methods + _AssistantStream_currentEvent.set(this, void 0); + _AssistantStream_currentRunSnapshot.set(this, void 0); + _AssistantStream_currentRunStepSnapshot.set(this, void 0); + } + [(_AssistantStream_events = new WeakMap(), _AssistantStream_runStepSnapshots = new WeakMap(), _AssistantStream_messageSnapshots = new WeakMap(), _AssistantStream_messageSnapshot = new WeakMap(), _AssistantStream_finalRun = new WeakMap(), _AssistantStream_currentContentIndex = new WeakMap(), _AssistantStream_currentContent = new WeakMap(), _AssistantStream_currentToolCallIndex = new WeakMap(), _AssistantStream_currentToolCall = new WeakMap(), _AssistantStream_currentEvent = new WeakMap(), _AssistantStream_currentRunSnapshot = new WeakMap(), _AssistantStream_currentRunStepSnapshot = new WeakMap(), _AssistantStream_instances = new WeakSet(), Symbol.asyncIterator)]() { + const pushQueue = []; + const readQueue = []; + let done = false; + //Catch all for passing along all events + this.on('event', (event) => { + const reader = readQueue.shift(); + if (reader) { + reader.resolve(event); + } + else { + pushQueue.push(event); + } + }); + this.on('end', () => { + done = true; + for (const reader of readQueue) { + reader.resolve(undefined); + } + readQueue.length = 0; + }); + this.on('abort', (err) => { + done = true; + for (const reader of readQueue) { + reader.reject(err); + } + readQueue.length = 0; + }); + this.on('error', (err) => { + done = true; + for (const reader of readQueue) { + reader.reject(err); + } + readQueue.length = 0; + }); + return { + next: async () => { + if (!pushQueue.length) { + if (done) { + return { value: undefined, done: true }; + } + return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true })); + } + const chunk = pushQueue.shift(); + return { value: chunk, done: false }; + }, + return: async () => { + this.abort(); + return { value: undefined, done: true }; + }, + }; + } + static fromReadableStream(stream) { + const runner = new AssistantStream(); + runner._run(() => runner._fromReadableStream(stream)); + return runner; + } + async _fromReadableStream(readableStream, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + this._connected(); + const stream = streaming_1.Stream.fromReadableStream(readableStream, this.controller); + for await (const event of stream) { + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event); + } + if (stream.controller.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this)); + } + toReadableStream() { + const stream = new streaming_1.Stream(this[Symbol.asyncIterator].bind(this), this.controller); + return stream.toReadableStream(); + } + static createToolAssistantStream(threadId, runId, runs, body, options) { + const runner = new AssistantStream(); + runner._run(() => runner._runToolAssistantStream(threadId, runId, runs, body, { + ...options, + headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' }, + })); + return runner; + } + async _createToolAssistantStream(run, threadId, runId, params, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + const body = { ...params, stream: true }; + const stream = await run.submitToolOutputs(threadId, runId, body, { + ...options, + signal: this.controller.signal, + }); + this._connected(); + for await (const event of stream) { + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event); + } + if (stream.controller.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this)); + } + static createThreadAssistantStream(body, thread, options) { + const runner = new AssistantStream(); + runner._run(() => runner._threadAssistantStream(body, thread, { + ...options, + headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' }, + })); + return runner; + } + static createAssistantStream(threadId, runs, params, options) { + const runner = new AssistantStream(); + runner._run(() => runner._runAssistantStream(threadId, runs, params, { + ...options, + headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' }, + })); + return runner; + } + currentEvent() { + return __classPrivateFieldGet(this, _AssistantStream_currentEvent, "f"); + } + currentRun() { + return __classPrivateFieldGet(this, _AssistantStream_currentRunSnapshot, "f"); + } + currentMessageSnapshot() { + return __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f"); + } + currentRunStepSnapshot() { + return __classPrivateFieldGet(this, _AssistantStream_currentRunStepSnapshot, "f"); + } + async finalRunSteps() { + await this.done(); + return Object.values(__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")); + } + async finalMessages() { + await this.done(); + return Object.values(__classPrivateFieldGet(this, _AssistantStream_messageSnapshots, "f")); + } + async finalRun() { + await this.done(); + if (!__classPrivateFieldGet(this, _AssistantStream_finalRun, "f")) + throw Error('Final run was not received.'); + return __classPrivateFieldGet(this, _AssistantStream_finalRun, "f"); + } + async _createThreadAssistantStream(thread, params, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + const body = { ...params, stream: true }; + const stream = await thread.createAndRun(body, { ...options, signal: this.controller.signal }); + this._connected(); + for await (const event of stream) { + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event); + } + if (stream.controller.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this)); + } + async _createAssistantStream(run, threadId, params, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + const body = { ...params, stream: true }; + const stream = await run.create(threadId, body, { ...options, signal: this.controller.signal }); + this._connected(); + for await (const event of stream) { + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event); + } + if (stream.controller.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this)); + } + static accumulateDelta(acc, delta) { + for (const [key, deltaValue] of Object.entries(delta)) { + if (!acc.hasOwnProperty(key)) { + acc[key] = deltaValue; + continue; + } + let accValue = acc[key]; + if (accValue === null || accValue === undefined) { + acc[key] = deltaValue; + continue; + } + // We don't accumulate these special properties + if (key === 'index' || key === 'type') { + acc[key] = deltaValue; + continue; + } + // Type-specific accumulation logic + if (typeof accValue === 'string' && typeof deltaValue === 'string') { + accValue += deltaValue; + } + else if (typeof accValue === 'number' && typeof deltaValue === 'number') { + accValue += deltaValue; + } + else if (Core.isObj(accValue) && Core.isObj(deltaValue)) { + accValue = this.accumulateDelta(accValue, deltaValue); + } + else if (Array.isArray(accValue) && Array.isArray(deltaValue)) { + if (accValue.every((x) => typeof x === 'string' || typeof x === 'number')) { + accValue.push(...deltaValue); // Use spread syntax for efficient addition + continue; + } + } + else { + throw Error(`Unhandled record type: ${key}, deltaValue: ${deltaValue}, accValue: ${accValue}`); + } + acc[key] = accValue; + } + return acc; + } +} +exports.AssistantStream = AssistantStream; +_AssistantStream_addEvent = function _AssistantStream_addEvent(event) { + if (this.ended) + return; + __classPrivateFieldSet(this, _AssistantStream_currentEvent, event, "f"); + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleEvent).call(this, event); + switch (event.event) { + case 'thread.created': + //No action on this event. + break; + case 'thread.run.created': + case 'thread.run.queued': + case 'thread.run.in_progress': + case 'thread.run.requires_action': + case 'thread.run.completed': + case 'thread.run.failed': + case 'thread.run.cancelling': + case 'thread.run.cancelled': + case 'thread.run.expired': + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleRun).call(this, event); + break; + case 'thread.run.step.created': + case 'thread.run.step.in_progress': + case 'thread.run.step.delta': + case 'thread.run.step.completed': + case 'thread.run.step.failed': + case 'thread.run.step.cancelled': + case 'thread.run.step.expired': + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleRunStep).call(this, event); + break; + case 'thread.message.created': + case 'thread.message.in_progress': + case 'thread.message.delta': + case 'thread.message.completed': + case 'thread.message.incomplete': + __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleMessage).call(this, event); + break; + case 'error': + //This is included for completeness, but errors are processed in the SSE event processing so this should not occur + throw new Error('Encountered an error event in event processing - errors should be processed earlier'); + } +}, _AssistantStream_endRequest = function _AssistantStream_endRequest() { + if (this.ended) { + throw new error_1.OpenAIError(`stream has ended, this shouldn't happen`); + } + if (!__classPrivateFieldGet(this, _AssistantStream_finalRun, "f")) + throw Error('Final run has not been received'); + return __classPrivateFieldGet(this, _AssistantStream_finalRun, "f"); +}, _AssistantStream_handleMessage = function _AssistantStream_handleMessage(event) { + const [accumulatedMessage, newContent] = __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_accumulateMessage).call(this, event, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); + __classPrivateFieldSet(this, _AssistantStream_messageSnapshot, accumulatedMessage, "f"); + __classPrivateFieldGet(this, _AssistantStream_messageSnapshots, "f")[accumulatedMessage.id] = accumulatedMessage; + for (const content of newContent) { + const snapshotContent = accumulatedMessage.content[content.index]; + if (snapshotContent?.type == 'text') { + this._emit('textCreated', snapshotContent.text); + } + } + switch (event.event) { + case 'thread.message.created': + this._emit('messageCreated', event.data); + break; + case 'thread.message.in_progress': + break; + case 'thread.message.delta': + this._emit('messageDelta', event.data.delta, accumulatedMessage); + if (event.data.delta.content) { + for (const content of event.data.delta.content) { + //If it is text delta, emit a text delta event + if (content.type == 'text' && content.text) { + let textDelta = content.text; + let snapshot = accumulatedMessage.content[content.index]; + if (snapshot && snapshot.type == 'text') { + this._emit('textDelta', textDelta, snapshot.text); + } + else { + throw Error('The snapshot associated with this text delta is not text or missing'); + } + } + if (content.index != __classPrivateFieldGet(this, _AssistantStream_currentContentIndex, "f")) { + //See if we have in progress content + if (__classPrivateFieldGet(this, _AssistantStream_currentContent, "f")) { + switch (__classPrivateFieldGet(this, _AssistantStream_currentContent, "f").type) { + case 'text': + this._emit('textDone', __classPrivateFieldGet(this, _AssistantStream_currentContent, "f").text, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); + break; + case 'image_file': + this._emit('imageFileDone', __classPrivateFieldGet(this, _AssistantStream_currentContent, "f").image_file, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); + break; + } + } + __classPrivateFieldSet(this, _AssistantStream_currentContentIndex, content.index, "f"); + } + __classPrivateFieldSet(this, _AssistantStream_currentContent, accumulatedMessage.content[content.index], "f"); + } + } + break; + case 'thread.message.completed': + case 'thread.message.incomplete': + //We emit the latest content we were working on on completion (including incomplete) + if (__classPrivateFieldGet(this, _AssistantStream_currentContentIndex, "f") !== undefined) { + const currentContent = event.data.content[__classPrivateFieldGet(this, _AssistantStream_currentContentIndex, "f")]; + if (currentContent) { + switch (currentContent.type) { + case 'image_file': + this._emit('imageFileDone', currentContent.image_file, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); + break; + case 'text': + this._emit('textDone', currentContent.text, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); + break; + } + } + } + if (__classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")) { + this._emit('messageDone', event.data); + } + __classPrivateFieldSet(this, _AssistantStream_messageSnapshot, undefined, "f"); + } +}, _AssistantStream_handleRunStep = function _AssistantStream_handleRunStep(event) { + const accumulatedRunStep = __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_accumulateRunStep).call(this, event); + __classPrivateFieldSet(this, _AssistantStream_currentRunStepSnapshot, accumulatedRunStep, "f"); + switch (event.event) { + case 'thread.run.step.created': + this._emit('runStepCreated', event.data); + break; + case 'thread.run.step.delta': + const delta = event.data.delta; + if (delta.step_details && + delta.step_details.type == 'tool_calls' && + delta.step_details.tool_calls && + accumulatedRunStep.step_details.type == 'tool_calls') { + for (const toolCall of delta.step_details.tool_calls) { + if (toolCall.index == __classPrivateFieldGet(this, _AssistantStream_currentToolCallIndex, "f")) { + this._emit('toolCallDelta', toolCall, accumulatedRunStep.step_details.tool_calls[toolCall.index]); + } + else { + if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) { + this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")); + } + __classPrivateFieldSet(this, _AssistantStream_currentToolCallIndex, toolCall.index, "f"); + __classPrivateFieldSet(this, _AssistantStream_currentToolCall, accumulatedRunStep.step_details.tool_calls[toolCall.index], "f"); + if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) + this._emit('toolCallCreated', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")); + } + } + } + this._emit('runStepDelta', event.data.delta, accumulatedRunStep); + break; + case 'thread.run.step.completed': + case 'thread.run.step.failed': + case 'thread.run.step.cancelled': + case 'thread.run.step.expired': + __classPrivateFieldSet(this, _AssistantStream_currentRunStepSnapshot, undefined, "f"); + const details = event.data.step_details; + if (details.type == 'tool_calls') { + if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) { + this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")); + __classPrivateFieldSet(this, _AssistantStream_currentToolCall, undefined, "f"); + } + } + this._emit('runStepDone', event.data, accumulatedRunStep); + break; + case 'thread.run.step.in_progress': + break; + } +}, _AssistantStream_handleEvent = function _AssistantStream_handleEvent(event) { + __classPrivateFieldGet(this, _AssistantStream_events, "f").push(event); + this._emit('event', event); +}, _AssistantStream_accumulateRunStep = function _AssistantStream_accumulateRunStep(event) { + switch (event.event) { + case 'thread.run.step.created': + __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = event.data; + return event.data; + case 'thread.run.step.delta': + let snapshot = __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; + if (!snapshot) { + throw Error('Received a RunStepDelta before creation of a snapshot'); + } + let data = event.data; + if (data.delta) { + const accumulated = AssistantStream.accumulateDelta(snapshot, data.delta); + __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = accumulated; + } + return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; + case 'thread.run.step.completed': + case 'thread.run.step.failed': + case 'thread.run.step.cancelled': + case 'thread.run.step.expired': + case 'thread.run.step.in_progress': + __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = event.data; + break; + } + if (__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]) + return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; + throw new Error('No snapshot available'); +}, _AssistantStream_accumulateMessage = function _AssistantStream_accumulateMessage(event, snapshot) { + let newContent = []; + switch (event.event) { + case 'thread.message.created': + //On creation the snapshot is just the initial message + return [event.data, newContent]; + case 'thread.message.delta': + if (!snapshot) { + throw Error('Received a delta with no existing snapshot (there should be one from message creation)'); + } + let data = event.data; + //If this delta does not have content, nothing to process + if (data.delta.content) { + for (const contentElement of data.delta.content) { + if (contentElement.index in snapshot.content) { + let currentContent = snapshot.content[contentElement.index]; + snapshot.content[contentElement.index] = __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_accumulateContent).call(this, contentElement, currentContent); + } + else { + snapshot.content[contentElement.index] = contentElement; + //This is a new element + newContent.push(contentElement); + } + } + } + return [snapshot, newContent]; + case 'thread.message.in_progress': + case 'thread.message.completed': + case 'thread.message.incomplete': + //No changes on other thread events + if (snapshot) { + return [snapshot, newContent]; + } + else { + throw Error('Received thread message event with no existing snapshot'); + } + } + throw Error('Tried to accumulate a non-message event'); +}, _AssistantStream_accumulateContent = function _AssistantStream_accumulateContent(contentElement, currentContent) { + return AssistantStream.accumulateDelta(currentContent, contentElement); +}, _AssistantStream_handleRun = function _AssistantStream_handleRun(event) { + __classPrivateFieldSet(this, _AssistantStream_currentRunSnapshot, event.data, "f"); + switch (event.event) { + case 'thread.run.created': + break; + case 'thread.run.queued': + break; + case 'thread.run.in_progress': + break; + case 'thread.run.requires_action': + case 'thread.run.cancelled': + case 'thread.run.failed': + case 'thread.run.completed': + case 'thread.run.expired': + __classPrivateFieldSet(this, _AssistantStream_finalRun, event.data, "f"); + if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) { + this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")); + __classPrivateFieldSet(this, _AssistantStream_currentToolCall, undefined, "f"); + } + break; + case 'thread.run.cancelling': + break; + } +}; +//# sourceMappingURL=AssistantStream.js.map + +/***/ }), + +/***/ 5575: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ChatCompletionRunner = void 0; +const AbstractChatCompletionRunner_1 = __nccwpck_require__(8398); +const chatCompletionUtils_1 = __nccwpck_require__(7858); +class ChatCompletionRunner extends AbstractChatCompletionRunner_1.AbstractChatCompletionRunner { + /** @deprecated - please use `runTools` instead. */ + static runFunctions(completions, params, options) { + const runner = new ChatCompletionRunner(); + const opts = { + ...options, + headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runFunctions' }, + }; + runner._run(() => runner._runFunctions(completions, params, opts)); + return runner; + } + static runTools(completions, params, options) { + const runner = new ChatCompletionRunner(); + const opts = { + ...options, + headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runTools' }, + }; + runner._run(() => runner._runTools(completions, params, opts)); + return runner; + } + _addMessage(message) { + super._addMessage(message); + if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message.content) { + this._emit('content', message.content); + } + } +} +exports.ChatCompletionRunner = ChatCompletionRunner; +//# sourceMappingURL=ChatCompletionRunner.js.map + +/***/ }), + +/***/ 7823: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); + return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); +}; +var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { + if (kind === "m") throw new TypeError("Private method is not writable"); + if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); + if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); + return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; +}; +var _ChatCompletionStream_instances, _ChatCompletionStream_currentChatCompletionSnapshot, _ChatCompletionStream_beginRequest, _ChatCompletionStream_addChunk, _ChatCompletionStream_endRequest, _ChatCompletionStream_accumulateChatCompletion; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ChatCompletionStream = void 0; +const error_1 = __nccwpck_require__(8905); +const AbstractChatCompletionRunner_1 = __nccwpck_require__(8398); +const streaming_1 = __nccwpck_require__(884); +class ChatCompletionStream extends AbstractChatCompletionRunner_1.AbstractChatCompletionRunner { + constructor() { + super(...arguments); + _ChatCompletionStream_instances.add(this); + _ChatCompletionStream_currentChatCompletionSnapshot.set(this, void 0); + } + get currentChatCompletionSnapshot() { + return __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); + } + /** + * Intended for use on the frontend, consuming a stream produced with + * `.toReadableStream()` on the backend. + * + * Note that messages sent to the model do not appear in `.on('message')` + * in this context. + */ + static fromReadableStream(stream) { + const runner = new ChatCompletionStream(); + runner._run(() => runner._fromReadableStream(stream)); + return runner; + } + static createChatCompletion(completions, params, options) { + const runner = new ChatCompletionStream(); + runner._run(() => runner._runChatCompletion(completions, { ...params, stream: true }, { ...options, headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' } })); + return runner; + } + async _createChatCompletion(completions, params, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_beginRequest).call(this); + const stream = await completions.create({ ...params, stream: true }, { ...options, signal: this.controller.signal }); + this._connected(); + for await (const chunk of stream) { + __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_addChunk).call(this, chunk); + } + if (stream.controller.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + return this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_endRequest).call(this)); + } + async _fromReadableStream(readableStream, options) { + const signal = options?.signal; + if (signal) { + if (signal.aborted) + this.controller.abort(); + signal.addEventListener('abort', () => this.controller.abort()); + } + __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_beginRequest).call(this); + this._connected(); + const stream = streaming_1.Stream.fromReadableStream(readableStream, this.controller); + let chatId; + for await (const chunk of stream) { + if (chatId && chatId !== chunk.id) { + // A new request has been made. + this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_endRequest).call(this)); + } + __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_addChunk).call(this, chunk); + chatId = chunk.id; + } + if (stream.controller.signal?.aborted) { + throw new error_1.APIUserAbortError(); + } + return this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_endRequest).call(this)); + } + [(_ChatCompletionStream_currentChatCompletionSnapshot = new WeakMap(), _ChatCompletionStream_instances = new WeakSet(), _ChatCompletionStream_beginRequest = function _ChatCompletionStream_beginRequest() { + if (this.ended) + return; + __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, "f"); + }, _ChatCompletionStream_addChunk = function _ChatCompletionStream_addChunk(chunk) { + if (this.ended) + return; + const completion = __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_accumulateChatCompletion).call(this, chunk); + this._emit('chunk', chunk, completion); + const delta = chunk.choices[0]?.delta?.content; + const snapshot = completion.choices[0]?.message; + if (delta != null && snapshot?.role === 'assistant' && snapshot?.content) { + this._emit('content', delta, snapshot.content); + } + }, _ChatCompletionStream_endRequest = function _ChatCompletionStream_endRequest() { + if (this.ended) { + throw new error_1.OpenAIError(`stream has ended, this shouldn't happen`); + } + const snapshot = __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); + if (!snapshot) { + throw new error_1.OpenAIError(`request ended without sending any chunks`); + } + __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, "f"); + return finalizeChatCompletion(snapshot); + }, _ChatCompletionStream_accumulateChatCompletion = function _ChatCompletionStream_accumulateChatCompletion(chunk) { + var _a, _b, _c; + let snapshot = __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); + const { choices, ...rest } = chunk; + if (!snapshot) { + snapshot = __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, { + ...rest, + choices: [], + }, "f"); + } + else { + Object.assign(snapshot, rest); + } + for (const { delta, finish_reason, index, logprobs = null, ...other } of chunk.choices) { + let choice = snapshot.choices[index]; + if (!choice) { + choice = snapshot.choices[index] = { finish_reason, index, message: {}, logprobs, ...other }; + } + if (logprobs) { + if (!choice.logprobs) { + choice.logprobs = Object.assign({}, logprobs); + } + else { + const { content, ...rest } = logprobs; + Object.assign(choice.logprobs, rest); + if (content) { + (_a = choice.logprobs).content ?? (_a.content = []); + choice.logprobs.content.push(...content); + } + } + } + if (finish_reason) + choice.finish_reason = finish_reason; + Object.assign(choice, other); + if (!delta) + continue; // Shouldn't happen; just in case. + const { content, function_call, role, tool_calls, ...rest } = delta; + Object.assign(choice.message, rest); + if (content) + choice.message.content = (choice.message.content || '') + content; + if (role) + choice.message.role = role; + if (function_call) { + if (!choice.message.function_call) { + choice.message.function_call = function_call; + } + else { + if (function_call.name) + choice.message.function_call.name = function_call.name; + if (function_call.arguments) { + (_b = choice.message.function_call).arguments ?? (_b.arguments = ''); + choice.message.function_call.arguments += function_call.arguments; + } + } + } + if (tool_calls) { + if (!choice.message.tool_calls) + choice.message.tool_calls = []; + for (const { index, id, type, function: fn, ...rest } of tool_calls) { + const tool_call = ((_c = choice.message.tool_calls)[index] ?? (_c[index] = {})); + Object.assign(tool_call, rest); + if (id) + tool_call.id = id; + if (type) + tool_call.type = type; + if (fn) + tool_call.function ?? (tool_call.function = { arguments: '' }); + if (fn?.name) + tool_call.function.name = fn.name; + if (fn?.arguments) + tool_call.function.arguments += fn.arguments; + } + } + } + return snapshot; + }, Symbol.asyncIterator)]() { + const pushQueue = []; + const readQueue = []; + let done = false; + this.on('chunk', (chunk) => { + const reader = readQueue.shift(); + if (reader) { + reader.resolve(chunk); + } + else { + pushQueue.push(chunk); + } + }); + this.on('end', () => { + done = true; + for (const reader of readQueue) { + reader.resolve(undefined); + } + readQueue.length = 0; + }); + this.on('abort', (err) => { + done = true; + for (const reader of readQueue) { + reader.reject(err); + } + readQueue.length = 0; + }); + this.on('error', (err) => { + done = true; + for (const reader of readQueue) { + reader.reject(err); + } + readQueue.length = 0; + }); + return { + next: async () => { + if (!pushQueue.length) { + if (done) { + return { value: undefined, done: true }; + } + return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true })); + } + const chunk = pushQueue.shift(); + return { value: chunk, done: false }; + }, + return: async () => { + this.abort(); + return { value: undefined, done: true }; + }, + }; + } + toReadableStream() { + const stream = new streaming_1.Stream(this[Symbol.asyncIterator].bind(this), this.controller); + return stream.toReadableStream(); + } +} +exports.ChatCompletionStream = ChatCompletionStream; +function finalizeChatCompletion(snapshot) { + const { id, choices, created, model, system_fingerprint, ...rest } = snapshot; + return { + ...rest, + id, + choices: choices.map(({ message, finish_reason, index, logprobs, ...choiceRest }) => { + if (!finish_reason) + throw new error_1.OpenAIError(`missing finish_reason for choice ${index}`); + const { content = null, function_call, tool_calls, ...messageRest } = message; + const role = message.role; // this is what we expect; in theory it could be different which would make our types a slight lie but would be fine. + if (!role) + throw new error_1.OpenAIError(`missing role for choice ${index}`); + if (function_call) { + const { arguments: args, name } = function_call; + if (args == null) + throw new error_1.OpenAIError(`missing function_call.arguments for choice ${index}`); + if (!name) + throw new error_1.OpenAIError(`missing function_call.name for choice ${index}`); + return { + ...choiceRest, + message: { content, function_call: { arguments: args, name }, role }, + finish_reason, + index, + logprobs, + }; + } + if (tool_calls) { + return { + ...choiceRest, + index, + finish_reason, + logprobs, + message: { + ...messageRest, + role, + content, + tool_calls: tool_calls.map((tool_call, i) => { + const { function: fn, type, id, ...toolRest } = tool_call; + const { arguments: args, name, ...fnRest } = fn || {}; + if (id == null) + throw new error_1.OpenAIError(`missing choices[${index}].tool_calls[${i}].id\n${str(snapshot)}`); + if (type == null) + throw new error_1.OpenAIError(`missing choices[${index}].tool_calls[${i}].type\n${str(snapshot)}`); + if (name == null) + throw new error_1.OpenAIError(`missing choices[${index}].tool_calls[${i}].function.name\n${str(snapshot)}`); + if (args == null) + throw new error_1.OpenAIError(`missing choices[${index}].tool_calls[${i}].function.arguments\n${str(snapshot)}`); + return { ...toolRest, id, type, function: { ...fnRest, name, arguments: args } }; + }), + }, + }; + } + return { + ...choiceRest, + message: { ...messageRest, content, role }, + finish_reason, + index, + logprobs, + }; + }), + created, + model, + object: 'chat.completion', + ...(system_fingerprint ? { system_fingerprint } : {}), + }; +} +function str(x) { + return JSON.stringify(x); +} +//# sourceMappingURL=ChatCompletionStream.js.map + +/***/ }), + +/***/ 794: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ChatCompletionStreamingRunner = void 0; +const ChatCompletionStream_1 = __nccwpck_require__(7823); +class ChatCompletionStreamingRunner extends ChatCompletionStream_1.ChatCompletionStream { + static fromReadableStream(stream) { + const runner = new ChatCompletionStreamingRunner(); + runner._run(() => runner._fromReadableStream(stream)); + return runner; + } + /** @deprecated - please use `runTools` instead. */ + static runFunctions(completions, params, options) { + const runner = new ChatCompletionStreamingRunner(); + const opts = { + ...options, + headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runFunctions' }, + }; + runner._run(() => runner._runFunctions(completions, params, opts)); + return runner; + } + static runTools(completions, params, options) { + const runner = new ChatCompletionStreamingRunner(); + const opts = { + ...options, + headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runTools' }, + }; + runner._run(() => runner._runTools(completions, params, opts)); + return runner; + } +} +exports.ChatCompletionStreamingRunner = ChatCompletionStreamingRunner; +//# sourceMappingURL=ChatCompletionStreamingRunner.js.map + +/***/ }), + +/***/ 5464: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ParsingToolFunction = exports.ParsingFunction = exports.isRunnableFunctionWithParse = void 0; +function isRunnableFunctionWithParse(fn) { + return typeof fn.parse === 'function'; +} +exports.isRunnableFunctionWithParse = isRunnableFunctionWithParse; +/** + * This is helper class for passing a `function` and `parse` where the `function` + * argument type matches the `parse` return type. + * + * @deprecated - please use ParsingToolFunction instead. + */ +class ParsingFunction { + constructor(input) { + this.function = input.function; + this.parse = input.parse; + this.parameters = input.parameters; + this.description = input.description; + this.name = input.name; + } +} +exports.ParsingFunction = ParsingFunction; +/** + * This is helper class for passing a `function` and `parse` where the `function` + * argument type matches the `parse` return type. + */ +class ParsingToolFunction { + constructor(input) { + this.type = 'function'; + this.function = input; + } +} +exports.ParsingToolFunction = ParsingToolFunction; +//# sourceMappingURL=RunnableFunction.js.map + +/***/ }), + +/***/ 2626: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.allSettledWithThrow = void 0; +/** + * Like `Promise.allSettled()` but throws an error if any promises are rejected. + */ +const allSettledWithThrow = async (promises) => { + const results = await Promise.allSettled(promises); + const rejected = results.filter((result) => result.status === 'rejected'); + if (rejected.length) { + for (const result of rejected) { + console.error(result.reason); + } + throw new Error(`${rejected.length} promise(s) failed - see the above errors`); + } + // Note: TS was complaining about using `.filter().map()` here for some reason + const values = []; + for (const result of results) { + if (result.status === 'fulfilled') { + values.push(result.value); + } + } + return values; +}; +exports.allSettledWithThrow = allSettledWithThrow; +//# sourceMappingURL=Util.js.map + +/***/ }), + +/***/ 7858: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isPresent = exports.isToolMessage = exports.isFunctionMessage = exports.isAssistantMessage = void 0; +const isAssistantMessage = (message) => { + return message?.role === 'assistant'; +}; +exports.isAssistantMessage = isAssistantMessage; +const isFunctionMessage = (message) => { + return message?.role === 'function'; +}; +exports.isFunctionMessage = isFunctionMessage; +const isToolMessage = (message) => { + return message?.role === 'tool'; +}; +exports.isToolMessage = isToolMessage; +function isPresent(obj) { + return obj != null; +} +exports.isPresent = isPresent; +//# sourceMappingURL=chatCompletionUtils.js.map + +/***/ }), + +/***/ 7401: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CursorPage = exports.Page = void 0; +const core_1 = __nccwpck_require__(1798); +/** + * Note: no pagination actually occurs yet, this is for forwards-compatibility. + */ +class Page extends core_1.AbstractPage { + constructor(client, response, body, options) { + super(client, response, body, options); + this.data = body.data || []; + this.object = body.object; + } + getPaginatedItems() { + return this.data ?? []; + } + // @deprecated Please use `nextPageInfo()` instead + /** + * This page represents a response that isn't actually paginated at the API level + * so there will never be any next page params. + */ + nextPageParams() { + return null; + } + nextPageInfo() { + return null; + } +} +exports.Page = Page; +class CursorPage extends core_1.AbstractPage { + constructor(client, response, body, options) { + super(client, response, body, options); + this.data = body.data || []; + } + getPaginatedItems() { + return this.data ?? []; + } + // @deprecated Please use `nextPageInfo()` instead + nextPageParams() { + const info = this.nextPageInfo(); + if (!info) + return null; + if ('params' in info) + return info.params; + const params = Object.fromEntries(info.url.searchParams); + if (!Object.keys(params).length) + return null; + return params; + } + nextPageInfo() { + const data = this.getPaginatedItems(); + if (!data.length) { + return null; + } + const id = data[data.length - 1]?.id; + if (!id) { + return null; + } + return { params: { after: id } }; + } +} +exports.CursorPage = CursorPage; +//# sourceMappingURL=pagination.js.map + +/***/ }), + +/***/ 9593: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.APIResource = void 0; +class APIResource { + constructor(client) { + this._client = client; + } +} +exports.APIResource = APIResource; +//# sourceMappingURL=resource.js.map + +/***/ }), + +/***/ 6376: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Audio = void 0; +const resource_1 = __nccwpck_require__(9593); +const SpeechAPI = __importStar(__nccwpck_require__(4117)); +const TranscriptionsAPI = __importStar(__nccwpck_require__(5622)); +const TranslationsAPI = __importStar(__nccwpck_require__(7735)); +class Audio extends resource_1.APIResource { + constructor() { + super(...arguments); + this.transcriptions = new TranscriptionsAPI.Transcriptions(this._client); + this.translations = new TranslationsAPI.Translations(this._client); + this.speech = new SpeechAPI.Speech(this._client); + } +} +exports.Audio = Audio; +(function (Audio) { + Audio.Transcriptions = TranscriptionsAPI.Transcriptions; + Audio.Translations = TranslationsAPI.Translations; + Audio.Speech = SpeechAPI.Speech; +})(Audio = exports.Audio || (exports.Audio = {})); +//# sourceMappingURL=audio.js.map + +/***/ }), + +/***/ 4117: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Speech = void 0; +const resource_1 = __nccwpck_require__(9593); +class Speech extends resource_1.APIResource { + /** + * Generates audio from the input text. + */ + create(body, options) { + return this._client.post('/audio/speech', { body, ...options, __binaryResponse: true }); + } +} +exports.Speech = Speech; +(function (Speech) { +})(Speech = exports.Speech || (exports.Speech = {})); +//# sourceMappingURL=speech.js.map + +/***/ }), + +/***/ 5622: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Transcriptions = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +class Transcriptions extends resource_1.APIResource { + /** + * Transcribes audio into the input language. + */ + create(body, options) { + return this._client.post('/audio/transcriptions', (0, core_1.multipartFormRequestOptions)({ body, ...options })); + } +} +exports.Transcriptions = Transcriptions; +(function (Transcriptions) { +})(Transcriptions = exports.Transcriptions || (exports.Transcriptions = {})); +//# sourceMappingURL=transcriptions.js.map + +/***/ }), + +/***/ 7735: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Translations = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +class Translations extends resource_1.APIResource { + /** + * Translates audio into English. + */ + create(body, options) { + return this._client.post('/audio/translations', (0, core_1.multipartFormRequestOptions)({ body, ...options })); + } +} +exports.Translations = Translations; +(function (Translations) { +})(Translations = exports.Translations || (exports.Translations = {})); +//# sourceMappingURL=translations.js.map + +/***/ }), + +/***/ 341: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.BatchesPage = exports.Batches = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const BatchesAPI = __importStar(__nccwpck_require__(341)); +const pagination_1 = __nccwpck_require__(7401); +class Batches extends resource_1.APIResource { + /** + * Creates and executes a batch from an uploaded file of requests + */ + create(body, options) { + return this._client.post('/batches', { body, ...options }); + } + /** + * Retrieves a batch. + */ + retrieve(batchId, options) { + return this._client.get(`/batches/${batchId}`, options); + } + list(query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list({}, query); + } + return this._client.getAPIList('/batches', BatchesPage, { query, ...options }); + } + /** + * Cancels an in-progress batch. + */ + cancel(batchId, options) { + return this._client.post(`/batches/${batchId}/cancel`, options); + } +} +exports.Batches = Batches; +class BatchesPage extends pagination_1.CursorPage { +} +exports.BatchesPage = BatchesPage; +(function (Batches) { + Batches.BatchesPage = BatchesAPI.BatchesPage; +})(Batches = exports.Batches || (exports.Batches = {})); +//# sourceMappingURL=batches.js.map + +/***/ }), + +/***/ 616: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AssistantsPage = exports.Assistants = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const AssistantsAPI = __importStar(__nccwpck_require__(616)); +const pagination_1 = __nccwpck_require__(7401); +class Assistants extends resource_1.APIResource { + /** + * Create an assistant with a model and instructions. + */ + create(body, options) { + return this._client.post('/assistants', { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Retrieves an assistant. + */ + retrieve(assistantId, options) { + return this._client.get(`/assistants/${assistantId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Modifies an assistant. + */ + update(assistantId, body, options) { + return this._client.post(`/assistants/${assistantId}`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + list(query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list({}, query); + } + return this._client.getAPIList('/assistants', AssistantsPage, { + query, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Delete an assistant. + */ + del(assistantId, options) { + return this._client.delete(`/assistants/${assistantId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } +} +exports.Assistants = Assistants; +class AssistantsPage extends pagination_1.CursorPage { +} +exports.AssistantsPage = AssistantsPage; +(function (Assistants) { + Assistants.AssistantsPage = AssistantsAPI.AssistantsPage; +})(Assistants = exports.Assistants || (exports.Assistants = {})); +//# sourceMappingURL=assistants.js.map + +/***/ }), + +/***/ 853: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Beta = void 0; +const resource_1 = __nccwpck_require__(9593); +const AssistantsAPI = __importStar(__nccwpck_require__(616)); +const ChatAPI = __importStar(__nccwpck_require__(8691)); +const ThreadsAPI = __importStar(__nccwpck_require__(1931)); +const VectorStoresAPI = __importStar(__nccwpck_require__(5822)); +class Beta extends resource_1.APIResource { + constructor() { + super(...arguments); + this.vectorStores = new VectorStoresAPI.VectorStores(this._client); + this.chat = new ChatAPI.Chat(this._client); + this.assistants = new AssistantsAPI.Assistants(this._client); + this.threads = new ThreadsAPI.Threads(this._client); + } +} +exports.Beta = Beta; +(function (Beta) { + Beta.VectorStores = VectorStoresAPI.VectorStores; + Beta.VectorStoresPage = VectorStoresAPI.VectorStoresPage; + Beta.Chat = ChatAPI.Chat; + Beta.Assistants = AssistantsAPI.Assistants; + Beta.AssistantsPage = AssistantsAPI.AssistantsPage; + Beta.Threads = ThreadsAPI.Threads; +})(Beta = exports.Beta || (exports.Beta = {})); +//# sourceMappingURL=beta.js.map + +/***/ }), + +/***/ 8691: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Chat = void 0; +const resource_1 = __nccwpck_require__(9593); +const CompletionsAPI = __importStar(__nccwpck_require__(559)); +class Chat extends resource_1.APIResource { + constructor() { + super(...arguments); + this.completions = new CompletionsAPI.Completions(this._client); + } +} +exports.Chat = Chat; +(function (Chat) { + Chat.Completions = CompletionsAPI.Completions; +})(Chat = exports.Chat || (exports.Chat = {})); +//# sourceMappingURL=chat.js.map + +/***/ }), + +/***/ 559: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Completions = exports.ChatCompletionStream = exports.ParsingToolFunction = exports.ParsingFunction = exports.ChatCompletionStreamingRunner = exports.ChatCompletionRunner = void 0; +const resource_1 = __nccwpck_require__(9593); +const ChatCompletionRunner_1 = __nccwpck_require__(5575); +var ChatCompletionRunner_2 = __nccwpck_require__(5575); +Object.defineProperty(exports, "ChatCompletionRunner", ({ enumerable: true, get: function () { return ChatCompletionRunner_2.ChatCompletionRunner; } })); +const ChatCompletionStreamingRunner_1 = __nccwpck_require__(794); +var ChatCompletionStreamingRunner_2 = __nccwpck_require__(794); +Object.defineProperty(exports, "ChatCompletionStreamingRunner", ({ enumerable: true, get: function () { return ChatCompletionStreamingRunner_2.ChatCompletionStreamingRunner; } })); +var RunnableFunction_1 = __nccwpck_require__(5464); +Object.defineProperty(exports, "ParsingFunction", ({ enumerable: true, get: function () { return RunnableFunction_1.ParsingFunction; } })); +Object.defineProperty(exports, "ParsingToolFunction", ({ enumerable: true, get: function () { return RunnableFunction_1.ParsingToolFunction; } })); +const ChatCompletionStream_1 = __nccwpck_require__(7823); +var ChatCompletionStream_2 = __nccwpck_require__(7823); +Object.defineProperty(exports, "ChatCompletionStream", ({ enumerable: true, get: function () { return ChatCompletionStream_2.ChatCompletionStream; } })); +class Completions extends resource_1.APIResource { + runFunctions(body, options) { + if (body.stream) { + return ChatCompletionStreamingRunner_1.ChatCompletionStreamingRunner.runFunctions(this._client.chat.completions, body, options); + } + return ChatCompletionRunner_1.ChatCompletionRunner.runFunctions(this._client.chat.completions, body, options); + } + runTools(body, options) { + if (body.stream) { + return ChatCompletionStreamingRunner_1.ChatCompletionStreamingRunner.runTools(this._client.chat.completions, body, options); + } + return ChatCompletionRunner_1.ChatCompletionRunner.runTools(this._client.chat.completions, body, options); + } + /** + * Creates a chat completion stream + */ + stream(body, options) { + return ChatCompletionStream_1.ChatCompletionStream.createChatCompletion(this._client.chat.completions, body, options); + } +} +exports.Completions = Completions; +//# sourceMappingURL=completions.js.map + +/***/ }), + +/***/ 1787: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.MessagesPage = exports.Messages = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const MessagesAPI = __importStar(__nccwpck_require__(1787)); +const pagination_1 = __nccwpck_require__(7401); +class Messages extends resource_1.APIResource { + /** + * Create a message. + */ + create(threadId, body, options) { + return this._client.post(`/threads/${threadId}/messages`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Retrieve a message. + */ + retrieve(threadId, messageId, options) { + return this._client.get(`/threads/${threadId}/messages/${messageId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Modifies a message. + */ + update(threadId, messageId, body, options) { + return this._client.post(`/threads/${threadId}/messages/${messageId}`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + list(threadId, query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list(threadId, {}, query); + } + return this._client.getAPIList(`/threads/${threadId}/messages`, MessagesPage, { + query, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } +} +exports.Messages = Messages; +class MessagesPage extends pagination_1.CursorPage { +} +exports.MessagesPage = MessagesPage; +(function (Messages) { + Messages.MessagesPage = MessagesAPI.MessagesPage; +})(Messages = exports.Messages || (exports.Messages = {})); +//# sourceMappingURL=messages.js.map + +/***/ }), + +/***/ 3187: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RunsPage = exports.Runs = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const AssistantStream_1 = __nccwpck_require__(7514); +const core_2 = __nccwpck_require__(1798); +const RunsAPI = __importStar(__nccwpck_require__(3187)); +const StepsAPI = __importStar(__nccwpck_require__(2630)); +const pagination_1 = __nccwpck_require__(7401); +class Runs extends resource_1.APIResource { + constructor() { + super(...arguments); + this.steps = new StepsAPI.Steps(this._client); + } + create(threadId, body, options) { + return this._client.post(`/threads/${threadId}/runs`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + stream: body.stream ?? false, + }); + } + /** + * Retrieves a run. + */ + retrieve(threadId, runId, options) { + return this._client.get(`/threads/${threadId}/runs/${runId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Modifies a run. + */ + update(threadId, runId, body, options) { + return this._client.post(`/threads/${threadId}/runs/${runId}`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + list(threadId, query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list(threadId, {}, query); + } + return this._client.getAPIList(`/threads/${threadId}/runs`, RunsPage, { + query, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Cancels a run that is `in_progress`. + */ + cancel(threadId, runId, options) { + return this._client.post(`/threads/${threadId}/runs/${runId}/cancel`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * A helper to create a run an poll for a terminal state. More information on Run + * lifecycles can be found here: + * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps + */ + async createAndPoll(threadId, body, options) { + const run = await this.create(threadId, body, options); + return await this.poll(threadId, run.id, options); + } + /** + * Create a Run stream + * + * @deprecated use `stream` instead + */ + createAndStream(threadId, body, options) { + return AssistantStream_1.AssistantStream.createAssistantStream(threadId, this._client.beta.threads.runs, body, options); + } + /** + * A helper to poll a run status until it reaches a terminal state. More + * information on Run lifecycles can be found here: + * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps + */ + async poll(threadId, runId, options) { + const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' }; + if (options?.pollIntervalMs) { + headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString(); + } + while (true) { + const { data: run, response } = await this.retrieve(threadId, runId, { + ...options, + headers: { ...options?.headers, ...headers }, + }).withResponse(); + switch (run.status) { + //If we are in any sort of intermediate state we poll + case 'queued': + case 'in_progress': + case 'cancelling': + let sleepInterval = 5000; + if (options?.pollIntervalMs) { + sleepInterval = options.pollIntervalMs; + } + else { + const headerInterval = response.headers.get('openai-poll-after-ms'); + if (headerInterval) { + const headerIntervalMs = parseInt(headerInterval); + if (!isNaN(headerIntervalMs)) { + sleepInterval = headerIntervalMs; + } + } + } + await (0, core_2.sleep)(sleepInterval); + break; + //We return the run in any terminal state. + case 'requires_action': + case 'cancelled': + case 'completed': + case 'failed': + case 'expired': + return run; + } + } + } + /** + * Create a Run stream + */ + stream(threadId, body, options) { + return AssistantStream_1.AssistantStream.createAssistantStream(threadId, this._client.beta.threads.runs, body, options); + } + submitToolOutputs(threadId, runId, body, options) { + return this._client.post(`/threads/${threadId}/runs/${runId}/submit_tool_outputs`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + stream: body.stream ?? false, + }); + } + /** + * A helper to submit a tool output to a run and poll for a terminal run state. + * More information on Run lifecycles can be found here: + * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps + */ + async submitToolOutputsAndPoll(threadId, runId, body, options) { + const run = await this.submitToolOutputs(threadId, runId, body, options); + return await this.poll(threadId, run.id, options); + } + /** + * Submit the tool outputs from a previous run and stream the run to a terminal + * state. More information on Run lifecycles can be found here: + * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps + */ + submitToolOutputsStream(threadId, runId, body, options) { + return AssistantStream_1.AssistantStream.createToolAssistantStream(threadId, runId, this._client.beta.threads.runs, body, options); + } +} +exports.Runs = Runs; +class RunsPage extends pagination_1.CursorPage { +} +exports.RunsPage = RunsPage; +(function (Runs) { + Runs.RunsPage = RunsAPI.RunsPage; + Runs.Steps = StepsAPI.Steps; + Runs.RunStepsPage = StepsAPI.RunStepsPage; +})(Runs = exports.Runs || (exports.Runs = {})); +//# sourceMappingURL=runs.js.map + +/***/ }), + +/***/ 2630: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RunStepsPage = exports.Steps = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const StepsAPI = __importStar(__nccwpck_require__(2630)); +const pagination_1 = __nccwpck_require__(7401); +class Steps extends resource_1.APIResource { + /** + * Retrieves a run step. + */ + retrieve(threadId, runId, stepId, options) { + return this._client.get(`/threads/${threadId}/runs/${runId}/steps/${stepId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + list(threadId, runId, query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list(threadId, runId, {}, query); + } + return this._client.getAPIList(`/threads/${threadId}/runs/${runId}/steps`, RunStepsPage, { + query, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } +} +exports.Steps = Steps; +class RunStepsPage extends pagination_1.CursorPage { +} +exports.RunStepsPage = RunStepsPage; +(function (Steps) { + Steps.RunStepsPage = StepsAPI.RunStepsPage; +})(Steps = exports.Steps || (exports.Steps = {})); +//# sourceMappingURL=steps.js.map + +/***/ }), + +/***/ 1931: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Threads = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const AssistantStream_1 = __nccwpck_require__(7514); +const MessagesAPI = __importStar(__nccwpck_require__(1787)); +const RunsAPI = __importStar(__nccwpck_require__(3187)); +class Threads extends resource_1.APIResource { + constructor() { + super(...arguments); + this.runs = new RunsAPI.Runs(this._client); + this.messages = new MessagesAPI.Messages(this._client); + } + create(body = {}, options) { + if ((0, core_1.isRequestOptions)(body)) { + return this.create({}, body); + } + return this._client.post('/threads', { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Retrieves a thread. + */ + retrieve(threadId, options) { + return this._client.get(`/threads/${threadId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Modifies a thread. + */ + update(threadId, body, options) { + return this._client.post(`/threads/${threadId}`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Delete a thread. + */ + del(threadId, options) { + return this._client.delete(`/threads/${threadId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + createAndRun(body, options) { + return this._client.post('/threads/runs', { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + stream: body.stream ?? false, + }); + } + /** + * A helper to create a thread, start a run and then poll for a terminal state. + * More information on Run lifecycles can be found here: + * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps + */ + async createAndRunPoll(body, options) { + const run = await this.createAndRun(body, options); + return await this.runs.poll(run.thread_id, run.id, options); + } + /** + * Create a thread and stream the run back + */ + createAndRunStream(body, options) { + return AssistantStream_1.AssistantStream.createThreadAssistantStream(body, this._client.beta.threads, options); + } +} +exports.Threads = Threads; +(function (Threads) { + Threads.Runs = RunsAPI.Runs; + Threads.RunsPage = RunsAPI.RunsPage; + Threads.Messages = MessagesAPI.Messages; + Threads.MessagesPage = MessagesAPI.MessagesPage; +})(Threads = exports.Threads || (exports.Threads = {})); +//# sourceMappingURL=threads.js.map + +/***/ }), + +/***/ 3922: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VectorStoreFilesPage = exports.FileBatches = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const core_2 = __nccwpck_require__(1798); +const Util_1 = __nccwpck_require__(2626); +const files_1 = __nccwpck_require__(9180); +Object.defineProperty(exports, "VectorStoreFilesPage", ({ enumerable: true, get: function () { return files_1.VectorStoreFilesPage; } })); +class FileBatches extends resource_1.APIResource { + /** + * Create a vector store file batch. + */ + create(vectorStoreId, body, options) { + return this._client.post(`/vector_stores/${vectorStoreId}/file_batches`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Retrieves a vector store file batch. + */ + retrieve(vectorStoreId, batchId, options) { + return this._client.get(`/vector_stores/${vectorStoreId}/file_batches/${batchId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Cancel a vector store file batch. This attempts to cancel the processing of + * files in this batch as soon as possible. + */ + cancel(vectorStoreId, batchId, options) { + return this._client.post(`/vector_stores/${vectorStoreId}/file_batches/${batchId}/cancel`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Create a vector store batch and poll until all files have been processed. + */ + async createAndPoll(vectorStoreId, body, options) { + const batch = await this.create(vectorStoreId, body); + return await this.poll(vectorStoreId, batch.id, options); + } + listFiles(vectorStoreId, batchId, query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.listFiles(vectorStoreId, batchId, {}, query); + } + return this._client.getAPIList(`/vector_stores/${vectorStoreId}/file_batches/${batchId}/files`, files_1.VectorStoreFilesPage, { query, ...options, headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers } }); + } + /** + * Wait for the given file batch to be processed. + * + * Note: this will return even if one of the files failed to process, you need to + * check batch.file_counts.failed_count to handle this case. + */ + async poll(vectorStoreId, batchId, options) { + const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' }; + if (options?.pollIntervalMs) { + headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString(); + } + while (true) { + const { data: batch, response } = await this.retrieve(vectorStoreId, batchId, { + ...options, + headers, + }).withResponse(); + switch (batch.status) { + case 'in_progress': + let sleepInterval = 5000; + if (options?.pollIntervalMs) { + sleepInterval = options.pollIntervalMs; + } + else { + const headerInterval = response.headers.get('openai-poll-after-ms'); + if (headerInterval) { + const headerIntervalMs = parseInt(headerInterval); + if (!isNaN(headerIntervalMs)) { + sleepInterval = headerIntervalMs; + } + } + } + await (0, core_2.sleep)(sleepInterval); + break; + case 'failed': + case 'completed': + return batch; + } + } + } + /** + * Uploads the given files concurrently and then creates a vector store file batch. + * + * The concurrency limit is configurable using the `maxConcurrency` parameter. + */ + async uploadAndPoll(vectorStoreId, { files, fileIds = [] }, options) { + if (files === null || files.length == 0) { + throw new Error('No files provided to process.'); + } + const configuredConcurrency = options?.maxConcurrency ?? 5; + //We cap the number of workers at the number of files (so we don't start any unnecessary workers) + const concurrencyLimit = Math.min(configuredConcurrency, files.length); + const client = this._client; + const fileIterator = files.values(); + const allFileIds = [...fileIds]; + //This code is based on this design. The libraries don't accommodate our environment limits. + // https://stackoverflow.com/questions/40639432/what-is-the-best-way-to-limit-concurrency-when-using-es6s-promise-all + async function processFiles(iterator) { + for (let item of iterator) { + const fileObj = await client.files.create({ file: item, purpose: 'assistants' }, options); + allFileIds.push(fileObj.id); + } + } + //Start workers to process results + const workers = Array(concurrencyLimit).fill(fileIterator).map(processFiles); + //Wait for all processing to complete. + await (0, Util_1.allSettledWithThrow)(workers); + return await this.createAndPoll(vectorStoreId, { + file_ids: allFileIds, + }); + } +} +exports.FileBatches = FileBatches; +(function (FileBatches) { +})(FileBatches = exports.FileBatches || (exports.FileBatches = {})); +//# sourceMappingURL=file-batches.js.map + +/***/ }), + +/***/ 9180: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VectorStoreFilesPage = exports.Files = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const core_2 = __nccwpck_require__(1798); +const FilesAPI = __importStar(__nccwpck_require__(9180)); +const pagination_1 = __nccwpck_require__(7401); +class Files extends resource_1.APIResource { + /** + * Create a vector store file by attaching a + * [File](https://platform.openai.com/docs/api-reference/files) to a + * [vector store](https://platform.openai.com/docs/api-reference/vector-stores/object). + */ + create(vectorStoreId, body, options) { + return this._client.post(`/vector_stores/${vectorStoreId}/files`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Retrieves a vector store file. + */ + retrieve(vectorStoreId, fileId, options) { + return this._client.get(`/vector_stores/${vectorStoreId}/files/${fileId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + list(vectorStoreId, query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list(vectorStoreId, {}, query); + } + return this._client.getAPIList(`/vector_stores/${vectorStoreId}/files`, VectorStoreFilesPage, { + query, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Delete a vector store file. This will remove the file from the vector store but + * the file itself will not be deleted. To delete the file, use the + * [delete file](https://platform.openai.com/docs/api-reference/files/delete) + * endpoint. + */ + del(vectorStoreId, fileId, options) { + return this._client.delete(`/vector_stores/${vectorStoreId}/files/${fileId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Attach a file to the given vector store and wait for it to be processed. + */ + async createAndPoll(vectorStoreId, body, options) { + const file = await this.create(vectorStoreId, body, options); + return await this.poll(vectorStoreId, file.id, options); + } + /** + * Wait for the vector store file to finish processing. + * + * Note: this will return even if the file failed to process, you need to check + * file.last_error and file.status to handle these cases + */ + async poll(vectorStoreId, fileId, options) { + const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' }; + if (options?.pollIntervalMs) { + headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString(); + } + while (true) { + const fileResponse = await this.retrieve(vectorStoreId, fileId, { + ...options, + headers, + }).withResponse(); + const file = fileResponse.data; + switch (file.status) { + case 'in_progress': + let sleepInterval = 5000; + if (options?.pollIntervalMs) { + sleepInterval = options.pollIntervalMs; + } + else { + const headerInterval = fileResponse.response.headers.get('openai-poll-after-ms'); + if (headerInterval) { + const headerIntervalMs = parseInt(headerInterval); + if (!isNaN(headerIntervalMs)) { + sleepInterval = headerIntervalMs; + } + } + } + await (0, core_2.sleep)(sleepInterval); + break; + case 'failed': + case 'completed': + return file; + } + } + } + /** + * Upload a file to the `files` API and then attach it to the given vector store. + * Note the file will be asynchronously processed (you can use the alternative + * polling helper method to wait for processing to complete). + */ + async upload(vectorStoreId, file, options) { + const fileInfo = await this._client.files.create({ file: file, purpose: 'assistants' }, options); + return this.create(vectorStoreId, { file_id: fileInfo.id }, options); + } + /** + * Add a file to a vector store and poll until processing is complete. + */ + async uploadAndPoll(vectorStoreId, file, options) { + const fileInfo = await this._client.files.create({ file: file, purpose: 'assistants' }, options); + return await this.poll(vectorStoreId, fileInfo.id, options); + } +} +exports.Files = Files; +class VectorStoreFilesPage extends pagination_1.CursorPage { +} +exports.VectorStoreFilesPage = VectorStoreFilesPage; +(function (Files) { + Files.VectorStoreFilesPage = FilesAPI.VectorStoreFilesPage; +})(Files = exports.Files || (exports.Files = {})); +//# sourceMappingURL=files.js.map + +/***/ }), + +/***/ 5822: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VectorStoresPage = exports.VectorStores = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const VectorStoresAPI = __importStar(__nccwpck_require__(5822)); +const FileBatchesAPI = __importStar(__nccwpck_require__(3922)); +const FilesAPI = __importStar(__nccwpck_require__(9180)); +const pagination_1 = __nccwpck_require__(7401); +class VectorStores extends resource_1.APIResource { + constructor() { + super(...arguments); + this.files = new FilesAPI.Files(this._client); + this.fileBatches = new FileBatchesAPI.FileBatches(this._client); + } + /** + * Create a vector store. + */ + create(body, options) { + return this._client.post('/vector_stores', { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Retrieves a vector store. + */ + retrieve(vectorStoreId, options) { + return this._client.get(`/vector_stores/${vectorStoreId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Modifies a vector store. + */ + update(vectorStoreId, body, options) { + return this._client.post(`/vector_stores/${vectorStoreId}`, { + body, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + list(query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list({}, query); + } + return this._client.getAPIList('/vector_stores', VectorStoresPage, { + query, + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } + /** + * Delete a vector store. + */ + del(vectorStoreId, options) { + return this._client.delete(`/vector_stores/${vectorStoreId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } +} +exports.VectorStores = VectorStores; +class VectorStoresPage extends pagination_1.CursorPage { +} +exports.VectorStoresPage = VectorStoresPage; +(function (VectorStores) { + VectorStores.VectorStoresPage = VectorStoresAPI.VectorStoresPage; + VectorStores.Files = FilesAPI.Files; + VectorStores.VectorStoreFilesPage = FilesAPI.VectorStoreFilesPage; + VectorStores.FileBatches = FileBatchesAPI.FileBatches; +})(VectorStores = exports.VectorStores || (exports.VectorStores = {})); +//# sourceMappingURL=vector-stores.js.map + +/***/ }), + +/***/ 7670: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Chat = void 0; +const resource_1 = __nccwpck_require__(9593); +const CompletionsAPI = __importStar(__nccwpck_require__(2875)); +class Chat extends resource_1.APIResource { + constructor() { + super(...arguments); + this.completions = new CompletionsAPI.Completions(this._client); + } +} +exports.Chat = Chat; +(function (Chat) { + Chat.Completions = CompletionsAPI.Completions; +})(Chat = exports.Chat || (exports.Chat = {})); +//# sourceMappingURL=chat.js.map + +/***/ }), + +/***/ 2875: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Completions = void 0; +const resource_1 = __nccwpck_require__(9593); +class Completions extends resource_1.APIResource { + create(body, options) { + return this._client.post('/chat/completions', { body, ...options, stream: body.stream ?? false }); + } +} +exports.Completions = Completions; +(function (Completions) { +})(Completions = exports.Completions || (exports.Completions = {})); +//# sourceMappingURL=completions.js.map + +/***/ }), + +/***/ 8240: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Chat = exports.Completions = void 0; +var completions_1 = __nccwpck_require__(2875); +Object.defineProperty(exports, "Completions", ({ enumerable: true, get: function () { return completions_1.Completions; } })); +var chat_1 = __nccwpck_require__(7670); +Object.defineProperty(exports, "Chat", ({ enumerable: true, get: function () { return chat_1.Chat; } })); +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ 9327: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Completions = void 0; +const resource_1 = __nccwpck_require__(9593); +class Completions extends resource_1.APIResource { + create(body, options) { + return this._client.post('/completions', { body, ...options, stream: body.stream ?? false }); + } +} +exports.Completions = Completions; +(function (Completions) { +})(Completions = exports.Completions || (exports.Completions = {})); +//# sourceMappingURL=completions.js.map + +/***/ }), + +/***/ 8064: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Embeddings = void 0; +const resource_1 = __nccwpck_require__(9593); +class Embeddings extends resource_1.APIResource { + /** + * Creates an embedding vector representing the input text. + */ + create(body, options) { + return this._client.post('/embeddings', { body, ...options }); + } +} +exports.Embeddings = Embeddings; +(function (Embeddings) { +})(Embeddings = exports.Embeddings || (exports.Embeddings = {})); +//# sourceMappingURL=embeddings.js.map + +/***/ }), + +/***/ 3873: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FileObjectsPage = exports.Files = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const core_2 = __nccwpck_require__(1798); +const error_1 = __nccwpck_require__(8905); +const FilesAPI = __importStar(__nccwpck_require__(3873)); +const core_3 = __nccwpck_require__(1798); +const pagination_1 = __nccwpck_require__(7401); +class Files extends resource_1.APIResource { + /** + * Upload a file that can be used across various endpoints. The size of all the + * files uploaded by one organization can be up to 100 GB. + * + * The size of individual files can be a maximum of 512 MB or 2 million tokens for + * Assistants. See the + * [Assistants Tools guide](https://platform.openai.com/docs/assistants/tools) to + * learn more about the types of files supported. The Fine-tuning API only supports + * `.jsonl` files. + * + * Please [contact us](https://help.openai.com/) if you need to increase these + * storage limits. + */ + create(body, options) { + return this._client.post('/files', (0, core_3.multipartFormRequestOptions)({ body, ...options })); + } + /** + * Returns information about a specific file. + */ + retrieve(fileId, options) { + return this._client.get(`/files/${fileId}`, options); + } + list(query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list({}, query); + } + return this._client.getAPIList('/files', FileObjectsPage, { query, ...options }); + } + /** + * Delete a file. + */ + del(fileId, options) { + return this._client.delete(`/files/${fileId}`, options); + } + /** + * Returns the contents of the specified file. + */ + content(fileId, options) { + return this._client.get(`/files/${fileId}/content`, { ...options, __binaryResponse: true }); + } + /** + * Returns the contents of the specified file. + * + * @deprecated The `.content()` method should be used instead + */ + retrieveContent(fileId, options) { + return this._client.get(`/files/${fileId}/content`, { + ...options, + headers: { Accept: 'application/json', ...options?.headers }, + }); + } + /** + * Waits for the given file to be processed, default timeout is 30 mins. + */ + async waitForProcessing(id, { pollInterval = 5000, maxWait = 30 * 60 * 1000 } = {}) { + const TERMINAL_STATES = new Set(['processed', 'error', 'deleted']); + const start = Date.now(); + let file = await this.retrieve(id); + while (!file.status || !TERMINAL_STATES.has(file.status)) { + await (0, core_2.sleep)(pollInterval); + file = await this.retrieve(id); + if (Date.now() - start > maxWait) { + throw new error_1.APIConnectionTimeoutError({ + message: `Giving up on waiting for file ${id} to finish processing after ${maxWait} milliseconds.`, + }); + } + } + return file; + } +} +exports.Files = Files; +/** + * Note: no pagination actually occurs yet, this is for forwards-compatibility. + */ +class FileObjectsPage extends pagination_1.Page { +} +exports.FileObjectsPage = FileObjectsPage; +(function (Files) { + Files.FileObjectsPage = FilesAPI.FileObjectsPage; +})(Files = exports.Files || (exports.Files = {})); +//# sourceMappingURL=files.js.map + +/***/ }), + +/***/ 1364: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FineTuning = void 0; +const resource_1 = __nccwpck_require__(9593); +const JobsAPI = __importStar(__nccwpck_require__(816)); +class FineTuning extends resource_1.APIResource { + constructor() { + super(...arguments); + this.jobs = new JobsAPI.Jobs(this._client); + } +} +exports.FineTuning = FineTuning; +(function (FineTuning) { + FineTuning.Jobs = JobsAPI.Jobs; + FineTuning.FineTuningJobsPage = JobsAPI.FineTuningJobsPage; + FineTuning.FineTuningJobEventsPage = JobsAPI.FineTuningJobEventsPage; +})(FineTuning = exports.FineTuning || (exports.FineTuning = {})); +//# sourceMappingURL=fine-tuning.js.map + +/***/ }), + +/***/ 3104: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FineTuningJobCheckpointsPage = exports.Checkpoints = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const CheckpointsAPI = __importStar(__nccwpck_require__(3104)); +const pagination_1 = __nccwpck_require__(7401); +class Checkpoints extends resource_1.APIResource { + list(fineTuningJobId, query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list(fineTuningJobId, {}, query); + } + return this._client.getAPIList(`/fine_tuning/jobs/${fineTuningJobId}/checkpoints`, FineTuningJobCheckpointsPage, { query, ...options }); + } +} +exports.Checkpoints = Checkpoints; +class FineTuningJobCheckpointsPage extends pagination_1.CursorPage { +} +exports.FineTuningJobCheckpointsPage = FineTuningJobCheckpointsPage; +(function (Checkpoints) { + Checkpoints.FineTuningJobCheckpointsPage = CheckpointsAPI.FineTuningJobCheckpointsPage; +})(Checkpoints = exports.Checkpoints || (exports.Checkpoints = {})); +//# sourceMappingURL=checkpoints.js.map + +/***/ }), + +/***/ 816: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FineTuningJobEventsPage = exports.FineTuningJobsPage = exports.Jobs = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +const JobsAPI = __importStar(__nccwpck_require__(816)); +const CheckpointsAPI = __importStar(__nccwpck_require__(3104)); +const pagination_1 = __nccwpck_require__(7401); +class Jobs extends resource_1.APIResource { + constructor() { + super(...arguments); + this.checkpoints = new CheckpointsAPI.Checkpoints(this._client); + } + /** + * Creates a fine-tuning job which begins the process of creating a new model from + * a given dataset. + * + * Response includes details of the enqueued job including job status and the name + * of the fine-tuned models once complete. + * + * [Learn more about fine-tuning](https://platform.openai.com/docs/guides/fine-tuning) + */ + create(body, options) { + return this._client.post('/fine_tuning/jobs', { body, ...options }); + } + /** + * Get info about a fine-tuning job. + * + * [Learn more about fine-tuning](https://platform.openai.com/docs/guides/fine-tuning) + */ + retrieve(fineTuningJobId, options) { + return this._client.get(`/fine_tuning/jobs/${fineTuningJobId}`, options); + } + list(query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.list({}, query); + } + return this._client.getAPIList('/fine_tuning/jobs', FineTuningJobsPage, { query, ...options }); + } + /** + * Immediately cancel a fine-tune job. + */ + cancel(fineTuningJobId, options) { + return this._client.post(`/fine_tuning/jobs/${fineTuningJobId}/cancel`, options); + } + listEvents(fineTuningJobId, query = {}, options) { + if ((0, core_1.isRequestOptions)(query)) { + return this.listEvents(fineTuningJobId, {}, query); + } + return this._client.getAPIList(`/fine_tuning/jobs/${fineTuningJobId}/events`, FineTuningJobEventsPage, { + query, + ...options, + }); + } +} +exports.Jobs = Jobs; +class FineTuningJobsPage extends pagination_1.CursorPage { +} +exports.FineTuningJobsPage = FineTuningJobsPage; +class FineTuningJobEventsPage extends pagination_1.CursorPage { +} +exports.FineTuningJobEventsPage = FineTuningJobEventsPage; +(function (Jobs) { + Jobs.FineTuningJobsPage = JobsAPI.FineTuningJobsPage; + Jobs.FineTuningJobEventsPage = JobsAPI.FineTuningJobEventsPage; + Jobs.Checkpoints = CheckpointsAPI.Checkpoints; + Jobs.FineTuningJobCheckpointsPage = CheckpointsAPI.FineTuningJobCheckpointsPage; +})(Jobs = exports.Jobs || (exports.Jobs = {})); +//# sourceMappingURL=jobs.js.map + +/***/ }), + +/***/ 2621: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Images = void 0; +const resource_1 = __nccwpck_require__(9593); +const core_1 = __nccwpck_require__(1798); +class Images extends resource_1.APIResource { + /** + * Creates a variation of a given image. + */ + createVariation(body, options) { + return this._client.post('/images/variations', (0, core_1.multipartFormRequestOptions)({ body, ...options })); + } + /** + * Creates an edited or extended image given an original image and a prompt. + */ + edit(body, options) { + return this._client.post('/images/edits', (0, core_1.multipartFormRequestOptions)({ body, ...options })); + } + /** + * Creates an image given a prompt. + */ + generate(body, options) { + return this._client.post('/images/generations', { body, ...options }); + } +} +exports.Images = Images; +(function (Images) { +})(Images = exports.Images || (exports.Images = {})); +//# sourceMappingURL=images.js.map + +/***/ }), + +/***/ 5690: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Moderations = exports.Models = exports.ModelsPage = exports.Images = exports.FineTuning = exports.Files = exports.FileObjectsPage = exports.Embeddings = exports.Completions = exports.Beta = exports.Batches = exports.BatchesPage = exports.Audio = void 0; +__exportStar(__nccwpck_require__(8240), exports); +__exportStar(__nccwpck_require__(4866), exports); +var audio_1 = __nccwpck_require__(6376); +Object.defineProperty(exports, "Audio", ({ enumerable: true, get: function () { return audio_1.Audio; } })); +var batches_1 = __nccwpck_require__(341); +Object.defineProperty(exports, "BatchesPage", ({ enumerable: true, get: function () { return batches_1.BatchesPage; } })); +Object.defineProperty(exports, "Batches", ({ enumerable: true, get: function () { return batches_1.Batches; } })); +var beta_1 = __nccwpck_require__(853); +Object.defineProperty(exports, "Beta", ({ enumerable: true, get: function () { return beta_1.Beta; } })); +var completions_1 = __nccwpck_require__(9327); +Object.defineProperty(exports, "Completions", ({ enumerable: true, get: function () { return completions_1.Completions; } })); +var embeddings_1 = __nccwpck_require__(8064); +Object.defineProperty(exports, "Embeddings", ({ enumerable: true, get: function () { return embeddings_1.Embeddings; } })); +var files_1 = __nccwpck_require__(3873); +Object.defineProperty(exports, "FileObjectsPage", ({ enumerable: true, get: function () { return files_1.FileObjectsPage; } })); +Object.defineProperty(exports, "Files", ({ enumerable: true, get: function () { return files_1.Files; } })); +var fine_tuning_1 = __nccwpck_require__(1364); +Object.defineProperty(exports, "FineTuning", ({ enumerable: true, get: function () { return fine_tuning_1.FineTuning; } })); +var images_1 = __nccwpck_require__(2621); +Object.defineProperty(exports, "Images", ({ enumerable: true, get: function () { return images_1.Images; } })); +var models_1 = __nccwpck_require__(6467); +Object.defineProperty(exports, "ModelsPage", ({ enumerable: true, get: function () { return models_1.ModelsPage; } })); +Object.defineProperty(exports, "Models", ({ enumerable: true, get: function () { return models_1.Models; } })); +var moderations_1 = __nccwpck_require__(2085); +Object.defineProperty(exports, "Moderations", ({ enumerable: true, get: function () { return moderations_1.Moderations; } })); +//# sourceMappingURL=index.js.map + +/***/ }), + +/***/ 6467: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ModelsPage = exports.Models = void 0; +const resource_1 = __nccwpck_require__(9593); +const ModelsAPI = __importStar(__nccwpck_require__(6467)); +const pagination_1 = __nccwpck_require__(7401); +class Models extends resource_1.APIResource { + /** + * Retrieves a model instance, providing basic information about the model such as + * the owner and permissioning. + */ + retrieve(model, options) { + return this._client.get(`/models/${model}`, options); + } + /** + * Lists the currently available models, and provides basic information about each + * one such as the owner and availability. + */ + list(options) { + return this._client.getAPIList('/models', ModelsPage, options); + } + /** + * Delete a fine-tuned model. You must have the Owner role in your organization to + * delete a model. + */ + del(model, options) { + return this._client.delete(`/models/${model}`, options); + } +} +exports.Models = Models; +/** + * Note: no pagination actually occurs yet, this is for forwards-compatibility. + */ +class ModelsPage extends pagination_1.Page { +} +exports.ModelsPage = ModelsPage; +(function (Models) { + Models.ModelsPage = ModelsAPI.ModelsPage; +})(Models = exports.Models || (exports.Models = {})); +//# sourceMappingURL=models.js.map + +/***/ }), + +/***/ 2085: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Moderations = void 0; +const resource_1 = __nccwpck_require__(9593); +class Moderations extends resource_1.APIResource { + /** + * Classifies if text is potentially harmful. + */ + create(body, options) { + return this._client.post('/moderations', { body, ...options }); + } +} +exports.Moderations = Moderations; +(function (Moderations) { +})(Moderations = exports.Moderations || (exports.Moderations = {})); +//# sourceMappingURL=moderations.js.map + +/***/ }), + +/***/ 4866: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. +Object.defineProperty(exports, "__esModule", ({ value: true })); +//# sourceMappingURL=shared.js.map + +/***/ }), + +/***/ 884: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.readableStreamAsyncIterable = exports._decodeChunks = exports._iterSSEMessages = exports.Stream = void 0; +const index_1 = __nccwpck_require__(6678); +const error_1 = __nccwpck_require__(8905); +const error_2 = __nccwpck_require__(8905); +class Stream { + constructor(iterator, controller) { + this.iterator = iterator; + this.controller = controller; + } + static fromSSEResponse(response, controller) { + let consumed = false; + async function* iterator() { + if (consumed) { + throw new Error('Cannot iterate over a consumed stream, use `.tee()` to split the stream.'); + } + consumed = true; + let done = false; + try { + for await (const sse of _iterSSEMessages(response, controller)) { + if (done) + continue; + if (sse.data.startsWith('[DONE]')) { + done = true; + continue; + } + if (sse.event === null) { + let data; + try { + data = JSON.parse(sse.data); + } + catch (e) { + console.error(`Could not parse message into JSON:`, sse.data); + console.error(`From chunk:`, sse.raw); + throw e; + } + if (data && data.error) { + throw new error_2.APIError(undefined, data.error, undefined, undefined); + } + yield data; + } + else { + let data; + try { + data = JSON.parse(sse.data); + } + catch (e) { + console.error(`Could not parse message into JSON:`, sse.data); + console.error(`From chunk:`, sse.raw); + throw e; + } + // TODO: Is this where the error should be thrown? + if (sse.event == 'error') { + throw new error_2.APIError(undefined, data.error, data.message, undefined); + } + yield { event: sse.event, data: data }; + } + } + done = true; + } + catch (e) { + // If the user calls `stream.controller.abort()`, we should exit without throwing. + if (e instanceof Error && e.name === 'AbortError') + return; + throw e; + } + finally { + // If the user `break`s, abort the ongoing request. + if (!done) + controller.abort(); + } + } + return new Stream(iterator, controller); + } + /** + * Generates a Stream from a newline-separated ReadableStream + * where each item is a JSON value. + */ + static fromReadableStream(readableStream, controller) { + let consumed = false; + async function* iterLines() { + const lineDecoder = new LineDecoder(); + const iter = readableStreamAsyncIterable(readableStream); + for await (const chunk of iter) { + for (const line of lineDecoder.decode(chunk)) { + yield line; + } + } + for (const line of lineDecoder.flush()) { + yield line; + } + } + async function* iterator() { + if (consumed) { + throw new Error('Cannot iterate over a consumed stream, use `.tee()` to split the stream.'); + } + consumed = true; + let done = false; + try { + for await (const line of iterLines()) { + if (done) + continue; + if (line) + yield JSON.parse(line); + } + done = true; + } + catch (e) { + // If the user calls `stream.controller.abort()`, we should exit without throwing. + if (e instanceof Error && e.name === 'AbortError') + return; + throw e; + } + finally { + // If the user `break`s, abort the ongoing request. + if (!done) + controller.abort(); + } + } + return new Stream(iterator, controller); + } + [Symbol.asyncIterator]() { + return this.iterator(); + } + /** + * Splits the stream into two streams which can be + * independently read from at different speeds. + */ + tee() { + const left = []; + const right = []; + const iterator = this.iterator(); + const teeIterator = (queue) => { + return { + next: () => { + if (queue.length === 0) { + const result = iterator.next(); + left.push(result); + right.push(result); + } + return queue.shift(); + }, + }; + }; + return [ + new Stream(() => teeIterator(left), this.controller), + new Stream(() => teeIterator(right), this.controller), + ]; + } + /** + * Converts this stream to a newline-separated ReadableStream of + * JSON stringified values in the stream + * which can be turned back into a Stream with `Stream.fromReadableStream()`. + */ + toReadableStream() { + const self = this; + let iter; + const encoder = new TextEncoder(); + return new index_1.ReadableStream({ + async start() { + iter = self[Symbol.asyncIterator](); + }, + async pull(ctrl) { + try { + const { value, done } = await iter.next(); + if (done) + return ctrl.close(); + const bytes = encoder.encode(JSON.stringify(value) + '\n'); + ctrl.enqueue(bytes); + } + catch (err) { + ctrl.error(err); + } + }, + async cancel() { + await iter.return?.(); + }, + }); + } +} +exports.Stream = Stream; +async function* _iterSSEMessages(response, controller) { + if (!response.body) { + controller.abort(); + throw new error_1.OpenAIError(`Attempted to iterate over a response with no body`); + } + const sseDecoder = new SSEDecoder(); + const lineDecoder = new LineDecoder(); + const iter = readableStreamAsyncIterable(response.body); + for await (const sseChunk of iterSSEChunks(iter)) { + for (const line of lineDecoder.decode(sseChunk)) { + const sse = sseDecoder.decode(line); + if (sse) + yield sse; + } + } + for (const line of lineDecoder.flush()) { + const sse = sseDecoder.decode(line); + if (sse) + yield sse; + } +} +exports._iterSSEMessages = _iterSSEMessages; +/** + * Given an async iterable iterator, iterates over it and yields full + * SSE chunks, i.e. yields when a double new-line is encountered. + */ +async function* iterSSEChunks(iterator) { + let data = new Uint8Array(); + for await (const chunk of iterator) { + if (chunk == null) { + continue; + } + const binaryChunk = chunk instanceof ArrayBuffer ? new Uint8Array(chunk) + : typeof chunk === 'string' ? new TextEncoder().encode(chunk) + : chunk; + let newData = new Uint8Array(data.length + binaryChunk.length); + newData.set(data); + newData.set(binaryChunk, data.length); + data = newData; + let patternIndex; + while ((patternIndex = findDoubleNewlineIndex(data)) !== -1) { + yield data.slice(0, patternIndex); + data = data.slice(patternIndex); + } + } + if (data.length > 0) { + yield data; + } +} +function findDoubleNewlineIndex(buffer) { + // This function searches the buffer for the end patterns (\r\r, \n\n, \r\n\r\n) + // and returns the index right after the first occurrence of any pattern, + // or -1 if none of the patterns are found. + const newline = 0x0a; // \n + const carriage = 0x0d; // \r + for (let i = 0; i < buffer.length - 2; i++) { + if (buffer[i] === newline && buffer[i + 1] === newline) { + // \n\n + return i + 2; + } + if (buffer[i] === carriage && buffer[i + 1] === carriage) { + // \r\r + return i + 2; + } + if (buffer[i] === carriage && + buffer[i + 1] === newline && + i + 3 < buffer.length && + buffer[i + 2] === carriage && + buffer[i + 3] === newline) { + // \r\n\r\n + return i + 4; + } + } + return -1; +} +class SSEDecoder { + constructor() { + this.event = null; + this.data = []; + this.chunks = []; + } + decode(line) { + if (line.endsWith('\r')) { + line = line.substring(0, line.length - 1); + } + if (!line) { + // empty line and we didn't previously encounter any messages + if (!this.event && !this.data.length) + return null; + const sse = { + event: this.event, + data: this.data.join('\n'), + raw: this.chunks, + }; + this.event = null; + this.data = []; + this.chunks = []; + return sse; + } + this.chunks.push(line); + if (line.startsWith(':')) { + return null; + } + let [fieldname, _, value] = partition(line, ':'); + if (value.startsWith(' ')) { + value = value.substring(1); + } + if (fieldname === 'event') { + this.event = value; + } + else if (fieldname === 'data') { + this.data.push(value); + } + return null; + } +} +/** + * A re-implementation of httpx's `LineDecoder` in Python that handles incrementally + * reading lines from text. + * + * https://github.com/encode/httpx/blob/920333ea98118e9cf617f246905d7b202510941c/httpx/_decoders.py#L258 + */ +class LineDecoder { + constructor() { + this.buffer = []; + this.trailingCR = false; + } + decode(chunk) { + let text = this.decodeText(chunk); + if (this.trailingCR) { + text = '\r' + text; + this.trailingCR = false; + } + if (text.endsWith('\r')) { + this.trailingCR = true; + text = text.slice(0, -1); + } + if (!text) { + return []; + } + const trailingNewline = LineDecoder.NEWLINE_CHARS.has(text[text.length - 1] || ''); + let lines = text.split(LineDecoder.NEWLINE_REGEXP); + // if there is a trailing new line then the last entry will be an empty + // string which we don't care about + if (trailingNewline) { + lines.pop(); + } + if (lines.length === 1 && !trailingNewline) { + this.buffer.push(lines[0]); + return []; + } + if (this.buffer.length > 0) { + lines = [this.buffer.join('') + lines[0], ...lines.slice(1)]; + this.buffer = []; + } + if (!trailingNewline) { + this.buffer = [lines.pop() || '']; + } + return lines; + } + decodeText(bytes) { + if (bytes == null) + return ''; + if (typeof bytes === 'string') + return bytes; + // Node: + if (typeof Buffer !== 'undefined') { + if (bytes instanceof Buffer) { + return bytes.toString(); + } + if (bytes instanceof Uint8Array) { + return Buffer.from(bytes).toString(); + } + throw new error_1.OpenAIError(`Unexpected: received non-Uint8Array (${bytes.constructor.name}) stream chunk in an environment with a global "Buffer" defined, which this library assumes to be Node. Please report this error.`); + } + // Browser + if (typeof TextDecoder !== 'undefined') { + if (bytes instanceof Uint8Array || bytes instanceof ArrayBuffer) { + this.textDecoder ?? (this.textDecoder = new TextDecoder('utf8')); + return this.textDecoder.decode(bytes); + } + throw new error_1.OpenAIError(`Unexpected: received non-Uint8Array/ArrayBuffer (${bytes.constructor.name}) in a web platform. Please report this error.`); + } + throw new error_1.OpenAIError(`Unexpected: neither Buffer nor TextDecoder are available as globals. Please report this error.`); + } + flush() { + if (!this.buffer.length && !this.trailingCR) { + return []; + } + const lines = [this.buffer.join('')]; + this.buffer = []; + this.trailingCR = false; + return lines; + } +} +// prettier-ignore +LineDecoder.NEWLINE_CHARS = new Set(['\n', '\r']); +LineDecoder.NEWLINE_REGEXP = /\r\n|[\n\r]/g; +/** This is an internal helper function that's just used for testing */ +function _decodeChunks(chunks) { + const decoder = new LineDecoder(); + const lines = []; + for (const chunk of chunks) { + lines.push(...decoder.decode(chunk)); + } + return lines; +} +exports._decodeChunks = _decodeChunks; +function partition(str, delimiter) { + const index = str.indexOf(delimiter); + if (index !== -1) { + return [str.substring(0, index), delimiter, str.substring(index + delimiter.length)]; + } + return [str, '', '']; +} +/** + * Most browsers don't yet have async iterable support for ReadableStream, + * and Node has a very different way of reading bytes from its "ReadableStream". + * + * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490 + */ +function readableStreamAsyncIterable(stream) { + if (stream[Symbol.asyncIterator]) + return stream; + const reader = stream.getReader(); + return { + async next() { + try { + const result = await reader.read(); + if (result?.done) + reader.releaseLock(); // release lock when stream becomes closed + return result; + } + catch (e) { + reader.releaseLock(); // release lock when stream becomes errored + throw e; + } + }, + async return() { + const cancelPromise = reader.cancel(); + reader.releaseLock(); + await cancelPromise; + return { done: true, value: undefined }; + }, + [Symbol.asyncIterator]() { + return this; + }, + }; +} +exports.readableStreamAsyncIterable = readableStreamAsyncIterable; +//# sourceMappingURL=streaming.js.map + +/***/ }), + +/***/ 3394: +/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.createForm = exports.multipartFormRequestOptions = exports.maybeMultipartFormRequestOptions = exports.isMultipartBody = exports.toFile = exports.isUploadable = exports.isBlobLike = exports.isFileLike = exports.isResponseLike = exports.fileFromPath = void 0; +const index_1 = __nccwpck_require__(6678); +var index_2 = __nccwpck_require__(6678); +Object.defineProperty(exports, "fileFromPath", ({ enumerable: true, get: function () { return index_2.fileFromPath; } })); +const isResponseLike = (value) => value != null && + typeof value === 'object' && + typeof value.url === 'string' && + typeof value.blob === 'function'; +exports.isResponseLike = isResponseLike; +const isFileLike = (value) => value != null && + typeof value === 'object' && + typeof value.name === 'string' && + typeof value.lastModified === 'number' && + (0, exports.isBlobLike)(value); +exports.isFileLike = isFileLike; +/** + * The BlobLike type omits arrayBuffer() because @types/node-fetch@^2.6.4 lacks it; but this check + * adds the arrayBuffer() method type because it is available and used at runtime + */ +const isBlobLike = (value) => value != null && + typeof value === 'object' && + typeof value.size === 'number' && + typeof value.type === 'string' && + typeof value.text === 'function' && + typeof value.slice === 'function' && + typeof value.arrayBuffer === 'function'; +exports.isBlobLike = isBlobLike; +const isUploadable = (value) => { + return (0, exports.isFileLike)(value) || (0, exports.isResponseLike)(value) || (0, index_1.isFsReadStream)(value); +}; +exports.isUploadable = isUploadable; +/** + * Helper for creating a {@link File} to pass to an SDK upload method from a variety of different data formats + * @param value the raw content of the file. Can be an {@link Uploadable}, {@link BlobLikePart}, or {@link AsyncIterable} of {@link BlobLikePart}s + * @param {string=} name the name of the file. If omitted, toFile will try to determine a file name from bits if possible + * @param {Object=} options additional properties + * @param {string=} options.type the MIME type of the content + * @param {number=} options.lastModified the last modified timestamp + * @returns a {@link File} with the given properties + */ +async function toFile(value, name, options) { + // If it's a promise, resolve it. + value = await value; + // Use the file's options if there isn't one provided + options ?? (options = (0, exports.isFileLike)(value) ? { lastModified: value.lastModified, type: value.type } : {}); + if ((0, exports.isResponseLike)(value)) { + const blob = await value.blob(); + name || (name = new URL(value.url).pathname.split(/[\\/]/).pop() ?? 'unknown_file'); + return new index_1.File([blob], name, options); + } + const bits = await getBytes(value); + name || (name = getName(value) ?? 'unknown_file'); + if (!options.type) { + const type = bits[0]?.type; + if (typeof type === 'string') { + options = { ...options, type }; + } + } + return new index_1.File(bits, name, options); +} +exports.toFile = toFile; +async function getBytes(value) { + let parts = []; + if (typeof value === 'string' || + ArrayBuffer.isView(value) || // includes Uint8Array, Buffer, etc. + value instanceof ArrayBuffer) { + parts.push(value); + } + else if ((0, exports.isBlobLike)(value)) { + parts.push(await value.arrayBuffer()); + } + else if (isAsyncIterableIterator(value) // includes Readable, ReadableStream, etc. + ) { + for await (const chunk of value) { + parts.push(chunk); // TODO, consider validating? + } + } + else { + throw new Error(`Unexpected data type: ${typeof value}; constructor: ${value?.constructor + ?.name}; props: ${propsForError(value)}`); + } + return parts; +} +function propsForError(value) { + const props = Object.getOwnPropertyNames(value); + return `[${props.map((p) => `"${p}"`).join(', ')}]`; +} +function getName(value) { + return (getStringFromMaybeBuffer(value.name) || + getStringFromMaybeBuffer(value.filename) || + // For fs.ReadStream + getStringFromMaybeBuffer(value.path)?.split(/[\\/]/).pop()); +} +const getStringFromMaybeBuffer = (x) => { + if (typeof x === 'string') + return x; + if (typeof Buffer !== 'undefined' && x instanceof Buffer) + return String(x); + return undefined; +}; +const isAsyncIterableIterator = (value) => value != null && typeof value === 'object' && typeof value[Symbol.asyncIterator] === 'function'; +const isMultipartBody = (body) => body && typeof body === 'object' && body.body && body[Symbol.toStringTag] === 'MultipartBody'; +exports.isMultipartBody = isMultipartBody; +/** + * Returns a multipart/form-data request if any part of the given request body contains a File / Blob value. + * Otherwise returns the request as is. + */ +const maybeMultipartFormRequestOptions = async (opts) => { + if (!hasUploadableValue(opts.body)) + return opts; + const form = await (0, exports.createForm)(opts.body); + return (0, index_1.getMultipartRequestOptions)(form, opts); +}; +exports.maybeMultipartFormRequestOptions = maybeMultipartFormRequestOptions; +const multipartFormRequestOptions = async (opts) => { + const form = await (0, exports.createForm)(opts.body); + return (0, index_1.getMultipartRequestOptions)(form, opts); +}; +exports.multipartFormRequestOptions = multipartFormRequestOptions; +const createForm = async (body) => { + const form = new index_1.FormData(); + await Promise.all(Object.entries(body || {}).map(([key, value]) => addFormValue(form, key, value))); + return form; +}; +exports.createForm = createForm; +const hasUploadableValue = (value) => { + if ((0, exports.isUploadable)(value)) + return true; + if (Array.isArray(value)) + return value.some(hasUploadableValue); + if (value && typeof value === 'object') { + for (const k in value) { + if (hasUploadableValue(value[k])) + return true; + } + } + return false; +}; +const addFormValue = async (form, key, value) => { + if (value === undefined) + return; + if (value == null) { + throw new TypeError(`Received null for "${key}"; to pass null in FormData, you must use the string 'null'`); + } + // TODO: make nested formats configurable + if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { + form.append(key, String(value)); + } + else if ((0, exports.isUploadable)(value)) { + const file = await toFile(value); + form.append(key, file); + } + else if (Array.isArray(value)) { + await Promise.all(value.map((entry) => addFormValue(form, key + '[]', entry))); + } + else if (typeof value === 'object') { + await Promise.all(Object.entries(value).map(([name, prop]) => addFormValue(form, `${key}[${name}]`, prop))); + } + else { + throw new TypeError(`Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${value} instead`); + } +}; +//# sourceMappingURL=uploads.js.map + +/***/ }), + +/***/ 6417: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VERSION = void 0; +exports.VERSION = '4.38.5'; // x-release-please-version +//# sourceMappingURL=version.js.map + +/***/ }), + +/***/ 1907: +/***/ ((module) => { + +"use strict"; +module.exports = JSON.parse('[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"],[[47,47],"disallowed_STD3_valid"],[[48,57],"valid"],[[58,64],"disallowed_STD3_valid"],[[65,65],"mapped",[97]],[[66,66],"mapped",[98]],[[67,67],"mapped",[99]],[[68,68],"mapped",[100]],[[69,69],"mapped",[101]],[[70,70],"mapped",[102]],[[71,71],"mapped",[103]],[[72,72],"mapped",[104]],[[73,73],"mapped",[105]],[[74,74],"mapped",[106]],[[75,75],"mapped",[107]],[[76,76],"mapped",[108]],[[77,77],"mapped",[109]],[[78,78],"mapped",[110]],[[79,79],"mapped",[111]],[[80,80],"mapped",[112]],[[81,81],"mapped",[113]],[[82,82],"mapped",[114]],[[83,83],"mapped",[115]],[[84,84],"mapped",[116]],[[85,85],"mapped",[117]],[[86,86],"mapped",[118]],[[87,87],"mapped",[119]],[[88,88],"mapped",[120]],[[89,89],"mapped",[121]],[[90,90],"mapped",[122]],[[91,96],"disallowed_STD3_valid"],[[97,122],"valid"],[[123,127],"disallowed_STD3_valid"],[[128,159],"disallowed"],[[160,160],"disallowed_STD3_mapped",[32]],[[161,167],"valid",[],"NV8"],[[168,168],"disallowed_STD3_mapped",[32,776]],[[169,169],"valid",[],"NV8"],[[170,170],"mapped",[97]],[[171,172],"valid",[],"NV8"],[[173,173],"ignored"],[[174,174],"valid",[],"NV8"],[[175,175],"disallowed_STD3_mapped",[32,772]],[[176,177],"valid",[],"NV8"],[[178,178],"mapped",[50]],[[179,179],"mapped",[51]],[[180,180],"disallowed_STD3_mapped",[32,769]],[[181,181],"mapped",[956]],[[182,182],"valid",[],"NV8"],[[183,183],"valid"],[[184,184],"disallowed_STD3_mapped",[32,807]],[[185,185],"mapped",[49]],[[186,186],"mapped",[111]],[[187,187],"valid",[],"NV8"],[[188,188],"mapped",[49,8260,52]],[[189,189],"mapped",[49,8260,50]],[[190,190],"mapped",[51,8260,52]],[[191,191],"valid",[],"NV8"],[[192,192],"mapped",[224]],[[193,193],"mapped",[225]],[[194,194],"mapped",[226]],[[195,195],"mapped",[227]],[[196,196],"mapped",[228]],[[197,197],"mapped",[229]],[[198,198],"mapped",[230]],[[199,199],"mapped",[231]],[[200,200],"mapped",[232]],[[201,201],"mapped",[233]],[[202,202],"mapped",[234]],[[203,203],"mapped",[235]],[[204,204],"mapped",[236]],[[205,205],"mapped",[237]],[[206,206],"mapped",[238]],[[207,207],"mapped",[239]],[[208,208],"mapped",[240]],[[209,209],"mapped",[241]],[[210,210],"mapped",[242]],[[211,211],"mapped",[243]],[[212,212],"mapped",[244]],[[213,213],"mapped",[245]],[[214,214],"mapped",[246]],[[215,215],"valid",[],"NV8"],[[216,216],"mapped",[248]],[[217,217],"mapped",[249]],[[218,218],"mapped",[250]],[[219,219],"mapped",[251]],[[220,220],"mapped",[252]],[[221,221],"mapped",[253]],[[222,222],"mapped",[254]],[[223,223],"deviation",[115,115]],[[224,246],"valid"],[[247,247],"valid",[],"NV8"],[[248,255],"valid"],[[256,256],"mapped",[257]],[[257,257],"valid"],[[258,258],"mapped",[259]],[[259,259],"valid"],[[260,260],"mapped",[261]],[[261,261],"valid"],[[262,262],"mapped",[263]],[[263,263],"valid"],[[264,264],"mapped",[265]],[[265,265],"valid"],[[266,266],"mapped",[267]],[[267,267],"valid"],[[268,268],"mapped",[269]],[[269,269],"valid"],[[270,270],"mapped",[271]],[[271,271],"valid"],[[272,272],"mapped",[273]],[[273,273],"valid"],[[274,274],"mapped",[275]],[[275,275],"valid"],[[276,276],"mapped",[277]],[[277,277],"valid"],[[278,278],"mapped",[279]],[[279,279],"valid"],[[280,280],"mapped",[281]],[[281,281],"valid"],[[282,282],"mapped",[283]],[[283,283],"valid"],[[284,284],"mapped",[285]],[[285,285],"valid"],[[286,286],"mapped",[287]],[[287,287],"valid"],[[288,288],"mapped",[289]],[[289,289],"valid"],[[290,290],"mapped",[291]],[[291,291],"valid"],[[292,292],"mapped",[293]],[[293,293],"valid"],[[294,294],"mapped",[295]],[[295,295],"valid"],[[296,296],"mapped",[297]],[[297,297],"valid"],[[298,298],"mapped",[299]],[[299,299],"valid"],[[300,300],"mapped",[301]],[[301,301],"valid"],[[302,302],"mapped",[303]],[[303,303],"valid"],[[304,304],"mapped",[105,775]],[[305,305],"valid"],[[306,307],"mapped",[105,106]],[[308,308],"mapped",[309]],[[309,309],"valid"],[[310,310],"mapped",[311]],[[311,312],"valid"],[[313,313],"mapped",[314]],[[314,314],"valid"],[[315,315],"mapped",[316]],[[316,316],"valid"],[[317,317],"mapped",[318]],[[318,318],"valid"],[[319,320],"mapped",[108,183]],[[321,321],"mapped",[322]],[[322,322],"valid"],[[323,323],"mapped",[324]],[[324,324],"valid"],[[325,325],"mapped",[326]],[[326,326],"valid"],[[327,327],"mapped",[328]],[[328,328],"valid"],[[329,329],"mapped",[700,110]],[[330,330],"mapped",[331]],[[331,331],"valid"],[[332,332],"mapped",[333]],[[333,333],"valid"],[[334,334],"mapped",[335]],[[335,335],"valid"],[[336,336],"mapped",[337]],[[337,337],"valid"],[[338,338],"mapped",[339]],[[339,339],"valid"],[[340,340],"mapped",[341]],[[341,341],"valid"],[[342,342],"mapped",[343]],[[343,343],"valid"],[[344,344],"mapped",[345]],[[345,345],"valid"],[[346,346],"mapped",[347]],[[347,347],"valid"],[[348,348],"mapped",[349]],[[349,349],"valid"],[[350,350],"mapped",[351]],[[351,351],"valid"],[[352,352],"mapped",[353]],[[353,353],"valid"],[[354,354],"mapped",[355]],[[355,355],"valid"],[[356,356],"mapped",[357]],[[357,357],"valid"],[[358,358],"mapped",[359]],[[359,359],"valid"],[[360,360],"mapped",[361]],[[361,361],"valid"],[[362,362],"mapped",[363]],[[363,363],"valid"],[[364,364],"mapped",[365]],[[365,365],"valid"],[[366,366],"mapped",[367]],[[367,367],"valid"],[[368,368],"mapped",[369]],[[369,369],"valid"],[[370,370],"mapped",[371]],[[371,371],"valid"],[[372,372],"mapped",[373]],[[373,373],"valid"],[[374,374],"mapped",[375]],[[375,375],"valid"],[[376,376],"mapped",[255]],[[377,377],"mapped",[378]],[[378,378],"valid"],[[379,379],"mapped",[380]],[[380,380],"valid"],[[381,381],"mapped",[382]],[[382,382],"valid"],[[383,383],"mapped",[115]],[[384,384],"valid"],[[385,385],"mapped",[595]],[[386,386],"mapped",[387]],[[387,387],"valid"],[[388,388],"mapped",[389]],[[389,389],"valid"],[[390,390],"mapped",[596]],[[391,391],"mapped",[392]],[[392,392],"valid"],[[393,393],"mapped",[598]],[[394,394],"mapped",[599]],[[395,395],"mapped",[396]],[[396,397],"valid"],[[398,398],"mapped",[477]],[[399,399],"mapped",[601]],[[400,400],"mapped",[603]],[[401,401],"mapped",[402]],[[402,402],"valid"],[[403,403],"mapped",[608]],[[404,404],"mapped",[611]],[[405,405],"valid"],[[406,406],"mapped",[617]],[[407,407],"mapped",[616]],[[408,408],"mapped",[409]],[[409,411],"valid"],[[412,412],"mapped",[623]],[[413,413],"mapped",[626]],[[414,414],"valid"],[[415,415],"mapped",[629]],[[416,416],"mapped",[417]],[[417,417],"valid"],[[418,418],"mapped",[419]],[[419,419],"valid"],[[420,420],"mapped",[421]],[[421,421],"valid"],[[422,422],"mapped",[640]],[[423,423],"mapped",[424]],[[424,424],"valid"],[[425,425],"mapped",[643]],[[426,427],"valid"],[[428,428],"mapped",[429]],[[429,429],"valid"],[[430,430],"mapped",[648]],[[431,431],"mapped",[432]],[[432,432],"valid"],[[433,433],"mapped",[650]],[[434,434],"mapped",[651]],[[435,435],"mapped",[436]],[[436,436],"valid"],[[437,437],"mapped",[438]],[[438,438],"valid"],[[439,439],"mapped",[658]],[[440,440],"mapped",[441]],[[441,443],"valid"],[[444,444],"mapped",[445]],[[445,451],"valid"],[[452,454],"mapped",[100,382]],[[455,457],"mapped",[108,106]],[[458,460],"mapped",[110,106]],[[461,461],"mapped",[462]],[[462,462],"valid"],[[463,463],"mapped",[464]],[[464,464],"valid"],[[465,465],"mapped",[466]],[[466,466],"valid"],[[467,467],"mapped",[468]],[[468,468],"valid"],[[469,469],"mapped",[470]],[[470,470],"valid"],[[471,471],"mapped",[472]],[[472,472],"valid"],[[473,473],"mapped",[474]],[[474,474],"valid"],[[475,475],"mapped",[476]],[[476,477],"valid"],[[478,478],"mapped",[479]],[[479,479],"valid"],[[480,480],"mapped",[481]],[[481,481],"valid"],[[482,482],"mapped",[483]],[[483,483],"valid"],[[484,484],"mapped",[485]],[[485,485],"valid"],[[486,486],"mapped",[487]],[[487,487],"valid"],[[488,488],"mapped",[489]],[[489,489],"valid"],[[490,490],"mapped",[491]],[[491,491],"valid"],[[492,492],"mapped",[493]],[[493,493],"valid"],[[494,494],"mapped",[495]],[[495,496],"valid"],[[497,499],"mapped",[100,122]],[[500,500],"mapped",[501]],[[501,501],"valid"],[[502,502],"mapped",[405]],[[503,503],"mapped",[447]],[[504,504],"mapped",[505]],[[505,505],"valid"],[[506,506],"mapped",[507]],[[507,507],"valid"],[[508,508],"mapped",[509]],[[509,509],"valid"],[[510,510],"mapped",[511]],[[511,511],"valid"],[[512,512],"mapped",[513]],[[513,513],"valid"],[[514,514],"mapped",[515]],[[515,515],"valid"],[[516,516],"mapped",[517]],[[517,517],"valid"],[[518,518],"mapped",[519]],[[519,519],"valid"],[[520,520],"mapped",[521]],[[521,521],"valid"],[[522,522],"mapped",[523]],[[523,523],"valid"],[[524,524],"mapped",[525]],[[525,525],"valid"],[[526,526],"mapped",[527]],[[527,527],"valid"],[[528,528],"mapped",[529]],[[529,529],"valid"],[[530,530],"mapped",[531]],[[531,531],"valid"],[[532,532],"mapped",[533]],[[533,533],"valid"],[[534,534],"mapped",[535]],[[535,535],"valid"],[[536,536],"mapped",[537]],[[537,537],"valid"],[[538,538],"mapped",[539]],[[539,539],"valid"],[[540,540],"mapped",[541]],[[541,541],"valid"],[[542,542],"mapped",[543]],[[543,543],"valid"],[[544,544],"mapped",[414]],[[545,545],"valid"],[[546,546],"mapped",[547]],[[547,547],"valid"],[[548,548],"mapped",[549]],[[549,549],"valid"],[[550,550],"mapped",[551]],[[551,551],"valid"],[[552,552],"mapped",[553]],[[553,553],"valid"],[[554,554],"mapped",[555]],[[555,555],"valid"],[[556,556],"mapped",[557]],[[557,557],"valid"],[[558,558],"mapped",[559]],[[559,559],"valid"],[[560,560],"mapped",[561]],[[561,561],"valid"],[[562,562],"mapped",[563]],[[563,563],"valid"],[[564,566],"valid"],[[567,569],"valid"],[[570,570],"mapped",[11365]],[[571,571],"mapped",[572]],[[572,572],"valid"],[[573,573],"mapped",[410]],[[574,574],"mapped",[11366]],[[575,576],"valid"],[[577,577],"mapped",[578]],[[578,578],"valid"],[[579,579],"mapped",[384]],[[580,580],"mapped",[649]],[[581,581],"mapped",[652]],[[582,582],"mapped",[583]],[[583,583],"valid"],[[584,584],"mapped",[585]],[[585,585],"valid"],[[586,586],"mapped",[587]],[[587,587],"valid"],[[588,588],"mapped",[589]],[[589,589],"valid"],[[590,590],"mapped",[591]],[[591,591],"valid"],[[592,680],"valid"],[[681,685],"valid"],[[686,687],"valid"],[[688,688],"mapped",[104]],[[689,689],"mapped",[614]],[[690,690],"mapped",[106]],[[691,691],"mapped",[114]],[[692,692],"mapped",[633]],[[693,693],"mapped",[635]],[[694,694],"mapped",[641]],[[695,695],"mapped",[119]],[[696,696],"mapped",[121]],[[697,705],"valid"],[[706,709],"valid",[],"NV8"],[[710,721],"valid"],[[722,727],"valid",[],"NV8"],[[728,728],"disallowed_STD3_mapped",[32,774]],[[729,729],"disallowed_STD3_mapped",[32,775]],[[730,730],"disallowed_STD3_mapped",[32,778]],[[731,731],"disallowed_STD3_mapped",[32,808]],[[732,732],"disallowed_STD3_mapped",[32,771]],[[733,733],"disallowed_STD3_mapped",[32,779]],[[734,734],"valid",[],"NV8"],[[735,735],"valid",[],"NV8"],[[736,736],"mapped",[611]],[[737,737],"mapped",[108]],[[738,738],"mapped",[115]],[[739,739],"mapped",[120]],[[740,740],"mapped",[661]],[[741,745],"valid",[],"NV8"],[[746,747],"valid",[],"NV8"],[[748,748],"valid"],[[749,749],"valid",[],"NV8"],[[750,750],"valid"],[[751,767],"valid",[],"NV8"],[[768,831],"valid"],[[832,832],"mapped",[768]],[[833,833],"mapped",[769]],[[834,834],"valid"],[[835,835],"mapped",[787]],[[836,836],"mapped",[776,769]],[[837,837],"mapped",[953]],[[838,846],"valid"],[[847,847],"ignored"],[[848,855],"valid"],[[856,860],"valid"],[[861,863],"valid"],[[864,865],"valid"],[[866,866],"valid"],[[867,879],"valid"],[[880,880],"mapped",[881]],[[881,881],"valid"],[[882,882],"mapped",[883]],[[883,883],"valid"],[[884,884],"mapped",[697]],[[885,885],"valid"],[[886,886],"mapped",[887]],[[887,887],"valid"],[[888,889],"disallowed"],[[890,890],"disallowed_STD3_mapped",[32,953]],[[891,893],"valid"],[[894,894],"disallowed_STD3_mapped",[59]],[[895,895],"mapped",[1011]],[[896,899],"disallowed"],[[900,900],"disallowed_STD3_mapped",[32,769]],[[901,901],"disallowed_STD3_mapped",[32,776,769]],[[902,902],"mapped",[940]],[[903,903],"mapped",[183]],[[904,904],"mapped",[941]],[[905,905],"mapped",[942]],[[906,906],"mapped",[943]],[[907,907],"disallowed"],[[908,908],"mapped",[972]],[[909,909],"disallowed"],[[910,910],"mapped",[973]],[[911,911],"mapped",[974]],[[912,912],"valid"],[[913,913],"mapped",[945]],[[914,914],"mapped",[946]],[[915,915],"mapped",[947]],[[916,916],"mapped",[948]],[[917,917],"mapped",[949]],[[918,918],"mapped",[950]],[[919,919],"mapped",[951]],[[920,920],"mapped",[952]],[[921,921],"mapped",[953]],[[922,922],"mapped",[954]],[[923,923],"mapped",[955]],[[924,924],"mapped",[956]],[[925,925],"mapped",[957]],[[926,926],"mapped",[958]],[[927,927],"mapped",[959]],[[928,928],"mapped",[960]],[[929,929],"mapped",[961]],[[930,930],"disallowed"],[[931,931],"mapped",[963]],[[932,932],"mapped",[964]],[[933,933],"mapped",[965]],[[934,934],"mapped",[966]],[[935,935],"mapped",[967]],[[936,936],"mapped",[968]],[[937,937],"mapped",[969]],[[938,938],"mapped",[970]],[[939,939],"mapped",[971]],[[940,961],"valid"],[[962,962],"deviation",[963]],[[963,974],"valid"],[[975,975],"mapped",[983]],[[976,976],"mapped",[946]],[[977,977],"mapped",[952]],[[978,978],"mapped",[965]],[[979,979],"mapped",[973]],[[980,980],"mapped",[971]],[[981,981],"mapped",[966]],[[982,982],"mapped",[960]],[[983,983],"valid"],[[984,984],"mapped",[985]],[[985,985],"valid"],[[986,986],"mapped",[987]],[[987,987],"valid"],[[988,988],"mapped",[989]],[[989,989],"valid"],[[990,990],"mapped",[991]],[[991,991],"valid"],[[992,992],"mapped",[993]],[[993,993],"valid"],[[994,994],"mapped",[995]],[[995,995],"valid"],[[996,996],"mapped",[997]],[[997,997],"valid"],[[998,998],"mapped",[999]],[[999,999],"valid"],[[1000,1000],"mapped",[1001]],[[1001,1001],"valid"],[[1002,1002],"mapped",[1003]],[[1003,1003],"valid"],[[1004,1004],"mapped",[1005]],[[1005,1005],"valid"],[[1006,1006],"mapped",[1007]],[[1007,1007],"valid"],[[1008,1008],"mapped",[954]],[[1009,1009],"mapped",[961]],[[1010,1010],"mapped",[963]],[[1011,1011],"valid"],[[1012,1012],"mapped",[952]],[[1013,1013],"mapped",[949]],[[1014,1014],"valid",[],"NV8"],[[1015,1015],"mapped",[1016]],[[1016,1016],"valid"],[[1017,1017],"mapped",[963]],[[1018,1018],"mapped",[1019]],[[1019,1019],"valid"],[[1020,1020],"valid"],[[1021,1021],"mapped",[891]],[[1022,1022],"mapped",[892]],[[1023,1023],"mapped",[893]],[[1024,1024],"mapped",[1104]],[[1025,1025],"mapped",[1105]],[[1026,1026],"mapped",[1106]],[[1027,1027],"mapped",[1107]],[[1028,1028],"mapped",[1108]],[[1029,1029],"mapped",[1109]],[[1030,1030],"mapped",[1110]],[[1031,1031],"mapped",[1111]],[[1032,1032],"mapped",[1112]],[[1033,1033],"mapped",[1113]],[[1034,1034],"mapped",[1114]],[[1035,1035],"mapped",[1115]],[[1036,1036],"mapped",[1116]],[[1037,1037],"mapped",[1117]],[[1038,1038],"mapped",[1118]],[[1039,1039],"mapped",[1119]],[[1040,1040],"mapped",[1072]],[[1041,1041],"mapped",[1073]],[[1042,1042],"mapped",[1074]],[[1043,1043],"mapped",[1075]],[[1044,1044],"mapped",[1076]],[[1045,1045],"mapped",[1077]],[[1046,1046],"mapped",[1078]],[[1047,1047],"mapped",[1079]],[[1048,1048],"mapped",[1080]],[[1049,1049],"mapped",[1081]],[[1050,1050],"mapped",[1082]],[[1051,1051],"mapped",[1083]],[[1052,1052],"mapped",[1084]],[[1053,1053],"mapped",[1085]],[[1054,1054],"mapped",[1086]],[[1055,1055],"mapped",[1087]],[[1056,1056],"mapped",[1088]],[[1057,1057],"mapped",[1089]],[[1058,1058],"mapped",[1090]],[[1059,1059],"mapped",[1091]],[[1060,1060],"mapped",[1092]],[[1061,1061],"mapped",[1093]],[[1062,1062],"mapped",[1094]],[[1063,1063],"mapped",[1095]],[[1064,1064],"mapped",[1096]],[[1065,1065],"mapped",[1097]],[[1066,1066],"mapped",[1098]],[[1067,1067],"mapped",[1099]],[[1068,1068],"mapped",[1100]],[[1069,1069],"mapped",[1101]],[[1070,1070],"mapped",[1102]],[[1071,1071],"mapped",[1103]],[[1072,1103],"valid"],[[1104,1104],"valid"],[[1105,1116],"valid"],[[1117,1117],"valid"],[[1118,1119],"valid"],[[1120,1120],"mapped",[1121]],[[1121,1121],"valid"],[[1122,1122],"mapped",[1123]],[[1123,1123],"valid"],[[1124,1124],"mapped",[1125]],[[1125,1125],"valid"],[[1126,1126],"mapped",[1127]],[[1127,1127],"valid"],[[1128,1128],"mapped",[1129]],[[1129,1129],"valid"],[[1130,1130],"mapped",[1131]],[[1131,1131],"valid"],[[1132,1132],"mapped",[1133]],[[1133,1133],"valid"],[[1134,1134],"mapped",[1135]],[[1135,1135],"valid"],[[1136,1136],"mapped",[1137]],[[1137,1137],"valid"],[[1138,1138],"mapped",[1139]],[[1139,1139],"valid"],[[1140,1140],"mapped",[1141]],[[1141,1141],"valid"],[[1142,1142],"mapped",[1143]],[[1143,1143],"valid"],[[1144,1144],"mapped",[1145]],[[1145,1145],"valid"],[[1146,1146],"mapped",[1147]],[[1147,1147],"valid"],[[1148,1148],"mapped",[1149]],[[1149,1149],"valid"],[[1150,1150],"mapped",[1151]],[[1151,1151],"valid"],[[1152,1152],"mapped",[1153]],[[1153,1153],"valid"],[[1154,1154],"valid",[],"NV8"],[[1155,1158],"valid"],[[1159,1159],"valid"],[[1160,1161],"valid",[],"NV8"],[[1162,1162],"mapped",[1163]],[[1163,1163],"valid"],[[1164,1164],"mapped",[1165]],[[1165,1165],"valid"],[[1166,1166],"mapped",[1167]],[[1167,1167],"valid"],[[1168,1168],"mapped",[1169]],[[1169,1169],"valid"],[[1170,1170],"mapped",[1171]],[[1171,1171],"valid"],[[1172,1172],"mapped",[1173]],[[1173,1173],"valid"],[[1174,1174],"mapped",[1175]],[[1175,1175],"valid"],[[1176,1176],"mapped",[1177]],[[1177,1177],"valid"],[[1178,1178],"mapped",[1179]],[[1179,1179],"valid"],[[1180,1180],"mapped",[1181]],[[1181,1181],"valid"],[[1182,1182],"mapped",[1183]],[[1183,1183],"valid"],[[1184,1184],"mapped",[1185]],[[1185,1185],"valid"],[[1186,1186],"mapped",[1187]],[[1187,1187],"valid"],[[1188,1188],"mapped",[1189]],[[1189,1189],"valid"],[[1190,1190],"mapped",[1191]],[[1191,1191],"valid"],[[1192,1192],"mapped",[1193]],[[1193,1193],"valid"],[[1194,1194],"mapped",[1195]],[[1195,1195],"valid"],[[1196,1196],"mapped",[1197]],[[1197,1197],"valid"],[[1198,1198],"mapped",[1199]],[[1199,1199],"valid"],[[1200,1200],"mapped",[1201]],[[1201,1201],"valid"],[[1202,1202],"mapped",[1203]],[[1203,1203],"valid"],[[1204,1204],"mapped",[1205]],[[1205,1205],"valid"],[[1206,1206],"mapped",[1207]],[[1207,1207],"valid"],[[1208,1208],"mapped",[1209]],[[1209,1209],"valid"],[[1210,1210],"mapped",[1211]],[[1211,1211],"valid"],[[1212,1212],"mapped",[1213]],[[1213,1213],"valid"],[[1214,1214],"mapped",[1215]],[[1215,1215],"valid"],[[1216,1216],"disallowed"],[[1217,1217],"mapped",[1218]],[[1218,1218],"valid"],[[1219,1219],"mapped",[1220]],[[1220,1220],"valid"],[[1221,1221],"mapped",[1222]],[[1222,1222],"valid"],[[1223,1223],"mapped",[1224]],[[1224,1224],"valid"],[[1225,1225],"mapped",[1226]],[[1226,1226],"valid"],[[1227,1227],"mapped",[1228]],[[1228,1228],"valid"],[[1229,1229],"mapped",[1230]],[[1230,1230],"valid"],[[1231,1231],"valid"],[[1232,1232],"mapped",[1233]],[[1233,1233],"valid"],[[1234,1234],"mapped",[1235]],[[1235,1235],"valid"],[[1236,1236],"mapped",[1237]],[[1237,1237],"valid"],[[1238,1238],"mapped",[1239]],[[1239,1239],"valid"],[[1240,1240],"mapped",[1241]],[[1241,1241],"valid"],[[1242,1242],"mapped",[1243]],[[1243,1243],"valid"],[[1244,1244],"mapped",[1245]],[[1245,1245],"valid"],[[1246,1246],"mapped",[1247]],[[1247,1247],"valid"],[[1248,1248],"mapped",[1249]],[[1249,1249],"valid"],[[1250,1250],"mapped",[1251]],[[1251,1251],"valid"],[[1252,1252],"mapped",[1253]],[[1253,1253],"valid"],[[1254,1254],"mapped",[1255]],[[1255,1255],"valid"],[[1256,1256],"mapped",[1257]],[[1257,1257],"valid"],[[1258,1258],"mapped",[1259]],[[1259,1259],"valid"],[[1260,1260],"mapped",[1261]],[[1261,1261],"valid"],[[1262,1262],"mapped",[1263]],[[1263,1263],"valid"],[[1264,1264],"mapped",[1265]],[[1265,1265],"valid"],[[1266,1266],"mapped",[1267]],[[1267,1267],"valid"],[[1268,1268],"mapped",[1269]],[[1269,1269],"valid"],[[1270,1270],"mapped",[1271]],[[1271,1271],"valid"],[[1272,1272],"mapped",[1273]],[[1273,1273],"valid"],[[1274,1274],"mapped",[1275]],[[1275,1275],"valid"],[[1276,1276],"mapped",[1277]],[[1277,1277],"valid"],[[1278,1278],"mapped",[1279]],[[1279,1279],"valid"],[[1280,1280],"mapped",[1281]],[[1281,1281],"valid"],[[1282,1282],"mapped",[1283]],[[1283,1283],"valid"],[[1284,1284],"mapped",[1285]],[[1285,1285],"valid"],[[1286,1286],"mapped",[1287]],[[1287,1287],"valid"],[[1288,1288],"mapped",[1289]],[[1289,1289],"valid"],[[1290,1290],"mapped",[1291]],[[1291,1291],"valid"],[[1292,1292],"mapped",[1293]],[[1293,1293],"valid"],[[1294,1294],"mapped",[1295]],[[1295,1295],"valid"],[[1296,1296],"mapped",[1297]],[[1297,1297],"valid"],[[1298,1298],"mapped",[1299]],[[1299,1299],"valid"],[[1300,1300],"mapped",[1301]],[[1301,1301],"valid"],[[1302,1302],"mapped",[1303]],[[1303,1303],"valid"],[[1304,1304],"mapped",[1305]],[[1305,1305],"valid"],[[1306,1306],"mapped",[1307]],[[1307,1307],"valid"],[[1308,1308],"mapped",[1309]],[[1309,1309],"valid"],[[1310,1310],"mapped",[1311]],[[1311,1311],"valid"],[[1312,1312],"mapped",[1313]],[[1313,1313],"valid"],[[1314,1314],"mapped",[1315]],[[1315,1315],"valid"],[[1316,1316],"mapped",[1317]],[[1317,1317],"valid"],[[1318,1318],"mapped",[1319]],[[1319,1319],"valid"],[[1320,1320],"mapped",[1321]],[[1321,1321],"valid"],[[1322,1322],"mapped",[1323]],[[1323,1323],"valid"],[[1324,1324],"mapped",[1325]],[[1325,1325],"valid"],[[1326,1326],"mapped",[1327]],[[1327,1327],"valid"],[[1328,1328],"disallowed"],[[1329,1329],"mapped",[1377]],[[1330,1330],"mapped",[1378]],[[1331,1331],"mapped",[1379]],[[1332,1332],"mapped",[1380]],[[1333,1333],"mapped",[1381]],[[1334,1334],"mapped",[1382]],[[1335,1335],"mapped",[1383]],[[1336,1336],"mapped",[1384]],[[1337,1337],"mapped",[1385]],[[1338,1338],"mapped",[1386]],[[1339,1339],"mapped",[1387]],[[1340,1340],"mapped",[1388]],[[1341,1341],"mapped",[1389]],[[1342,1342],"mapped",[1390]],[[1343,1343],"mapped",[1391]],[[1344,1344],"mapped",[1392]],[[1345,1345],"mapped",[1393]],[[1346,1346],"mapped",[1394]],[[1347,1347],"mapped",[1395]],[[1348,1348],"mapped",[1396]],[[1349,1349],"mapped",[1397]],[[1350,1350],"mapped",[1398]],[[1351,1351],"mapped",[1399]],[[1352,1352],"mapped",[1400]],[[1353,1353],"mapped",[1401]],[[1354,1354],"mapped",[1402]],[[1355,1355],"mapped",[1403]],[[1356,1356],"mapped",[1404]],[[1357,1357],"mapped",[1405]],[[1358,1358],"mapped",[1406]],[[1359,1359],"mapped",[1407]],[[1360,1360],"mapped",[1408]],[[1361,1361],"mapped",[1409]],[[1362,1362],"mapped",[1410]],[[1363,1363],"mapped",[1411]],[[1364,1364],"mapped",[1412]],[[1365,1365],"mapped",[1413]],[[1366,1366],"mapped",[1414]],[[1367,1368],"disallowed"],[[1369,1369],"valid"],[[1370,1375],"valid",[],"NV8"],[[1376,1376],"disallowed"],[[1377,1414],"valid"],[[1415,1415],"mapped",[1381,1410]],[[1416,1416],"disallowed"],[[1417,1417],"valid",[],"NV8"],[[1418,1418],"valid",[],"NV8"],[[1419,1420],"disallowed"],[[1421,1422],"valid",[],"NV8"],[[1423,1423],"valid",[],"NV8"],[[1424,1424],"disallowed"],[[1425,1441],"valid"],[[1442,1442],"valid"],[[1443,1455],"valid"],[[1456,1465],"valid"],[[1466,1466],"valid"],[[1467,1469],"valid"],[[1470,1470],"valid",[],"NV8"],[[1471,1471],"valid"],[[1472,1472],"valid",[],"NV8"],[[1473,1474],"valid"],[[1475,1475],"valid",[],"NV8"],[[1476,1476],"valid"],[[1477,1477],"valid"],[[1478,1478],"valid",[],"NV8"],[[1479,1479],"valid"],[[1480,1487],"disallowed"],[[1488,1514],"valid"],[[1515,1519],"disallowed"],[[1520,1524],"valid"],[[1525,1535],"disallowed"],[[1536,1539],"disallowed"],[[1540,1540],"disallowed"],[[1541,1541],"disallowed"],[[1542,1546],"valid",[],"NV8"],[[1547,1547],"valid",[],"NV8"],[[1548,1548],"valid",[],"NV8"],[[1549,1551],"valid",[],"NV8"],[[1552,1557],"valid"],[[1558,1562],"valid"],[[1563,1563],"valid",[],"NV8"],[[1564,1564],"disallowed"],[[1565,1565],"disallowed"],[[1566,1566],"valid",[],"NV8"],[[1567,1567],"valid",[],"NV8"],[[1568,1568],"valid"],[[1569,1594],"valid"],[[1595,1599],"valid"],[[1600,1600],"valid",[],"NV8"],[[1601,1618],"valid"],[[1619,1621],"valid"],[[1622,1624],"valid"],[[1625,1630],"valid"],[[1631,1631],"valid"],[[1632,1641],"valid"],[[1642,1645],"valid",[],"NV8"],[[1646,1647],"valid"],[[1648,1652],"valid"],[[1653,1653],"mapped",[1575,1652]],[[1654,1654],"mapped",[1608,1652]],[[1655,1655],"mapped",[1735,1652]],[[1656,1656],"mapped",[1610,1652]],[[1657,1719],"valid"],[[1720,1721],"valid"],[[1722,1726],"valid"],[[1727,1727],"valid"],[[1728,1742],"valid"],[[1743,1743],"valid"],[[1744,1747],"valid"],[[1748,1748],"valid",[],"NV8"],[[1749,1756],"valid"],[[1757,1757],"disallowed"],[[1758,1758],"valid",[],"NV8"],[[1759,1768],"valid"],[[1769,1769],"valid",[],"NV8"],[[1770,1773],"valid"],[[1774,1775],"valid"],[[1776,1785],"valid"],[[1786,1790],"valid"],[[1791,1791],"valid"],[[1792,1805],"valid",[],"NV8"],[[1806,1806],"disallowed"],[[1807,1807],"disallowed"],[[1808,1836],"valid"],[[1837,1839],"valid"],[[1840,1866],"valid"],[[1867,1868],"disallowed"],[[1869,1871],"valid"],[[1872,1901],"valid"],[[1902,1919],"valid"],[[1920,1968],"valid"],[[1969,1969],"valid"],[[1970,1983],"disallowed"],[[1984,2037],"valid"],[[2038,2042],"valid",[],"NV8"],[[2043,2047],"disallowed"],[[2048,2093],"valid"],[[2094,2095],"disallowed"],[[2096,2110],"valid",[],"NV8"],[[2111,2111],"disallowed"],[[2112,2139],"valid"],[[2140,2141],"disallowed"],[[2142,2142],"valid",[],"NV8"],[[2143,2207],"disallowed"],[[2208,2208],"valid"],[[2209,2209],"valid"],[[2210,2220],"valid"],[[2221,2226],"valid"],[[2227,2228],"valid"],[[2229,2274],"disallowed"],[[2275,2275],"valid"],[[2276,2302],"valid"],[[2303,2303],"valid"],[[2304,2304],"valid"],[[2305,2307],"valid"],[[2308,2308],"valid"],[[2309,2361],"valid"],[[2362,2363],"valid"],[[2364,2381],"valid"],[[2382,2382],"valid"],[[2383,2383],"valid"],[[2384,2388],"valid"],[[2389,2389],"valid"],[[2390,2391],"valid"],[[2392,2392],"mapped",[2325,2364]],[[2393,2393],"mapped",[2326,2364]],[[2394,2394],"mapped",[2327,2364]],[[2395,2395],"mapped",[2332,2364]],[[2396,2396],"mapped",[2337,2364]],[[2397,2397],"mapped",[2338,2364]],[[2398,2398],"mapped",[2347,2364]],[[2399,2399],"mapped",[2351,2364]],[[2400,2403],"valid"],[[2404,2405],"valid",[],"NV8"],[[2406,2415],"valid"],[[2416,2416],"valid",[],"NV8"],[[2417,2418],"valid"],[[2419,2423],"valid"],[[2424,2424],"valid"],[[2425,2426],"valid"],[[2427,2428],"valid"],[[2429,2429],"valid"],[[2430,2431],"valid"],[[2432,2432],"valid"],[[2433,2435],"valid"],[[2436,2436],"disallowed"],[[2437,2444],"valid"],[[2445,2446],"disallowed"],[[2447,2448],"valid"],[[2449,2450],"disallowed"],[[2451,2472],"valid"],[[2473,2473],"disallowed"],[[2474,2480],"valid"],[[2481,2481],"disallowed"],[[2482,2482],"valid"],[[2483,2485],"disallowed"],[[2486,2489],"valid"],[[2490,2491],"disallowed"],[[2492,2492],"valid"],[[2493,2493],"valid"],[[2494,2500],"valid"],[[2501,2502],"disallowed"],[[2503,2504],"valid"],[[2505,2506],"disallowed"],[[2507,2509],"valid"],[[2510,2510],"valid"],[[2511,2518],"disallowed"],[[2519,2519],"valid"],[[2520,2523],"disallowed"],[[2524,2524],"mapped",[2465,2492]],[[2525,2525],"mapped",[2466,2492]],[[2526,2526],"disallowed"],[[2527,2527],"mapped",[2479,2492]],[[2528,2531],"valid"],[[2532,2533],"disallowed"],[[2534,2545],"valid"],[[2546,2554],"valid",[],"NV8"],[[2555,2555],"valid",[],"NV8"],[[2556,2560],"disallowed"],[[2561,2561],"valid"],[[2562,2562],"valid"],[[2563,2563],"valid"],[[2564,2564],"disallowed"],[[2565,2570],"valid"],[[2571,2574],"disallowed"],[[2575,2576],"valid"],[[2577,2578],"disallowed"],[[2579,2600],"valid"],[[2601,2601],"disallowed"],[[2602,2608],"valid"],[[2609,2609],"disallowed"],[[2610,2610],"valid"],[[2611,2611],"mapped",[2610,2620]],[[2612,2612],"disallowed"],[[2613,2613],"valid"],[[2614,2614],"mapped",[2616,2620]],[[2615,2615],"disallowed"],[[2616,2617],"valid"],[[2618,2619],"disallowed"],[[2620,2620],"valid"],[[2621,2621],"disallowed"],[[2622,2626],"valid"],[[2627,2630],"disallowed"],[[2631,2632],"valid"],[[2633,2634],"disallowed"],[[2635,2637],"valid"],[[2638,2640],"disallowed"],[[2641,2641],"valid"],[[2642,2648],"disallowed"],[[2649,2649],"mapped",[2582,2620]],[[2650,2650],"mapped",[2583,2620]],[[2651,2651],"mapped",[2588,2620]],[[2652,2652],"valid"],[[2653,2653],"disallowed"],[[2654,2654],"mapped",[2603,2620]],[[2655,2661],"disallowed"],[[2662,2676],"valid"],[[2677,2677],"valid"],[[2678,2688],"disallowed"],[[2689,2691],"valid"],[[2692,2692],"disallowed"],[[2693,2699],"valid"],[[2700,2700],"valid"],[[2701,2701],"valid"],[[2702,2702],"disallowed"],[[2703,2705],"valid"],[[2706,2706],"disallowed"],[[2707,2728],"valid"],[[2729,2729],"disallowed"],[[2730,2736],"valid"],[[2737,2737],"disallowed"],[[2738,2739],"valid"],[[2740,2740],"disallowed"],[[2741,2745],"valid"],[[2746,2747],"disallowed"],[[2748,2757],"valid"],[[2758,2758],"disallowed"],[[2759,2761],"valid"],[[2762,2762],"disallowed"],[[2763,2765],"valid"],[[2766,2767],"disallowed"],[[2768,2768],"valid"],[[2769,2783],"disallowed"],[[2784,2784],"valid"],[[2785,2787],"valid"],[[2788,2789],"disallowed"],[[2790,2799],"valid"],[[2800,2800],"valid",[],"NV8"],[[2801,2801],"valid",[],"NV8"],[[2802,2808],"disallowed"],[[2809,2809],"valid"],[[2810,2816],"disallowed"],[[2817,2819],"valid"],[[2820,2820],"disallowed"],[[2821,2828],"valid"],[[2829,2830],"disallowed"],[[2831,2832],"valid"],[[2833,2834],"disallowed"],[[2835,2856],"valid"],[[2857,2857],"disallowed"],[[2858,2864],"valid"],[[2865,2865],"disallowed"],[[2866,2867],"valid"],[[2868,2868],"disallowed"],[[2869,2869],"valid"],[[2870,2873],"valid"],[[2874,2875],"disallowed"],[[2876,2883],"valid"],[[2884,2884],"valid"],[[2885,2886],"disallowed"],[[2887,2888],"valid"],[[2889,2890],"disallowed"],[[2891,2893],"valid"],[[2894,2901],"disallowed"],[[2902,2903],"valid"],[[2904,2907],"disallowed"],[[2908,2908],"mapped",[2849,2876]],[[2909,2909],"mapped",[2850,2876]],[[2910,2910],"disallowed"],[[2911,2913],"valid"],[[2914,2915],"valid"],[[2916,2917],"disallowed"],[[2918,2927],"valid"],[[2928,2928],"valid",[],"NV8"],[[2929,2929],"valid"],[[2930,2935],"valid",[],"NV8"],[[2936,2945],"disallowed"],[[2946,2947],"valid"],[[2948,2948],"disallowed"],[[2949,2954],"valid"],[[2955,2957],"disallowed"],[[2958,2960],"valid"],[[2961,2961],"disallowed"],[[2962,2965],"valid"],[[2966,2968],"disallowed"],[[2969,2970],"valid"],[[2971,2971],"disallowed"],[[2972,2972],"valid"],[[2973,2973],"disallowed"],[[2974,2975],"valid"],[[2976,2978],"disallowed"],[[2979,2980],"valid"],[[2981,2983],"disallowed"],[[2984,2986],"valid"],[[2987,2989],"disallowed"],[[2990,2997],"valid"],[[2998,2998],"valid"],[[2999,3001],"valid"],[[3002,3005],"disallowed"],[[3006,3010],"valid"],[[3011,3013],"disallowed"],[[3014,3016],"valid"],[[3017,3017],"disallowed"],[[3018,3021],"valid"],[[3022,3023],"disallowed"],[[3024,3024],"valid"],[[3025,3030],"disallowed"],[[3031,3031],"valid"],[[3032,3045],"disallowed"],[[3046,3046],"valid"],[[3047,3055],"valid"],[[3056,3058],"valid",[],"NV8"],[[3059,3066],"valid",[],"NV8"],[[3067,3071],"disallowed"],[[3072,3072],"valid"],[[3073,3075],"valid"],[[3076,3076],"disallowed"],[[3077,3084],"valid"],[[3085,3085],"disallowed"],[[3086,3088],"valid"],[[3089,3089],"disallowed"],[[3090,3112],"valid"],[[3113,3113],"disallowed"],[[3114,3123],"valid"],[[3124,3124],"valid"],[[3125,3129],"valid"],[[3130,3132],"disallowed"],[[3133,3133],"valid"],[[3134,3140],"valid"],[[3141,3141],"disallowed"],[[3142,3144],"valid"],[[3145,3145],"disallowed"],[[3146,3149],"valid"],[[3150,3156],"disallowed"],[[3157,3158],"valid"],[[3159,3159],"disallowed"],[[3160,3161],"valid"],[[3162,3162],"valid"],[[3163,3167],"disallowed"],[[3168,3169],"valid"],[[3170,3171],"valid"],[[3172,3173],"disallowed"],[[3174,3183],"valid"],[[3184,3191],"disallowed"],[[3192,3199],"valid",[],"NV8"],[[3200,3200],"disallowed"],[[3201,3201],"valid"],[[3202,3203],"valid"],[[3204,3204],"disallowed"],[[3205,3212],"valid"],[[3213,3213],"disallowed"],[[3214,3216],"valid"],[[3217,3217],"disallowed"],[[3218,3240],"valid"],[[3241,3241],"disallowed"],[[3242,3251],"valid"],[[3252,3252],"disallowed"],[[3253,3257],"valid"],[[3258,3259],"disallowed"],[[3260,3261],"valid"],[[3262,3268],"valid"],[[3269,3269],"disallowed"],[[3270,3272],"valid"],[[3273,3273],"disallowed"],[[3274,3277],"valid"],[[3278,3284],"disallowed"],[[3285,3286],"valid"],[[3287,3293],"disallowed"],[[3294,3294],"valid"],[[3295,3295],"disallowed"],[[3296,3297],"valid"],[[3298,3299],"valid"],[[3300,3301],"disallowed"],[[3302,3311],"valid"],[[3312,3312],"disallowed"],[[3313,3314],"valid"],[[3315,3328],"disallowed"],[[3329,3329],"valid"],[[3330,3331],"valid"],[[3332,3332],"disallowed"],[[3333,3340],"valid"],[[3341,3341],"disallowed"],[[3342,3344],"valid"],[[3345,3345],"disallowed"],[[3346,3368],"valid"],[[3369,3369],"valid"],[[3370,3385],"valid"],[[3386,3386],"valid"],[[3387,3388],"disallowed"],[[3389,3389],"valid"],[[3390,3395],"valid"],[[3396,3396],"valid"],[[3397,3397],"disallowed"],[[3398,3400],"valid"],[[3401,3401],"disallowed"],[[3402,3405],"valid"],[[3406,3406],"valid"],[[3407,3414],"disallowed"],[[3415,3415],"valid"],[[3416,3422],"disallowed"],[[3423,3423],"valid"],[[3424,3425],"valid"],[[3426,3427],"valid"],[[3428,3429],"disallowed"],[[3430,3439],"valid"],[[3440,3445],"valid",[],"NV8"],[[3446,3448],"disallowed"],[[3449,3449],"valid",[],"NV8"],[[3450,3455],"valid"],[[3456,3457],"disallowed"],[[3458,3459],"valid"],[[3460,3460],"disallowed"],[[3461,3478],"valid"],[[3479,3481],"disallowed"],[[3482,3505],"valid"],[[3506,3506],"disallowed"],[[3507,3515],"valid"],[[3516,3516],"disallowed"],[[3517,3517],"valid"],[[3518,3519],"disallowed"],[[3520,3526],"valid"],[[3527,3529],"disallowed"],[[3530,3530],"valid"],[[3531,3534],"disallowed"],[[3535,3540],"valid"],[[3541,3541],"disallowed"],[[3542,3542],"valid"],[[3543,3543],"disallowed"],[[3544,3551],"valid"],[[3552,3557],"disallowed"],[[3558,3567],"valid"],[[3568,3569],"disallowed"],[[3570,3571],"valid"],[[3572,3572],"valid",[],"NV8"],[[3573,3584],"disallowed"],[[3585,3634],"valid"],[[3635,3635],"mapped",[3661,3634]],[[3636,3642],"valid"],[[3643,3646],"disallowed"],[[3647,3647],"valid",[],"NV8"],[[3648,3662],"valid"],[[3663,3663],"valid",[],"NV8"],[[3664,3673],"valid"],[[3674,3675],"valid",[],"NV8"],[[3676,3712],"disallowed"],[[3713,3714],"valid"],[[3715,3715],"disallowed"],[[3716,3716],"valid"],[[3717,3718],"disallowed"],[[3719,3720],"valid"],[[3721,3721],"disallowed"],[[3722,3722],"valid"],[[3723,3724],"disallowed"],[[3725,3725],"valid"],[[3726,3731],"disallowed"],[[3732,3735],"valid"],[[3736,3736],"disallowed"],[[3737,3743],"valid"],[[3744,3744],"disallowed"],[[3745,3747],"valid"],[[3748,3748],"disallowed"],[[3749,3749],"valid"],[[3750,3750],"disallowed"],[[3751,3751],"valid"],[[3752,3753],"disallowed"],[[3754,3755],"valid"],[[3756,3756],"disallowed"],[[3757,3762],"valid"],[[3763,3763],"mapped",[3789,3762]],[[3764,3769],"valid"],[[3770,3770],"disallowed"],[[3771,3773],"valid"],[[3774,3775],"disallowed"],[[3776,3780],"valid"],[[3781,3781],"disallowed"],[[3782,3782],"valid"],[[3783,3783],"disallowed"],[[3784,3789],"valid"],[[3790,3791],"disallowed"],[[3792,3801],"valid"],[[3802,3803],"disallowed"],[[3804,3804],"mapped",[3755,3737]],[[3805,3805],"mapped",[3755,3745]],[[3806,3807],"valid"],[[3808,3839],"disallowed"],[[3840,3840],"valid"],[[3841,3850],"valid",[],"NV8"],[[3851,3851],"valid"],[[3852,3852],"mapped",[3851]],[[3853,3863],"valid",[],"NV8"],[[3864,3865],"valid"],[[3866,3871],"valid",[],"NV8"],[[3872,3881],"valid"],[[3882,3892],"valid",[],"NV8"],[[3893,3893],"valid"],[[3894,3894],"valid",[],"NV8"],[[3895,3895],"valid"],[[3896,3896],"valid",[],"NV8"],[[3897,3897],"valid"],[[3898,3901],"valid",[],"NV8"],[[3902,3906],"valid"],[[3907,3907],"mapped",[3906,4023]],[[3908,3911],"valid"],[[3912,3912],"disallowed"],[[3913,3916],"valid"],[[3917,3917],"mapped",[3916,4023]],[[3918,3921],"valid"],[[3922,3922],"mapped",[3921,4023]],[[3923,3926],"valid"],[[3927,3927],"mapped",[3926,4023]],[[3928,3931],"valid"],[[3932,3932],"mapped",[3931,4023]],[[3933,3944],"valid"],[[3945,3945],"mapped",[3904,4021]],[[3946,3946],"valid"],[[3947,3948],"valid"],[[3949,3952],"disallowed"],[[3953,3954],"valid"],[[3955,3955],"mapped",[3953,3954]],[[3956,3956],"valid"],[[3957,3957],"mapped",[3953,3956]],[[3958,3958],"mapped",[4018,3968]],[[3959,3959],"mapped",[4018,3953,3968]],[[3960,3960],"mapped",[4019,3968]],[[3961,3961],"mapped",[4019,3953,3968]],[[3962,3968],"valid"],[[3969,3969],"mapped",[3953,3968]],[[3970,3972],"valid"],[[3973,3973],"valid",[],"NV8"],[[3974,3979],"valid"],[[3980,3983],"valid"],[[3984,3986],"valid"],[[3987,3987],"mapped",[3986,4023]],[[3988,3989],"valid"],[[3990,3990],"valid"],[[3991,3991],"valid"],[[3992,3992],"disallowed"],[[3993,3996],"valid"],[[3997,3997],"mapped",[3996,4023]],[[3998,4001],"valid"],[[4002,4002],"mapped",[4001,4023]],[[4003,4006],"valid"],[[4007,4007],"mapped",[4006,4023]],[[4008,4011],"valid"],[[4012,4012],"mapped",[4011,4023]],[[4013,4013],"valid"],[[4014,4016],"valid"],[[4017,4023],"valid"],[[4024,4024],"valid"],[[4025,4025],"mapped",[3984,4021]],[[4026,4028],"valid"],[[4029,4029],"disallowed"],[[4030,4037],"valid",[],"NV8"],[[4038,4038],"valid"],[[4039,4044],"valid",[],"NV8"],[[4045,4045],"disallowed"],[[4046,4046],"valid",[],"NV8"],[[4047,4047],"valid",[],"NV8"],[[4048,4049],"valid",[],"NV8"],[[4050,4052],"valid",[],"NV8"],[[4053,4056],"valid",[],"NV8"],[[4057,4058],"valid",[],"NV8"],[[4059,4095],"disallowed"],[[4096,4129],"valid"],[[4130,4130],"valid"],[[4131,4135],"valid"],[[4136,4136],"valid"],[[4137,4138],"valid"],[[4139,4139],"valid"],[[4140,4146],"valid"],[[4147,4149],"valid"],[[4150,4153],"valid"],[[4154,4159],"valid"],[[4160,4169],"valid"],[[4170,4175],"valid",[],"NV8"],[[4176,4185],"valid"],[[4186,4249],"valid"],[[4250,4253],"valid"],[[4254,4255],"valid",[],"NV8"],[[4256,4293],"disallowed"],[[4294,4294],"disallowed"],[[4295,4295],"mapped",[11559]],[[4296,4300],"disallowed"],[[4301,4301],"mapped",[11565]],[[4302,4303],"disallowed"],[[4304,4342],"valid"],[[4343,4344],"valid"],[[4345,4346],"valid"],[[4347,4347],"valid",[],"NV8"],[[4348,4348],"mapped",[4316]],[[4349,4351],"valid"],[[4352,4441],"valid",[],"NV8"],[[4442,4446],"valid",[],"NV8"],[[4447,4448],"disallowed"],[[4449,4514],"valid",[],"NV8"],[[4515,4519],"valid",[],"NV8"],[[4520,4601],"valid",[],"NV8"],[[4602,4607],"valid",[],"NV8"],[[4608,4614],"valid"],[[4615,4615],"valid"],[[4616,4678],"valid"],[[4679,4679],"valid"],[[4680,4680],"valid"],[[4681,4681],"disallowed"],[[4682,4685],"valid"],[[4686,4687],"disallowed"],[[4688,4694],"valid"],[[4695,4695],"disallowed"],[[4696,4696],"valid"],[[4697,4697],"disallowed"],[[4698,4701],"valid"],[[4702,4703],"disallowed"],[[4704,4742],"valid"],[[4743,4743],"valid"],[[4744,4744],"valid"],[[4745,4745],"disallowed"],[[4746,4749],"valid"],[[4750,4751],"disallowed"],[[4752,4782],"valid"],[[4783,4783],"valid"],[[4784,4784],"valid"],[[4785,4785],"disallowed"],[[4786,4789],"valid"],[[4790,4791],"disallowed"],[[4792,4798],"valid"],[[4799,4799],"disallowed"],[[4800,4800],"valid"],[[4801,4801],"disallowed"],[[4802,4805],"valid"],[[4806,4807],"disallowed"],[[4808,4814],"valid"],[[4815,4815],"valid"],[[4816,4822],"valid"],[[4823,4823],"disallowed"],[[4824,4846],"valid"],[[4847,4847],"valid"],[[4848,4878],"valid"],[[4879,4879],"valid"],[[4880,4880],"valid"],[[4881,4881],"disallowed"],[[4882,4885],"valid"],[[4886,4887],"disallowed"],[[4888,4894],"valid"],[[4895,4895],"valid"],[[4896,4934],"valid"],[[4935,4935],"valid"],[[4936,4954],"valid"],[[4955,4956],"disallowed"],[[4957,4958],"valid"],[[4959,4959],"valid"],[[4960,4960],"valid",[],"NV8"],[[4961,4988],"valid",[],"NV8"],[[4989,4991],"disallowed"],[[4992,5007],"valid"],[[5008,5017],"valid",[],"NV8"],[[5018,5023],"disallowed"],[[5024,5108],"valid"],[[5109,5109],"valid"],[[5110,5111],"disallowed"],[[5112,5112],"mapped",[5104]],[[5113,5113],"mapped",[5105]],[[5114,5114],"mapped",[5106]],[[5115,5115],"mapped",[5107]],[[5116,5116],"mapped",[5108]],[[5117,5117],"mapped",[5109]],[[5118,5119],"disallowed"],[[5120,5120],"valid",[],"NV8"],[[5121,5740],"valid"],[[5741,5742],"valid",[],"NV8"],[[5743,5750],"valid"],[[5751,5759],"valid"],[[5760,5760],"disallowed"],[[5761,5786],"valid"],[[5787,5788],"valid",[],"NV8"],[[5789,5791],"disallowed"],[[5792,5866],"valid"],[[5867,5872],"valid",[],"NV8"],[[5873,5880],"valid"],[[5881,5887],"disallowed"],[[5888,5900],"valid"],[[5901,5901],"disallowed"],[[5902,5908],"valid"],[[5909,5919],"disallowed"],[[5920,5940],"valid"],[[5941,5942],"valid",[],"NV8"],[[5943,5951],"disallowed"],[[5952,5971],"valid"],[[5972,5983],"disallowed"],[[5984,5996],"valid"],[[5997,5997],"disallowed"],[[5998,6000],"valid"],[[6001,6001],"disallowed"],[[6002,6003],"valid"],[[6004,6015],"disallowed"],[[6016,6067],"valid"],[[6068,6069],"disallowed"],[[6070,6099],"valid"],[[6100,6102],"valid",[],"NV8"],[[6103,6103],"valid"],[[6104,6107],"valid",[],"NV8"],[[6108,6108],"valid"],[[6109,6109],"valid"],[[6110,6111],"disallowed"],[[6112,6121],"valid"],[[6122,6127],"disallowed"],[[6128,6137],"valid",[],"NV8"],[[6138,6143],"disallowed"],[[6144,6149],"valid",[],"NV8"],[[6150,6150],"disallowed"],[[6151,6154],"valid",[],"NV8"],[[6155,6157],"ignored"],[[6158,6158],"disallowed"],[[6159,6159],"disallowed"],[[6160,6169],"valid"],[[6170,6175],"disallowed"],[[6176,6263],"valid"],[[6264,6271],"disallowed"],[[6272,6313],"valid"],[[6314,6314],"valid"],[[6315,6319],"disallowed"],[[6320,6389],"valid"],[[6390,6399],"disallowed"],[[6400,6428],"valid"],[[6429,6430],"valid"],[[6431,6431],"disallowed"],[[6432,6443],"valid"],[[6444,6447],"disallowed"],[[6448,6459],"valid"],[[6460,6463],"disallowed"],[[6464,6464],"valid",[],"NV8"],[[6465,6467],"disallowed"],[[6468,6469],"valid",[],"NV8"],[[6470,6509],"valid"],[[6510,6511],"disallowed"],[[6512,6516],"valid"],[[6517,6527],"disallowed"],[[6528,6569],"valid"],[[6570,6571],"valid"],[[6572,6575],"disallowed"],[[6576,6601],"valid"],[[6602,6607],"disallowed"],[[6608,6617],"valid"],[[6618,6618],"valid",[],"XV8"],[[6619,6621],"disallowed"],[[6622,6623],"valid",[],"NV8"],[[6624,6655],"valid",[],"NV8"],[[6656,6683],"valid"],[[6684,6685],"disallowed"],[[6686,6687],"valid",[],"NV8"],[[6688,6750],"valid"],[[6751,6751],"disallowed"],[[6752,6780],"valid"],[[6781,6782],"disallowed"],[[6783,6793],"valid"],[[6794,6799],"disallowed"],[[6800,6809],"valid"],[[6810,6815],"disallowed"],[[6816,6822],"valid",[],"NV8"],[[6823,6823],"valid"],[[6824,6829],"valid",[],"NV8"],[[6830,6831],"disallowed"],[[6832,6845],"valid"],[[6846,6846],"valid",[],"NV8"],[[6847,6911],"disallowed"],[[6912,6987],"valid"],[[6988,6991],"disallowed"],[[6992,7001],"valid"],[[7002,7018],"valid",[],"NV8"],[[7019,7027],"valid"],[[7028,7036],"valid",[],"NV8"],[[7037,7039],"disallowed"],[[7040,7082],"valid"],[[7083,7085],"valid"],[[7086,7097],"valid"],[[7098,7103],"valid"],[[7104,7155],"valid"],[[7156,7163],"disallowed"],[[7164,7167],"valid",[],"NV8"],[[7168,7223],"valid"],[[7224,7226],"disallowed"],[[7227,7231],"valid",[],"NV8"],[[7232,7241],"valid"],[[7242,7244],"disallowed"],[[7245,7293],"valid"],[[7294,7295],"valid",[],"NV8"],[[7296,7359],"disallowed"],[[7360,7367],"valid",[],"NV8"],[[7368,7375],"disallowed"],[[7376,7378],"valid"],[[7379,7379],"valid",[],"NV8"],[[7380,7410],"valid"],[[7411,7414],"valid"],[[7415,7415],"disallowed"],[[7416,7417],"valid"],[[7418,7423],"disallowed"],[[7424,7467],"valid"],[[7468,7468],"mapped",[97]],[[7469,7469],"mapped",[230]],[[7470,7470],"mapped",[98]],[[7471,7471],"valid"],[[7472,7472],"mapped",[100]],[[7473,7473],"mapped",[101]],[[7474,7474],"mapped",[477]],[[7475,7475],"mapped",[103]],[[7476,7476],"mapped",[104]],[[7477,7477],"mapped",[105]],[[7478,7478],"mapped",[106]],[[7479,7479],"mapped",[107]],[[7480,7480],"mapped",[108]],[[7481,7481],"mapped",[109]],[[7482,7482],"mapped",[110]],[[7483,7483],"valid"],[[7484,7484],"mapped",[111]],[[7485,7485],"mapped",[547]],[[7486,7486],"mapped",[112]],[[7487,7487],"mapped",[114]],[[7488,7488],"mapped",[116]],[[7489,7489],"mapped",[117]],[[7490,7490],"mapped",[119]],[[7491,7491],"mapped",[97]],[[7492,7492],"mapped",[592]],[[7493,7493],"mapped",[593]],[[7494,7494],"mapped",[7426]],[[7495,7495],"mapped",[98]],[[7496,7496],"mapped",[100]],[[7497,7497],"mapped",[101]],[[7498,7498],"mapped",[601]],[[7499,7499],"mapped",[603]],[[7500,7500],"mapped",[604]],[[7501,7501],"mapped",[103]],[[7502,7502],"valid"],[[7503,7503],"mapped",[107]],[[7504,7504],"mapped",[109]],[[7505,7505],"mapped",[331]],[[7506,7506],"mapped",[111]],[[7507,7507],"mapped",[596]],[[7508,7508],"mapped",[7446]],[[7509,7509],"mapped",[7447]],[[7510,7510],"mapped",[112]],[[7511,7511],"mapped",[116]],[[7512,7512],"mapped",[117]],[[7513,7513],"mapped",[7453]],[[7514,7514],"mapped",[623]],[[7515,7515],"mapped",[118]],[[7516,7516],"mapped",[7461]],[[7517,7517],"mapped",[946]],[[7518,7518],"mapped",[947]],[[7519,7519],"mapped",[948]],[[7520,7520],"mapped",[966]],[[7521,7521],"mapped",[967]],[[7522,7522],"mapped",[105]],[[7523,7523],"mapped",[114]],[[7524,7524],"mapped",[117]],[[7525,7525],"mapped",[118]],[[7526,7526],"mapped",[946]],[[7527,7527],"mapped",[947]],[[7528,7528],"mapped",[961]],[[7529,7529],"mapped",[966]],[[7530,7530],"mapped",[967]],[[7531,7531],"valid"],[[7532,7543],"valid"],[[7544,7544],"mapped",[1085]],[[7545,7578],"valid"],[[7579,7579],"mapped",[594]],[[7580,7580],"mapped",[99]],[[7581,7581],"mapped",[597]],[[7582,7582],"mapped",[240]],[[7583,7583],"mapped",[604]],[[7584,7584],"mapped",[102]],[[7585,7585],"mapped",[607]],[[7586,7586],"mapped",[609]],[[7587,7587],"mapped",[613]],[[7588,7588],"mapped",[616]],[[7589,7589],"mapped",[617]],[[7590,7590],"mapped",[618]],[[7591,7591],"mapped",[7547]],[[7592,7592],"mapped",[669]],[[7593,7593],"mapped",[621]],[[7594,7594],"mapped",[7557]],[[7595,7595],"mapped",[671]],[[7596,7596],"mapped",[625]],[[7597,7597],"mapped",[624]],[[7598,7598],"mapped",[626]],[[7599,7599],"mapped",[627]],[[7600,7600],"mapped",[628]],[[7601,7601],"mapped",[629]],[[7602,7602],"mapped",[632]],[[7603,7603],"mapped",[642]],[[7604,7604],"mapped",[643]],[[7605,7605],"mapped",[427]],[[7606,7606],"mapped",[649]],[[7607,7607],"mapped",[650]],[[7608,7608],"mapped",[7452]],[[7609,7609],"mapped",[651]],[[7610,7610],"mapped",[652]],[[7611,7611],"mapped",[122]],[[7612,7612],"mapped",[656]],[[7613,7613],"mapped",[657]],[[7614,7614],"mapped",[658]],[[7615,7615],"mapped",[952]],[[7616,7619],"valid"],[[7620,7626],"valid"],[[7627,7654],"valid"],[[7655,7669],"valid"],[[7670,7675],"disallowed"],[[7676,7676],"valid"],[[7677,7677],"valid"],[[7678,7679],"valid"],[[7680,7680],"mapped",[7681]],[[7681,7681],"valid"],[[7682,7682],"mapped",[7683]],[[7683,7683],"valid"],[[7684,7684],"mapped",[7685]],[[7685,7685],"valid"],[[7686,7686],"mapped",[7687]],[[7687,7687],"valid"],[[7688,7688],"mapped",[7689]],[[7689,7689],"valid"],[[7690,7690],"mapped",[7691]],[[7691,7691],"valid"],[[7692,7692],"mapped",[7693]],[[7693,7693],"valid"],[[7694,7694],"mapped",[7695]],[[7695,7695],"valid"],[[7696,7696],"mapped",[7697]],[[7697,7697],"valid"],[[7698,7698],"mapped",[7699]],[[7699,7699],"valid"],[[7700,7700],"mapped",[7701]],[[7701,7701],"valid"],[[7702,7702],"mapped",[7703]],[[7703,7703],"valid"],[[7704,7704],"mapped",[7705]],[[7705,7705],"valid"],[[7706,7706],"mapped",[7707]],[[7707,7707],"valid"],[[7708,7708],"mapped",[7709]],[[7709,7709],"valid"],[[7710,7710],"mapped",[7711]],[[7711,7711],"valid"],[[7712,7712],"mapped",[7713]],[[7713,7713],"valid"],[[7714,7714],"mapped",[7715]],[[7715,7715],"valid"],[[7716,7716],"mapped",[7717]],[[7717,7717],"valid"],[[7718,7718],"mapped",[7719]],[[7719,7719],"valid"],[[7720,7720],"mapped",[7721]],[[7721,7721],"valid"],[[7722,7722],"mapped",[7723]],[[7723,7723],"valid"],[[7724,7724],"mapped",[7725]],[[7725,7725],"valid"],[[7726,7726],"mapped",[7727]],[[7727,7727],"valid"],[[7728,7728],"mapped",[7729]],[[7729,7729],"valid"],[[7730,7730],"mapped",[7731]],[[7731,7731],"valid"],[[7732,7732],"mapped",[7733]],[[7733,7733],"valid"],[[7734,7734],"mapped",[7735]],[[7735,7735],"valid"],[[7736,7736],"mapped",[7737]],[[7737,7737],"valid"],[[7738,7738],"mapped",[7739]],[[7739,7739],"valid"],[[7740,7740],"mapped",[7741]],[[7741,7741],"valid"],[[7742,7742],"mapped",[7743]],[[7743,7743],"valid"],[[7744,7744],"mapped",[7745]],[[7745,7745],"valid"],[[7746,7746],"mapped",[7747]],[[7747,7747],"valid"],[[7748,7748],"mapped",[7749]],[[7749,7749],"valid"],[[7750,7750],"mapped",[7751]],[[7751,7751],"valid"],[[7752,7752],"mapped",[7753]],[[7753,7753],"valid"],[[7754,7754],"mapped",[7755]],[[7755,7755],"valid"],[[7756,7756],"mapped",[7757]],[[7757,7757],"valid"],[[7758,7758],"mapped",[7759]],[[7759,7759],"valid"],[[7760,7760],"mapped",[7761]],[[7761,7761],"valid"],[[7762,7762],"mapped",[7763]],[[7763,7763],"valid"],[[7764,7764],"mapped",[7765]],[[7765,7765],"valid"],[[7766,7766],"mapped",[7767]],[[7767,7767],"valid"],[[7768,7768],"mapped",[7769]],[[7769,7769],"valid"],[[7770,7770],"mapped",[7771]],[[7771,7771],"valid"],[[7772,7772],"mapped",[7773]],[[7773,7773],"valid"],[[7774,7774],"mapped",[7775]],[[7775,7775],"valid"],[[7776,7776],"mapped",[7777]],[[7777,7777],"valid"],[[7778,7778],"mapped",[7779]],[[7779,7779],"valid"],[[7780,7780],"mapped",[7781]],[[7781,7781],"valid"],[[7782,7782],"mapped",[7783]],[[7783,7783],"valid"],[[7784,7784],"mapped",[7785]],[[7785,7785],"valid"],[[7786,7786],"mapped",[7787]],[[7787,7787],"valid"],[[7788,7788],"mapped",[7789]],[[7789,7789],"valid"],[[7790,7790],"mapped",[7791]],[[7791,7791],"valid"],[[7792,7792],"mapped",[7793]],[[7793,7793],"valid"],[[7794,7794],"mapped",[7795]],[[7795,7795],"valid"],[[7796,7796],"mapped",[7797]],[[7797,7797],"valid"],[[7798,7798],"mapped",[7799]],[[7799,7799],"valid"],[[7800,7800],"mapped",[7801]],[[7801,7801],"valid"],[[7802,7802],"mapped",[7803]],[[7803,7803],"valid"],[[7804,7804],"mapped",[7805]],[[7805,7805],"valid"],[[7806,7806],"mapped",[7807]],[[7807,7807],"valid"],[[7808,7808],"mapped",[7809]],[[7809,7809],"valid"],[[7810,7810],"mapped",[7811]],[[7811,7811],"valid"],[[7812,7812],"mapped",[7813]],[[7813,7813],"valid"],[[7814,7814],"mapped",[7815]],[[7815,7815],"valid"],[[7816,7816],"mapped",[7817]],[[7817,7817],"valid"],[[7818,7818],"mapped",[7819]],[[7819,7819],"valid"],[[7820,7820],"mapped",[7821]],[[7821,7821],"valid"],[[7822,7822],"mapped",[7823]],[[7823,7823],"valid"],[[7824,7824],"mapped",[7825]],[[7825,7825],"valid"],[[7826,7826],"mapped",[7827]],[[7827,7827],"valid"],[[7828,7828],"mapped",[7829]],[[7829,7833],"valid"],[[7834,7834],"mapped",[97,702]],[[7835,7835],"mapped",[7777]],[[7836,7837],"valid"],[[7838,7838],"mapped",[115,115]],[[7839,7839],"valid"],[[7840,7840],"mapped",[7841]],[[7841,7841],"valid"],[[7842,7842],"mapped",[7843]],[[7843,7843],"valid"],[[7844,7844],"mapped",[7845]],[[7845,7845],"valid"],[[7846,7846],"mapped",[7847]],[[7847,7847],"valid"],[[7848,7848],"mapped",[7849]],[[7849,7849],"valid"],[[7850,7850],"mapped",[7851]],[[7851,7851],"valid"],[[7852,7852],"mapped",[7853]],[[7853,7853],"valid"],[[7854,7854],"mapped",[7855]],[[7855,7855],"valid"],[[7856,7856],"mapped",[7857]],[[7857,7857],"valid"],[[7858,7858],"mapped",[7859]],[[7859,7859],"valid"],[[7860,7860],"mapped",[7861]],[[7861,7861],"valid"],[[7862,7862],"mapped",[7863]],[[7863,7863],"valid"],[[7864,7864],"mapped",[7865]],[[7865,7865],"valid"],[[7866,7866],"mapped",[7867]],[[7867,7867],"valid"],[[7868,7868],"mapped",[7869]],[[7869,7869],"valid"],[[7870,7870],"mapped",[7871]],[[7871,7871],"valid"],[[7872,7872],"mapped",[7873]],[[7873,7873],"valid"],[[7874,7874],"mapped",[7875]],[[7875,7875],"valid"],[[7876,7876],"mapped",[7877]],[[7877,7877],"valid"],[[7878,7878],"mapped",[7879]],[[7879,7879],"valid"],[[7880,7880],"mapped",[7881]],[[7881,7881],"valid"],[[7882,7882],"mapped",[7883]],[[7883,7883],"valid"],[[7884,7884],"mapped",[7885]],[[7885,7885],"valid"],[[7886,7886],"mapped",[7887]],[[7887,7887],"valid"],[[7888,7888],"mapped",[7889]],[[7889,7889],"valid"],[[7890,7890],"mapped",[7891]],[[7891,7891],"valid"],[[7892,7892],"mapped",[7893]],[[7893,7893],"valid"],[[7894,7894],"mapped",[7895]],[[7895,7895],"valid"],[[7896,7896],"mapped",[7897]],[[7897,7897],"valid"],[[7898,7898],"mapped",[7899]],[[7899,7899],"valid"],[[7900,7900],"mapped",[7901]],[[7901,7901],"valid"],[[7902,7902],"mapped",[7903]],[[7903,7903],"valid"],[[7904,7904],"mapped",[7905]],[[7905,7905],"valid"],[[7906,7906],"mapped",[7907]],[[7907,7907],"valid"],[[7908,7908],"mapped",[7909]],[[7909,7909],"valid"],[[7910,7910],"mapped",[7911]],[[7911,7911],"valid"],[[7912,7912],"mapped",[7913]],[[7913,7913],"valid"],[[7914,7914],"mapped",[7915]],[[7915,7915],"valid"],[[7916,7916],"mapped",[7917]],[[7917,7917],"valid"],[[7918,7918],"mapped",[7919]],[[7919,7919],"valid"],[[7920,7920],"mapped",[7921]],[[7921,7921],"valid"],[[7922,7922],"mapped",[7923]],[[7923,7923],"valid"],[[7924,7924],"mapped",[7925]],[[7925,7925],"valid"],[[7926,7926],"mapped",[7927]],[[7927,7927],"valid"],[[7928,7928],"mapped",[7929]],[[7929,7929],"valid"],[[7930,7930],"mapped",[7931]],[[7931,7931],"valid"],[[7932,7932],"mapped",[7933]],[[7933,7933],"valid"],[[7934,7934],"mapped",[7935]],[[7935,7935],"valid"],[[7936,7943],"valid"],[[7944,7944],"mapped",[7936]],[[7945,7945],"mapped",[7937]],[[7946,7946],"mapped",[7938]],[[7947,7947],"mapped",[7939]],[[7948,7948],"mapped",[7940]],[[7949,7949],"mapped",[7941]],[[7950,7950],"mapped",[7942]],[[7951,7951],"mapped",[7943]],[[7952,7957],"valid"],[[7958,7959],"disallowed"],[[7960,7960],"mapped",[7952]],[[7961,7961],"mapped",[7953]],[[7962,7962],"mapped",[7954]],[[7963,7963],"mapped",[7955]],[[7964,7964],"mapped",[7956]],[[7965,7965],"mapped",[7957]],[[7966,7967],"disallowed"],[[7968,7975],"valid"],[[7976,7976],"mapped",[7968]],[[7977,7977],"mapped",[7969]],[[7978,7978],"mapped",[7970]],[[7979,7979],"mapped",[7971]],[[7980,7980],"mapped",[7972]],[[7981,7981],"mapped",[7973]],[[7982,7982],"mapped",[7974]],[[7983,7983],"mapped",[7975]],[[7984,7991],"valid"],[[7992,7992],"mapped",[7984]],[[7993,7993],"mapped",[7985]],[[7994,7994],"mapped",[7986]],[[7995,7995],"mapped",[7987]],[[7996,7996],"mapped",[7988]],[[7997,7997],"mapped",[7989]],[[7998,7998],"mapped",[7990]],[[7999,7999],"mapped",[7991]],[[8000,8005],"valid"],[[8006,8007],"disallowed"],[[8008,8008],"mapped",[8000]],[[8009,8009],"mapped",[8001]],[[8010,8010],"mapped",[8002]],[[8011,8011],"mapped",[8003]],[[8012,8012],"mapped",[8004]],[[8013,8013],"mapped",[8005]],[[8014,8015],"disallowed"],[[8016,8023],"valid"],[[8024,8024],"disallowed"],[[8025,8025],"mapped",[8017]],[[8026,8026],"disallowed"],[[8027,8027],"mapped",[8019]],[[8028,8028],"disallowed"],[[8029,8029],"mapped",[8021]],[[8030,8030],"disallowed"],[[8031,8031],"mapped",[8023]],[[8032,8039],"valid"],[[8040,8040],"mapped",[8032]],[[8041,8041],"mapped",[8033]],[[8042,8042],"mapped",[8034]],[[8043,8043],"mapped",[8035]],[[8044,8044],"mapped",[8036]],[[8045,8045],"mapped",[8037]],[[8046,8046],"mapped",[8038]],[[8047,8047],"mapped",[8039]],[[8048,8048],"valid"],[[8049,8049],"mapped",[940]],[[8050,8050],"valid"],[[8051,8051],"mapped",[941]],[[8052,8052],"valid"],[[8053,8053],"mapped",[942]],[[8054,8054],"valid"],[[8055,8055],"mapped",[943]],[[8056,8056],"valid"],[[8057,8057],"mapped",[972]],[[8058,8058],"valid"],[[8059,8059],"mapped",[973]],[[8060,8060],"valid"],[[8061,8061],"mapped",[974]],[[8062,8063],"disallowed"],[[8064,8064],"mapped",[7936,953]],[[8065,8065],"mapped",[7937,953]],[[8066,8066],"mapped",[7938,953]],[[8067,8067],"mapped",[7939,953]],[[8068,8068],"mapped",[7940,953]],[[8069,8069],"mapped",[7941,953]],[[8070,8070],"mapped",[7942,953]],[[8071,8071],"mapped",[7943,953]],[[8072,8072],"mapped",[7936,953]],[[8073,8073],"mapped",[7937,953]],[[8074,8074],"mapped",[7938,953]],[[8075,8075],"mapped",[7939,953]],[[8076,8076],"mapped",[7940,953]],[[8077,8077],"mapped",[7941,953]],[[8078,8078],"mapped",[7942,953]],[[8079,8079],"mapped",[7943,953]],[[8080,8080],"mapped",[7968,953]],[[8081,8081],"mapped",[7969,953]],[[8082,8082],"mapped",[7970,953]],[[8083,8083],"mapped",[7971,953]],[[8084,8084],"mapped",[7972,953]],[[8085,8085],"mapped",[7973,953]],[[8086,8086],"mapped",[7974,953]],[[8087,8087],"mapped",[7975,953]],[[8088,8088],"mapped",[7968,953]],[[8089,8089],"mapped",[7969,953]],[[8090,8090],"mapped",[7970,953]],[[8091,8091],"mapped",[7971,953]],[[8092,8092],"mapped",[7972,953]],[[8093,8093],"mapped",[7973,953]],[[8094,8094],"mapped",[7974,953]],[[8095,8095],"mapped",[7975,953]],[[8096,8096],"mapped",[8032,953]],[[8097,8097],"mapped",[8033,953]],[[8098,8098],"mapped",[8034,953]],[[8099,8099],"mapped",[8035,953]],[[8100,8100],"mapped",[8036,953]],[[8101,8101],"mapped",[8037,953]],[[8102,8102],"mapped",[8038,953]],[[8103,8103],"mapped",[8039,953]],[[8104,8104],"mapped",[8032,953]],[[8105,8105],"mapped",[8033,953]],[[8106,8106],"mapped",[8034,953]],[[8107,8107],"mapped",[8035,953]],[[8108,8108],"mapped",[8036,953]],[[8109,8109],"mapped",[8037,953]],[[8110,8110],"mapped",[8038,953]],[[8111,8111],"mapped",[8039,953]],[[8112,8113],"valid"],[[8114,8114],"mapped",[8048,953]],[[8115,8115],"mapped",[945,953]],[[8116,8116],"mapped",[940,953]],[[8117,8117],"disallowed"],[[8118,8118],"valid"],[[8119,8119],"mapped",[8118,953]],[[8120,8120],"mapped",[8112]],[[8121,8121],"mapped",[8113]],[[8122,8122],"mapped",[8048]],[[8123,8123],"mapped",[940]],[[8124,8124],"mapped",[945,953]],[[8125,8125],"disallowed_STD3_mapped",[32,787]],[[8126,8126],"mapped",[953]],[[8127,8127],"disallowed_STD3_mapped",[32,787]],[[8128,8128],"disallowed_STD3_mapped",[32,834]],[[8129,8129],"disallowed_STD3_mapped",[32,776,834]],[[8130,8130],"mapped",[8052,953]],[[8131,8131],"mapped",[951,953]],[[8132,8132],"mapped",[942,953]],[[8133,8133],"disallowed"],[[8134,8134],"valid"],[[8135,8135],"mapped",[8134,953]],[[8136,8136],"mapped",[8050]],[[8137,8137],"mapped",[941]],[[8138,8138],"mapped",[8052]],[[8139,8139],"mapped",[942]],[[8140,8140],"mapped",[951,953]],[[8141,8141],"disallowed_STD3_mapped",[32,787,768]],[[8142,8142],"disallowed_STD3_mapped",[32,787,769]],[[8143,8143],"disallowed_STD3_mapped",[32,787,834]],[[8144,8146],"valid"],[[8147,8147],"mapped",[912]],[[8148,8149],"disallowed"],[[8150,8151],"valid"],[[8152,8152],"mapped",[8144]],[[8153,8153],"mapped",[8145]],[[8154,8154],"mapped",[8054]],[[8155,8155],"mapped",[943]],[[8156,8156],"disallowed"],[[8157,8157],"disallowed_STD3_mapped",[32,788,768]],[[8158,8158],"disallowed_STD3_mapped",[32,788,769]],[[8159,8159],"disallowed_STD3_mapped",[32,788,834]],[[8160,8162],"valid"],[[8163,8163],"mapped",[944]],[[8164,8167],"valid"],[[8168,8168],"mapped",[8160]],[[8169,8169],"mapped",[8161]],[[8170,8170],"mapped",[8058]],[[8171,8171],"mapped",[973]],[[8172,8172],"mapped",[8165]],[[8173,8173],"disallowed_STD3_mapped",[32,776,768]],[[8174,8174],"disallowed_STD3_mapped",[32,776,769]],[[8175,8175],"disallowed_STD3_mapped",[96]],[[8176,8177],"disallowed"],[[8178,8178],"mapped",[8060,953]],[[8179,8179],"mapped",[969,953]],[[8180,8180],"mapped",[974,953]],[[8181,8181],"disallowed"],[[8182,8182],"valid"],[[8183,8183],"mapped",[8182,953]],[[8184,8184],"mapped",[8056]],[[8185,8185],"mapped",[972]],[[8186,8186],"mapped",[8060]],[[8187,8187],"mapped",[974]],[[8188,8188],"mapped",[969,953]],[[8189,8189],"disallowed_STD3_mapped",[32,769]],[[8190,8190],"disallowed_STD3_mapped",[32,788]],[[8191,8191],"disallowed"],[[8192,8202],"disallowed_STD3_mapped",[32]],[[8203,8203],"ignored"],[[8204,8205],"deviation",[]],[[8206,8207],"disallowed"],[[8208,8208],"valid",[],"NV8"],[[8209,8209],"mapped",[8208]],[[8210,8214],"valid",[],"NV8"],[[8215,8215],"disallowed_STD3_mapped",[32,819]],[[8216,8227],"valid",[],"NV8"],[[8228,8230],"disallowed"],[[8231,8231],"valid",[],"NV8"],[[8232,8238],"disallowed"],[[8239,8239],"disallowed_STD3_mapped",[32]],[[8240,8242],"valid",[],"NV8"],[[8243,8243],"mapped",[8242,8242]],[[8244,8244],"mapped",[8242,8242,8242]],[[8245,8245],"valid",[],"NV8"],[[8246,8246],"mapped",[8245,8245]],[[8247,8247],"mapped",[8245,8245,8245]],[[8248,8251],"valid",[],"NV8"],[[8252,8252],"disallowed_STD3_mapped",[33,33]],[[8253,8253],"valid",[],"NV8"],[[8254,8254],"disallowed_STD3_mapped",[32,773]],[[8255,8262],"valid",[],"NV8"],[[8263,8263],"disallowed_STD3_mapped",[63,63]],[[8264,8264],"disallowed_STD3_mapped",[63,33]],[[8265,8265],"disallowed_STD3_mapped",[33,63]],[[8266,8269],"valid",[],"NV8"],[[8270,8274],"valid",[],"NV8"],[[8275,8276],"valid",[],"NV8"],[[8277,8278],"valid",[],"NV8"],[[8279,8279],"mapped",[8242,8242,8242,8242]],[[8280,8286],"valid",[],"NV8"],[[8287,8287],"disallowed_STD3_mapped",[32]],[[8288,8288],"ignored"],[[8289,8291],"disallowed"],[[8292,8292],"ignored"],[[8293,8293],"disallowed"],[[8294,8297],"disallowed"],[[8298,8303],"disallowed"],[[8304,8304],"mapped",[48]],[[8305,8305],"mapped",[105]],[[8306,8307],"disallowed"],[[8308,8308],"mapped",[52]],[[8309,8309],"mapped",[53]],[[8310,8310],"mapped",[54]],[[8311,8311],"mapped",[55]],[[8312,8312],"mapped",[56]],[[8313,8313],"mapped",[57]],[[8314,8314],"disallowed_STD3_mapped",[43]],[[8315,8315],"mapped",[8722]],[[8316,8316],"disallowed_STD3_mapped",[61]],[[8317,8317],"disallowed_STD3_mapped",[40]],[[8318,8318],"disallowed_STD3_mapped",[41]],[[8319,8319],"mapped",[110]],[[8320,8320],"mapped",[48]],[[8321,8321],"mapped",[49]],[[8322,8322],"mapped",[50]],[[8323,8323],"mapped",[51]],[[8324,8324],"mapped",[52]],[[8325,8325],"mapped",[53]],[[8326,8326],"mapped",[54]],[[8327,8327],"mapped",[55]],[[8328,8328],"mapped",[56]],[[8329,8329],"mapped",[57]],[[8330,8330],"disallowed_STD3_mapped",[43]],[[8331,8331],"mapped",[8722]],[[8332,8332],"disallowed_STD3_mapped",[61]],[[8333,8333],"disallowed_STD3_mapped",[40]],[[8334,8334],"disallowed_STD3_mapped",[41]],[[8335,8335],"disallowed"],[[8336,8336],"mapped",[97]],[[8337,8337],"mapped",[101]],[[8338,8338],"mapped",[111]],[[8339,8339],"mapped",[120]],[[8340,8340],"mapped",[601]],[[8341,8341],"mapped",[104]],[[8342,8342],"mapped",[107]],[[8343,8343],"mapped",[108]],[[8344,8344],"mapped",[109]],[[8345,8345],"mapped",[110]],[[8346,8346],"mapped",[112]],[[8347,8347],"mapped",[115]],[[8348,8348],"mapped",[116]],[[8349,8351],"disallowed"],[[8352,8359],"valid",[],"NV8"],[[8360,8360],"mapped",[114,115]],[[8361,8362],"valid",[],"NV8"],[[8363,8363],"valid",[],"NV8"],[[8364,8364],"valid",[],"NV8"],[[8365,8367],"valid",[],"NV8"],[[8368,8369],"valid",[],"NV8"],[[8370,8373],"valid",[],"NV8"],[[8374,8376],"valid",[],"NV8"],[[8377,8377],"valid",[],"NV8"],[[8378,8378],"valid",[],"NV8"],[[8379,8381],"valid",[],"NV8"],[[8382,8382],"valid",[],"NV8"],[[8383,8399],"disallowed"],[[8400,8417],"valid",[],"NV8"],[[8418,8419],"valid",[],"NV8"],[[8420,8426],"valid",[],"NV8"],[[8427,8427],"valid",[],"NV8"],[[8428,8431],"valid",[],"NV8"],[[8432,8432],"valid",[],"NV8"],[[8433,8447],"disallowed"],[[8448,8448],"disallowed_STD3_mapped",[97,47,99]],[[8449,8449],"disallowed_STD3_mapped",[97,47,115]],[[8450,8450],"mapped",[99]],[[8451,8451],"mapped",[176,99]],[[8452,8452],"valid",[],"NV8"],[[8453,8453],"disallowed_STD3_mapped",[99,47,111]],[[8454,8454],"disallowed_STD3_mapped",[99,47,117]],[[8455,8455],"mapped",[603]],[[8456,8456],"valid",[],"NV8"],[[8457,8457],"mapped",[176,102]],[[8458,8458],"mapped",[103]],[[8459,8462],"mapped",[104]],[[8463,8463],"mapped",[295]],[[8464,8465],"mapped",[105]],[[8466,8467],"mapped",[108]],[[8468,8468],"valid",[],"NV8"],[[8469,8469],"mapped",[110]],[[8470,8470],"mapped",[110,111]],[[8471,8472],"valid",[],"NV8"],[[8473,8473],"mapped",[112]],[[8474,8474],"mapped",[113]],[[8475,8477],"mapped",[114]],[[8478,8479],"valid",[],"NV8"],[[8480,8480],"mapped",[115,109]],[[8481,8481],"mapped",[116,101,108]],[[8482,8482],"mapped",[116,109]],[[8483,8483],"valid",[],"NV8"],[[8484,8484],"mapped",[122]],[[8485,8485],"valid",[],"NV8"],[[8486,8486],"mapped",[969]],[[8487,8487],"valid",[],"NV8"],[[8488,8488],"mapped",[122]],[[8489,8489],"valid",[],"NV8"],[[8490,8490],"mapped",[107]],[[8491,8491],"mapped",[229]],[[8492,8492],"mapped",[98]],[[8493,8493],"mapped",[99]],[[8494,8494],"valid",[],"NV8"],[[8495,8496],"mapped",[101]],[[8497,8497],"mapped",[102]],[[8498,8498],"disallowed"],[[8499,8499],"mapped",[109]],[[8500,8500],"mapped",[111]],[[8501,8501],"mapped",[1488]],[[8502,8502],"mapped",[1489]],[[8503,8503],"mapped",[1490]],[[8504,8504],"mapped",[1491]],[[8505,8505],"mapped",[105]],[[8506,8506],"valid",[],"NV8"],[[8507,8507],"mapped",[102,97,120]],[[8508,8508],"mapped",[960]],[[8509,8510],"mapped",[947]],[[8511,8511],"mapped",[960]],[[8512,8512],"mapped",[8721]],[[8513,8516],"valid",[],"NV8"],[[8517,8518],"mapped",[100]],[[8519,8519],"mapped",[101]],[[8520,8520],"mapped",[105]],[[8521,8521],"mapped",[106]],[[8522,8523],"valid",[],"NV8"],[[8524,8524],"valid",[],"NV8"],[[8525,8525],"valid",[],"NV8"],[[8526,8526],"valid"],[[8527,8527],"valid",[],"NV8"],[[8528,8528],"mapped",[49,8260,55]],[[8529,8529],"mapped",[49,8260,57]],[[8530,8530],"mapped",[49,8260,49,48]],[[8531,8531],"mapped",[49,8260,51]],[[8532,8532],"mapped",[50,8260,51]],[[8533,8533],"mapped",[49,8260,53]],[[8534,8534],"mapped",[50,8260,53]],[[8535,8535],"mapped",[51,8260,53]],[[8536,8536],"mapped",[52,8260,53]],[[8537,8537],"mapped",[49,8260,54]],[[8538,8538],"mapped",[53,8260,54]],[[8539,8539],"mapped",[49,8260,56]],[[8540,8540],"mapped",[51,8260,56]],[[8541,8541],"mapped",[53,8260,56]],[[8542,8542],"mapped",[55,8260,56]],[[8543,8543],"mapped",[49,8260]],[[8544,8544],"mapped",[105]],[[8545,8545],"mapped",[105,105]],[[8546,8546],"mapped",[105,105,105]],[[8547,8547],"mapped",[105,118]],[[8548,8548],"mapped",[118]],[[8549,8549],"mapped",[118,105]],[[8550,8550],"mapped",[118,105,105]],[[8551,8551],"mapped",[118,105,105,105]],[[8552,8552],"mapped",[105,120]],[[8553,8553],"mapped",[120]],[[8554,8554],"mapped",[120,105]],[[8555,8555],"mapped",[120,105,105]],[[8556,8556],"mapped",[108]],[[8557,8557],"mapped",[99]],[[8558,8558],"mapped",[100]],[[8559,8559],"mapped",[109]],[[8560,8560],"mapped",[105]],[[8561,8561],"mapped",[105,105]],[[8562,8562],"mapped",[105,105,105]],[[8563,8563],"mapped",[105,118]],[[8564,8564],"mapped",[118]],[[8565,8565],"mapped",[118,105]],[[8566,8566],"mapped",[118,105,105]],[[8567,8567],"mapped",[118,105,105,105]],[[8568,8568],"mapped",[105,120]],[[8569,8569],"mapped",[120]],[[8570,8570],"mapped",[120,105]],[[8571,8571],"mapped",[120,105,105]],[[8572,8572],"mapped",[108]],[[8573,8573],"mapped",[99]],[[8574,8574],"mapped",[100]],[[8575,8575],"mapped",[109]],[[8576,8578],"valid",[],"NV8"],[[8579,8579],"disallowed"],[[8580,8580],"valid"],[[8581,8584],"valid",[],"NV8"],[[8585,8585],"mapped",[48,8260,51]],[[8586,8587],"valid",[],"NV8"],[[8588,8591],"disallowed"],[[8592,8682],"valid",[],"NV8"],[[8683,8691],"valid",[],"NV8"],[[8692,8703],"valid",[],"NV8"],[[8704,8747],"valid",[],"NV8"],[[8748,8748],"mapped",[8747,8747]],[[8749,8749],"mapped",[8747,8747,8747]],[[8750,8750],"valid",[],"NV8"],[[8751,8751],"mapped",[8750,8750]],[[8752,8752],"mapped",[8750,8750,8750]],[[8753,8799],"valid",[],"NV8"],[[8800,8800],"disallowed_STD3_valid"],[[8801,8813],"valid",[],"NV8"],[[8814,8815],"disallowed_STD3_valid"],[[8816,8945],"valid",[],"NV8"],[[8946,8959],"valid",[],"NV8"],[[8960,8960],"valid",[],"NV8"],[[8961,8961],"valid",[],"NV8"],[[8962,9000],"valid",[],"NV8"],[[9001,9001],"mapped",[12296]],[[9002,9002],"mapped",[12297]],[[9003,9082],"valid",[],"NV8"],[[9083,9083],"valid",[],"NV8"],[[9084,9084],"valid",[],"NV8"],[[9085,9114],"valid",[],"NV8"],[[9115,9166],"valid",[],"NV8"],[[9167,9168],"valid",[],"NV8"],[[9169,9179],"valid",[],"NV8"],[[9180,9191],"valid",[],"NV8"],[[9192,9192],"valid",[],"NV8"],[[9193,9203],"valid",[],"NV8"],[[9204,9210],"valid",[],"NV8"],[[9211,9215],"disallowed"],[[9216,9252],"valid",[],"NV8"],[[9253,9254],"valid",[],"NV8"],[[9255,9279],"disallowed"],[[9280,9290],"valid",[],"NV8"],[[9291,9311],"disallowed"],[[9312,9312],"mapped",[49]],[[9313,9313],"mapped",[50]],[[9314,9314],"mapped",[51]],[[9315,9315],"mapped",[52]],[[9316,9316],"mapped",[53]],[[9317,9317],"mapped",[54]],[[9318,9318],"mapped",[55]],[[9319,9319],"mapped",[56]],[[9320,9320],"mapped",[57]],[[9321,9321],"mapped",[49,48]],[[9322,9322],"mapped",[49,49]],[[9323,9323],"mapped",[49,50]],[[9324,9324],"mapped",[49,51]],[[9325,9325],"mapped",[49,52]],[[9326,9326],"mapped",[49,53]],[[9327,9327],"mapped",[49,54]],[[9328,9328],"mapped",[49,55]],[[9329,9329],"mapped",[49,56]],[[9330,9330],"mapped",[49,57]],[[9331,9331],"mapped",[50,48]],[[9332,9332],"disallowed_STD3_mapped",[40,49,41]],[[9333,9333],"disallowed_STD3_mapped",[40,50,41]],[[9334,9334],"disallowed_STD3_mapped",[40,51,41]],[[9335,9335],"disallowed_STD3_mapped",[40,52,41]],[[9336,9336],"disallowed_STD3_mapped",[40,53,41]],[[9337,9337],"disallowed_STD3_mapped",[40,54,41]],[[9338,9338],"disallowed_STD3_mapped",[40,55,41]],[[9339,9339],"disallowed_STD3_mapped",[40,56,41]],[[9340,9340],"disallowed_STD3_mapped",[40,57,41]],[[9341,9341],"disallowed_STD3_mapped",[40,49,48,41]],[[9342,9342],"disallowed_STD3_mapped",[40,49,49,41]],[[9343,9343],"disallowed_STD3_mapped",[40,49,50,41]],[[9344,9344],"disallowed_STD3_mapped",[40,49,51,41]],[[9345,9345],"disallowed_STD3_mapped",[40,49,52,41]],[[9346,9346],"disallowed_STD3_mapped",[40,49,53,41]],[[9347,9347],"disallowed_STD3_mapped",[40,49,54,41]],[[9348,9348],"disallowed_STD3_mapped",[40,49,55,41]],[[9349,9349],"disallowed_STD3_mapped",[40,49,56,41]],[[9350,9350],"disallowed_STD3_mapped",[40,49,57,41]],[[9351,9351],"disallowed_STD3_mapped",[40,50,48,41]],[[9352,9371],"disallowed"],[[9372,9372],"disallowed_STD3_mapped",[40,97,41]],[[9373,9373],"disallowed_STD3_mapped",[40,98,41]],[[9374,9374],"disallowed_STD3_mapped",[40,99,41]],[[9375,9375],"disallowed_STD3_mapped",[40,100,41]],[[9376,9376],"disallowed_STD3_mapped",[40,101,41]],[[9377,9377],"disallowed_STD3_mapped",[40,102,41]],[[9378,9378],"disallowed_STD3_mapped",[40,103,41]],[[9379,9379],"disallowed_STD3_mapped",[40,104,41]],[[9380,9380],"disallowed_STD3_mapped",[40,105,41]],[[9381,9381],"disallowed_STD3_mapped",[40,106,41]],[[9382,9382],"disallowed_STD3_mapped",[40,107,41]],[[9383,9383],"disallowed_STD3_mapped",[40,108,41]],[[9384,9384],"disallowed_STD3_mapped",[40,109,41]],[[9385,9385],"disallowed_STD3_mapped",[40,110,41]],[[9386,9386],"disallowed_STD3_mapped",[40,111,41]],[[9387,9387],"disallowed_STD3_mapped",[40,112,41]],[[9388,9388],"disallowed_STD3_mapped",[40,113,41]],[[9389,9389],"disallowed_STD3_mapped",[40,114,41]],[[9390,9390],"disallowed_STD3_mapped",[40,115,41]],[[9391,9391],"disallowed_STD3_mapped",[40,116,41]],[[9392,9392],"disallowed_STD3_mapped",[40,117,41]],[[9393,9393],"disallowed_STD3_mapped",[40,118,41]],[[9394,9394],"disallowed_STD3_mapped",[40,119,41]],[[9395,9395],"disallowed_STD3_mapped",[40,120,41]],[[9396,9396],"disallowed_STD3_mapped",[40,121,41]],[[9397,9397],"disallowed_STD3_mapped",[40,122,41]],[[9398,9398],"mapped",[97]],[[9399,9399],"mapped",[98]],[[9400,9400],"mapped",[99]],[[9401,9401],"mapped",[100]],[[9402,9402],"mapped",[101]],[[9403,9403],"mapped",[102]],[[9404,9404],"mapped",[103]],[[9405,9405],"mapped",[104]],[[9406,9406],"mapped",[105]],[[9407,9407],"mapped",[106]],[[9408,9408],"mapped",[107]],[[9409,9409],"mapped",[108]],[[9410,9410],"mapped",[109]],[[9411,9411],"mapped",[110]],[[9412,9412],"mapped",[111]],[[9413,9413],"mapped",[112]],[[9414,9414],"mapped",[113]],[[9415,9415],"mapped",[114]],[[9416,9416],"mapped",[115]],[[9417,9417],"mapped",[116]],[[9418,9418],"mapped",[117]],[[9419,9419],"mapped",[118]],[[9420,9420],"mapped",[119]],[[9421,9421],"mapped",[120]],[[9422,9422],"mapped",[121]],[[9423,9423],"mapped",[122]],[[9424,9424],"mapped",[97]],[[9425,9425],"mapped",[98]],[[9426,9426],"mapped",[99]],[[9427,9427],"mapped",[100]],[[9428,9428],"mapped",[101]],[[9429,9429],"mapped",[102]],[[9430,9430],"mapped",[103]],[[9431,9431],"mapped",[104]],[[9432,9432],"mapped",[105]],[[9433,9433],"mapped",[106]],[[9434,9434],"mapped",[107]],[[9435,9435],"mapped",[108]],[[9436,9436],"mapped",[109]],[[9437,9437],"mapped",[110]],[[9438,9438],"mapped",[111]],[[9439,9439],"mapped",[112]],[[9440,9440],"mapped",[113]],[[9441,9441],"mapped",[114]],[[9442,9442],"mapped",[115]],[[9443,9443],"mapped",[116]],[[9444,9444],"mapped",[117]],[[9445,9445],"mapped",[118]],[[9446,9446],"mapped",[119]],[[9447,9447],"mapped",[120]],[[9448,9448],"mapped",[121]],[[9449,9449],"mapped",[122]],[[9450,9450],"mapped",[48]],[[9451,9470],"valid",[],"NV8"],[[9471,9471],"valid",[],"NV8"],[[9472,9621],"valid",[],"NV8"],[[9622,9631],"valid",[],"NV8"],[[9632,9711],"valid",[],"NV8"],[[9712,9719],"valid",[],"NV8"],[[9720,9727],"valid",[],"NV8"],[[9728,9747],"valid",[],"NV8"],[[9748,9749],"valid",[],"NV8"],[[9750,9751],"valid",[],"NV8"],[[9752,9752],"valid",[],"NV8"],[[9753,9753],"valid",[],"NV8"],[[9754,9839],"valid",[],"NV8"],[[9840,9841],"valid",[],"NV8"],[[9842,9853],"valid",[],"NV8"],[[9854,9855],"valid",[],"NV8"],[[9856,9865],"valid",[],"NV8"],[[9866,9873],"valid",[],"NV8"],[[9874,9884],"valid",[],"NV8"],[[9885,9885],"valid",[],"NV8"],[[9886,9887],"valid",[],"NV8"],[[9888,9889],"valid",[],"NV8"],[[9890,9905],"valid",[],"NV8"],[[9906,9906],"valid",[],"NV8"],[[9907,9916],"valid",[],"NV8"],[[9917,9919],"valid",[],"NV8"],[[9920,9923],"valid",[],"NV8"],[[9924,9933],"valid",[],"NV8"],[[9934,9934],"valid",[],"NV8"],[[9935,9953],"valid",[],"NV8"],[[9954,9954],"valid",[],"NV8"],[[9955,9955],"valid",[],"NV8"],[[9956,9959],"valid",[],"NV8"],[[9960,9983],"valid",[],"NV8"],[[9984,9984],"valid",[],"NV8"],[[9985,9988],"valid",[],"NV8"],[[9989,9989],"valid",[],"NV8"],[[9990,9993],"valid",[],"NV8"],[[9994,9995],"valid",[],"NV8"],[[9996,10023],"valid",[],"NV8"],[[10024,10024],"valid",[],"NV8"],[[10025,10059],"valid",[],"NV8"],[[10060,10060],"valid",[],"NV8"],[[10061,10061],"valid",[],"NV8"],[[10062,10062],"valid",[],"NV8"],[[10063,10066],"valid",[],"NV8"],[[10067,10069],"valid",[],"NV8"],[[10070,10070],"valid",[],"NV8"],[[10071,10071],"valid",[],"NV8"],[[10072,10078],"valid",[],"NV8"],[[10079,10080],"valid",[],"NV8"],[[10081,10087],"valid",[],"NV8"],[[10088,10101],"valid",[],"NV8"],[[10102,10132],"valid",[],"NV8"],[[10133,10135],"valid",[],"NV8"],[[10136,10159],"valid",[],"NV8"],[[10160,10160],"valid",[],"NV8"],[[10161,10174],"valid",[],"NV8"],[[10175,10175],"valid",[],"NV8"],[[10176,10182],"valid",[],"NV8"],[[10183,10186],"valid",[],"NV8"],[[10187,10187],"valid",[],"NV8"],[[10188,10188],"valid",[],"NV8"],[[10189,10189],"valid",[],"NV8"],[[10190,10191],"valid",[],"NV8"],[[10192,10219],"valid",[],"NV8"],[[10220,10223],"valid",[],"NV8"],[[10224,10239],"valid",[],"NV8"],[[10240,10495],"valid",[],"NV8"],[[10496,10763],"valid",[],"NV8"],[[10764,10764],"mapped",[8747,8747,8747,8747]],[[10765,10867],"valid",[],"NV8"],[[10868,10868],"disallowed_STD3_mapped",[58,58,61]],[[10869,10869],"disallowed_STD3_mapped",[61,61]],[[10870,10870],"disallowed_STD3_mapped",[61,61,61]],[[10871,10971],"valid",[],"NV8"],[[10972,10972],"mapped",[10973,824]],[[10973,11007],"valid",[],"NV8"],[[11008,11021],"valid",[],"NV8"],[[11022,11027],"valid",[],"NV8"],[[11028,11034],"valid",[],"NV8"],[[11035,11039],"valid",[],"NV8"],[[11040,11043],"valid",[],"NV8"],[[11044,11084],"valid",[],"NV8"],[[11085,11087],"valid",[],"NV8"],[[11088,11092],"valid",[],"NV8"],[[11093,11097],"valid",[],"NV8"],[[11098,11123],"valid",[],"NV8"],[[11124,11125],"disallowed"],[[11126,11157],"valid",[],"NV8"],[[11158,11159],"disallowed"],[[11160,11193],"valid",[],"NV8"],[[11194,11196],"disallowed"],[[11197,11208],"valid",[],"NV8"],[[11209,11209],"disallowed"],[[11210,11217],"valid",[],"NV8"],[[11218,11243],"disallowed"],[[11244,11247],"valid",[],"NV8"],[[11248,11263],"disallowed"],[[11264,11264],"mapped",[11312]],[[11265,11265],"mapped",[11313]],[[11266,11266],"mapped",[11314]],[[11267,11267],"mapped",[11315]],[[11268,11268],"mapped",[11316]],[[11269,11269],"mapped",[11317]],[[11270,11270],"mapped",[11318]],[[11271,11271],"mapped",[11319]],[[11272,11272],"mapped",[11320]],[[11273,11273],"mapped",[11321]],[[11274,11274],"mapped",[11322]],[[11275,11275],"mapped",[11323]],[[11276,11276],"mapped",[11324]],[[11277,11277],"mapped",[11325]],[[11278,11278],"mapped",[11326]],[[11279,11279],"mapped",[11327]],[[11280,11280],"mapped",[11328]],[[11281,11281],"mapped",[11329]],[[11282,11282],"mapped",[11330]],[[11283,11283],"mapped",[11331]],[[11284,11284],"mapped",[11332]],[[11285,11285],"mapped",[11333]],[[11286,11286],"mapped",[11334]],[[11287,11287],"mapped",[11335]],[[11288,11288],"mapped",[11336]],[[11289,11289],"mapped",[11337]],[[11290,11290],"mapped",[11338]],[[11291,11291],"mapped",[11339]],[[11292,11292],"mapped",[11340]],[[11293,11293],"mapped",[11341]],[[11294,11294],"mapped",[11342]],[[11295,11295],"mapped",[11343]],[[11296,11296],"mapped",[11344]],[[11297,11297],"mapped",[11345]],[[11298,11298],"mapped",[11346]],[[11299,11299],"mapped",[11347]],[[11300,11300],"mapped",[11348]],[[11301,11301],"mapped",[11349]],[[11302,11302],"mapped",[11350]],[[11303,11303],"mapped",[11351]],[[11304,11304],"mapped",[11352]],[[11305,11305],"mapped",[11353]],[[11306,11306],"mapped",[11354]],[[11307,11307],"mapped",[11355]],[[11308,11308],"mapped",[11356]],[[11309,11309],"mapped",[11357]],[[11310,11310],"mapped",[11358]],[[11311,11311],"disallowed"],[[11312,11358],"valid"],[[11359,11359],"disallowed"],[[11360,11360],"mapped",[11361]],[[11361,11361],"valid"],[[11362,11362],"mapped",[619]],[[11363,11363],"mapped",[7549]],[[11364,11364],"mapped",[637]],[[11365,11366],"valid"],[[11367,11367],"mapped",[11368]],[[11368,11368],"valid"],[[11369,11369],"mapped",[11370]],[[11370,11370],"valid"],[[11371,11371],"mapped",[11372]],[[11372,11372],"valid"],[[11373,11373],"mapped",[593]],[[11374,11374],"mapped",[625]],[[11375,11375],"mapped",[592]],[[11376,11376],"mapped",[594]],[[11377,11377],"valid"],[[11378,11378],"mapped",[11379]],[[11379,11379],"valid"],[[11380,11380],"valid"],[[11381,11381],"mapped",[11382]],[[11382,11383],"valid"],[[11384,11387],"valid"],[[11388,11388],"mapped",[106]],[[11389,11389],"mapped",[118]],[[11390,11390],"mapped",[575]],[[11391,11391],"mapped",[576]],[[11392,11392],"mapped",[11393]],[[11393,11393],"valid"],[[11394,11394],"mapped",[11395]],[[11395,11395],"valid"],[[11396,11396],"mapped",[11397]],[[11397,11397],"valid"],[[11398,11398],"mapped",[11399]],[[11399,11399],"valid"],[[11400,11400],"mapped",[11401]],[[11401,11401],"valid"],[[11402,11402],"mapped",[11403]],[[11403,11403],"valid"],[[11404,11404],"mapped",[11405]],[[11405,11405],"valid"],[[11406,11406],"mapped",[11407]],[[11407,11407],"valid"],[[11408,11408],"mapped",[11409]],[[11409,11409],"valid"],[[11410,11410],"mapped",[11411]],[[11411,11411],"valid"],[[11412,11412],"mapped",[11413]],[[11413,11413],"valid"],[[11414,11414],"mapped",[11415]],[[11415,11415],"valid"],[[11416,11416],"mapped",[11417]],[[11417,11417],"valid"],[[11418,11418],"mapped",[11419]],[[11419,11419],"valid"],[[11420,11420],"mapped",[11421]],[[11421,11421],"valid"],[[11422,11422],"mapped",[11423]],[[11423,11423],"valid"],[[11424,11424],"mapped",[11425]],[[11425,11425],"valid"],[[11426,11426],"mapped",[11427]],[[11427,11427],"valid"],[[11428,11428],"mapped",[11429]],[[11429,11429],"valid"],[[11430,11430],"mapped",[11431]],[[11431,11431],"valid"],[[11432,11432],"mapped",[11433]],[[11433,11433],"valid"],[[11434,11434],"mapped",[11435]],[[11435,11435],"valid"],[[11436,11436],"mapped",[11437]],[[11437,11437],"valid"],[[11438,11438],"mapped",[11439]],[[11439,11439],"valid"],[[11440,11440],"mapped",[11441]],[[11441,11441],"valid"],[[11442,11442],"mapped",[11443]],[[11443,11443],"valid"],[[11444,11444],"mapped",[11445]],[[11445,11445],"valid"],[[11446,11446],"mapped",[11447]],[[11447,11447],"valid"],[[11448,11448],"mapped",[11449]],[[11449,11449],"valid"],[[11450,11450],"mapped",[11451]],[[11451,11451],"valid"],[[11452,11452],"mapped",[11453]],[[11453,11453],"valid"],[[11454,11454],"mapped",[11455]],[[11455,11455],"valid"],[[11456,11456],"mapped",[11457]],[[11457,11457],"valid"],[[11458,11458],"mapped",[11459]],[[11459,11459],"valid"],[[11460,11460],"mapped",[11461]],[[11461,11461],"valid"],[[11462,11462],"mapped",[11463]],[[11463,11463],"valid"],[[11464,11464],"mapped",[11465]],[[11465,11465],"valid"],[[11466,11466],"mapped",[11467]],[[11467,11467],"valid"],[[11468,11468],"mapped",[11469]],[[11469,11469],"valid"],[[11470,11470],"mapped",[11471]],[[11471,11471],"valid"],[[11472,11472],"mapped",[11473]],[[11473,11473],"valid"],[[11474,11474],"mapped",[11475]],[[11475,11475],"valid"],[[11476,11476],"mapped",[11477]],[[11477,11477],"valid"],[[11478,11478],"mapped",[11479]],[[11479,11479],"valid"],[[11480,11480],"mapped",[11481]],[[11481,11481],"valid"],[[11482,11482],"mapped",[11483]],[[11483,11483],"valid"],[[11484,11484],"mapped",[11485]],[[11485,11485],"valid"],[[11486,11486],"mapped",[11487]],[[11487,11487],"valid"],[[11488,11488],"mapped",[11489]],[[11489,11489],"valid"],[[11490,11490],"mapped",[11491]],[[11491,11492],"valid"],[[11493,11498],"valid",[],"NV8"],[[11499,11499],"mapped",[11500]],[[11500,11500],"valid"],[[11501,11501],"mapped",[11502]],[[11502,11505],"valid"],[[11506,11506],"mapped",[11507]],[[11507,11507],"valid"],[[11508,11512],"disallowed"],[[11513,11519],"valid",[],"NV8"],[[11520,11557],"valid"],[[11558,11558],"disallowed"],[[11559,11559],"valid"],[[11560,11564],"disallowed"],[[11565,11565],"valid"],[[11566,11567],"disallowed"],[[11568,11621],"valid"],[[11622,11623],"valid"],[[11624,11630],"disallowed"],[[11631,11631],"mapped",[11617]],[[11632,11632],"valid",[],"NV8"],[[11633,11646],"disallowed"],[[11647,11647],"valid"],[[11648,11670],"valid"],[[11671,11679],"disallowed"],[[11680,11686],"valid"],[[11687,11687],"disallowed"],[[11688,11694],"valid"],[[11695,11695],"disallowed"],[[11696,11702],"valid"],[[11703,11703],"disallowed"],[[11704,11710],"valid"],[[11711,11711],"disallowed"],[[11712,11718],"valid"],[[11719,11719],"disallowed"],[[11720,11726],"valid"],[[11727,11727],"disallowed"],[[11728,11734],"valid"],[[11735,11735],"disallowed"],[[11736,11742],"valid"],[[11743,11743],"disallowed"],[[11744,11775],"valid"],[[11776,11799],"valid",[],"NV8"],[[11800,11803],"valid",[],"NV8"],[[11804,11805],"valid",[],"NV8"],[[11806,11822],"valid",[],"NV8"],[[11823,11823],"valid"],[[11824,11824],"valid",[],"NV8"],[[11825,11825],"valid",[],"NV8"],[[11826,11835],"valid",[],"NV8"],[[11836,11842],"valid",[],"NV8"],[[11843,11903],"disallowed"],[[11904,11929],"valid",[],"NV8"],[[11930,11930],"disallowed"],[[11931,11934],"valid",[],"NV8"],[[11935,11935],"mapped",[27597]],[[11936,12018],"valid",[],"NV8"],[[12019,12019],"mapped",[40863]],[[12020,12031],"disallowed"],[[12032,12032],"mapped",[19968]],[[12033,12033],"mapped",[20008]],[[12034,12034],"mapped",[20022]],[[12035,12035],"mapped",[20031]],[[12036,12036],"mapped",[20057]],[[12037,12037],"mapped",[20101]],[[12038,12038],"mapped",[20108]],[[12039,12039],"mapped",[20128]],[[12040,12040],"mapped",[20154]],[[12041,12041],"mapped",[20799]],[[12042,12042],"mapped",[20837]],[[12043,12043],"mapped",[20843]],[[12044,12044],"mapped",[20866]],[[12045,12045],"mapped",[20886]],[[12046,12046],"mapped",[20907]],[[12047,12047],"mapped",[20960]],[[12048,12048],"mapped",[20981]],[[12049,12049],"mapped",[20992]],[[12050,12050],"mapped",[21147]],[[12051,12051],"mapped",[21241]],[[12052,12052],"mapped",[21269]],[[12053,12053],"mapped",[21274]],[[12054,12054],"mapped",[21304]],[[12055,12055],"mapped",[21313]],[[12056,12056],"mapped",[21340]],[[12057,12057],"mapped",[21353]],[[12058,12058],"mapped",[21378]],[[12059,12059],"mapped",[21430]],[[12060,12060],"mapped",[21448]],[[12061,12061],"mapped",[21475]],[[12062,12062],"mapped",[22231]],[[12063,12063],"mapped",[22303]],[[12064,12064],"mapped",[22763]],[[12065,12065],"mapped",[22786]],[[12066,12066],"mapped",[22794]],[[12067,12067],"mapped",[22805]],[[12068,12068],"mapped",[22823]],[[12069,12069],"mapped",[22899]],[[12070,12070],"mapped",[23376]],[[12071,12071],"mapped",[23424]],[[12072,12072],"mapped",[23544]],[[12073,12073],"mapped",[23567]],[[12074,12074],"mapped",[23586]],[[12075,12075],"mapped",[23608]],[[12076,12076],"mapped",[23662]],[[12077,12077],"mapped",[23665]],[[12078,12078],"mapped",[24027]],[[12079,12079],"mapped",[24037]],[[12080,12080],"mapped",[24049]],[[12081,12081],"mapped",[24062]],[[12082,12082],"mapped",[24178]],[[12083,12083],"mapped",[24186]],[[12084,12084],"mapped",[24191]],[[12085,12085],"mapped",[24308]],[[12086,12086],"mapped",[24318]],[[12087,12087],"mapped",[24331]],[[12088,12088],"mapped",[24339]],[[12089,12089],"mapped",[24400]],[[12090,12090],"mapped",[24417]],[[12091,12091],"mapped",[24435]],[[12092,12092],"mapped",[24515]],[[12093,12093],"mapped",[25096]],[[12094,12094],"mapped",[25142]],[[12095,12095],"mapped",[25163]],[[12096,12096],"mapped",[25903]],[[12097,12097],"mapped",[25908]],[[12098,12098],"mapped",[25991]],[[12099,12099],"mapped",[26007]],[[12100,12100],"mapped",[26020]],[[12101,12101],"mapped",[26041]],[[12102,12102],"mapped",[26080]],[[12103,12103],"mapped",[26085]],[[12104,12104],"mapped",[26352]],[[12105,12105],"mapped",[26376]],[[12106,12106],"mapped",[26408]],[[12107,12107],"mapped",[27424]],[[12108,12108],"mapped",[27490]],[[12109,12109],"mapped",[27513]],[[12110,12110],"mapped",[27571]],[[12111,12111],"mapped",[27595]],[[12112,12112],"mapped",[27604]],[[12113,12113],"mapped",[27611]],[[12114,12114],"mapped",[27663]],[[12115,12115],"mapped",[27668]],[[12116,12116],"mapped",[27700]],[[12117,12117],"mapped",[28779]],[[12118,12118],"mapped",[29226]],[[12119,12119],"mapped",[29238]],[[12120,12120],"mapped",[29243]],[[12121,12121],"mapped",[29247]],[[12122,12122],"mapped",[29255]],[[12123,12123],"mapped",[29273]],[[12124,12124],"mapped",[29275]],[[12125,12125],"mapped",[29356]],[[12126,12126],"mapped",[29572]],[[12127,12127],"mapped",[29577]],[[12128,12128],"mapped",[29916]],[[12129,12129],"mapped",[29926]],[[12130,12130],"mapped",[29976]],[[12131,12131],"mapped",[29983]],[[12132,12132],"mapped",[29992]],[[12133,12133],"mapped",[30000]],[[12134,12134],"mapped",[30091]],[[12135,12135],"mapped",[30098]],[[12136,12136],"mapped",[30326]],[[12137,12137],"mapped",[30333]],[[12138,12138],"mapped",[30382]],[[12139,12139],"mapped",[30399]],[[12140,12140],"mapped",[30446]],[[12141,12141],"mapped",[30683]],[[12142,12142],"mapped",[30690]],[[12143,12143],"mapped",[30707]],[[12144,12144],"mapped",[31034]],[[12145,12145],"mapped",[31160]],[[12146,12146],"mapped",[31166]],[[12147,12147],"mapped",[31348]],[[12148,12148],"mapped",[31435]],[[12149,12149],"mapped",[31481]],[[12150,12150],"mapped",[31859]],[[12151,12151],"mapped",[31992]],[[12152,12152],"mapped",[32566]],[[12153,12153],"mapped",[32593]],[[12154,12154],"mapped",[32650]],[[12155,12155],"mapped",[32701]],[[12156,12156],"mapped",[32769]],[[12157,12157],"mapped",[32780]],[[12158,12158],"mapped",[32786]],[[12159,12159],"mapped",[32819]],[[12160,12160],"mapped",[32895]],[[12161,12161],"mapped",[32905]],[[12162,12162],"mapped",[33251]],[[12163,12163],"mapped",[33258]],[[12164,12164],"mapped",[33267]],[[12165,12165],"mapped",[33276]],[[12166,12166],"mapped",[33292]],[[12167,12167],"mapped",[33307]],[[12168,12168],"mapped",[33311]],[[12169,12169],"mapped",[33390]],[[12170,12170],"mapped",[33394]],[[12171,12171],"mapped",[33400]],[[12172,12172],"mapped",[34381]],[[12173,12173],"mapped",[34411]],[[12174,12174],"mapped",[34880]],[[12175,12175],"mapped",[34892]],[[12176,12176],"mapped",[34915]],[[12177,12177],"mapped",[35198]],[[12178,12178],"mapped",[35211]],[[12179,12179],"mapped",[35282]],[[12180,12180],"mapped",[35328]],[[12181,12181],"mapped",[35895]],[[12182,12182],"mapped",[35910]],[[12183,12183],"mapped",[35925]],[[12184,12184],"mapped",[35960]],[[12185,12185],"mapped",[35997]],[[12186,12186],"mapped",[36196]],[[12187,12187],"mapped",[36208]],[[12188,12188],"mapped",[36275]],[[12189,12189],"mapped",[36523]],[[12190,12190],"mapped",[36554]],[[12191,12191],"mapped",[36763]],[[12192,12192],"mapped",[36784]],[[12193,12193],"mapped",[36789]],[[12194,12194],"mapped",[37009]],[[12195,12195],"mapped",[37193]],[[12196,12196],"mapped",[37318]],[[12197,12197],"mapped",[37324]],[[12198,12198],"mapped",[37329]],[[12199,12199],"mapped",[38263]],[[12200,12200],"mapped",[38272]],[[12201,12201],"mapped",[38428]],[[12202,12202],"mapped",[38582]],[[12203,12203],"mapped",[38585]],[[12204,12204],"mapped",[38632]],[[12205,12205],"mapped",[38737]],[[12206,12206],"mapped",[38750]],[[12207,12207],"mapped",[38754]],[[12208,12208],"mapped",[38761]],[[12209,12209],"mapped",[38859]],[[12210,12210],"mapped",[38893]],[[12211,12211],"mapped",[38899]],[[12212,12212],"mapped",[38913]],[[12213,12213],"mapped",[39080]],[[12214,12214],"mapped",[39131]],[[12215,12215],"mapped",[39135]],[[12216,12216],"mapped",[39318]],[[12217,12217],"mapped",[39321]],[[12218,12218],"mapped",[39340]],[[12219,12219],"mapped",[39592]],[[12220,12220],"mapped",[39640]],[[12221,12221],"mapped",[39647]],[[12222,12222],"mapped",[39717]],[[12223,12223],"mapped",[39727]],[[12224,12224],"mapped",[39730]],[[12225,12225],"mapped",[39740]],[[12226,12226],"mapped",[39770]],[[12227,12227],"mapped",[40165]],[[12228,12228],"mapped",[40565]],[[12229,12229],"mapped",[40575]],[[12230,12230],"mapped",[40613]],[[12231,12231],"mapped",[40635]],[[12232,12232],"mapped",[40643]],[[12233,12233],"mapped",[40653]],[[12234,12234],"mapped",[40657]],[[12235,12235],"mapped",[40697]],[[12236,12236],"mapped",[40701]],[[12237,12237],"mapped",[40718]],[[12238,12238],"mapped",[40723]],[[12239,12239],"mapped",[40736]],[[12240,12240],"mapped",[40763]],[[12241,12241],"mapped",[40778]],[[12242,12242],"mapped",[40786]],[[12243,12243],"mapped",[40845]],[[12244,12244],"mapped",[40860]],[[12245,12245],"mapped",[40864]],[[12246,12271],"disallowed"],[[12272,12283],"disallowed"],[[12284,12287],"disallowed"],[[12288,12288],"disallowed_STD3_mapped",[32]],[[12289,12289],"valid",[],"NV8"],[[12290,12290],"mapped",[46]],[[12291,12292],"valid",[],"NV8"],[[12293,12295],"valid"],[[12296,12329],"valid",[],"NV8"],[[12330,12333],"valid"],[[12334,12341],"valid",[],"NV8"],[[12342,12342],"mapped",[12306]],[[12343,12343],"valid",[],"NV8"],[[12344,12344],"mapped",[21313]],[[12345,12345],"mapped",[21316]],[[12346,12346],"mapped",[21317]],[[12347,12347],"valid",[],"NV8"],[[12348,12348],"valid"],[[12349,12349],"valid",[],"NV8"],[[12350,12350],"valid",[],"NV8"],[[12351,12351],"valid",[],"NV8"],[[12352,12352],"disallowed"],[[12353,12436],"valid"],[[12437,12438],"valid"],[[12439,12440],"disallowed"],[[12441,12442],"valid"],[[12443,12443],"disallowed_STD3_mapped",[32,12441]],[[12444,12444],"disallowed_STD3_mapped",[32,12442]],[[12445,12446],"valid"],[[12447,12447],"mapped",[12424,12426]],[[12448,12448],"valid",[],"NV8"],[[12449,12542],"valid"],[[12543,12543],"mapped",[12467,12488]],[[12544,12548],"disallowed"],[[12549,12588],"valid"],[[12589,12589],"valid"],[[12590,12592],"disallowed"],[[12593,12593],"mapped",[4352]],[[12594,12594],"mapped",[4353]],[[12595,12595],"mapped",[4522]],[[12596,12596],"mapped",[4354]],[[12597,12597],"mapped",[4524]],[[12598,12598],"mapped",[4525]],[[12599,12599],"mapped",[4355]],[[12600,12600],"mapped",[4356]],[[12601,12601],"mapped",[4357]],[[12602,12602],"mapped",[4528]],[[12603,12603],"mapped",[4529]],[[12604,12604],"mapped",[4530]],[[12605,12605],"mapped",[4531]],[[12606,12606],"mapped",[4532]],[[12607,12607],"mapped",[4533]],[[12608,12608],"mapped",[4378]],[[12609,12609],"mapped",[4358]],[[12610,12610],"mapped",[4359]],[[12611,12611],"mapped",[4360]],[[12612,12612],"mapped",[4385]],[[12613,12613],"mapped",[4361]],[[12614,12614],"mapped",[4362]],[[12615,12615],"mapped",[4363]],[[12616,12616],"mapped",[4364]],[[12617,12617],"mapped",[4365]],[[12618,12618],"mapped",[4366]],[[12619,12619],"mapped",[4367]],[[12620,12620],"mapped",[4368]],[[12621,12621],"mapped",[4369]],[[12622,12622],"mapped",[4370]],[[12623,12623],"mapped",[4449]],[[12624,12624],"mapped",[4450]],[[12625,12625],"mapped",[4451]],[[12626,12626],"mapped",[4452]],[[12627,12627],"mapped",[4453]],[[12628,12628],"mapped",[4454]],[[12629,12629],"mapped",[4455]],[[12630,12630],"mapped",[4456]],[[12631,12631],"mapped",[4457]],[[12632,12632],"mapped",[4458]],[[12633,12633],"mapped",[4459]],[[12634,12634],"mapped",[4460]],[[12635,12635],"mapped",[4461]],[[12636,12636],"mapped",[4462]],[[12637,12637],"mapped",[4463]],[[12638,12638],"mapped",[4464]],[[12639,12639],"mapped",[4465]],[[12640,12640],"mapped",[4466]],[[12641,12641],"mapped",[4467]],[[12642,12642],"mapped",[4468]],[[12643,12643],"mapped",[4469]],[[12644,12644],"disallowed"],[[12645,12645],"mapped",[4372]],[[12646,12646],"mapped",[4373]],[[12647,12647],"mapped",[4551]],[[12648,12648],"mapped",[4552]],[[12649,12649],"mapped",[4556]],[[12650,12650],"mapped",[4558]],[[12651,12651],"mapped",[4563]],[[12652,12652],"mapped",[4567]],[[12653,12653],"mapped",[4569]],[[12654,12654],"mapped",[4380]],[[12655,12655],"mapped",[4573]],[[12656,12656],"mapped",[4575]],[[12657,12657],"mapped",[4381]],[[12658,12658],"mapped",[4382]],[[12659,12659],"mapped",[4384]],[[12660,12660],"mapped",[4386]],[[12661,12661],"mapped",[4387]],[[12662,12662],"mapped",[4391]],[[12663,12663],"mapped",[4393]],[[12664,12664],"mapped",[4395]],[[12665,12665],"mapped",[4396]],[[12666,12666],"mapped",[4397]],[[12667,12667],"mapped",[4398]],[[12668,12668],"mapped",[4399]],[[12669,12669],"mapped",[4402]],[[12670,12670],"mapped",[4406]],[[12671,12671],"mapped",[4416]],[[12672,12672],"mapped",[4423]],[[12673,12673],"mapped",[4428]],[[12674,12674],"mapped",[4593]],[[12675,12675],"mapped",[4594]],[[12676,12676],"mapped",[4439]],[[12677,12677],"mapped",[4440]],[[12678,12678],"mapped",[4441]],[[12679,12679],"mapped",[4484]],[[12680,12680],"mapped",[4485]],[[12681,12681],"mapped",[4488]],[[12682,12682],"mapped",[4497]],[[12683,12683],"mapped",[4498]],[[12684,12684],"mapped",[4500]],[[12685,12685],"mapped",[4510]],[[12686,12686],"mapped",[4513]],[[12687,12687],"disallowed"],[[12688,12689],"valid",[],"NV8"],[[12690,12690],"mapped",[19968]],[[12691,12691],"mapped",[20108]],[[12692,12692],"mapped",[19977]],[[12693,12693],"mapped",[22235]],[[12694,12694],"mapped",[19978]],[[12695,12695],"mapped",[20013]],[[12696,12696],"mapped",[19979]],[[12697,12697],"mapped",[30002]],[[12698,12698],"mapped",[20057]],[[12699,12699],"mapped",[19993]],[[12700,12700],"mapped",[19969]],[[12701,12701],"mapped",[22825]],[[12702,12702],"mapped",[22320]],[[12703,12703],"mapped",[20154]],[[12704,12727],"valid"],[[12728,12730],"valid"],[[12731,12735],"disallowed"],[[12736,12751],"valid",[],"NV8"],[[12752,12771],"valid",[],"NV8"],[[12772,12783],"disallowed"],[[12784,12799],"valid"],[[12800,12800],"disallowed_STD3_mapped",[40,4352,41]],[[12801,12801],"disallowed_STD3_mapped",[40,4354,41]],[[12802,12802],"disallowed_STD3_mapped",[40,4355,41]],[[12803,12803],"disallowed_STD3_mapped",[40,4357,41]],[[12804,12804],"disallowed_STD3_mapped",[40,4358,41]],[[12805,12805],"disallowed_STD3_mapped",[40,4359,41]],[[12806,12806],"disallowed_STD3_mapped",[40,4361,41]],[[12807,12807],"disallowed_STD3_mapped",[40,4363,41]],[[12808,12808],"disallowed_STD3_mapped",[40,4364,41]],[[12809,12809],"disallowed_STD3_mapped",[40,4366,41]],[[12810,12810],"disallowed_STD3_mapped",[40,4367,41]],[[12811,12811],"disallowed_STD3_mapped",[40,4368,41]],[[12812,12812],"disallowed_STD3_mapped",[40,4369,41]],[[12813,12813],"disallowed_STD3_mapped",[40,4370,41]],[[12814,12814],"disallowed_STD3_mapped",[40,44032,41]],[[12815,12815],"disallowed_STD3_mapped",[40,45208,41]],[[12816,12816],"disallowed_STD3_mapped",[40,45796,41]],[[12817,12817],"disallowed_STD3_mapped",[40,46972,41]],[[12818,12818],"disallowed_STD3_mapped",[40,47560,41]],[[12819,12819],"disallowed_STD3_mapped",[40,48148,41]],[[12820,12820],"disallowed_STD3_mapped",[40,49324,41]],[[12821,12821],"disallowed_STD3_mapped",[40,50500,41]],[[12822,12822],"disallowed_STD3_mapped",[40,51088,41]],[[12823,12823],"disallowed_STD3_mapped",[40,52264,41]],[[12824,12824],"disallowed_STD3_mapped",[40,52852,41]],[[12825,12825],"disallowed_STD3_mapped",[40,53440,41]],[[12826,12826],"disallowed_STD3_mapped",[40,54028,41]],[[12827,12827],"disallowed_STD3_mapped",[40,54616,41]],[[12828,12828],"disallowed_STD3_mapped",[40,51452,41]],[[12829,12829],"disallowed_STD3_mapped",[40,50724,51204,41]],[[12830,12830],"disallowed_STD3_mapped",[40,50724,54980,41]],[[12831,12831],"disallowed"],[[12832,12832],"disallowed_STD3_mapped",[40,19968,41]],[[12833,12833],"disallowed_STD3_mapped",[40,20108,41]],[[12834,12834],"disallowed_STD3_mapped",[40,19977,41]],[[12835,12835],"disallowed_STD3_mapped",[40,22235,41]],[[12836,12836],"disallowed_STD3_mapped",[40,20116,41]],[[12837,12837],"disallowed_STD3_mapped",[40,20845,41]],[[12838,12838],"disallowed_STD3_mapped",[40,19971,41]],[[12839,12839],"disallowed_STD3_mapped",[40,20843,41]],[[12840,12840],"disallowed_STD3_mapped",[40,20061,41]],[[12841,12841],"disallowed_STD3_mapped",[40,21313,41]],[[12842,12842],"disallowed_STD3_mapped",[40,26376,41]],[[12843,12843],"disallowed_STD3_mapped",[40,28779,41]],[[12844,12844],"disallowed_STD3_mapped",[40,27700,41]],[[12845,12845],"disallowed_STD3_mapped",[40,26408,41]],[[12846,12846],"disallowed_STD3_mapped",[40,37329,41]],[[12847,12847],"disallowed_STD3_mapped",[40,22303,41]],[[12848,12848],"disallowed_STD3_mapped",[40,26085,41]],[[12849,12849],"disallowed_STD3_mapped",[40,26666,41]],[[12850,12850],"disallowed_STD3_mapped",[40,26377,41]],[[12851,12851],"disallowed_STD3_mapped",[40,31038,41]],[[12852,12852],"disallowed_STD3_mapped",[40,21517,41]],[[12853,12853],"disallowed_STD3_mapped",[40,29305,41]],[[12854,12854],"disallowed_STD3_mapped",[40,36001,41]],[[12855,12855],"disallowed_STD3_mapped",[40,31069,41]],[[12856,12856],"disallowed_STD3_mapped",[40,21172,41]],[[12857,12857],"disallowed_STD3_mapped",[40,20195,41]],[[12858,12858],"disallowed_STD3_mapped",[40,21628,41]],[[12859,12859],"disallowed_STD3_mapped",[40,23398,41]],[[12860,12860],"disallowed_STD3_mapped",[40,30435,41]],[[12861,12861],"disallowed_STD3_mapped",[40,20225,41]],[[12862,12862],"disallowed_STD3_mapped",[40,36039,41]],[[12863,12863],"disallowed_STD3_mapped",[40,21332,41]],[[12864,12864],"disallowed_STD3_mapped",[40,31085,41]],[[12865,12865],"disallowed_STD3_mapped",[40,20241,41]],[[12866,12866],"disallowed_STD3_mapped",[40,33258,41]],[[12867,12867],"disallowed_STD3_mapped",[40,33267,41]],[[12868,12868],"mapped",[21839]],[[12869,12869],"mapped",[24188]],[[12870,12870],"mapped",[25991]],[[12871,12871],"mapped",[31631]],[[12872,12879],"valid",[],"NV8"],[[12880,12880],"mapped",[112,116,101]],[[12881,12881],"mapped",[50,49]],[[12882,12882],"mapped",[50,50]],[[12883,12883],"mapped",[50,51]],[[12884,12884],"mapped",[50,52]],[[12885,12885],"mapped",[50,53]],[[12886,12886],"mapped",[50,54]],[[12887,12887],"mapped",[50,55]],[[12888,12888],"mapped",[50,56]],[[12889,12889],"mapped",[50,57]],[[12890,12890],"mapped",[51,48]],[[12891,12891],"mapped",[51,49]],[[12892,12892],"mapped",[51,50]],[[12893,12893],"mapped",[51,51]],[[12894,12894],"mapped",[51,52]],[[12895,12895],"mapped",[51,53]],[[12896,12896],"mapped",[4352]],[[12897,12897],"mapped",[4354]],[[12898,12898],"mapped",[4355]],[[12899,12899],"mapped",[4357]],[[12900,12900],"mapped",[4358]],[[12901,12901],"mapped",[4359]],[[12902,12902],"mapped",[4361]],[[12903,12903],"mapped",[4363]],[[12904,12904],"mapped",[4364]],[[12905,12905],"mapped",[4366]],[[12906,12906],"mapped",[4367]],[[12907,12907],"mapped",[4368]],[[12908,12908],"mapped",[4369]],[[12909,12909],"mapped",[4370]],[[12910,12910],"mapped",[44032]],[[12911,12911],"mapped",[45208]],[[12912,12912],"mapped",[45796]],[[12913,12913],"mapped",[46972]],[[12914,12914],"mapped",[47560]],[[12915,12915],"mapped",[48148]],[[12916,12916],"mapped",[49324]],[[12917,12917],"mapped",[50500]],[[12918,12918],"mapped",[51088]],[[12919,12919],"mapped",[52264]],[[12920,12920],"mapped",[52852]],[[12921,12921],"mapped",[53440]],[[12922,12922],"mapped",[54028]],[[12923,12923],"mapped",[54616]],[[12924,12924],"mapped",[52280,44256]],[[12925,12925],"mapped",[51452,51032]],[[12926,12926],"mapped",[50864]],[[12927,12927],"valid",[],"NV8"],[[12928,12928],"mapped",[19968]],[[12929,12929],"mapped",[20108]],[[12930,12930],"mapped",[19977]],[[12931,12931],"mapped",[22235]],[[12932,12932],"mapped",[20116]],[[12933,12933],"mapped",[20845]],[[12934,12934],"mapped",[19971]],[[12935,12935],"mapped",[20843]],[[12936,12936],"mapped",[20061]],[[12937,12937],"mapped",[21313]],[[12938,12938],"mapped",[26376]],[[12939,12939],"mapped",[28779]],[[12940,12940],"mapped",[27700]],[[12941,12941],"mapped",[26408]],[[12942,12942],"mapped",[37329]],[[12943,12943],"mapped",[22303]],[[12944,12944],"mapped",[26085]],[[12945,12945],"mapped",[26666]],[[12946,12946],"mapped",[26377]],[[12947,12947],"mapped",[31038]],[[12948,12948],"mapped",[21517]],[[12949,12949],"mapped",[29305]],[[12950,12950],"mapped",[36001]],[[12951,12951],"mapped",[31069]],[[12952,12952],"mapped",[21172]],[[12953,12953],"mapped",[31192]],[[12954,12954],"mapped",[30007]],[[12955,12955],"mapped",[22899]],[[12956,12956],"mapped",[36969]],[[12957,12957],"mapped",[20778]],[[12958,12958],"mapped",[21360]],[[12959,12959],"mapped",[27880]],[[12960,12960],"mapped",[38917]],[[12961,12961],"mapped",[20241]],[[12962,12962],"mapped",[20889]],[[12963,12963],"mapped",[27491]],[[12964,12964],"mapped",[19978]],[[12965,12965],"mapped",[20013]],[[12966,12966],"mapped",[19979]],[[12967,12967],"mapped",[24038]],[[12968,12968],"mapped",[21491]],[[12969,12969],"mapped",[21307]],[[12970,12970],"mapped",[23447]],[[12971,12971],"mapped",[23398]],[[12972,12972],"mapped",[30435]],[[12973,12973],"mapped",[20225]],[[12974,12974],"mapped",[36039]],[[12975,12975],"mapped",[21332]],[[12976,12976],"mapped",[22812]],[[12977,12977],"mapped",[51,54]],[[12978,12978],"mapped",[51,55]],[[12979,12979],"mapped",[51,56]],[[12980,12980],"mapped",[51,57]],[[12981,12981],"mapped",[52,48]],[[12982,12982],"mapped",[52,49]],[[12983,12983],"mapped",[52,50]],[[12984,12984],"mapped",[52,51]],[[12985,12985],"mapped",[52,52]],[[12986,12986],"mapped",[52,53]],[[12987,12987],"mapped",[52,54]],[[12988,12988],"mapped",[52,55]],[[12989,12989],"mapped",[52,56]],[[12990,12990],"mapped",[52,57]],[[12991,12991],"mapped",[53,48]],[[12992,12992],"mapped",[49,26376]],[[12993,12993],"mapped",[50,26376]],[[12994,12994],"mapped",[51,26376]],[[12995,12995],"mapped",[52,26376]],[[12996,12996],"mapped",[53,26376]],[[12997,12997],"mapped",[54,26376]],[[12998,12998],"mapped",[55,26376]],[[12999,12999],"mapped",[56,26376]],[[13000,13000],"mapped",[57,26376]],[[13001,13001],"mapped",[49,48,26376]],[[13002,13002],"mapped",[49,49,26376]],[[13003,13003],"mapped",[49,50,26376]],[[13004,13004],"mapped",[104,103]],[[13005,13005],"mapped",[101,114,103]],[[13006,13006],"mapped",[101,118]],[[13007,13007],"mapped",[108,116,100]],[[13008,13008],"mapped",[12450]],[[13009,13009],"mapped",[12452]],[[13010,13010],"mapped",[12454]],[[13011,13011],"mapped",[12456]],[[13012,13012],"mapped",[12458]],[[13013,13013],"mapped",[12459]],[[13014,13014],"mapped",[12461]],[[13015,13015],"mapped",[12463]],[[13016,13016],"mapped",[12465]],[[13017,13017],"mapped",[12467]],[[13018,13018],"mapped",[12469]],[[13019,13019],"mapped",[12471]],[[13020,13020],"mapped",[12473]],[[13021,13021],"mapped",[12475]],[[13022,13022],"mapped",[12477]],[[13023,13023],"mapped",[12479]],[[13024,13024],"mapped",[12481]],[[13025,13025],"mapped",[12484]],[[13026,13026],"mapped",[12486]],[[13027,13027],"mapped",[12488]],[[13028,13028],"mapped",[12490]],[[13029,13029],"mapped",[12491]],[[13030,13030],"mapped",[12492]],[[13031,13031],"mapped",[12493]],[[13032,13032],"mapped",[12494]],[[13033,13033],"mapped",[12495]],[[13034,13034],"mapped",[12498]],[[13035,13035],"mapped",[12501]],[[13036,13036],"mapped",[12504]],[[13037,13037],"mapped",[12507]],[[13038,13038],"mapped",[12510]],[[13039,13039],"mapped",[12511]],[[13040,13040],"mapped",[12512]],[[13041,13041],"mapped",[12513]],[[13042,13042],"mapped",[12514]],[[13043,13043],"mapped",[12516]],[[13044,13044],"mapped",[12518]],[[13045,13045],"mapped",[12520]],[[13046,13046],"mapped",[12521]],[[13047,13047],"mapped",[12522]],[[13048,13048],"mapped",[12523]],[[13049,13049],"mapped",[12524]],[[13050,13050],"mapped",[12525]],[[13051,13051],"mapped",[12527]],[[13052,13052],"mapped",[12528]],[[13053,13053],"mapped",[12529]],[[13054,13054],"mapped",[12530]],[[13055,13055],"disallowed"],[[13056,13056],"mapped",[12450,12497,12540,12488]],[[13057,13057],"mapped",[12450,12523,12501,12449]],[[13058,13058],"mapped",[12450,12531,12506,12450]],[[13059,13059],"mapped",[12450,12540,12523]],[[13060,13060],"mapped",[12452,12491,12531,12464]],[[13061,13061],"mapped",[12452,12531,12481]],[[13062,13062],"mapped",[12454,12457,12531]],[[13063,13063],"mapped",[12456,12473,12463,12540,12489]],[[13064,13064],"mapped",[12456,12540,12459,12540]],[[13065,13065],"mapped",[12458,12531,12473]],[[13066,13066],"mapped",[12458,12540,12512]],[[13067,13067],"mapped",[12459,12452,12522]],[[13068,13068],"mapped",[12459,12521,12483,12488]],[[13069,13069],"mapped",[12459,12525,12522,12540]],[[13070,13070],"mapped",[12460,12525,12531]],[[13071,13071],"mapped",[12460,12531,12510]],[[13072,13072],"mapped",[12462,12460]],[[13073,13073],"mapped",[12462,12491,12540]],[[13074,13074],"mapped",[12461,12517,12522,12540]],[[13075,13075],"mapped",[12462,12523,12480,12540]],[[13076,13076],"mapped",[12461,12525]],[[13077,13077],"mapped",[12461,12525,12464,12521,12512]],[[13078,13078],"mapped",[12461,12525,12513,12540,12488,12523]],[[13079,13079],"mapped",[12461,12525,12527,12483,12488]],[[13080,13080],"mapped",[12464,12521,12512]],[[13081,13081],"mapped",[12464,12521,12512,12488,12531]],[[13082,13082],"mapped",[12463,12523,12476,12452,12525]],[[13083,13083],"mapped",[12463,12525,12540,12493]],[[13084,13084],"mapped",[12465,12540,12473]],[[13085,13085],"mapped",[12467,12523,12490]],[[13086,13086],"mapped",[12467,12540,12509]],[[13087,13087],"mapped",[12469,12452,12463,12523]],[[13088,13088],"mapped",[12469,12531,12481,12540,12512]],[[13089,13089],"mapped",[12471,12522,12531,12464]],[[13090,13090],"mapped",[12475,12531,12481]],[[13091,13091],"mapped",[12475,12531,12488]],[[13092,13092],"mapped",[12480,12540,12473]],[[13093,13093],"mapped",[12487,12471]],[[13094,13094],"mapped",[12489,12523]],[[13095,13095],"mapped",[12488,12531]],[[13096,13096],"mapped",[12490,12494]],[[13097,13097],"mapped",[12494,12483,12488]],[[13098,13098],"mapped",[12495,12452,12484]],[[13099,13099],"mapped",[12497,12540,12475,12531,12488]],[[13100,13100],"mapped",[12497,12540,12484]],[[13101,13101],"mapped",[12496,12540,12524,12523]],[[13102,13102],"mapped",[12500,12450,12473,12488,12523]],[[13103,13103],"mapped",[12500,12463,12523]],[[13104,13104],"mapped",[12500,12467]],[[13105,13105],"mapped",[12499,12523]],[[13106,13106],"mapped",[12501,12449,12521,12483,12489]],[[13107,13107],"mapped",[12501,12451,12540,12488]],[[13108,13108],"mapped",[12502,12483,12471,12455,12523]],[[13109,13109],"mapped",[12501,12521,12531]],[[13110,13110],"mapped",[12504,12463,12479,12540,12523]],[[13111,13111],"mapped",[12506,12477]],[[13112,13112],"mapped",[12506,12491,12498]],[[13113,13113],"mapped",[12504,12523,12484]],[[13114,13114],"mapped",[12506,12531,12473]],[[13115,13115],"mapped",[12506,12540,12472]],[[13116,13116],"mapped",[12505,12540,12479]],[[13117,13117],"mapped",[12509,12452,12531,12488]],[[13118,13118],"mapped",[12508,12523,12488]],[[13119,13119],"mapped",[12507,12531]],[[13120,13120],"mapped",[12509,12531,12489]],[[13121,13121],"mapped",[12507,12540,12523]],[[13122,13122],"mapped",[12507,12540,12531]],[[13123,13123],"mapped",[12510,12452,12463,12525]],[[13124,13124],"mapped",[12510,12452,12523]],[[13125,13125],"mapped",[12510,12483,12495]],[[13126,13126],"mapped",[12510,12523,12463]],[[13127,13127],"mapped",[12510,12531,12471,12519,12531]],[[13128,13128],"mapped",[12511,12463,12525,12531]],[[13129,13129],"mapped",[12511,12522]],[[13130,13130],"mapped",[12511,12522,12496,12540,12523]],[[13131,13131],"mapped",[12513,12460]],[[13132,13132],"mapped",[12513,12460,12488,12531]],[[13133,13133],"mapped",[12513,12540,12488,12523]],[[13134,13134],"mapped",[12516,12540,12489]],[[13135,13135],"mapped",[12516,12540,12523]],[[13136,13136],"mapped",[12518,12450,12531]],[[13137,13137],"mapped",[12522,12483,12488,12523]],[[13138,13138],"mapped",[12522,12521]],[[13139,13139],"mapped",[12523,12500,12540]],[[13140,13140],"mapped",[12523,12540,12502,12523]],[[13141,13141],"mapped",[12524,12512]],[[13142,13142],"mapped",[12524,12531,12488,12466,12531]],[[13143,13143],"mapped",[12527,12483,12488]],[[13144,13144],"mapped",[48,28857]],[[13145,13145],"mapped",[49,28857]],[[13146,13146],"mapped",[50,28857]],[[13147,13147],"mapped",[51,28857]],[[13148,13148],"mapped",[52,28857]],[[13149,13149],"mapped",[53,28857]],[[13150,13150],"mapped",[54,28857]],[[13151,13151],"mapped",[55,28857]],[[13152,13152],"mapped",[56,28857]],[[13153,13153],"mapped",[57,28857]],[[13154,13154],"mapped",[49,48,28857]],[[13155,13155],"mapped",[49,49,28857]],[[13156,13156],"mapped",[49,50,28857]],[[13157,13157],"mapped",[49,51,28857]],[[13158,13158],"mapped",[49,52,28857]],[[13159,13159],"mapped",[49,53,28857]],[[13160,13160],"mapped",[49,54,28857]],[[13161,13161],"mapped",[49,55,28857]],[[13162,13162],"mapped",[49,56,28857]],[[13163,13163],"mapped",[49,57,28857]],[[13164,13164],"mapped",[50,48,28857]],[[13165,13165],"mapped",[50,49,28857]],[[13166,13166],"mapped",[50,50,28857]],[[13167,13167],"mapped",[50,51,28857]],[[13168,13168],"mapped",[50,52,28857]],[[13169,13169],"mapped",[104,112,97]],[[13170,13170],"mapped",[100,97]],[[13171,13171],"mapped",[97,117]],[[13172,13172],"mapped",[98,97,114]],[[13173,13173],"mapped",[111,118]],[[13174,13174],"mapped",[112,99]],[[13175,13175],"mapped",[100,109]],[[13176,13176],"mapped",[100,109,50]],[[13177,13177],"mapped",[100,109,51]],[[13178,13178],"mapped",[105,117]],[[13179,13179],"mapped",[24179,25104]],[[13180,13180],"mapped",[26157,21644]],[[13181,13181],"mapped",[22823,27491]],[[13182,13182],"mapped",[26126,27835]],[[13183,13183],"mapped",[26666,24335,20250,31038]],[[13184,13184],"mapped",[112,97]],[[13185,13185],"mapped",[110,97]],[[13186,13186],"mapped",[956,97]],[[13187,13187],"mapped",[109,97]],[[13188,13188],"mapped",[107,97]],[[13189,13189],"mapped",[107,98]],[[13190,13190],"mapped",[109,98]],[[13191,13191],"mapped",[103,98]],[[13192,13192],"mapped",[99,97,108]],[[13193,13193],"mapped",[107,99,97,108]],[[13194,13194],"mapped",[112,102]],[[13195,13195],"mapped",[110,102]],[[13196,13196],"mapped",[956,102]],[[13197,13197],"mapped",[956,103]],[[13198,13198],"mapped",[109,103]],[[13199,13199],"mapped",[107,103]],[[13200,13200],"mapped",[104,122]],[[13201,13201],"mapped",[107,104,122]],[[13202,13202],"mapped",[109,104,122]],[[13203,13203],"mapped",[103,104,122]],[[13204,13204],"mapped",[116,104,122]],[[13205,13205],"mapped",[956,108]],[[13206,13206],"mapped",[109,108]],[[13207,13207],"mapped",[100,108]],[[13208,13208],"mapped",[107,108]],[[13209,13209],"mapped",[102,109]],[[13210,13210],"mapped",[110,109]],[[13211,13211],"mapped",[956,109]],[[13212,13212],"mapped",[109,109]],[[13213,13213],"mapped",[99,109]],[[13214,13214],"mapped",[107,109]],[[13215,13215],"mapped",[109,109,50]],[[13216,13216],"mapped",[99,109,50]],[[13217,13217],"mapped",[109,50]],[[13218,13218],"mapped",[107,109,50]],[[13219,13219],"mapped",[109,109,51]],[[13220,13220],"mapped",[99,109,51]],[[13221,13221],"mapped",[109,51]],[[13222,13222],"mapped",[107,109,51]],[[13223,13223],"mapped",[109,8725,115]],[[13224,13224],"mapped",[109,8725,115,50]],[[13225,13225],"mapped",[112,97]],[[13226,13226],"mapped",[107,112,97]],[[13227,13227],"mapped",[109,112,97]],[[13228,13228],"mapped",[103,112,97]],[[13229,13229],"mapped",[114,97,100]],[[13230,13230],"mapped",[114,97,100,8725,115]],[[13231,13231],"mapped",[114,97,100,8725,115,50]],[[13232,13232],"mapped",[112,115]],[[13233,13233],"mapped",[110,115]],[[13234,13234],"mapped",[956,115]],[[13235,13235],"mapped",[109,115]],[[13236,13236],"mapped",[112,118]],[[13237,13237],"mapped",[110,118]],[[13238,13238],"mapped",[956,118]],[[13239,13239],"mapped",[109,118]],[[13240,13240],"mapped",[107,118]],[[13241,13241],"mapped",[109,118]],[[13242,13242],"mapped",[112,119]],[[13243,13243],"mapped",[110,119]],[[13244,13244],"mapped",[956,119]],[[13245,13245],"mapped",[109,119]],[[13246,13246],"mapped",[107,119]],[[13247,13247],"mapped",[109,119]],[[13248,13248],"mapped",[107,969]],[[13249,13249],"mapped",[109,969]],[[13250,13250],"disallowed"],[[13251,13251],"mapped",[98,113]],[[13252,13252],"mapped",[99,99]],[[13253,13253],"mapped",[99,100]],[[13254,13254],"mapped",[99,8725,107,103]],[[13255,13255],"disallowed"],[[13256,13256],"mapped",[100,98]],[[13257,13257],"mapped",[103,121]],[[13258,13258],"mapped",[104,97]],[[13259,13259],"mapped",[104,112]],[[13260,13260],"mapped",[105,110]],[[13261,13261],"mapped",[107,107]],[[13262,13262],"mapped",[107,109]],[[13263,13263],"mapped",[107,116]],[[13264,13264],"mapped",[108,109]],[[13265,13265],"mapped",[108,110]],[[13266,13266],"mapped",[108,111,103]],[[13267,13267],"mapped",[108,120]],[[13268,13268],"mapped",[109,98]],[[13269,13269],"mapped",[109,105,108]],[[13270,13270],"mapped",[109,111,108]],[[13271,13271],"mapped",[112,104]],[[13272,13272],"disallowed"],[[13273,13273],"mapped",[112,112,109]],[[13274,13274],"mapped",[112,114]],[[13275,13275],"mapped",[115,114]],[[13276,13276],"mapped",[115,118]],[[13277,13277],"mapped",[119,98]],[[13278,13278],"mapped",[118,8725,109]],[[13279,13279],"mapped",[97,8725,109]],[[13280,13280],"mapped",[49,26085]],[[13281,13281],"mapped",[50,26085]],[[13282,13282],"mapped",[51,26085]],[[13283,13283],"mapped",[52,26085]],[[13284,13284],"mapped",[53,26085]],[[13285,13285],"mapped",[54,26085]],[[13286,13286],"mapped",[55,26085]],[[13287,13287],"mapped",[56,26085]],[[13288,13288],"mapped",[57,26085]],[[13289,13289],"mapped",[49,48,26085]],[[13290,13290],"mapped",[49,49,26085]],[[13291,13291],"mapped",[49,50,26085]],[[13292,13292],"mapped",[49,51,26085]],[[13293,13293],"mapped",[49,52,26085]],[[13294,13294],"mapped",[49,53,26085]],[[13295,13295],"mapped",[49,54,26085]],[[13296,13296],"mapped",[49,55,26085]],[[13297,13297],"mapped",[49,56,26085]],[[13298,13298],"mapped",[49,57,26085]],[[13299,13299],"mapped",[50,48,26085]],[[13300,13300],"mapped",[50,49,26085]],[[13301,13301],"mapped",[50,50,26085]],[[13302,13302],"mapped",[50,51,26085]],[[13303,13303],"mapped",[50,52,26085]],[[13304,13304],"mapped",[50,53,26085]],[[13305,13305],"mapped",[50,54,26085]],[[13306,13306],"mapped",[50,55,26085]],[[13307,13307],"mapped",[50,56,26085]],[[13308,13308],"mapped",[50,57,26085]],[[13309,13309],"mapped",[51,48,26085]],[[13310,13310],"mapped",[51,49,26085]],[[13311,13311],"mapped",[103,97,108]],[[13312,19893],"valid"],[[19894,19903],"disallowed"],[[19904,19967],"valid",[],"NV8"],[[19968,40869],"valid"],[[40870,40891],"valid"],[[40892,40899],"valid"],[[40900,40907],"valid"],[[40908,40908],"valid"],[[40909,40917],"valid"],[[40918,40959],"disallowed"],[[40960,42124],"valid"],[[42125,42127],"disallowed"],[[42128,42145],"valid",[],"NV8"],[[42146,42147],"valid",[],"NV8"],[[42148,42163],"valid",[],"NV8"],[[42164,42164],"valid",[],"NV8"],[[42165,42176],"valid",[],"NV8"],[[42177,42177],"valid",[],"NV8"],[[42178,42180],"valid",[],"NV8"],[[42181,42181],"valid",[],"NV8"],[[42182,42182],"valid",[],"NV8"],[[42183,42191],"disallowed"],[[42192,42237],"valid"],[[42238,42239],"valid",[],"NV8"],[[42240,42508],"valid"],[[42509,42511],"valid",[],"NV8"],[[42512,42539],"valid"],[[42540,42559],"disallowed"],[[42560,42560],"mapped",[42561]],[[42561,42561],"valid"],[[42562,42562],"mapped",[42563]],[[42563,42563],"valid"],[[42564,42564],"mapped",[42565]],[[42565,42565],"valid"],[[42566,42566],"mapped",[42567]],[[42567,42567],"valid"],[[42568,42568],"mapped",[42569]],[[42569,42569],"valid"],[[42570,42570],"mapped",[42571]],[[42571,42571],"valid"],[[42572,42572],"mapped",[42573]],[[42573,42573],"valid"],[[42574,42574],"mapped",[42575]],[[42575,42575],"valid"],[[42576,42576],"mapped",[42577]],[[42577,42577],"valid"],[[42578,42578],"mapped",[42579]],[[42579,42579],"valid"],[[42580,42580],"mapped",[42581]],[[42581,42581],"valid"],[[42582,42582],"mapped",[42583]],[[42583,42583],"valid"],[[42584,42584],"mapped",[42585]],[[42585,42585],"valid"],[[42586,42586],"mapped",[42587]],[[42587,42587],"valid"],[[42588,42588],"mapped",[42589]],[[42589,42589],"valid"],[[42590,42590],"mapped",[42591]],[[42591,42591],"valid"],[[42592,42592],"mapped",[42593]],[[42593,42593],"valid"],[[42594,42594],"mapped",[42595]],[[42595,42595],"valid"],[[42596,42596],"mapped",[42597]],[[42597,42597],"valid"],[[42598,42598],"mapped",[42599]],[[42599,42599],"valid"],[[42600,42600],"mapped",[42601]],[[42601,42601],"valid"],[[42602,42602],"mapped",[42603]],[[42603,42603],"valid"],[[42604,42604],"mapped",[42605]],[[42605,42607],"valid"],[[42608,42611],"valid",[],"NV8"],[[42612,42619],"valid"],[[42620,42621],"valid"],[[42622,42622],"valid",[],"NV8"],[[42623,42623],"valid"],[[42624,42624],"mapped",[42625]],[[42625,42625],"valid"],[[42626,42626],"mapped",[42627]],[[42627,42627],"valid"],[[42628,42628],"mapped",[42629]],[[42629,42629],"valid"],[[42630,42630],"mapped",[42631]],[[42631,42631],"valid"],[[42632,42632],"mapped",[42633]],[[42633,42633],"valid"],[[42634,42634],"mapped",[42635]],[[42635,42635],"valid"],[[42636,42636],"mapped",[42637]],[[42637,42637],"valid"],[[42638,42638],"mapped",[42639]],[[42639,42639],"valid"],[[42640,42640],"mapped",[42641]],[[42641,42641],"valid"],[[42642,42642],"mapped",[42643]],[[42643,42643],"valid"],[[42644,42644],"mapped",[42645]],[[42645,42645],"valid"],[[42646,42646],"mapped",[42647]],[[42647,42647],"valid"],[[42648,42648],"mapped",[42649]],[[42649,42649],"valid"],[[42650,42650],"mapped",[42651]],[[42651,42651],"valid"],[[42652,42652],"mapped",[1098]],[[42653,42653],"mapped",[1100]],[[42654,42654],"valid"],[[42655,42655],"valid"],[[42656,42725],"valid"],[[42726,42735],"valid",[],"NV8"],[[42736,42737],"valid"],[[42738,42743],"valid",[],"NV8"],[[42744,42751],"disallowed"],[[42752,42774],"valid",[],"NV8"],[[42775,42778],"valid"],[[42779,42783],"valid"],[[42784,42785],"valid",[],"NV8"],[[42786,42786],"mapped",[42787]],[[42787,42787],"valid"],[[42788,42788],"mapped",[42789]],[[42789,42789],"valid"],[[42790,42790],"mapped",[42791]],[[42791,42791],"valid"],[[42792,42792],"mapped",[42793]],[[42793,42793],"valid"],[[42794,42794],"mapped",[42795]],[[42795,42795],"valid"],[[42796,42796],"mapped",[42797]],[[42797,42797],"valid"],[[42798,42798],"mapped",[42799]],[[42799,42801],"valid"],[[42802,42802],"mapped",[42803]],[[42803,42803],"valid"],[[42804,42804],"mapped",[42805]],[[42805,42805],"valid"],[[42806,42806],"mapped",[42807]],[[42807,42807],"valid"],[[42808,42808],"mapped",[42809]],[[42809,42809],"valid"],[[42810,42810],"mapped",[42811]],[[42811,42811],"valid"],[[42812,42812],"mapped",[42813]],[[42813,42813],"valid"],[[42814,42814],"mapped",[42815]],[[42815,42815],"valid"],[[42816,42816],"mapped",[42817]],[[42817,42817],"valid"],[[42818,42818],"mapped",[42819]],[[42819,42819],"valid"],[[42820,42820],"mapped",[42821]],[[42821,42821],"valid"],[[42822,42822],"mapped",[42823]],[[42823,42823],"valid"],[[42824,42824],"mapped",[42825]],[[42825,42825],"valid"],[[42826,42826],"mapped",[42827]],[[42827,42827],"valid"],[[42828,42828],"mapped",[42829]],[[42829,42829],"valid"],[[42830,42830],"mapped",[42831]],[[42831,42831],"valid"],[[42832,42832],"mapped",[42833]],[[42833,42833],"valid"],[[42834,42834],"mapped",[42835]],[[42835,42835],"valid"],[[42836,42836],"mapped",[42837]],[[42837,42837],"valid"],[[42838,42838],"mapped",[42839]],[[42839,42839],"valid"],[[42840,42840],"mapped",[42841]],[[42841,42841],"valid"],[[42842,42842],"mapped",[42843]],[[42843,42843],"valid"],[[42844,42844],"mapped",[42845]],[[42845,42845],"valid"],[[42846,42846],"mapped",[42847]],[[42847,42847],"valid"],[[42848,42848],"mapped",[42849]],[[42849,42849],"valid"],[[42850,42850],"mapped",[42851]],[[42851,42851],"valid"],[[42852,42852],"mapped",[42853]],[[42853,42853],"valid"],[[42854,42854],"mapped",[42855]],[[42855,42855],"valid"],[[42856,42856],"mapped",[42857]],[[42857,42857],"valid"],[[42858,42858],"mapped",[42859]],[[42859,42859],"valid"],[[42860,42860],"mapped",[42861]],[[42861,42861],"valid"],[[42862,42862],"mapped",[42863]],[[42863,42863],"valid"],[[42864,42864],"mapped",[42863]],[[42865,42872],"valid"],[[42873,42873],"mapped",[42874]],[[42874,42874],"valid"],[[42875,42875],"mapped",[42876]],[[42876,42876],"valid"],[[42877,42877],"mapped",[7545]],[[42878,42878],"mapped",[42879]],[[42879,42879],"valid"],[[42880,42880],"mapped",[42881]],[[42881,42881],"valid"],[[42882,42882],"mapped",[42883]],[[42883,42883],"valid"],[[42884,42884],"mapped",[42885]],[[42885,42885],"valid"],[[42886,42886],"mapped",[42887]],[[42887,42888],"valid"],[[42889,42890],"valid",[],"NV8"],[[42891,42891],"mapped",[42892]],[[42892,42892],"valid"],[[42893,42893],"mapped",[613]],[[42894,42894],"valid"],[[42895,42895],"valid"],[[42896,42896],"mapped",[42897]],[[42897,42897],"valid"],[[42898,42898],"mapped",[42899]],[[42899,42899],"valid"],[[42900,42901],"valid"],[[42902,42902],"mapped",[42903]],[[42903,42903],"valid"],[[42904,42904],"mapped",[42905]],[[42905,42905],"valid"],[[42906,42906],"mapped",[42907]],[[42907,42907],"valid"],[[42908,42908],"mapped",[42909]],[[42909,42909],"valid"],[[42910,42910],"mapped",[42911]],[[42911,42911],"valid"],[[42912,42912],"mapped",[42913]],[[42913,42913],"valid"],[[42914,42914],"mapped",[42915]],[[42915,42915],"valid"],[[42916,42916],"mapped",[42917]],[[42917,42917],"valid"],[[42918,42918],"mapped",[42919]],[[42919,42919],"valid"],[[42920,42920],"mapped",[42921]],[[42921,42921],"valid"],[[42922,42922],"mapped",[614]],[[42923,42923],"mapped",[604]],[[42924,42924],"mapped",[609]],[[42925,42925],"mapped",[620]],[[42926,42927],"disallowed"],[[42928,42928],"mapped",[670]],[[42929,42929],"mapped",[647]],[[42930,42930],"mapped",[669]],[[42931,42931],"mapped",[43859]],[[42932,42932],"mapped",[42933]],[[42933,42933],"valid"],[[42934,42934],"mapped",[42935]],[[42935,42935],"valid"],[[42936,42998],"disallowed"],[[42999,42999],"valid"],[[43000,43000],"mapped",[295]],[[43001,43001],"mapped",[339]],[[43002,43002],"valid"],[[43003,43007],"valid"],[[43008,43047],"valid"],[[43048,43051],"valid",[],"NV8"],[[43052,43055],"disallowed"],[[43056,43065],"valid",[],"NV8"],[[43066,43071],"disallowed"],[[43072,43123],"valid"],[[43124,43127],"valid",[],"NV8"],[[43128,43135],"disallowed"],[[43136,43204],"valid"],[[43205,43213],"disallowed"],[[43214,43215],"valid",[],"NV8"],[[43216,43225],"valid"],[[43226,43231],"disallowed"],[[43232,43255],"valid"],[[43256,43258],"valid",[],"NV8"],[[43259,43259],"valid"],[[43260,43260],"valid",[],"NV8"],[[43261,43261],"valid"],[[43262,43263],"disallowed"],[[43264,43309],"valid"],[[43310,43311],"valid",[],"NV8"],[[43312,43347],"valid"],[[43348,43358],"disallowed"],[[43359,43359],"valid",[],"NV8"],[[43360,43388],"valid",[],"NV8"],[[43389,43391],"disallowed"],[[43392,43456],"valid"],[[43457,43469],"valid",[],"NV8"],[[43470,43470],"disallowed"],[[43471,43481],"valid"],[[43482,43485],"disallowed"],[[43486,43487],"valid",[],"NV8"],[[43488,43518],"valid"],[[43519,43519],"disallowed"],[[43520,43574],"valid"],[[43575,43583],"disallowed"],[[43584,43597],"valid"],[[43598,43599],"disallowed"],[[43600,43609],"valid"],[[43610,43611],"disallowed"],[[43612,43615],"valid",[],"NV8"],[[43616,43638],"valid"],[[43639,43641],"valid",[],"NV8"],[[43642,43643],"valid"],[[43644,43647],"valid"],[[43648,43714],"valid"],[[43715,43738],"disallowed"],[[43739,43741],"valid"],[[43742,43743],"valid",[],"NV8"],[[43744,43759],"valid"],[[43760,43761],"valid",[],"NV8"],[[43762,43766],"valid"],[[43767,43776],"disallowed"],[[43777,43782],"valid"],[[43783,43784],"disallowed"],[[43785,43790],"valid"],[[43791,43792],"disallowed"],[[43793,43798],"valid"],[[43799,43807],"disallowed"],[[43808,43814],"valid"],[[43815,43815],"disallowed"],[[43816,43822],"valid"],[[43823,43823],"disallowed"],[[43824,43866],"valid"],[[43867,43867],"valid",[],"NV8"],[[43868,43868],"mapped",[42791]],[[43869,43869],"mapped",[43831]],[[43870,43870],"mapped",[619]],[[43871,43871],"mapped",[43858]],[[43872,43875],"valid"],[[43876,43877],"valid"],[[43878,43887],"disallowed"],[[43888,43888],"mapped",[5024]],[[43889,43889],"mapped",[5025]],[[43890,43890],"mapped",[5026]],[[43891,43891],"mapped",[5027]],[[43892,43892],"mapped",[5028]],[[43893,43893],"mapped",[5029]],[[43894,43894],"mapped",[5030]],[[43895,43895],"mapped",[5031]],[[43896,43896],"mapped",[5032]],[[43897,43897],"mapped",[5033]],[[43898,43898],"mapped",[5034]],[[43899,43899],"mapped",[5035]],[[43900,43900],"mapped",[5036]],[[43901,43901],"mapped",[5037]],[[43902,43902],"mapped",[5038]],[[43903,43903],"mapped",[5039]],[[43904,43904],"mapped",[5040]],[[43905,43905],"mapped",[5041]],[[43906,43906],"mapped",[5042]],[[43907,43907],"mapped",[5043]],[[43908,43908],"mapped",[5044]],[[43909,43909],"mapped",[5045]],[[43910,43910],"mapped",[5046]],[[43911,43911],"mapped",[5047]],[[43912,43912],"mapped",[5048]],[[43913,43913],"mapped",[5049]],[[43914,43914],"mapped",[5050]],[[43915,43915],"mapped",[5051]],[[43916,43916],"mapped",[5052]],[[43917,43917],"mapped",[5053]],[[43918,43918],"mapped",[5054]],[[43919,43919],"mapped",[5055]],[[43920,43920],"mapped",[5056]],[[43921,43921],"mapped",[5057]],[[43922,43922],"mapped",[5058]],[[43923,43923],"mapped",[5059]],[[43924,43924],"mapped",[5060]],[[43925,43925],"mapped",[5061]],[[43926,43926],"mapped",[5062]],[[43927,43927],"mapped",[5063]],[[43928,43928],"mapped",[5064]],[[43929,43929],"mapped",[5065]],[[43930,43930],"mapped",[5066]],[[43931,43931],"mapped",[5067]],[[43932,43932],"mapped",[5068]],[[43933,43933],"mapped",[5069]],[[43934,43934],"mapped",[5070]],[[43935,43935],"mapped",[5071]],[[43936,43936],"mapped",[5072]],[[43937,43937],"mapped",[5073]],[[43938,43938],"mapped",[5074]],[[43939,43939],"mapped",[5075]],[[43940,43940],"mapped",[5076]],[[43941,43941],"mapped",[5077]],[[43942,43942],"mapped",[5078]],[[43943,43943],"mapped",[5079]],[[43944,43944],"mapped",[5080]],[[43945,43945],"mapped",[5081]],[[43946,43946],"mapped",[5082]],[[43947,43947],"mapped",[5083]],[[43948,43948],"mapped",[5084]],[[43949,43949],"mapped",[5085]],[[43950,43950],"mapped",[5086]],[[43951,43951],"mapped",[5087]],[[43952,43952],"mapped",[5088]],[[43953,43953],"mapped",[5089]],[[43954,43954],"mapped",[5090]],[[43955,43955],"mapped",[5091]],[[43956,43956],"mapped",[5092]],[[43957,43957],"mapped",[5093]],[[43958,43958],"mapped",[5094]],[[43959,43959],"mapped",[5095]],[[43960,43960],"mapped",[5096]],[[43961,43961],"mapped",[5097]],[[43962,43962],"mapped",[5098]],[[43963,43963],"mapped",[5099]],[[43964,43964],"mapped",[5100]],[[43965,43965],"mapped",[5101]],[[43966,43966],"mapped",[5102]],[[43967,43967],"mapped",[5103]],[[43968,44010],"valid"],[[44011,44011],"valid",[],"NV8"],[[44012,44013],"valid"],[[44014,44015],"disallowed"],[[44016,44025],"valid"],[[44026,44031],"disallowed"],[[44032,55203],"valid"],[[55204,55215],"disallowed"],[[55216,55238],"valid",[],"NV8"],[[55239,55242],"disallowed"],[[55243,55291],"valid",[],"NV8"],[[55292,55295],"disallowed"],[[55296,57343],"disallowed"],[[57344,63743],"disallowed"],[[63744,63744],"mapped",[35912]],[[63745,63745],"mapped",[26356]],[[63746,63746],"mapped",[36554]],[[63747,63747],"mapped",[36040]],[[63748,63748],"mapped",[28369]],[[63749,63749],"mapped",[20018]],[[63750,63750],"mapped",[21477]],[[63751,63752],"mapped",[40860]],[[63753,63753],"mapped",[22865]],[[63754,63754],"mapped",[37329]],[[63755,63755],"mapped",[21895]],[[63756,63756],"mapped",[22856]],[[63757,63757],"mapped",[25078]],[[63758,63758],"mapped",[30313]],[[63759,63759],"mapped",[32645]],[[63760,63760],"mapped",[34367]],[[63761,63761],"mapped",[34746]],[[63762,63762],"mapped",[35064]],[[63763,63763],"mapped",[37007]],[[63764,63764],"mapped",[27138]],[[63765,63765],"mapped",[27931]],[[63766,63766],"mapped",[28889]],[[63767,63767],"mapped",[29662]],[[63768,63768],"mapped",[33853]],[[63769,63769],"mapped",[37226]],[[63770,63770],"mapped",[39409]],[[63771,63771],"mapped",[20098]],[[63772,63772],"mapped",[21365]],[[63773,63773],"mapped",[27396]],[[63774,63774],"mapped",[29211]],[[63775,63775],"mapped",[34349]],[[63776,63776],"mapped",[40478]],[[63777,63777],"mapped",[23888]],[[63778,63778],"mapped",[28651]],[[63779,63779],"mapped",[34253]],[[63780,63780],"mapped",[35172]],[[63781,63781],"mapped",[25289]],[[63782,63782],"mapped",[33240]],[[63783,63783],"mapped",[34847]],[[63784,63784],"mapped",[24266]],[[63785,63785],"mapped",[26391]],[[63786,63786],"mapped",[28010]],[[63787,63787],"mapped",[29436]],[[63788,63788],"mapped",[37070]],[[63789,63789],"mapped",[20358]],[[63790,63790],"mapped",[20919]],[[63791,63791],"mapped",[21214]],[[63792,63792],"mapped",[25796]],[[63793,63793],"mapped",[27347]],[[63794,63794],"mapped",[29200]],[[63795,63795],"mapped",[30439]],[[63796,63796],"mapped",[32769]],[[63797,63797],"mapped",[34310]],[[63798,63798],"mapped",[34396]],[[63799,63799],"mapped",[36335]],[[63800,63800],"mapped",[38706]],[[63801,63801],"mapped",[39791]],[[63802,63802],"mapped",[40442]],[[63803,63803],"mapped",[30860]],[[63804,63804],"mapped",[31103]],[[63805,63805],"mapped",[32160]],[[63806,63806],"mapped",[33737]],[[63807,63807],"mapped",[37636]],[[63808,63808],"mapped",[40575]],[[63809,63809],"mapped",[35542]],[[63810,63810],"mapped",[22751]],[[63811,63811],"mapped",[24324]],[[63812,63812],"mapped",[31840]],[[63813,63813],"mapped",[32894]],[[63814,63814],"mapped",[29282]],[[63815,63815],"mapped",[30922]],[[63816,63816],"mapped",[36034]],[[63817,63817],"mapped",[38647]],[[63818,63818],"mapped",[22744]],[[63819,63819],"mapped",[23650]],[[63820,63820],"mapped",[27155]],[[63821,63821],"mapped",[28122]],[[63822,63822],"mapped",[28431]],[[63823,63823],"mapped",[32047]],[[63824,63824],"mapped",[32311]],[[63825,63825],"mapped",[38475]],[[63826,63826],"mapped",[21202]],[[63827,63827],"mapped",[32907]],[[63828,63828],"mapped",[20956]],[[63829,63829],"mapped",[20940]],[[63830,63830],"mapped",[31260]],[[63831,63831],"mapped",[32190]],[[63832,63832],"mapped",[33777]],[[63833,63833],"mapped",[38517]],[[63834,63834],"mapped",[35712]],[[63835,63835],"mapped",[25295]],[[63836,63836],"mapped",[27138]],[[63837,63837],"mapped",[35582]],[[63838,63838],"mapped",[20025]],[[63839,63839],"mapped",[23527]],[[63840,63840],"mapped",[24594]],[[63841,63841],"mapped",[29575]],[[63842,63842],"mapped",[30064]],[[63843,63843],"mapped",[21271]],[[63844,63844],"mapped",[30971]],[[63845,63845],"mapped",[20415]],[[63846,63846],"mapped",[24489]],[[63847,63847],"mapped",[19981]],[[63848,63848],"mapped",[27852]],[[63849,63849],"mapped",[25976]],[[63850,63850],"mapped",[32034]],[[63851,63851],"mapped",[21443]],[[63852,63852],"mapped",[22622]],[[63853,63853],"mapped",[30465]],[[63854,63854],"mapped",[33865]],[[63855,63855],"mapped",[35498]],[[63856,63856],"mapped",[27578]],[[63857,63857],"mapped",[36784]],[[63858,63858],"mapped",[27784]],[[63859,63859],"mapped",[25342]],[[63860,63860],"mapped",[33509]],[[63861,63861],"mapped",[25504]],[[63862,63862],"mapped",[30053]],[[63863,63863],"mapped",[20142]],[[63864,63864],"mapped",[20841]],[[63865,63865],"mapped",[20937]],[[63866,63866],"mapped",[26753]],[[63867,63867],"mapped",[31975]],[[63868,63868],"mapped",[33391]],[[63869,63869],"mapped",[35538]],[[63870,63870],"mapped",[37327]],[[63871,63871],"mapped",[21237]],[[63872,63872],"mapped",[21570]],[[63873,63873],"mapped",[22899]],[[63874,63874],"mapped",[24300]],[[63875,63875],"mapped",[26053]],[[63876,63876],"mapped",[28670]],[[63877,63877],"mapped",[31018]],[[63878,63878],"mapped",[38317]],[[63879,63879],"mapped",[39530]],[[63880,63880],"mapped",[40599]],[[63881,63881],"mapped",[40654]],[[63882,63882],"mapped",[21147]],[[63883,63883],"mapped",[26310]],[[63884,63884],"mapped",[27511]],[[63885,63885],"mapped",[36706]],[[63886,63886],"mapped",[24180]],[[63887,63887],"mapped",[24976]],[[63888,63888],"mapped",[25088]],[[63889,63889],"mapped",[25754]],[[63890,63890],"mapped",[28451]],[[63891,63891],"mapped",[29001]],[[63892,63892],"mapped",[29833]],[[63893,63893],"mapped",[31178]],[[63894,63894],"mapped",[32244]],[[63895,63895],"mapped",[32879]],[[63896,63896],"mapped",[36646]],[[63897,63897],"mapped",[34030]],[[63898,63898],"mapped",[36899]],[[63899,63899],"mapped",[37706]],[[63900,63900],"mapped",[21015]],[[63901,63901],"mapped",[21155]],[[63902,63902],"mapped",[21693]],[[63903,63903],"mapped",[28872]],[[63904,63904],"mapped",[35010]],[[63905,63905],"mapped",[35498]],[[63906,63906],"mapped",[24265]],[[63907,63907],"mapped",[24565]],[[63908,63908],"mapped",[25467]],[[63909,63909],"mapped",[27566]],[[63910,63910],"mapped",[31806]],[[63911,63911],"mapped",[29557]],[[63912,63912],"mapped",[20196]],[[63913,63913],"mapped",[22265]],[[63914,63914],"mapped",[23527]],[[63915,63915],"mapped",[23994]],[[63916,63916],"mapped",[24604]],[[63917,63917],"mapped",[29618]],[[63918,63918],"mapped",[29801]],[[63919,63919],"mapped",[32666]],[[63920,63920],"mapped",[32838]],[[63921,63921],"mapped",[37428]],[[63922,63922],"mapped",[38646]],[[63923,63923],"mapped",[38728]],[[63924,63924],"mapped",[38936]],[[63925,63925],"mapped",[20363]],[[63926,63926],"mapped",[31150]],[[63927,63927],"mapped",[37300]],[[63928,63928],"mapped",[38584]],[[63929,63929],"mapped",[24801]],[[63930,63930],"mapped",[20102]],[[63931,63931],"mapped",[20698]],[[63932,63932],"mapped",[23534]],[[63933,63933],"mapped",[23615]],[[63934,63934],"mapped",[26009]],[[63935,63935],"mapped",[27138]],[[63936,63936],"mapped",[29134]],[[63937,63937],"mapped",[30274]],[[63938,63938],"mapped",[34044]],[[63939,63939],"mapped",[36988]],[[63940,63940],"mapped",[40845]],[[63941,63941],"mapped",[26248]],[[63942,63942],"mapped",[38446]],[[63943,63943],"mapped",[21129]],[[63944,63944],"mapped",[26491]],[[63945,63945],"mapped",[26611]],[[63946,63946],"mapped",[27969]],[[63947,63947],"mapped",[28316]],[[63948,63948],"mapped",[29705]],[[63949,63949],"mapped",[30041]],[[63950,63950],"mapped",[30827]],[[63951,63951],"mapped",[32016]],[[63952,63952],"mapped",[39006]],[[63953,63953],"mapped",[20845]],[[63954,63954],"mapped",[25134]],[[63955,63955],"mapped",[38520]],[[63956,63956],"mapped",[20523]],[[63957,63957],"mapped",[23833]],[[63958,63958],"mapped",[28138]],[[63959,63959],"mapped",[36650]],[[63960,63960],"mapped",[24459]],[[63961,63961],"mapped",[24900]],[[63962,63962],"mapped",[26647]],[[63963,63963],"mapped",[29575]],[[63964,63964],"mapped",[38534]],[[63965,63965],"mapped",[21033]],[[63966,63966],"mapped",[21519]],[[63967,63967],"mapped",[23653]],[[63968,63968],"mapped",[26131]],[[63969,63969],"mapped",[26446]],[[63970,63970],"mapped",[26792]],[[63971,63971],"mapped",[27877]],[[63972,63972],"mapped",[29702]],[[63973,63973],"mapped",[30178]],[[63974,63974],"mapped",[32633]],[[63975,63975],"mapped",[35023]],[[63976,63976],"mapped",[35041]],[[63977,63977],"mapped",[37324]],[[63978,63978],"mapped",[38626]],[[63979,63979],"mapped",[21311]],[[63980,63980],"mapped",[28346]],[[63981,63981],"mapped",[21533]],[[63982,63982],"mapped",[29136]],[[63983,63983],"mapped",[29848]],[[63984,63984],"mapped",[34298]],[[63985,63985],"mapped",[38563]],[[63986,63986],"mapped",[40023]],[[63987,63987],"mapped",[40607]],[[63988,63988],"mapped",[26519]],[[63989,63989],"mapped",[28107]],[[63990,63990],"mapped",[33256]],[[63991,63991],"mapped",[31435]],[[63992,63992],"mapped",[31520]],[[63993,63993],"mapped",[31890]],[[63994,63994],"mapped",[29376]],[[63995,63995],"mapped",[28825]],[[63996,63996],"mapped",[35672]],[[63997,63997],"mapped",[20160]],[[63998,63998],"mapped",[33590]],[[63999,63999],"mapped",[21050]],[[64000,64000],"mapped",[20999]],[[64001,64001],"mapped",[24230]],[[64002,64002],"mapped",[25299]],[[64003,64003],"mapped",[31958]],[[64004,64004],"mapped",[23429]],[[64005,64005],"mapped",[27934]],[[64006,64006],"mapped",[26292]],[[64007,64007],"mapped",[36667]],[[64008,64008],"mapped",[34892]],[[64009,64009],"mapped",[38477]],[[64010,64010],"mapped",[35211]],[[64011,64011],"mapped",[24275]],[[64012,64012],"mapped",[20800]],[[64013,64013],"mapped",[21952]],[[64014,64015],"valid"],[[64016,64016],"mapped",[22618]],[[64017,64017],"valid"],[[64018,64018],"mapped",[26228]],[[64019,64020],"valid"],[[64021,64021],"mapped",[20958]],[[64022,64022],"mapped",[29482]],[[64023,64023],"mapped",[30410]],[[64024,64024],"mapped",[31036]],[[64025,64025],"mapped",[31070]],[[64026,64026],"mapped",[31077]],[[64027,64027],"mapped",[31119]],[[64028,64028],"mapped",[38742]],[[64029,64029],"mapped",[31934]],[[64030,64030],"mapped",[32701]],[[64031,64031],"valid"],[[64032,64032],"mapped",[34322]],[[64033,64033],"valid"],[[64034,64034],"mapped",[35576]],[[64035,64036],"valid"],[[64037,64037],"mapped",[36920]],[[64038,64038],"mapped",[37117]],[[64039,64041],"valid"],[[64042,64042],"mapped",[39151]],[[64043,64043],"mapped",[39164]],[[64044,64044],"mapped",[39208]],[[64045,64045],"mapped",[40372]],[[64046,64046],"mapped",[37086]],[[64047,64047],"mapped",[38583]],[[64048,64048],"mapped",[20398]],[[64049,64049],"mapped",[20711]],[[64050,64050],"mapped",[20813]],[[64051,64051],"mapped",[21193]],[[64052,64052],"mapped",[21220]],[[64053,64053],"mapped",[21329]],[[64054,64054],"mapped",[21917]],[[64055,64055],"mapped",[22022]],[[64056,64056],"mapped",[22120]],[[64057,64057],"mapped",[22592]],[[64058,64058],"mapped",[22696]],[[64059,64059],"mapped",[23652]],[[64060,64060],"mapped",[23662]],[[64061,64061],"mapped",[24724]],[[64062,64062],"mapped",[24936]],[[64063,64063],"mapped",[24974]],[[64064,64064],"mapped",[25074]],[[64065,64065],"mapped",[25935]],[[64066,64066],"mapped",[26082]],[[64067,64067],"mapped",[26257]],[[64068,64068],"mapped",[26757]],[[64069,64069],"mapped",[28023]],[[64070,64070],"mapped",[28186]],[[64071,64071],"mapped",[28450]],[[64072,64072],"mapped",[29038]],[[64073,64073],"mapped",[29227]],[[64074,64074],"mapped",[29730]],[[64075,64075],"mapped",[30865]],[[64076,64076],"mapped",[31038]],[[64077,64077],"mapped",[31049]],[[64078,64078],"mapped",[31048]],[[64079,64079],"mapped",[31056]],[[64080,64080],"mapped",[31062]],[[64081,64081],"mapped",[31069]],[[64082,64082],"mapped",[31117]],[[64083,64083],"mapped",[31118]],[[64084,64084],"mapped",[31296]],[[64085,64085],"mapped",[31361]],[[64086,64086],"mapped",[31680]],[[64087,64087],"mapped",[32244]],[[64088,64088],"mapped",[32265]],[[64089,64089],"mapped",[32321]],[[64090,64090],"mapped",[32626]],[[64091,64091],"mapped",[32773]],[[64092,64092],"mapped",[33261]],[[64093,64094],"mapped",[33401]],[[64095,64095],"mapped",[33879]],[[64096,64096],"mapped",[35088]],[[64097,64097],"mapped",[35222]],[[64098,64098],"mapped",[35585]],[[64099,64099],"mapped",[35641]],[[64100,64100],"mapped",[36051]],[[64101,64101],"mapped",[36104]],[[64102,64102],"mapped",[36790]],[[64103,64103],"mapped",[36920]],[[64104,64104],"mapped",[38627]],[[64105,64105],"mapped",[38911]],[[64106,64106],"mapped",[38971]],[[64107,64107],"mapped",[24693]],[[64108,64108],"mapped",[148206]],[[64109,64109],"mapped",[33304]],[[64110,64111],"disallowed"],[[64112,64112],"mapped",[20006]],[[64113,64113],"mapped",[20917]],[[64114,64114],"mapped",[20840]],[[64115,64115],"mapped",[20352]],[[64116,64116],"mapped",[20805]],[[64117,64117],"mapped",[20864]],[[64118,64118],"mapped",[21191]],[[64119,64119],"mapped",[21242]],[[64120,64120],"mapped",[21917]],[[64121,64121],"mapped",[21845]],[[64122,64122],"mapped",[21913]],[[64123,64123],"mapped",[21986]],[[64124,64124],"mapped",[22618]],[[64125,64125],"mapped",[22707]],[[64126,64126],"mapped",[22852]],[[64127,64127],"mapped",[22868]],[[64128,64128],"mapped",[23138]],[[64129,64129],"mapped",[23336]],[[64130,64130],"mapped",[24274]],[[64131,64131],"mapped",[24281]],[[64132,64132],"mapped",[24425]],[[64133,64133],"mapped",[24493]],[[64134,64134],"mapped",[24792]],[[64135,64135],"mapped",[24910]],[[64136,64136],"mapped",[24840]],[[64137,64137],"mapped",[24974]],[[64138,64138],"mapped",[24928]],[[64139,64139],"mapped",[25074]],[[64140,64140],"mapped",[25140]],[[64141,64141],"mapped",[25540]],[[64142,64142],"mapped",[25628]],[[64143,64143],"mapped",[25682]],[[64144,64144],"mapped",[25942]],[[64145,64145],"mapped",[26228]],[[64146,64146],"mapped",[26391]],[[64147,64147],"mapped",[26395]],[[64148,64148],"mapped",[26454]],[[64149,64149],"mapped",[27513]],[[64150,64150],"mapped",[27578]],[[64151,64151],"mapped",[27969]],[[64152,64152],"mapped",[28379]],[[64153,64153],"mapped",[28363]],[[64154,64154],"mapped",[28450]],[[64155,64155],"mapped",[28702]],[[64156,64156],"mapped",[29038]],[[64157,64157],"mapped",[30631]],[[64158,64158],"mapped",[29237]],[[64159,64159],"mapped",[29359]],[[64160,64160],"mapped",[29482]],[[64161,64161],"mapped",[29809]],[[64162,64162],"mapped",[29958]],[[64163,64163],"mapped",[30011]],[[64164,64164],"mapped",[30237]],[[64165,64165],"mapped",[30239]],[[64166,64166],"mapped",[30410]],[[64167,64167],"mapped",[30427]],[[64168,64168],"mapped",[30452]],[[64169,64169],"mapped",[30538]],[[64170,64170],"mapped",[30528]],[[64171,64171],"mapped",[30924]],[[64172,64172],"mapped",[31409]],[[64173,64173],"mapped",[31680]],[[64174,64174],"mapped",[31867]],[[64175,64175],"mapped",[32091]],[[64176,64176],"mapped",[32244]],[[64177,64177],"mapped",[32574]],[[64178,64178],"mapped",[32773]],[[64179,64179],"mapped",[33618]],[[64180,64180],"mapped",[33775]],[[64181,64181],"mapped",[34681]],[[64182,64182],"mapped",[35137]],[[64183,64183],"mapped",[35206]],[[64184,64184],"mapped",[35222]],[[64185,64185],"mapped",[35519]],[[64186,64186],"mapped",[35576]],[[64187,64187],"mapped",[35531]],[[64188,64188],"mapped",[35585]],[[64189,64189],"mapped",[35582]],[[64190,64190],"mapped",[35565]],[[64191,64191],"mapped",[35641]],[[64192,64192],"mapped",[35722]],[[64193,64193],"mapped",[36104]],[[64194,64194],"mapped",[36664]],[[64195,64195],"mapped",[36978]],[[64196,64196],"mapped",[37273]],[[64197,64197],"mapped",[37494]],[[64198,64198],"mapped",[38524]],[[64199,64199],"mapped",[38627]],[[64200,64200],"mapped",[38742]],[[64201,64201],"mapped",[38875]],[[64202,64202],"mapped",[38911]],[[64203,64203],"mapped",[38923]],[[64204,64204],"mapped",[38971]],[[64205,64205],"mapped",[39698]],[[64206,64206],"mapped",[40860]],[[64207,64207],"mapped",[141386]],[[64208,64208],"mapped",[141380]],[[64209,64209],"mapped",[144341]],[[64210,64210],"mapped",[15261]],[[64211,64211],"mapped",[16408]],[[64212,64212],"mapped",[16441]],[[64213,64213],"mapped",[152137]],[[64214,64214],"mapped",[154832]],[[64215,64215],"mapped",[163539]],[[64216,64216],"mapped",[40771]],[[64217,64217],"mapped",[40846]],[[64218,64255],"disallowed"],[[64256,64256],"mapped",[102,102]],[[64257,64257],"mapped",[102,105]],[[64258,64258],"mapped",[102,108]],[[64259,64259],"mapped",[102,102,105]],[[64260,64260],"mapped",[102,102,108]],[[64261,64262],"mapped",[115,116]],[[64263,64274],"disallowed"],[[64275,64275],"mapped",[1396,1398]],[[64276,64276],"mapped",[1396,1381]],[[64277,64277],"mapped",[1396,1387]],[[64278,64278],"mapped",[1406,1398]],[[64279,64279],"mapped",[1396,1389]],[[64280,64284],"disallowed"],[[64285,64285],"mapped",[1497,1460]],[[64286,64286],"valid"],[[64287,64287],"mapped",[1522,1463]],[[64288,64288],"mapped",[1506]],[[64289,64289],"mapped",[1488]],[[64290,64290],"mapped",[1491]],[[64291,64291],"mapped",[1492]],[[64292,64292],"mapped",[1499]],[[64293,64293],"mapped",[1500]],[[64294,64294],"mapped",[1501]],[[64295,64295],"mapped",[1512]],[[64296,64296],"mapped",[1514]],[[64297,64297],"disallowed_STD3_mapped",[43]],[[64298,64298],"mapped",[1513,1473]],[[64299,64299],"mapped",[1513,1474]],[[64300,64300],"mapped",[1513,1468,1473]],[[64301,64301],"mapped",[1513,1468,1474]],[[64302,64302],"mapped",[1488,1463]],[[64303,64303],"mapped",[1488,1464]],[[64304,64304],"mapped",[1488,1468]],[[64305,64305],"mapped",[1489,1468]],[[64306,64306],"mapped",[1490,1468]],[[64307,64307],"mapped",[1491,1468]],[[64308,64308],"mapped",[1492,1468]],[[64309,64309],"mapped",[1493,1468]],[[64310,64310],"mapped",[1494,1468]],[[64311,64311],"disallowed"],[[64312,64312],"mapped",[1496,1468]],[[64313,64313],"mapped",[1497,1468]],[[64314,64314],"mapped",[1498,1468]],[[64315,64315],"mapped",[1499,1468]],[[64316,64316],"mapped",[1500,1468]],[[64317,64317],"disallowed"],[[64318,64318],"mapped",[1502,1468]],[[64319,64319],"disallowed"],[[64320,64320],"mapped",[1504,1468]],[[64321,64321],"mapped",[1505,1468]],[[64322,64322],"disallowed"],[[64323,64323],"mapped",[1507,1468]],[[64324,64324],"mapped",[1508,1468]],[[64325,64325],"disallowed"],[[64326,64326],"mapped",[1510,1468]],[[64327,64327],"mapped",[1511,1468]],[[64328,64328],"mapped",[1512,1468]],[[64329,64329],"mapped",[1513,1468]],[[64330,64330],"mapped",[1514,1468]],[[64331,64331],"mapped",[1493,1465]],[[64332,64332],"mapped",[1489,1471]],[[64333,64333],"mapped",[1499,1471]],[[64334,64334],"mapped",[1508,1471]],[[64335,64335],"mapped",[1488,1500]],[[64336,64337],"mapped",[1649]],[[64338,64341],"mapped",[1659]],[[64342,64345],"mapped",[1662]],[[64346,64349],"mapped",[1664]],[[64350,64353],"mapped",[1658]],[[64354,64357],"mapped",[1663]],[[64358,64361],"mapped",[1657]],[[64362,64365],"mapped",[1700]],[[64366,64369],"mapped",[1702]],[[64370,64373],"mapped",[1668]],[[64374,64377],"mapped",[1667]],[[64378,64381],"mapped",[1670]],[[64382,64385],"mapped",[1671]],[[64386,64387],"mapped",[1677]],[[64388,64389],"mapped",[1676]],[[64390,64391],"mapped",[1678]],[[64392,64393],"mapped",[1672]],[[64394,64395],"mapped",[1688]],[[64396,64397],"mapped",[1681]],[[64398,64401],"mapped",[1705]],[[64402,64405],"mapped",[1711]],[[64406,64409],"mapped",[1715]],[[64410,64413],"mapped",[1713]],[[64414,64415],"mapped",[1722]],[[64416,64419],"mapped",[1723]],[[64420,64421],"mapped",[1728]],[[64422,64425],"mapped",[1729]],[[64426,64429],"mapped",[1726]],[[64430,64431],"mapped",[1746]],[[64432,64433],"mapped",[1747]],[[64434,64449],"valid",[],"NV8"],[[64450,64466],"disallowed"],[[64467,64470],"mapped",[1709]],[[64471,64472],"mapped",[1735]],[[64473,64474],"mapped",[1734]],[[64475,64476],"mapped",[1736]],[[64477,64477],"mapped",[1735,1652]],[[64478,64479],"mapped",[1739]],[[64480,64481],"mapped",[1733]],[[64482,64483],"mapped",[1737]],[[64484,64487],"mapped",[1744]],[[64488,64489],"mapped",[1609]],[[64490,64491],"mapped",[1574,1575]],[[64492,64493],"mapped",[1574,1749]],[[64494,64495],"mapped",[1574,1608]],[[64496,64497],"mapped",[1574,1735]],[[64498,64499],"mapped",[1574,1734]],[[64500,64501],"mapped",[1574,1736]],[[64502,64504],"mapped",[1574,1744]],[[64505,64507],"mapped",[1574,1609]],[[64508,64511],"mapped",[1740]],[[64512,64512],"mapped",[1574,1580]],[[64513,64513],"mapped",[1574,1581]],[[64514,64514],"mapped",[1574,1605]],[[64515,64515],"mapped",[1574,1609]],[[64516,64516],"mapped",[1574,1610]],[[64517,64517],"mapped",[1576,1580]],[[64518,64518],"mapped",[1576,1581]],[[64519,64519],"mapped",[1576,1582]],[[64520,64520],"mapped",[1576,1605]],[[64521,64521],"mapped",[1576,1609]],[[64522,64522],"mapped",[1576,1610]],[[64523,64523],"mapped",[1578,1580]],[[64524,64524],"mapped",[1578,1581]],[[64525,64525],"mapped",[1578,1582]],[[64526,64526],"mapped",[1578,1605]],[[64527,64527],"mapped",[1578,1609]],[[64528,64528],"mapped",[1578,1610]],[[64529,64529],"mapped",[1579,1580]],[[64530,64530],"mapped",[1579,1605]],[[64531,64531],"mapped",[1579,1609]],[[64532,64532],"mapped",[1579,1610]],[[64533,64533],"mapped",[1580,1581]],[[64534,64534],"mapped",[1580,1605]],[[64535,64535],"mapped",[1581,1580]],[[64536,64536],"mapped",[1581,1605]],[[64537,64537],"mapped",[1582,1580]],[[64538,64538],"mapped",[1582,1581]],[[64539,64539],"mapped",[1582,1605]],[[64540,64540],"mapped",[1587,1580]],[[64541,64541],"mapped",[1587,1581]],[[64542,64542],"mapped",[1587,1582]],[[64543,64543],"mapped",[1587,1605]],[[64544,64544],"mapped",[1589,1581]],[[64545,64545],"mapped",[1589,1605]],[[64546,64546],"mapped",[1590,1580]],[[64547,64547],"mapped",[1590,1581]],[[64548,64548],"mapped",[1590,1582]],[[64549,64549],"mapped",[1590,1605]],[[64550,64550],"mapped",[1591,1581]],[[64551,64551],"mapped",[1591,1605]],[[64552,64552],"mapped",[1592,1605]],[[64553,64553],"mapped",[1593,1580]],[[64554,64554],"mapped",[1593,1605]],[[64555,64555],"mapped",[1594,1580]],[[64556,64556],"mapped",[1594,1605]],[[64557,64557],"mapped",[1601,1580]],[[64558,64558],"mapped",[1601,1581]],[[64559,64559],"mapped",[1601,1582]],[[64560,64560],"mapped",[1601,1605]],[[64561,64561],"mapped",[1601,1609]],[[64562,64562],"mapped",[1601,1610]],[[64563,64563],"mapped",[1602,1581]],[[64564,64564],"mapped",[1602,1605]],[[64565,64565],"mapped",[1602,1609]],[[64566,64566],"mapped",[1602,1610]],[[64567,64567],"mapped",[1603,1575]],[[64568,64568],"mapped",[1603,1580]],[[64569,64569],"mapped",[1603,1581]],[[64570,64570],"mapped",[1603,1582]],[[64571,64571],"mapped",[1603,1604]],[[64572,64572],"mapped",[1603,1605]],[[64573,64573],"mapped",[1603,1609]],[[64574,64574],"mapped",[1603,1610]],[[64575,64575],"mapped",[1604,1580]],[[64576,64576],"mapped",[1604,1581]],[[64577,64577],"mapped",[1604,1582]],[[64578,64578],"mapped",[1604,1605]],[[64579,64579],"mapped",[1604,1609]],[[64580,64580],"mapped",[1604,1610]],[[64581,64581],"mapped",[1605,1580]],[[64582,64582],"mapped",[1605,1581]],[[64583,64583],"mapped",[1605,1582]],[[64584,64584],"mapped",[1605,1605]],[[64585,64585],"mapped",[1605,1609]],[[64586,64586],"mapped",[1605,1610]],[[64587,64587],"mapped",[1606,1580]],[[64588,64588],"mapped",[1606,1581]],[[64589,64589],"mapped",[1606,1582]],[[64590,64590],"mapped",[1606,1605]],[[64591,64591],"mapped",[1606,1609]],[[64592,64592],"mapped",[1606,1610]],[[64593,64593],"mapped",[1607,1580]],[[64594,64594],"mapped",[1607,1605]],[[64595,64595],"mapped",[1607,1609]],[[64596,64596],"mapped",[1607,1610]],[[64597,64597],"mapped",[1610,1580]],[[64598,64598],"mapped",[1610,1581]],[[64599,64599],"mapped",[1610,1582]],[[64600,64600],"mapped",[1610,1605]],[[64601,64601],"mapped",[1610,1609]],[[64602,64602],"mapped",[1610,1610]],[[64603,64603],"mapped",[1584,1648]],[[64604,64604],"mapped",[1585,1648]],[[64605,64605],"mapped",[1609,1648]],[[64606,64606],"disallowed_STD3_mapped",[32,1612,1617]],[[64607,64607],"disallowed_STD3_mapped",[32,1613,1617]],[[64608,64608],"disallowed_STD3_mapped",[32,1614,1617]],[[64609,64609],"disallowed_STD3_mapped",[32,1615,1617]],[[64610,64610],"disallowed_STD3_mapped",[32,1616,1617]],[[64611,64611],"disallowed_STD3_mapped",[32,1617,1648]],[[64612,64612],"mapped",[1574,1585]],[[64613,64613],"mapped",[1574,1586]],[[64614,64614],"mapped",[1574,1605]],[[64615,64615],"mapped",[1574,1606]],[[64616,64616],"mapped",[1574,1609]],[[64617,64617],"mapped",[1574,1610]],[[64618,64618],"mapped",[1576,1585]],[[64619,64619],"mapped",[1576,1586]],[[64620,64620],"mapped",[1576,1605]],[[64621,64621],"mapped",[1576,1606]],[[64622,64622],"mapped",[1576,1609]],[[64623,64623],"mapped",[1576,1610]],[[64624,64624],"mapped",[1578,1585]],[[64625,64625],"mapped",[1578,1586]],[[64626,64626],"mapped",[1578,1605]],[[64627,64627],"mapped",[1578,1606]],[[64628,64628],"mapped",[1578,1609]],[[64629,64629],"mapped",[1578,1610]],[[64630,64630],"mapped",[1579,1585]],[[64631,64631],"mapped",[1579,1586]],[[64632,64632],"mapped",[1579,1605]],[[64633,64633],"mapped",[1579,1606]],[[64634,64634],"mapped",[1579,1609]],[[64635,64635],"mapped",[1579,1610]],[[64636,64636],"mapped",[1601,1609]],[[64637,64637],"mapped",[1601,1610]],[[64638,64638],"mapped",[1602,1609]],[[64639,64639],"mapped",[1602,1610]],[[64640,64640],"mapped",[1603,1575]],[[64641,64641],"mapped",[1603,1604]],[[64642,64642],"mapped",[1603,1605]],[[64643,64643],"mapped",[1603,1609]],[[64644,64644],"mapped",[1603,1610]],[[64645,64645],"mapped",[1604,1605]],[[64646,64646],"mapped",[1604,1609]],[[64647,64647],"mapped",[1604,1610]],[[64648,64648],"mapped",[1605,1575]],[[64649,64649],"mapped",[1605,1605]],[[64650,64650],"mapped",[1606,1585]],[[64651,64651],"mapped",[1606,1586]],[[64652,64652],"mapped",[1606,1605]],[[64653,64653],"mapped",[1606,1606]],[[64654,64654],"mapped",[1606,1609]],[[64655,64655],"mapped",[1606,1610]],[[64656,64656],"mapped",[1609,1648]],[[64657,64657],"mapped",[1610,1585]],[[64658,64658],"mapped",[1610,1586]],[[64659,64659],"mapped",[1610,1605]],[[64660,64660],"mapped",[1610,1606]],[[64661,64661],"mapped",[1610,1609]],[[64662,64662],"mapped",[1610,1610]],[[64663,64663],"mapped",[1574,1580]],[[64664,64664],"mapped",[1574,1581]],[[64665,64665],"mapped",[1574,1582]],[[64666,64666],"mapped",[1574,1605]],[[64667,64667],"mapped",[1574,1607]],[[64668,64668],"mapped",[1576,1580]],[[64669,64669],"mapped",[1576,1581]],[[64670,64670],"mapped",[1576,1582]],[[64671,64671],"mapped",[1576,1605]],[[64672,64672],"mapped",[1576,1607]],[[64673,64673],"mapped",[1578,1580]],[[64674,64674],"mapped",[1578,1581]],[[64675,64675],"mapped",[1578,1582]],[[64676,64676],"mapped",[1578,1605]],[[64677,64677],"mapped",[1578,1607]],[[64678,64678],"mapped",[1579,1605]],[[64679,64679],"mapped",[1580,1581]],[[64680,64680],"mapped",[1580,1605]],[[64681,64681],"mapped",[1581,1580]],[[64682,64682],"mapped",[1581,1605]],[[64683,64683],"mapped",[1582,1580]],[[64684,64684],"mapped",[1582,1605]],[[64685,64685],"mapped",[1587,1580]],[[64686,64686],"mapped",[1587,1581]],[[64687,64687],"mapped",[1587,1582]],[[64688,64688],"mapped",[1587,1605]],[[64689,64689],"mapped",[1589,1581]],[[64690,64690],"mapped",[1589,1582]],[[64691,64691],"mapped",[1589,1605]],[[64692,64692],"mapped",[1590,1580]],[[64693,64693],"mapped",[1590,1581]],[[64694,64694],"mapped",[1590,1582]],[[64695,64695],"mapped",[1590,1605]],[[64696,64696],"mapped",[1591,1581]],[[64697,64697],"mapped",[1592,1605]],[[64698,64698],"mapped",[1593,1580]],[[64699,64699],"mapped",[1593,1605]],[[64700,64700],"mapped",[1594,1580]],[[64701,64701],"mapped",[1594,1605]],[[64702,64702],"mapped",[1601,1580]],[[64703,64703],"mapped",[1601,1581]],[[64704,64704],"mapped",[1601,1582]],[[64705,64705],"mapped",[1601,1605]],[[64706,64706],"mapped",[1602,1581]],[[64707,64707],"mapped",[1602,1605]],[[64708,64708],"mapped",[1603,1580]],[[64709,64709],"mapped",[1603,1581]],[[64710,64710],"mapped",[1603,1582]],[[64711,64711],"mapped",[1603,1604]],[[64712,64712],"mapped",[1603,1605]],[[64713,64713],"mapped",[1604,1580]],[[64714,64714],"mapped",[1604,1581]],[[64715,64715],"mapped",[1604,1582]],[[64716,64716],"mapped",[1604,1605]],[[64717,64717],"mapped",[1604,1607]],[[64718,64718],"mapped",[1605,1580]],[[64719,64719],"mapped",[1605,1581]],[[64720,64720],"mapped",[1605,1582]],[[64721,64721],"mapped",[1605,1605]],[[64722,64722],"mapped",[1606,1580]],[[64723,64723],"mapped",[1606,1581]],[[64724,64724],"mapped",[1606,1582]],[[64725,64725],"mapped",[1606,1605]],[[64726,64726],"mapped",[1606,1607]],[[64727,64727],"mapped",[1607,1580]],[[64728,64728],"mapped",[1607,1605]],[[64729,64729],"mapped",[1607,1648]],[[64730,64730],"mapped",[1610,1580]],[[64731,64731],"mapped",[1610,1581]],[[64732,64732],"mapped",[1610,1582]],[[64733,64733],"mapped",[1610,1605]],[[64734,64734],"mapped",[1610,1607]],[[64735,64735],"mapped",[1574,1605]],[[64736,64736],"mapped",[1574,1607]],[[64737,64737],"mapped",[1576,1605]],[[64738,64738],"mapped",[1576,1607]],[[64739,64739],"mapped",[1578,1605]],[[64740,64740],"mapped",[1578,1607]],[[64741,64741],"mapped",[1579,1605]],[[64742,64742],"mapped",[1579,1607]],[[64743,64743],"mapped",[1587,1605]],[[64744,64744],"mapped",[1587,1607]],[[64745,64745],"mapped",[1588,1605]],[[64746,64746],"mapped",[1588,1607]],[[64747,64747],"mapped",[1603,1604]],[[64748,64748],"mapped",[1603,1605]],[[64749,64749],"mapped",[1604,1605]],[[64750,64750],"mapped",[1606,1605]],[[64751,64751],"mapped",[1606,1607]],[[64752,64752],"mapped",[1610,1605]],[[64753,64753],"mapped",[1610,1607]],[[64754,64754],"mapped",[1600,1614,1617]],[[64755,64755],"mapped",[1600,1615,1617]],[[64756,64756],"mapped",[1600,1616,1617]],[[64757,64757],"mapped",[1591,1609]],[[64758,64758],"mapped",[1591,1610]],[[64759,64759],"mapped",[1593,1609]],[[64760,64760],"mapped",[1593,1610]],[[64761,64761],"mapped",[1594,1609]],[[64762,64762],"mapped",[1594,1610]],[[64763,64763],"mapped",[1587,1609]],[[64764,64764],"mapped",[1587,1610]],[[64765,64765],"mapped",[1588,1609]],[[64766,64766],"mapped",[1588,1610]],[[64767,64767],"mapped",[1581,1609]],[[64768,64768],"mapped",[1581,1610]],[[64769,64769],"mapped",[1580,1609]],[[64770,64770],"mapped",[1580,1610]],[[64771,64771],"mapped",[1582,1609]],[[64772,64772],"mapped",[1582,1610]],[[64773,64773],"mapped",[1589,1609]],[[64774,64774],"mapped",[1589,1610]],[[64775,64775],"mapped",[1590,1609]],[[64776,64776],"mapped",[1590,1610]],[[64777,64777],"mapped",[1588,1580]],[[64778,64778],"mapped",[1588,1581]],[[64779,64779],"mapped",[1588,1582]],[[64780,64780],"mapped",[1588,1605]],[[64781,64781],"mapped",[1588,1585]],[[64782,64782],"mapped",[1587,1585]],[[64783,64783],"mapped",[1589,1585]],[[64784,64784],"mapped",[1590,1585]],[[64785,64785],"mapped",[1591,1609]],[[64786,64786],"mapped",[1591,1610]],[[64787,64787],"mapped",[1593,1609]],[[64788,64788],"mapped",[1593,1610]],[[64789,64789],"mapped",[1594,1609]],[[64790,64790],"mapped",[1594,1610]],[[64791,64791],"mapped",[1587,1609]],[[64792,64792],"mapped",[1587,1610]],[[64793,64793],"mapped",[1588,1609]],[[64794,64794],"mapped",[1588,1610]],[[64795,64795],"mapped",[1581,1609]],[[64796,64796],"mapped",[1581,1610]],[[64797,64797],"mapped",[1580,1609]],[[64798,64798],"mapped",[1580,1610]],[[64799,64799],"mapped",[1582,1609]],[[64800,64800],"mapped",[1582,1610]],[[64801,64801],"mapped",[1589,1609]],[[64802,64802],"mapped",[1589,1610]],[[64803,64803],"mapped",[1590,1609]],[[64804,64804],"mapped",[1590,1610]],[[64805,64805],"mapped",[1588,1580]],[[64806,64806],"mapped",[1588,1581]],[[64807,64807],"mapped",[1588,1582]],[[64808,64808],"mapped",[1588,1605]],[[64809,64809],"mapped",[1588,1585]],[[64810,64810],"mapped",[1587,1585]],[[64811,64811],"mapped",[1589,1585]],[[64812,64812],"mapped",[1590,1585]],[[64813,64813],"mapped",[1588,1580]],[[64814,64814],"mapped",[1588,1581]],[[64815,64815],"mapped",[1588,1582]],[[64816,64816],"mapped",[1588,1605]],[[64817,64817],"mapped",[1587,1607]],[[64818,64818],"mapped",[1588,1607]],[[64819,64819],"mapped",[1591,1605]],[[64820,64820],"mapped",[1587,1580]],[[64821,64821],"mapped",[1587,1581]],[[64822,64822],"mapped",[1587,1582]],[[64823,64823],"mapped",[1588,1580]],[[64824,64824],"mapped",[1588,1581]],[[64825,64825],"mapped",[1588,1582]],[[64826,64826],"mapped",[1591,1605]],[[64827,64827],"mapped",[1592,1605]],[[64828,64829],"mapped",[1575,1611]],[[64830,64831],"valid",[],"NV8"],[[64832,64847],"disallowed"],[[64848,64848],"mapped",[1578,1580,1605]],[[64849,64850],"mapped",[1578,1581,1580]],[[64851,64851],"mapped",[1578,1581,1605]],[[64852,64852],"mapped",[1578,1582,1605]],[[64853,64853],"mapped",[1578,1605,1580]],[[64854,64854],"mapped",[1578,1605,1581]],[[64855,64855],"mapped",[1578,1605,1582]],[[64856,64857],"mapped",[1580,1605,1581]],[[64858,64858],"mapped",[1581,1605,1610]],[[64859,64859],"mapped",[1581,1605,1609]],[[64860,64860],"mapped",[1587,1581,1580]],[[64861,64861],"mapped",[1587,1580,1581]],[[64862,64862],"mapped",[1587,1580,1609]],[[64863,64864],"mapped",[1587,1605,1581]],[[64865,64865],"mapped",[1587,1605,1580]],[[64866,64867],"mapped",[1587,1605,1605]],[[64868,64869],"mapped",[1589,1581,1581]],[[64870,64870],"mapped",[1589,1605,1605]],[[64871,64872],"mapped",[1588,1581,1605]],[[64873,64873],"mapped",[1588,1580,1610]],[[64874,64875],"mapped",[1588,1605,1582]],[[64876,64877],"mapped",[1588,1605,1605]],[[64878,64878],"mapped",[1590,1581,1609]],[[64879,64880],"mapped",[1590,1582,1605]],[[64881,64882],"mapped",[1591,1605,1581]],[[64883,64883],"mapped",[1591,1605,1605]],[[64884,64884],"mapped",[1591,1605,1610]],[[64885,64885],"mapped",[1593,1580,1605]],[[64886,64887],"mapped",[1593,1605,1605]],[[64888,64888],"mapped",[1593,1605,1609]],[[64889,64889],"mapped",[1594,1605,1605]],[[64890,64890],"mapped",[1594,1605,1610]],[[64891,64891],"mapped",[1594,1605,1609]],[[64892,64893],"mapped",[1601,1582,1605]],[[64894,64894],"mapped",[1602,1605,1581]],[[64895,64895],"mapped",[1602,1605,1605]],[[64896,64896],"mapped",[1604,1581,1605]],[[64897,64897],"mapped",[1604,1581,1610]],[[64898,64898],"mapped",[1604,1581,1609]],[[64899,64900],"mapped",[1604,1580,1580]],[[64901,64902],"mapped",[1604,1582,1605]],[[64903,64904],"mapped",[1604,1605,1581]],[[64905,64905],"mapped",[1605,1581,1580]],[[64906,64906],"mapped",[1605,1581,1605]],[[64907,64907],"mapped",[1605,1581,1610]],[[64908,64908],"mapped",[1605,1580,1581]],[[64909,64909],"mapped",[1605,1580,1605]],[[64910,64910],"mapped",[1605,1582,1580]],[[64911,64911],"mapped",[1605,1582,1605]],[[64912,64913],"disallowed"],[[64914,64914],"mapped",[1605,1580,1582]],[[64915,64915],"mapped",[1607,1605,1580]],[[64916,64916],"mapped",[1607,1605,1605]],[[64917,64917],"mapped",[1606,1581,1605]],[[64918,64918],"mapped",[1606,1581,1609]],[[64919,64920],"mapped",[1606,1580,1605]],[[64921,64921],"mapped",[1606,1580,1609]],[[64922,64922],"mapped",[1606,1605,1610]],[[64923,64923],"mapped",[1606,1605,1609]],[[64924,64925],"mapped",[1610,1605,1605]],[[64926,64926],"mapped",[1576,1582,1610]],[[64927,64927],"mapped",[1578,1580,1610]],[[64928,64928],"mapped",[1578,1580,1609]],[[64929,64929],"mapped",[1578,1582,1610]],[[64930,64930],"mapped",[1578,1582,1609]],[[64931,64931],"mapped",[1578,1605,1610]],[[64932,64932],"mapped",[1578,1605,1609]],[[64933,64933],"mapped",[1580,1605,1610]],[[64934,64934],"mapped",[1580,1581,1609]],[[64935,64935],"mapped",[1580,1605,1609]],[[64936,64936],"mapped",[1587,1582,1609]],[[64937,64937],"mapped",[1589,1581,1610]],[[64938,64938],"mapped",[1588,1581,1610]],[[64939,64939],"mapped",[1590,1581,1610]],[[64940,64940],"mapped",[1604,1580,1610]],[[64941,64941],"mapped",[1604,1605,1610]],[[64942,64942],"mapped",[1610,1581,1610]],[[64943,64943],"mapped",[1610,1580,1610]],[[64944,64944],"mapped",[1610,1605,1610]],[[64945,64945],"mapped",[1605,1605,1610]],[[64946,64946],"mapped",[1602,1605,1610]],[[64947,64947],"mapped",[1606,1581,1610]],[[64948,64948],"mapped",[1602,1605,1581]],[[64949,64949],"mapped",[1604,1581,1605]],[[64950,64950],"mapped",[1593,1605,1610]],[[64951,64951],"mapped",[1603,1605,1610]],[[64952,64952],"mapped",[1606,1580,1581]],[[64953,64953],"mapped",[1605,1582,1610]],[[64954,64954],"mapped",[1604,1580,1605]],[[64955,64955],"mapped",[1603,1605,1605]],[[64956,64956],"mapped",[1604,1580,1605]],[[64957,64957],"mapped",[1606,1580,1581]],[[64958,64958],"mapped",[1580,1581,1610]],[[64959,64959],"mapped",[1581,1580,1610]],[[64960,64960],"mapped",[1605,1580,1610]],[[64961,64961],"mapped",[1601,1605,1610]],[[64962,64962],"mapped",[1576,1581,1610]],[[64963,64963],"mapped",[1603,1605,1605]],[[64964,64964],"mapped",[1593,1580,1605]],[[64965,64965],"mapped",[1589,1605,1605]],[[64966,64966],"mapped",[1587,1582,1610]],[[64967,64967],"mapped",[1606,1580,1610]],[[64968,64975],"disallowed"],[[64976,65007],"disallowed"],[[65008,65008],"mapped",[1589,1604,1746]],[[65009,65009],"mapped",[1602,1604,1746]],[[65010,65010],"mapped",[1575,1604,1604,1607]],[[65011,65011],"mapped",[1575,1603,1576,1585]],[[65012,65012],"mapped",[1605,1581,1605,1583]],[[65013,65013],"mapped",[1589,1604,1593,1605]],[[65014,65014],"mapped",[1585,1587,1608,1604]],[[65015,65015],"mapped",[1593,1604,1610,1607]],[[65016,65016],"mapped",[1608,1587,1604,1605]],[[65017,65017],"mapped",[1589,1604,1609]],[[65018,65018],"disallowed_STD3_mapped",[1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605]],[[65019,65019],"disallowed_STD3_mapped",[1580,1604,32,1580,1604,1575,1604,1607]],[[65020,65020],"mapped",[1585,1740,1575,1604]],[[65021,65021],"valid",[],"NV8"],[[65022,65023],"disallowed"],[[65024,65039],"ignored"],[[65040,65040],"disallowed_STD3_mapped",[44]],[[65041,65041],"mapped",[12289]],[[65042,65042],"disallowed"],[[65043,65043],"disallowed_STD3_mapped",[58]],[[65044,65044],"disallowed_STD3_mapped",[59]],[[65045,65045],"disallowed_STD3_mapped",[33]],[[65046,65046],"disallowed_STD3_mapped",[63]],[[65047,65047],"mapped",[12310]],[[65048,65048],"mapped",[12311]],[[65049,65049],"disallowed"],[[65050,65055],"disallowed"],[[65056,65059],"valid"],[[65060,65062],"valid"],[[65063,65069],"valid"],[[65070,65071],"valid"],[[65072,65072],"disallowed"],[[65073,65073],"mapped",[8212]],[[65074,65074],"mapped",[8211]],[[65075,65076],"disallowed_STD3_mapped",[95]],[[65077,65077],"disallowed_STD3_mapped",[40]],[[65078,65078],"disallowed_STD3_mapped",[41]],[[65079,65079],"disallowed_STD3_mapped",[123]],[[65080,65080],"disallowed_STD3_mapped",[125]],[[65081,65081],"mapped",[12308]],[[65082,65082],"mapped",[12309]],[[65083,65083],"mapped",[12304]],[[65084,65084],"mapped",[12305]],[[65085,65085],"mapped",[12298]],[[65086,65086],"mapped",[12299]],[[65087,65087],"mapped",[12296]],[[65088,65088],"mapped",[12297]],[[65089,65089],"mapped",[12300]],[[65090,65090],"mapped",[12301]],[[65091,65091],"mapped",[12302]],[[65092,65092],"mapped",[12303]],[[65093,65094],"valid",[],"NV8"],[[65095,65095],"disallowed_STD3_mapped",[91]],[[65096,65096],"disallowed_STD3_mapped",[93]],[[65097,65100],"disallowed_STD3_mapped",[32,773]],[[65101,65103],"disallowed_STD3_mapped",[95]],[[65104,65104],"disallowed_STD3_mapped",[44]],[[65105,65105],"mapped",[12289]],[[65106,65106],"disallowed"],[[65107,65107],"disallowed"],[[65108,65108],"disallowed_STD3_mapped",[59]],[[65109,65109],"disallowed_STD3_mapped",[58]],[[65110,65110],"disallowed_STD3_mapped",[63]],[[65111,65111],"disallowed_STD3_mapped",[33]],[[65112,65112],"mapped",[8212]],[[65113,65113],"disallowed_STD3_mapped",[40]],[[65114,65114],"disallowed_STD3_mapped",[41]],[[65115,65115],"disallowed_STD3_mapped",[123]],[[65116,65116],"disallowed_STD3_mapped",[125]],[[65117,65117],"mapped",[12308]],[[65118,65118],"mapped",[12309]],[[65119,65119],"disallowed_STD3_mapped",[35]],[[65120,65120],"disallowed_STD3_mapped",[38]],[[65121,65121],"disallowed_STD3_mapped",[42]],[[65122,65122],"disallowed_STD3_mapped",[43]],[[65123,65123],"mapped",[45]],[[65124,65124],"disallowed_STD3_mapped",[60]],[[65125,65125],"disallowed_STD3_mapped",[62]],[[65126,65126],"disallowed_STD3_mapped",[61]],[[65127,65127],"disallowed"],[[65128,65128],"disallowed_STD3_mapped",[92]],[[65129,65129],"disallowed_STD3_mapped",[36]],[[65130,65130],"disallowed_STD3_mapped",[37]],[[65131,65131],"disallowed_STD3_mapped",[64]],[[65132,65135],"disallowed"],[[65136,65136],"disallowed_STD3_mapped",[32,1611]],[[65137,65137],"mapped",[1600,1611]],[[65138,65138],"disallowed_STD3_mapped",[32,1612]],[[65139,65139],"valid"],[[65140,65140],"disallowed_STD3_mapped",[32,1613]],[[65141,65141],"disallowed"],[[65142,65142],"disallowed_STD3_mapped",[32,1614]],[[65143,65143],"mapped",[1600,1614]],[[65144,65144],"disallowed_STD3_mapped",[32,1615]],[[65145,65145],"mapped",[1600,1615]],[[65146,65146],"disallowed_STD3_mapped",[32,1616]],[[65147,65147],"mapped",[1600,1616]],[[65148,65148],"disallowed_STD3_mapped",[32,1617]],[[65149,65149],"mapped",[1600,1617]],[[65150,65150],"disallowed_STD3_mapped",[32,1618]],[[65151,65151],"mapped",[1600,1618]],[[65152,65152],"mapped",[1569]],[[65153,65154],"mapped",[1570]],[[65155,65156],"mapped",[1571]],[[65157,65158],"mapped",[1572]],[[65159,65160],"mapped",[1573]],[[65161,65164],"mapped",[1574]],[[65165,65166],"mapped",[1575]],[[65167,65170],"mapped",[1576]],[[65171,65172],"mapped",[1577]],[[65173,65176],"mapped",[1578]],[[65177,65180],"mapped",[1579]],[[65181,65184],"mapped",[1580]],[[65185,65188],"mapped",[1581]],[[65189,65192],"mapped",[1582]],[[65193,65194],"mapped",[1583]],[[65195,65196],"mapped",[1584]],[[65197,65198],"mapped",[1585]],[[65199,65200],"mapped",[1586]],[[65201,65204],"mapped",[1587]],[[65205,65208],"mapped",[1588]],[[65209,65212],"mapped",[1589]],[[65213,65216],"mapped",[1590]],[[65217,65220],"mapped",[1591]],[[65221,65224],"mapped",[1592]],[[65225,65228],"mapped",[1593]],[[65229,65232],"mapped",[1594]],[[65233,65236],"mapped",[1601]],[[65237,65240],"mapped",[1602]],[[65241,65244],"mapped",[1603]],[[65245,65248],"mapped",[1604]],[[65249,65252],"mapped",[1605]],[[65253,65256],"mapped",[1606]],[[65257,65260],"mapped",[1607]],[[65261,65262],"mapped",[1608]],[[65263,65264],"mapped",[1609]],[[65265,65268],"mapped",[1610]],[[65269,65270],"mapped",[1604,1570]],[[65271,65272],"mapped",[1604,1571]],[[65273,65274],"mapped",[1604,1573]],[[65275,65276],"mapped",[1604,1575]],[[65277,65278],"disallowed"],[[65279,65279],"ignored"],[[65280,65280],"disallowed"],[[65281,65281],"disallowed_STD3_mapped",[33]],[[65282,65282],"disallowed_STD3_mapped",[34]],[[65283,65283],"disallowed_STD3_mapped",[35]],[[65284,65284],"disallowed_STD3_mapped",[36]],[[65285,65285],"disallowed_STD3_mapped",[37]],[[65286,65286],"disallowed_STD3_mapped",[38]],[[65287,65287],"disallowed_STD3_mapped",[39]],[[65288,65288],"disallowed_STD3_mapped",[40]],[[65289,65289],"disallowed_STD3_mapped",[41]],[[65290,65290],"disallowed_STD3_mapped",[42]],[[65291,65291],"disallowed_STD3_mapped",[43]],[[65292,65292],"disallowed_STD3_mapped",[44]],[[65293,65293],"mapped",[45]],[[65294,65294],"mapped",[46]],[[65295,65295],"disallowed_STD3_mapped",[47]],[[65296,65296],"mapped",[48]],[[65297,65297],"mapped",[49]],[[65298,65298],"mapped",[50]],[[65299,65299],"mapped",[51]],[[65300,65300],"mapped",[52]],[[65301,65301],"mapped",[53]],[[65302,65302],"mapped",[54]],[[65303,65303],"mapped",[55]],[[65304,65304],"mapped",[56]],[[65305,65305],"mapped",[57]],[[65306,65306],"disallowed_STD3_mapped",[58]],[[65307,65307],"disallowed_STD3_mapped",[59]],[[65308,65308],"disallowed_STD3_mapped",[60]],[[65309,65309],"disallowed_STD3_mapped",[61]],[[65310,65310],"disallowed_STD3_mapped",[62]],[[65311,65311],"disallowed_STD3_mapped",[63]],[[65312,65312],"disallowed_STD3_mapped",[64]],[[65313,65313],"mapped",[97]],[[65314,65314],"mapped",[98]],[[65315,65315],"mapped",[99]],[[65316,65316],"mapped",[100]],[[65317,65317],"mapped",[101]],[[65318,65318],"mapped",[102]],[[65319,65319],"mapped",[103]],[[65320,65320],"mapped",[104]],[[65321,65321],"mapped",[105]],[[65322,65322],"mapped",[106]],[[65323,65323],"mapped",[107]],[[65324,65324],"mapped",[108]],[[65325,65325],"mapped",[109]],[[65326,65326],"mapped",[110]],[[65327,65327],"mapped",[111]],[[65328,65328],"mapped",[112]],[[65329,65329],"mapped",[113]],[[65330,65330],"mapped",[114]],[[65331,65331],"mapped",[115]],[[65332,65332],"mapped",[116]],[[65333,65333],"mapped",[117]],[[65334,65334],"mapped",[118]],[[65335,65335],"mapped",[119]],[[65336,65336],"mapped",[120]],[[65337,65337],"mapped",[121]],[[65338,65338],"mapped",[122]],[[65339,65339],"disallowed_STD3_mapped",[91]],[[65340,65340],"disallowed_STD3_mapped",[92]],[[65341,65341],"disallowed_STD3_mapped",[93]],[[65342,65342],"disallowed_STD3_mapped",[94]],[[65343,65343],"disallowed_STD3_mapped",[95]],[[65344,65344],"disallowed_STD3_mapped",[96]],[[65345,65345],"mapped",[97]],[[65346,65346],"mapped",[98]],[[65347,65347],"mapped",[99]],[[65348,65348],"mapped",[100]],[[65349,65349],"mapped",[101]],[[65350,65350],"mapped",[102]],[[65351,65351],"mapped",[103]],[[65352,65352],"mapped",[104]],[[65353,65353],"mapped",[105]],[[65354,65354],"mapped",[106]],[[65355,65355],"mapped",[107]],[[65356,65356],"mapped",[108]],[[65357,65357],"mapped",[109]],[[65358,65358],"mapped",[110]],[[65359,65359],"mapped",[111]],[[65360,65360],"mapped",[112]],[[65361,65361],"mapped",[113]],[[65362,65362],"mapped",[114]],[[65363,65363],"mapped",[115]],[[65364,65364],"mapped",[116]],[[65365,65365],"mapped",[117]],[[65366,65366],"mapped",[118]],[[65367,65367],"mapped",[119]],[[65368,65368],"mapped",[120]],[[65369,65369],"mapped",[121]],[[65370,65370],"mapped",[122]],[[65371,65371],"disallowed_STD3_mapped",[123]],[[65372,65372],"disallowed_STD3_mapped",[124]],[[65373,65373],"disallowed_STD3_mapped",[125]],[[65374,65374],"disallowed_STD3_mapped",[126]],[[65375,65375],"mapped",[10629]],[[65376,65376],"mapped",[10630]],[[65377,65377],"mapped",[46]],[[65378,65378],"mapped",[12300]],[[65379,65379],"mapped",[12301]],[[65380,65380],"mapped",[12289]],[[65381,65381],"mapped",[12539]],[[65382,65382],"mapped",[12530]],[[65383,65383],"mapped",[12449]],[[65384,65384],"mapped",[12451]],[[65385,65385],"mapped",[12453]],[[65386,65386],"mapped",[12455]],[[65387,65387],"mapped",[12457]],[[65388,65388],"mapped",[12515]],[[65389,65389],"mapped",[12517]],[[65390,65390],"mapped",[12519]],[[65391,65391],"mapped",[12483]],[[65392,65392],"mapped",[12540]],[[65393,65393],"mapped",[12450]],[[65394,65394],"mapped",[12452]],[[65395,65395],"mapped",[12454]],[[65396,65396],"mapped",[12456]],[[65397,65397],"mapped",[12458]],[[65398,65398],"mapped",[12459]],[[65399,65399],"mapped",[12461]],[[65400,65400],"mapped",[12463]],[[65401,65401],"mapped",[12465]],[[65402,65402],"mapped",[12467]],[[65403,65403],"mapped",[12469]],[[65404,65404],"mapped",[12471]],[[65405,65405],"mapped",[12473]],[[65406,65406],"mapped",[12475]],[[65407,65407],"mapped",[12477]],[[65408,65408],"mapped",[12479]],[[65409,65409],"mapped",[12481]],[[65410,65410],"mapped",[12484]],[[65411,65411],"mapped",[12486]],[[65412,65412],"mapped",[12488]],[[65413,65413],"mapped",[12490]],[[65414,65414],"mapped",[12491]],[[65415,65415],"mapped",[12492]],[[65416,65416],"mapped",[12493]],[[65417,65417],"mapped",[12494]],[[65418,65418],"mapped",[12495]],[[65419,65419],"mapped",[12498]],[[65420,65420],"mapped",[12501]],[[65421,65421],"mapped",[12504]],[[65422,65422],"mapped",[12507]],[[65423,65423],"mapped",[12510]],[[65424,65424],"mapped",[12511]],[[65425,65425],"mapped",[12512]],[[65426,65426],"mapped",[12513]],[[65427,65427],"mapped",[12514]],[[65428,65428],"mapped",[12516]],[[65429,65429],"mapped",[12518]],[[65430,65430],"mapped",[12520]],[[65431,65431],"mapped",[12521]],[[65432,65432],"mapped",[12522]],[[65433,65433],"mapped",[12523]],[[65434,65434],"mapped",[12524]],[[65435,65435],"mapped",[12525]],[[65436,65436],"mapped",[12527]],[[65437,65437],"mapped",[12531]],[[65438,65438],"mapped",[12441]],[[65439,65439],"mapped",[12442]],[[65440,65440],"disallowed"],[[65441,65441],"mapped",[4352]],[[65442,65442],"mapped",[4353]],[[65443,65443],"mapped",[4522]],[[65444,65444],"mapped",[4354]],[[65445,65445],"mapped",[4524]],[[65446,65446],"mapped",[4525]],[[65447,65447],"mapped",[4355]],[[65448,65448],"mapped",[4356]],[[65449,65449],"mapped",[4357]],[[65450,65450],"mapped",[4528]],[[65451,65451],"mapped",[4529]],[[65452,65452],"mapped",[4530]],[[65453,65453],"mapped",[4531]],[[65454,65454],"mapped",[4532]],[[65455,65455],"mapped",[4533]],[[65456,65456],"mapped",[4378]],[[65457,65457],"mapped",[4358]],[[65458,65458],"mapped",[4359]],[[65459,65459],"mapped",[4360]],[[65460,65460],"mapped",[4385]],[[65461,65461],"mapped",[4361]],[[65462,65462],"mapped",[4362]],[[65463,65463],"mapped",[4363]],[[65464,65464],"mapped",[4364]],[[65465,65465],"mapped",[4365]],[[65466,65466],"mapped",[4366]],[[65467,65467],"mapped",[4367]],[[65468,65468],"mapped",[4368]],[[65469,65469],"mapped",[4369]],[[65470,65470],"mapped",[4370]],[[65471,65473],"disallowed"],[[65474,65474],"mapped",[4449]],[[65475,65475],"mapped",[4450]],[[65476,65476],"mapped",[4451]],[[65477,65477],"mapped",[4452]],[[65478,65478],"mapped",[4453]],[[65479,65479],"mapped",[4454]],[[65480,65481],"disallowed"],[[65482,65482],"mapped",[4455]],[[65483,65483],"mapped",[4456]],[[65484,65484],"mapped",[4457]],[[65485,65485],"mapped",[4458]],[[65486,65486],"mapped",[4459]],[[65487,65487],"mapped",[4460]],[[65488,65489],"disallowed"],[[65490,65490],"mapped",[4461]],[[65491,65491],"mapped",[4462]],[[65492,65492],"mapped",[4463]],[[65493,65493],"mapped",[4464]],[[65494,65494],"mapped",[4465]],[[65495,65495],"mapped",[4466]],[[65496,65497],"disallowed"],[[65498,65498],"mapped",[4467]],[[65499,65499],"mapped",[4468]],[[65500,65500],"mapped",[4469]],[[65501,65503],"disallowed"],[[65504,65504],"mapped",[162]],[[65505,65505],"mapped",[163]],[[65506,65506],"mapped",[172]],[[65507,65507],"disallowed_STD3_mapped",[32,772]],[[65508,65508],"mapped",[166]],[[65509,65509],"mapped",[165]],[[65510,65510],"mapped",[8361]],[[65511,65511],"disallowed"],[[65512,65512],"mapped",[9474]],[[65513,65513],"mapped",[8592]],[[65514,65514],"mapped",[8593]],[[65515,65515],"mapped",[8594]],[[65516,65516],"mapped",[8595]],[[65517,65517],"mapped",[9632]],[[65518,65518],"mapped",[9675]],[[65519,65528],"disallowed"],[[65529,65531],"disallowed"],[[65532,65532],"disallowed"],[[65533,65533],"disallowed"],[[65534,65535],"disallowed"],[[65536,65547],"valid"],[[65548,65548],"disallowed"],[[65549,65574],"valid"],[[65575,65575],"disallowed"],[[65576,65594],"valid"],[[65595,65595],"disallowed"],[[65596,65597],"valid"],[[65598,65598],"disallowed"],[[65599,65613],"valid"],[[65614,65615],"disallowed"],[[65616,65629],"valid"],[[65630,65663],"disallowed"],[[65664,65786],"valid"],[[65787,65791],"disallowed"],[[65792,65794],"valid",[],"NV8"],[[65795,65798],"disallowed"],[[65799,65843],"valid",[],"NV8"],[[65844,65846],"disallowed"],[[65847,65855],"valid",[],"NV8"],[[65856,65930],"valid",[],"NV8"],[[65931,65932],"valid",[],"NV8"],[[65933,65935],"disallowed"],[[65936,65947],"valid",[],"NV8"],[[65948,65951],"disallowed"],[[65952,65952],"valid",[],"NV8"],[[65953,65999],"disallowed"],[[66000,66044],"valid",[],"NV8"],[[66045,66045],"valid"],[[66046,66175],"disallowed"],[[66176,66204],"valid"],[[66205,66207],"disallowed"],[[66208,66256],"valid"],[[66257,66271],"disallowed"],[[66272,66272],"valid"],[[66273,66299],"valid",[],"NV8"],[[66300,66303],"disallowed"],[[66304,66334],"valid"],[[66335,66335],"valid"],[[66336,66339],"valid",[],"NV8"],[[66340,66351],"disallowed"],[[66352,66368],"valid"],[[66369,66369],"valid",[],"NV8"],[[66370,66377],"valid"],[[66378,66378],"valid",[],"NV8"],[[66379,66383],"disallowed"],[[66384,66426],"valid"],[[66427,66431],"disallowed"],[[66432,66461],"valid"],[[66462,66462],"disallowed"],[[66463,66463],"valid",[],"NV8"],[[66464,66499],"valid"],[[66500,66503],"disallowed"],[[66504,66511],"valid"],[[66512,66517],"valid",[],"NV8"],[[66518,66559],"disallowed"],[[66560,66560],"mapped",[66600]],[[66561,66561],"mapped",[66601]],[[66562,66562],"mapped",[66602]],[[66563,66563],"mapped",[66603]],[[66564,66564],"mapped",[66604]],[[66565,66565],"mapped",[66605]],[[66566,66566],"mapped",[66606]],[[66567,66567],"mapped",[66607]],[[66568,66568],"mapped",[66608]],[[66569,66569],"mapped",[66609]],[[66570,66570],"mapped",[66610]],[[66571,66571],"mapped",[66611]],[[66572,66572],"mapped",[66612]],[[66573,66573],"mapped",[66613]],[[66574,66574],"mapped",[66614]],[[66575,66575],"mapped",[66615]],[[66576,66576],"mapped",[66616]],[[66577,66577],"mapped",[66617]],[[66578,66578],"mapped",[66618]],[[66579,66579],"mapped",[66619]],[[66580,66580],"mapped",[66620]],[[66581,66581],"mapped",[66621]],[[66582,66582],"mapped",[66622]],[[66583,66583],"mapped",[66623]],[[66584,66584],"mapped",[66624]],[[66585,66585],"mapped",[66625]],[[66586,66586],"mapped",[66626]],[[66587,66587],"mapped",[66627]],[[66588,66588],"mapped",[66628]],[[66589,66589],"mapped",[66629]],[[66590,66590],"mapped",[66630]],[[66591,66591],"mapped",[66631]],[[66592,66592],"mapped",[66632]],[[66593,66593],"mapped",[66633]],[[66594,66594],"mapped",[66634]],[[66595,66595],"mapped",[66635]],[[66596,66596],"mapped",[66636]],[[66597,66597],"mapped",[66637]],[[66598,66598],"mapped",[66638]],[[66599,66599],"mapped",[66639]],[[66600,66637],"valid"],[[66638,66717],"valid"],[[66718,66719],"disallowed"],[[66720,66729],"valid"],[[66730,66815],"disallowed"],[[66816,66855],"valid"],[[66856,66863],"disallowed"],[[66864,66915],"valid"],[[66916,66926],"disallowed"],[[66927,66927],"valid",[],"NV8"],[[66928,67071],"disallowed"],[[67072,67382],"valid"],[[67383,67391],"disallowed"],[[67392,67413],"valid"],[[67414,67423],"disallowed"],[[67424,67431],"valid"],[[67432,67583],"disallowed"],[[67584,67589],"valid"],[[67590,67591],"disallowed"],[[67592,67592],"valid"],[[67593,67593],"disallowed"],[[67594,67637],"valid"],[[67638,67638],"disallowed"],[[67639,67640],"valid"],[[67641,67643],"disallowed"],[[67644,67644],"valid"],[[67645,67646],"disallowed"],[[67647,67647],"valid"],[[67648,67669],"valid"],[[67670,67670],"disallowed"],[[67671,67679],"valid",[],"NV8"],[[67680,67702],"valid"],[[67703,67711],"valid",[],"NV8"],[[67712,67742],"valid"],[[67743,67750],"disallowed"],[[67751,67759],"valid",[],"NV8"],[[67760,67807],"disallowed"],[[67808,67826],"valid"],[[67827,67827],"disallowed"],[[67828,67829],"valid"],[[67830,67834],"disallowed"],[[67835,67839],"valid",[],"NV8"],[[67840,67861],"valid"],[[67862,67865],"valid",[],"NV8"],[[67866,67867],"valid",[],"NV8"],[[67868,67870],"disallowed"],[[67871,67871],"valid",[],"NV8"],[[67872,67897],"valid"],[[67898,67902],"disallowed"],[[67903,67903],"valid",[],"NV8"],[[67904,67967],"disallowed"],[[67968,68023],"valid"],[[68024,68027],"disallowed"],[[68028,68029],"valid",[],"NV8"],[[68030,68031],"valid"],[[68032,68047],"valid",[],"NV8"],[[68048,68049],"disallowed"],[[68050,68095],"valid",[],"NV8"],[[68096,68099],"valid"],[[68100,68100],"disallowed"],[[68101,68102],"valid"],[[68103,68107],"disallowed"],[[68108,68115],"valid"],[[68116,68116],"disallowed"],[[68117,68119],"valid"],[[68120,68120],"disallowed"],[[68121,68147],"valid"],[[68148,68151],"disallowed"],[[68152,68154],"valid"],[[68155,68158],"disallowed"],[[68159,68159],"valid"],[[68160,68167],"valid",[],"NV8"],[[68168,68175],"disallowed"],[[68176,68184],"valid",[],"NV8"],[[68185,68191],"disallowed"],[[68192,68220],"valid"],[[68221,68223],"valid",[],"NV8"],[[68224,68252],"valid"],[[68253,68255],"valid",[],"NV8"],[[68256,68287],"disallowed"],[[68288,68295],"valid"],[[68296,68296],"valid",[],"NV8"],[[68297,68326],"valid"],[[68327,68330],"disallowed"],[[68331,68342],"valid",[],"NV8"],[[68343,68351],"disallowed"],[[68352,68405],"valid"],[[68406,68408],"disallowed"],[[68409,68415],"valid",[],"NV8"],[[68416,68437],"valid"],[[68438,68439],"disallowed"],[[68440,68447],"valid",[],"NV8"],[[68448,68466],"valid"],[[68467,68471],"disallowed"],[[68472,68479],"valid",[],"NV8"],[[68480,68497],"valid"],[[68498,68504],"disallowed"],[[68505,68508],"valid",[],"NV8"],[[68509,68520],"disallowed"],[[68521,68527],"valid",[],"NV8"],[[68528,68607],"disallowed"],[[68608,68680],"valid"],[[68681,68735],"disallowed"],[[68736,68736],"mapped",[68800]],[[68737,68737],"mapped",[68801]],[[68738,68738],"mapped",[68802]],[[68739,68739],"mapped",[68803]],[[68740,68740],"mapped",[68804]],[[68741,68741],"mapped",[68805]],[[68742,68742],"mapped",[68806]],[[68743,68743],"mapped",[68807]],[[68744,68744],"mapped",[68808]],[[68745,68745],"mapped",[68809]],[[68746,68746],"mapped",[68810]],[[68747,68747],"mapped",[68811]],[[68748,68748],"mapped",[68812]],[[68749,68749],"mapped",[68813]],[[68750,68750],"mapped",[68814]],[[68751,68751],"mapped",[68815]],[[68752,68752],"mapped",[68816]],[[68753,68753],"mapped",[68817]],[[68754,68754],"mapped",[68818]],[[68755,68755],"mapped",[68819]],[[68756,68756],"mapped",[68820]],[[68757,68757],"mapped",[68821]],[[68758,68758],"mapped",[68822]],[[68759,68759],"mapped",[68823]],[[68760,68760],"mapped",[68824]],[[68761,68761],"mapped",[68825]],[[68762,68762],"mapped",[68826]],[[68763,68763],"mapped",[68827]],[[68764,68764],"mapped",[68828]],[[68765,68765],"mapped",[68829]],[[68766,68766],"mapped",[68830]],[[68767,68767],"mapped",[68831]],[[68768,68768],"mapped",[68832]],[[68769,68769],"mapped",[68833]],[[68770,68770],"mapped",[68834]],[[68771,68771],"mapped",[68835]],[[68772,68772],"mapped",[68836]],[[68773,68773],"mapped",[68837]],[[68774,68774],"mapped",[68838]],[[68775,68775],"mapped",[68839]],[[68776,68776],"mapped",[68840]],[[68777,68777],"mapped",[68841]],[[68778,68778],"mapped",[68842]],[[68779,68779],"mapped",[68843]],[[68780,68780],"mapped",[68844]],[[68781,68781],"mapped",[68845]],[[68782,68782],"mapped",[68846]],[[68783,68783],"mapped",[68847]],[[68784,68784],"mapped",[68848]],[[68785,68785],"mapped",[68849]],[[68786,68786],"mapped",[68850]],[[68787,68799],"disallowed"],[[68800,68850],"valid"],[[68851,68857],"disallowed"],[[68858,68863],"valid",[],"NV8"],[[68864,69215],"disallowed"],[[69216,69246],"valid",[],"NV8"],[[69247,69631],"disallowed"],[[69632,69702],"valid"],[[69703,69709],"valid",[],"NV8"],[[69710,69713],"disallowed"],[[69714,69733],"valid",[],"NV8"],[[69734,69743],"valid"],[[69744,69758],"disallowed"],[[69759,69759],"valid"],[[69760,69818],"valid"],[[69819,69820],"valid",[],"NV8"],[[69821,69821],"disallowed"],[[69822,69825],"valid",[],"NV8"],[[69826,69839],"disallowed"],[[69840,69864],"valid"],[[69865,69871],"disallowed"],[[69872,69881],"valid"],[[69882,69887],"disallowed"],[[69888,69940],"valid"],[[69941,69941],"disallowed"],[[69942,69951],"valid"],[[69952,69955],"valid",[],"NV8"],[[69956,69967],"disallowed"],[[69968,70003],"valid"],[[70004,70005],"valid",[],"NV8"],[[70006,70006],"valid"],[[70007,70015],"disallowed"],[[70016,70084],"valid"],[[70085,70088],"valid",[],"NV8"],[[70089,70089],"valid",[],"NV8"],[[70090,70092],"valid"],[[70093,70093],"valid",[],"NV8"],[[70094,70095],"disallowed"],[[70096,70105],"valid"],[[70106,70106],"valid"],[[70107,70107],"valid",[],"NV8"],[[70108,70108],"valid"],[[70109,70111],"valid",[],"NV8"],[[70112,70112],"disallowed"],[[70113,70132],"valid",[],"NV8"],[[70133,70143],"disallowed"],[[70144,70161],"valid"],[[70162,70162],"disallowed"],[[70163,70199],"valid"],[[70200,70205],"valid",[],"NV8"],[[70206,70271],"disallowed"],[[70272,70278],"valid"],[[70279,70279],"disallowed"],[[70280,70280],"valid"],[[70281,70281],"disallowed"],[[70282,70285],"valid"],[[70286,70286],"disallowed"],[[70287,70301],"valid"],[[70302,70302],"disallowed"],[[70303,70312],"valid"],[[70313,70313],"valid",[],"NV8"],[[70314,70319],"disallowed"],[[70320,70378],"valid"],[[70379,70383],"disallowed"],[[70384,70393],"valid"],[[70394,70399],"disallowed"],[[70400,70400],"valid"],[[70401,70403],"valid"],[[70404,70404],"disallowed"],[[70405,70412],"valid"],[[70413,70414],"disallowed"],[[70415,70416],"valid"],[[70417,70418],"disallowed"],[[70419,70440],"valid"],[[70441,70441],"disallowed"],[[70442,70448],"valid"],[[70449,70449],"disallowed"],[[70450,70451],"valid"],[[70452,70452],"disallowed"],[[70453,70457],"valid"],[[70458,70459],"disallowed"],[[70460,70468],"valid"],[[70469,70470],"disallowed"],[[70471,70472],"valid"],[[70473,70474],"disallowed"],[[70475,70477],"valid"],[[70478,70479],"disallowed"],[[70480,70480],"valid"],[[70481,70486],"disallowed"],[[70487,70487],"valid"],[[70488,70492],"disallowed"],[[70493,70499],"valid"],[[70500,70501],"disallowed"],[[70502,70508],"valid"],[[70509,70511],"disallowed"],[[70512,70516],"valid"],[[70517,70783],"disallowed"],[[70784,70853],"valid"],[[70854,70854],"valid",[],"NV8"],[[70855,70855],"valid"],[[70856,70863],"disallowed"],[[70864,70873],"valid"],[[70874,71039],"disallowed"],[[71040,71093],"valid"],[[71094,71095],"disallowed"],[[71096,71104],"valid"],[[71105,71113],"valid",[],"NV8"],[[71114,71127],"valid",[],"NV8"],[[71128,71133],"valid"],[[71134,71167],"disallowed"],[[71168,71232],"valid"],[[71233,71235],"valid",[],"NV8"],[[71236,71236],"valid"],[[71237,71247],"disallowed"],[[71248,71257],"valid"],[[71258,71295],"disallowed"],[[71296,71351],"valid"],[[71352,71359],"disallowed"],[[71360,71369],"valid"],[[71370,71423],"disallowed"],[[71424,71449],"valid"],[[71450,71452],"disallowed"],[[71453,71467],"valid"],[[71468,71471],"disallowed"],[[71472,71481],"valid"],[[71482,71487],"valid",[],"NV8"],[[71488,71839],"disallowed"],[[71840,71840],"mapped",[71872]],[[71841,71841],"mapped",[71873]],[[71842,71842],"mapped",[71874]],[[71843,71843],"mapped",[71875]],[[71844,71844],"mapped",[71876]],[[71845,71845],"mapped",[71877]],[[71846,71846],"mapped",[71878]],[[71847,71847],"mapped",[71879]],[[71848,71848],"mapped",[71880]],[[71849,71849],"mapped",[71881]],[[71850,71850],"mapped",[71882]],[[71851,71851],"mapped",[71883]],[[71852,71852],"mapped",[71884]],[[71853,71853],"mapped",[71885]],[[71854,71854],"mapped",[71886]],[[71855,71855],"mapped",[71887]],[[71856,71856],"mapped",[71888]],[[71857,71857],"mapped",[71889]],[[71858,71858],"mapped",[71890]],[[71859,71859],"mapped",[71891]],[[71860,71860],"mapped",[71892]],[[71861,71861],"mapped",[71893]],[[71862,71862],"mapped",[71894]],[[71863,71863],"mapped",[71895]],[[71864,71864],"mapped",[71896]],[[71865,71865],"mapped",[71897]],[[71866,71866],"mapped",[71898]],[[71867,71867],"mapped",[71899]],[[71868,71868],"mapped",[71900]],[[71869,71869],"mapped",[71901]],[[71870,71870],"mapped",[71902]],[[71871,71871],"mapped",[71903]],[[71872,71913],"valid"],[[71914,71922],"valid",[],"NV8"],[[71923,71934],"disallowed"],[[71935,71935],"valid"],[[71936,72383],"disallowed"],[[72384,72440],"valid"],[[72441,73727],"disallowed"],[[73728,74606],"valid"],[[74607,74648],"valid"],[[74649,74649],"valid"],[[74650,74751],"disallowed"],[[74752,74850],"valid",[],"NV8"],[[74851,74862],"valid",[],"NV8"],[[74863,74863],"disallowed"],[[74864,74867],"valid",[],"NV8"],[[74868,74868],"valid",[],"NV8"],[[74869,74879],"disallowed"],[[74880,75075],"valid"],[[75076,77823],"disallowed"],[[77824,78894],"valid"],[[78895,82943],"disallowed"],[[82944,83526],"valid"],[[83527,92159],"disallowed"],[[92160,92728],"valid"],[[92729,92735],"disallowed"],[[92736,92766],"valid"],[[92767,92767],"disallowed"],[[92768,92777],"valid"],[[92778,92781],"disallowed"],[[92782,92783],"valid",[],"NV8"],[[92784,92879],"disallowed"],[[92880,92909],"valid"],[[92910,92911],"disallowed"],[[92912,92916],"valid"],[[92917,92917],"valid",[],"NV8"],[[92918,92927],"disallowed"],[[92928,92982],"valid"],[[92983,92991],"valid",[],"NV8"],[[92992,92995],"valid"],[[92996,92997],"valid",[],"NV8"],[[92998,93007],"disallowed"],[[93008,93017],"valid"],[[93018,93018],"disallowed"],[[93019,93025],"valid",[],"NV8"],[[93026,93026],"disallowed"],[[93027,93047],"valid"],[[93048,93052],"disallowed"],[[93053,93071],"valid"],[[93072,93951],"disallowed"],[[93952,94020],"valid"],[[94021,94031],"disallowed"],[[94032,94078],"valid"],[[94079,94094],"disallowed"],[[94095,94111],"valid"],[[94112,110591],"disallowed"],[[110592,110593],"valid"],[[110594,113663],"disallowed"],[[113664,113770],"valid"],[[113771,113775],"disallowed"],[[113776,113788],"valid"],[[113789,113791],"disallowed"],[[113792,113800],"valid"],[[113801,113807],"disallowed"],[[113808,113817],"valid"],[[113818,113819],"disallowed"],[[113820,113820],"valid",[],"NV8"],[[113821,113822],"valid"],[[113823,113823],"valid",[],"NV8"],[[113824,113827],"ignored"],[[113828,118783],"disallowed"],[[118784,119029],"valid",[],"NV8"],[[119030,119039],"disallowed"],[[119040,119078],"valid",[],"NV8"],[[119079,119080],"disallowed"],[[119081,119081],"valid",[],"NV8"],[[119082,119133],"valid",[],"NV8"],[[119134,119134],"mapped",[119127,119141]],[[119135,119135],"mapped",[119128,119141]],[[119136,119136],"mapped",[119128,119141,119150]],[[119137,119137],"mapped",[119128,119141,119151]],[[119138,119138],"mapped",[119128,119141,119152]],[[119139,119139],"mapped",[119128,119141,119153]],[[119140,119140],"mapped",[119128,119141,119154]],[[119141,119154],"valid",[],"NV8"],[[119155,119162],"disallowed"],[[119163,119226],"valid",[],"NV8"],[[119227,119227],"mapped",[119225,119141]],[[119228,119228],"mapped",[119226,119141]],[[119229,119229],"mapped",[119225,119141,119150]],[[119230,119230],"mapped",[119226,119141,119150]],[[119231,119231],"mapped",[119225,119141,119151]],[[119232,119232],"mapped",[119226,119141,119151]],[[119233,119261],"valid",[],"NV8"],[[119262,119272],"valid",[],"NV8"],[[119273,119295],"disallowed"],[[119296,119365],"valid",[],"NV8"],[[119366,119551],"disallowed"],[[119552,119638],"valid",[],"NV8"],[[119639,119647],"disallowed"],[[119648,119665],"valid",[],"NV8"],[[119666,119807],"disallowed"],[[119808,119808],"mapped",[97]],[[119809,119809],"mapped",[98]],[[119810,119810],"mapped",[99]],[[119811,119811],"mapped",[100]],[[119812,119812],"mapped",[101]],[[119813,119813],"mapped",[102]],[[119814,119814],"mapped",[103]],[[119815,119815],"mapped",[104]],[[119816,119816],"mapped",[105]],[[119817,119817],"mapped",[106]],[[119818,119818],"mapped",[107]],[[119819,119819],"mapped",[108]],[[119820,119820],"mapped",[109]],[[119821,119821],"mapped",[110]],[[119822,119822],"mapped",[111]],[[119823,119823],"mapped",[112]],[[119824,119824],"mapped",[113]],[[119825,119825],"mapped",[114]],[[119826,119826],"mapped",[115]],[[119827,119827],"mapped",[116]],[[119828,119828],"mapped",[117]],[[119829,119829],"mapped",[118]],[[119830,119830],"mapped",[119]],[[119831,119831],"mapped",[120]],[[119832,119832],"mapped",[121]],[[119833,119833],"mapped",[122]],[[119834,119834],"mapped",[97]],[[119835,119835],"mapped",[98]],[[119836,119836],"mapped",[99]],[[119837,119837],"mapped",[100]],[[119838,119838],"mapped",[101]],[[119839,119839],"mapped",[102]],[[119840,119840],"mapped",[103]],[[119841,119841],"mapped",[104]],[[119842,119842],"mapped",[105]],[[119843,119843],"mapped",[106]],[[119844,119844],"mapped",[107]],[[119845,119845],"mapped",[108]],[[119846,119846],"mapped",[109]],[[119847,119847],"mapped",[110]],[[119848,119848],"mapped",[111]],[[119849,119849],"mapped",[112]],[[119850,119850],"mapped",[113]],[[119851,119851],"mapped",[114]],[[119852,119852],"mapped",[115]],[[119853,119853],"mapped",[116]],[[119854,119854],"mapped",[117]],[[119855,119855],"mapped",[118]],[[119856,119856],"mapped",[119]],[[119857,119857],"mapped",[120]],[[119858,119858],"mapped",[121]],[[119859,119859],"mapped",[122]],[[119860,119860],"mapped",[97]],[[119861,119861],"mapped",[98]],[[119862,119862],"mapped",[99]],[[119863,119863],"mapped",[100]],[[119864,119864],"mapped",[101]],[[119865,119865],"mapped",[102]],[[119866,119866],"mapped",[103]],[[119867,119867],"mapped",[104]],[[119868,119868],"mapped",[105]],[[119869,119869],"mapped",[106]],[[119870,119870],"mapped",[107]],[[119871,119871],"mapped",[108]],[[119872,119872],"mapped",[109]],[[119873,119873],"mapped",[110]],[[119874,119874],"mapped",[111]],[[119875,119875],"mapped",[112]],[[119876,119876],"mapped",[113]],[[119877,119877],"mapped",[114]],[[119878,119878],"mapped",[115]],[[119879,119879],"mapped",[116]],[[119880,119880],"mapped",[117]],[[119881,119881],"mapped",[118]],[[119882,119882],"mapped",[119]],[[119883,119883],"mapped",[120]],[[119884,119884],"mapped",[121]],[[119885,119885],"mapped",[122]],[[119886,119886],"mapped",[97]],[[119887,119887],"mapped",[98]],[[119888,119888],"mapped",[99]],[[119889,119889],"mapped",[100]],[[119890,119890],"mapped",[101]],[[119891,119891],"mapped",[102]],[[119892,119892],"mapped",[103]],[[119893,119893],"disallowed"],[[119894,119894],"mapped",[105]],[[119895,119895],"mapped",[106]],[[119896,119896],"mapped",[107]],[[119897,119897],"mapped",[108]],[[119898,119898],"mapped",[109]],[[119899,119899],"mapped",[110]],[[119900,119900],"mapped",[111]],[[119901,119901],"mapped",[112]],[[119902,119902],"mapped",[113]],[[119903,119903],"mapped",[114]],[[119904,119904],"mapped",[115]],[[119905,119905],"mapped",[116]],[[119906,119906],"mapped",[117]],[[119907,119907],"mapped",[118]],[[119908,119908],"mapped",[119]],[[119909,119909],"mapped",[120]],[[119910,119910],"mapped",[121]],[[119911,119911],"mapped",[122]],[[119912,119912],"mapped",[97]],[[119913,119913],"mapped",[98]],[[119914,119914],"mapped",[99]],[[119915,119915],"mapped",[100]],[[119916,119916],"mapped",[101]],[[119917,119917],"mapped",[102]],[[119918,119918],"mapped",[103]],[[119919,119919],"mapped",[104]],[[119920,119920],"mapped",[105]],[[119921,119921],"mapped",[106]],[[119922,119922],"mapped",[107]],[[119923,119923],"mapped",[108]],[[119924,119924],"mapped",[109]],[[119925,119925],"mapped",[110]],[[119926,119926],"mapped",[111]],[[119927,119927],"mapped",[112]],[[119928,119928],"mapped",[113]],[[119929,119929],"mapped",[114]],[[119930,119930],"mapped",[115]],[[119931,119931],"mapped",[116]],[[119932,119932],"mapped",[117]],[[119933,119933],"mapped",[118]],[[119934,119934],"mapped",[119]],[[119935,119935],"mapped",[120]],[[119936,119936],"mapped",[121]],[[119937,119937],"mapped",[122]],[[119938,119938],"mapped",[97]],[[119939,119939],"mapped",[98]],[[119940,119940],"mapped",[99]],[[119941,119941],"mapped",[100]],[[119942,119942],"mapped",[101]],[[119943,119943],"mapped",[102]],[[119944,119944],"mapped",[103]],[[119945,119945],"mapped",[104]],[[119946,119946],"mapped",[105]],[[119947,119947],"mapped",[106]],[[119948,119948],"mapped",[107]],[[119949,119949],"mapped",[108]],[[119950,119950],"mapped",[109]],[[119951,119951],"mapped",[110]],[[119952,119952],"mapped",[111]],[[119953,119953],"mapped",[112]],[[119954,119954],"mapped",[113]],[[119955,119955],"mapped",[114]],[[119956,119956],"mapped",[115]],[[119957,119957],"mapped",[116]],[[119958,119958],"mapped",[117]],[[119959,119959],"mapped",[118]],[[119960,119960],"mapped",[119]],[[119961,119961],"mapped",[120]],[[119962,119962],"mapped",[121]],[[119963,119963],"mapped",[122]],[[119964,119964],"mapped",[97]],[[119965,119965],"disallowed"],[[119966,119966],"mapped",[99]],[[119967,119967],"mapped",[100]],[[119968,119969],"disallowed"],[[119970,119970],"mapped",[103]],[[119971,119972],"disallowed"],[[119973,119973],"mapped",[106]],[[119974,119974],"mapped",[107]],[[119975,119976],"disallowed"],[[119977,119977],"mapped",[110]],[[119978,119978],"mapped",[111]],[[119979,119979],"mapped",[112]],[[119980,119980],"mapped",[113]],[[119981,119981],"disallowed"],[[119982,119982],"mapped",[115]],[[119983,119983],"mapped",[116]],[[119984,119984],"mapped",[117]],[[119985,119985],"mapped",[118]],[[119986,119986],"mapped",[119]],[[119987,119987],"mapped",[120]],[[119988,119988],"mapped",[121]],[[119989,119989],"mapped",[122]],[[119990,119990],"mapped",[97]],[[119991,119991],"mapped",[98]],[[119992,119992],"mapped",[99]],[[119993,119993],"mapped",[100]],[[119994,119994],"disallowed"],[[119995,119995],"mapped",[102]],[[119996,119996],"disallowed"],[[119997,119997],"mapped",[104]],[[119998,119998],"mapped",[105]],[[119999,119999],"mapped",[106]],[[120000,120000],"mapped",[107]],[[120001,120001],"mapped",[108]],[[120002,120002],"mapped",[109]],[[120003,120003],"mapped",[110]],[[120004,120004],"disallowed"],[[120005,120005],"mapped",[112]],[[120006,120006],"mapped",[113]],[[120007,120007],"mapped",[114]],[[120008,120008],"mapped",[115]],[[120009,120009],"mapped",[116]],[[120010,120010],"mapped",[117]],[[120011,120011],"mapped",[118]],[[120012,120012],"mapped",[119]],[[120013,120013],"mapped",[120]],[[120014,120014],"mapped",[121]],[[120015,120015],"mapped",[122]],[[120016,120016],"mapped",[97]],[[120017,120017],"mapped",[98]],[[120018,120018],"mapped",[99]],[[120019,120019],"mapped",[100]],[[120020,120020],"mapped",[101]],[[120021,120021],"mapped",[102]],[[120022,120022],"mapped",[103]],[[120023,120023],"mapped",[104]],[[120024,120024],"mapped",[105]],[[120025,120025],"mapped",[106]],[[120026,120026],"mapped",[107]],[[120027,120027],"mapped",[108]],[[120028,120028],"mapped",[109]],[[120029,120029],"mapped",[110]],[[120030,120030],"mapped",[111]],[[120031,120031],"mapped",[112]],[[120032,120032],"mapped",[113]],[[120033,120033],"mapped",[114]],[[120034,120034],"mapped",[115]],[[120035,120035],"mapped",[116]],[[120036,120036],"mapped",[117]],[[120037,120037],"mapped",[118]],[[120038,120038],"mapped",[119]],[[120039,120039],"mapped",[120]],[[120040,120040],"mapped",[121]],[[120041,120041],"mapped",[122]],[[120042,120042],"mapped",[97]],[[120043,120043],"mapped",[98]],[[120044,120044],"mapped",[99]],[[120045,120045],"mapped",[100]],[[120046,120046],"mapped",[101]],[[120047,120047],"mapped",[102]],[[120048,120048],"mapped",[103]],[[120049,120049],"mapped",[104]],[[120050,120050],"mapped",[105]],[[120051,120051],"mapped",[106]],[[120052,120052],"mapped",[107]],[[120053,120053],"mapped",[108]],[[120054,120054],"mapped",[109]],[[120055,120055],"mapped",[110]],[[120056,120056],"mapped",[111]],[[120057,120057],"mapped",[112]],[[120058,120058],"mapped",[113]],[[120059,120059],"mapped",[114]],[[120060,120060],"mapped",[115]],[[120061,120061],"mapped",[116]],[[120062,120062],"mapped",[117]],[[120063,120063],"mapped",[118]],[[120064,120064],"mapped",[119]],[[120065,120065],"mapped",[120]],[[120066,120066],"mapped",[121]],[[120067,120067],"mapped",[122]],[[120068,120068],"mapped",[97]],[[120069,120069],"mapped",[98]],[[120070,120070],"disallowed"],[[120071,120071],"mapped",[100]],[[120072,120072],"mapped",[101]],[[120073,120073],"mapped",[102]],[[120074,120074],"mapped",[103]],[[120075,120076],"disallowed"],[[120077,120077],"mapped",[106]],[[120078,120078],"mapped",[107]],[[120079,120079],"mapped",[108]],[[120080,120080],"mapped",[109]],[[120081,120081],"mapped",[110]],[[120082,120082],"mapped",[111]],[[120083,120083],"mapped",[112]],[[120084,120084],"mapped",[113]],[[120085,120085],"disallowed"],[[120086,120086],"mapped",[115]],[[120087,120087],"mapped",[116]],[[120088,120088],"mapped",[117]],[[120089,120089],"mapped",[118]],[[120090,120090],"mapped",[119]],[[120091,120091],"mapped",[120]],[[120092,120092],"mapped",[121]],[[120093,120093],"disallowed"],[[120094,120094],"mapped",[97]],[[120095,120095],"mapped",[98]],[[120096,120096],"mapped",[99]],[[120097,120097],"mapped",[100]],[[120098,120098],"mapped",[101]],[[120099,120099],"mapped",[102]],[[120100,120100],"mapped",[103]],[[120101,120101],"mapped",[104]],[[120102,120102],"mapped",[105]],[[120103,120103],"mapped",[106]],[[120104,120104],"mapped",[107]],[[120105,120105],"mapped",[108]],[[120106,120106],"mapped",[109]],[[120107,120107],"mapped",[110]],[[120108,120108],"mapped",[111]],[[120109,120109],"mapped",[112]],[[120110,120110],"mapped",[113]],[[120111,120111],"mapped",[114]],[[120112,120112],"mapped",[115]],[[120113,120113],"mapped",[116]],[[120114,120114],"mapped",[117]],[[120115,120115],"mapped",[118]],[[120116,120116],"mapped",[119]],[[120117,120117],"mapped",[120]],[[120118,120118],"mapped",[121]],[[120119,120119],"mapped",[122]],[[120120,120120],"mapped",[97]],[[120121,120121],"mapped",[98]],[[120122,120122],"disallowed"],[[120123,120123],"mapped",[100]],[[120124,120124],"mapped",[101]],[[120125,120125],"mapped",[102]],[[120126,120126],"mapped",[103]],[[120127,120127],"disallowed"],[[120128,120128],"mapped",[105]],[[120129,120129],"mapped",[106]],[[120130,120130],"mapped",[107]],[[120131,120131],"mapped",[108]],[[120132,120132],"mapped",[109]],[[120133,120133],"disallowed"],[[120134,120134],"mapped",[111]],[[120135,120137],"disallowed"],[[120138,120138],"mapped",[115]],[[120139,120139],"mapped",[116]],[[120140,120140],"mapped",[117]],[[120141,120141],"mapped",[118]],[[120142,120142],"mapped",[119]],[[120143,120143],"mapped",[120]],[[120144,120144],"mapped",[121]],[[120145,120145],"disallowed"],[[120146,120146],"mapped",[97]],[[120147,120147],"mapped",[98]],[[120148,120148],"mapped",[99]],[[120149,120149],"mapped",[100]],[[120150,120150],"mapped",[101]],[[120151,120151],"mapped",[102]],[[120152,120152],"mapped",[103]],[[120153,120153],"mapped",[104]],[[120154,120154],"mapped",[105]],[[120155,120155],"mapped",[106]],[[120156,120156],"mapped",[107]],[[120157,120157],"mapped",[108]],[[120158,120158],"mapped",[109]],[[120159,120159],"mapped",[110]],[[120160,120160],"mapped",[111]],[[120161,120161],"mapped",[112]],[[120162,120162],"mapped",[113]],[[120163,120163],"mapped",[114]],[[120164,120164],"mapped",[115]],[[120165,120165],"mapped",[116]],[[120166,120166],"mapped",[117]],[[120167,120167],"mapped",[118]],[[120168,120168],"mapped",[119]],[[120169,120169],"mapped",[120]],[[120170,120170],"mapped",[121]],[[120171,120171],"mapped",[122]],[[120172,120172],"mapped",[97]],[[120173,120173],"mapped",[98]],[[120174,120174],"mapped",[99]],[[120175,120175],"mapped",[100]],[[120176,120176],"mapped",[101]],[[120177,120177],"mapped",[102]],[[120178,120178],"mapped",[103]],[[120179,120179],"mapped",[104]],[[120180,120180],"mapped",[105]],[[120181,120181],"mapped",[106]],[[120182,120182],"mapped",[107]],[[120183,120183],"mapped",[108]],[[120184,120184],"mapped",[109]],[[120185,120185],"mapped",[110]],[[120186,120186],"mapped",[111]],[[120187,120187],"mapped",[112]],[[120188,120188],"mapped",[113]],[[120189,120189],"mapped",[114]],[[120190,120190],"mapped",[115]],[[120191,120191],"mapped",[116]],[[120192,120192],"mapped",[117]],[[120193,120193],"mapped",[118]],[[120194,120194],"mapped",[119]],[[120195,120195],"mapped",[120]],[[120196,120196],"mapped",[121]],[[120197,120197],"mapped",[122]],[[120198,120198],"mapped",[97]],[[120199,120199],"mapped",[98]],[[120200,120200],"mapped",[99]],[[120201,120201],"mapped",[100]],[[120202,120202],"mapped",[101]],[[120203,120203],"mapped",[102]],[[120204,120204],"mapped",[103]],[[120205,120205],"mapped",[104]],[[120206,120206],"mapped",[105]],[[120207,120207],"mapped",[106]],[[120208,120208],"mapped",[107]],[[120209,120209],"mapped",[108]],[[120210,120210],"mapped",[109]],[[120211,120211],"mapped",[110]],[[120212,120212],"mapped",[111]],[[120213,120213],"mapped",[112]],[[120214,120214],"mapped",[113]],[[120215,120215],"mapped",[114]],[[120216,120216],"mapped",[115]],[[120217,120217],"mapped",[116]],[[120218,120218],"mapped",[117]],[[120219,120219],"mapped",[118]],[[120220,120220],"mapped",[119]],[[120221,120221],"mapped",[120]],[[120222,120222],"mapped",[121]],[[120223,120223],"mapped",[122]],[[120224,120224],"mapped",[97]],[[120225,120225],"mapped",[98]],[[120226,120226],"mapped",[99]],[[120227,120227],"mapped",[100]],[[120228,120228],"mapped",[101]],[[120229,120229],"mapped",[102]],[[120230,120230],"mapped",[103]],[[120231,120231],"mapped",[104]],[[120232,120232],"mapped",[105]],[[120233,120233],"mapped",[106]],[[120234,120234],"mapped",[107]],[[120235,120235],"mapped",[108]],[[120236,120236],"mapped",[109]],[[120237,120237],"mapped",[110]],[[120238,120238],"mapped",[111]],[[120239,120239],"mapped",[112]],[[120240,120240],"mapped",[113]],[[120241,120241],"mapped",[114]],[[120242,120242],"mapped",[115]],[[120243,120243],"mapped",[116]],[[120244,120244],"mapped",[117]],[[120245,120245],"mapped",[118]],[[120246,120246],"mapped",[119]],[[120247,120247],"mapped",[120]],[[120248,120248],"mapped",[121]],[[120249,120249],"mapped",[122]],[[120250,120250],"mapped",[97]],[[120251,120251],"mapped",[98]],[[120252,120252],"mapped",[99]],[[120253,120253],"mapped",[100]],[[120254,120254],"mapped",[101]],[[120255,120255],"mapped",[102]],[[120256,120256],"mapped",[103]],[[120257,120257],"mapped",[104]],[[120258,120258],"mapped",[105]],[[120259,120259],"mapped",[106]],[[120260,120260],"mapped",[107]],[[120261,120261],"mapped",[108]],[[120262,120262],"mapped",[109]],[[120263,120263],"mapped",[110]],[[120264,120264],"mapped",[111]],[[120265,120265],"mapped",[112]],[[120266,120266],"mapped",[113]],[[120267,120267],"mapped",[114]],[[120268,120268],"mapped",[115]],[[120269,120269],"mapped",[116]],[[120270,120270],"mapped",[117]],[[120271,120271],"mapped",[118]],[[120272,120272],"mapped",[119]],[[120273,120273],"mapped",[120]],[[120274,120274],"mapped",[121]],[[120275,120275],"mapped",[122]],[[120276,120276],"mapped",[97]],[[120277,120277],"mapped",[98]],[[120278,120278],"mapped",[99]],[[120279,120279],"mapped",[100]],[[120280,120280],"mapped",[101]],[[120281,120281],"mapped",[102]],[[120282,120282],"mapped",[103]],[[120283,120283],"mapped",[104]],[[120284,120284],"mapped",[105]],[[120285,120285],"mapped",[106]],[[120286,120286],"mapped",[107]],[[120287,120287],"mapped",[108]],[[120288,120288],"mapped",[109]],[[120289,120289],"mapped",[110]],[[120290,120290],"mapped",[111]],[[120291,120291],"mapped",[112]],[[120292,120292],"mapped",[113]],[[120293,120293],"mapped",[114]],[[120294,120294],"mapped",[115]],[[120295,120295],"mapped",[116]],[[120296,120296],"mapped",[117]],[[120297,120297],"mapped",[118]],[[120298,120298],"mapped",[119]],[[120299,120299],"mapped",[120]],[[120300,120300],"mapped",[121]],[[120301,120301],"mapped",[122]],[[120302,120302],"mapped",[97]],[[120303,120303],"mapped",[98]],[[120304,120304],"mapped",[99]],[[120305,120305],"mapped",[100]],[[120306,120306],"mapped",[101]],[[120307,120307],"mapped",[102]],[[120308,120308],"mapped",[103]],[[120309,120309],"mapped",[104]],[[120310,120310],"mapped",[105]],[[120311,120311],"mapped",[106]],[[120312,120312],"mapped",[107]],[[120313,120313],"mapped",[108]],[[120314,120314],"mapped",[109]],[[120315,120315],"mapped",[110]],[[120316,120316],"mapped",[111]],[[120317,120317],"mapped",[112]],[[120318,120318],"mapped",[113]],[[120319,120319],"mapped",[114]],[[120320,120320],"mapped",[115]],[[120321,120321],"mapped",[116]],[[120322,120322],"mapped",[117]],[[120323,120323],"mapped",[118]],[[120324,120324],"mapped",[119]],[[120325,120325],"mapped",[120]],[[120326,120326],"mapped",[121]],[[120327,120327],"mapped",[122]],[[120328,120328],"mapped",[97]],[[120329,120329],"mapped",[98]],[[120330,120330],"mapped",[99]],[[120331,120331],"mapped",[100]],[[120332,120332],"mapped",[101]],[[120333,120333],"mapped",[102]],[[120334,120334],"mapped",[103]],[[120335,120335],"mapped",[104]],[[120336,120336],"mapped",[105]],[[120337,120337],"mapped",[106]],[[120338,120338],"mapped",[107]],[[120339,120339],"mapped",[108]],[[120340,120340],"mapped",[109]],[[120341,120341],"mapped",[110]],[[120342,120342],"mapped",[111]],[[120343,120343],"mapped",[112]],[[120344,120344],"mapped",[113]],[[120345,120345],"mapped",[114]],[[120346,120346],"mapped",[115]],[[120347,120347],"mapped",[116]],[[120348,120348],"mapped",[117]],[[120349,120349],"mapped",[118]],[[120350,120350],"mapped",[119]],[[120351,120351],"mapped",[120]],[[120352,120352],"mapped",[121]],[[120353,120353],"mapped",[122]],[[120354,120354],"mapped",[97]],[[120355,120355],"mapped",[98]],[[120356,120356],"mapped",[99]],[[120357,120357],"mapped",[100]],[[120358,120358],"mapped",[101]],[[120359,120359],"mapped",[102]],[[120360,120360],"mapped",[103]],[[120361,120361],"mapped",[104]],[[120362,120362],"mapped",[105]],[[120363,120363],"mapped",[106]],[[120364,120364],"mapped",[107]],[[120365,120365],"mapped",[108]],[[120366,120366],"mapped",[109]],[[120367,120367],"mapped",[110]],[[120368,120368],"mapped",[111]],[[120369,120369],"mapped",[112]],[[120370,120370],"mapped",[113]],[[120371,120371],"mapped",[114]],[[120372,120372],"mapped",[115]],[[120373,120373],"mapped",[116]],[[120374,120374],"mapped",[117]],[[120375,120375],"mapped",[118]],[[120376,120376],"mapped",[119]],[[120377,120377],"mapped",[120]],[[120378,120378],"mapped",[121]],[[120379,120379],"mapped",[122]],[[120380,120380],"mapped",[97]],[[120381,120381],"mapped",[98]],[[120382,120382],"mapped",[99]],[[120383,120383],"mapped",[100]],[[120384,120384],"mapped",[101]],[[120385,120385],"mapped",[102]],[[120386,120386],"mapped",[103]],[[120387,120387],"mapped",[104]],[[120388,120388],"mapped",[105]],[[120389,120389],"mapped",[106]],[[120390,120390],"mapped",[107]],[[120391,120391],"mapped",[108]],[[120392,120392],"mapped",[109]],[[120393,120393],"mapped",[110]],[[120394,120394],"mapped",[111]],[[120395,120395],"mapped",[112]],[[120396,120396],"mapped",[113]],[[120397,120397],"mapped",[114]],[[120398,120398],"mapped",[115]],[[120399,120399],"mapped",[116]],[[120400,120400],"mapped",[117]],[[120401,120401],"mapped",[118]],[[120402,120402],"mapped",[119]],[[120403,120403],"mapped",[120]],[[120404,120404],"mapped",[121]],[[120405,120405],"mapped",[122]],[[120406,120406],"mapped",[97]],[[120407,120407],"mapped",[98]],[[120408,120408],"mapped",[99]],[[120409,120409],"mapped",[100]],[[120410,120410],"mapped",[101]],[[120411,120411],"mapped",[102]],[[120412,120412],"mapped",[103]],[[120413,120413],"mapped",[104]],[[120414,120414],"mapped",[105]],[[120415,120415],"mapped",[106]],[[120416,120416],"mapped",[107]],[[120417,120417],"mapped",[108]],[[120418,120418],"mapped",[109]],[[120419,120419],"mapped",[110]],[[120420,120420],"mapped",[111]],[[120421,120421],"mapped",[112]],[[120422,120422],"mapped",[113]],[[120423,120423],"mapped",[114]],[[120424,120424],"mapped",[115]],[[120425,120425],"mapped",[116]],[[120426,120426],"mapped",[117]],[[120427,120427],"mapped",[118]],[[120428,120428],"mapped",[119]],[[120429,120429],"mapped",[120]],[[120430,120430],"mapped",[121]],[[120431,120431],"mapped",[122]],[[120432,120432],"mapped",[97]],[[120433,120433],"mapped",[98]],[[120434,120434],"mapped",[99]],[[120435,120435],"mapped",[100]],[[120436,120436],"mapped",[101]],[[120437,120437],"mapped",[102]],[[120438,120438],"mapped",[103]],[[120439,120439],"mapped",[104]],[[120440,120440],"mapped",[105]],[[120441,120441],"mapped",[106]],[[120442,120442],"mapped",[107]],[[120443,120443],"mapped",[108]],[[120444,120444],"mapped",[109]],[[120445,120445],"mapped",[110]],[[120446,120446],"mapped",[111]],[[120447,120447],"mapped",[112]],[[120448,120448],"mapped",[113]],[[120449,120449],"mapped",[114]],[[120450,120450],"mapped",[115]],[[120451,120451],"mapped",[116]],[[120452,120452],"mapped",[117]],[[120453,120453],"mapped",[118]],[[120454,120454],"mapped",[119]],[[120455,120455],"mapped",[120]],[[120456,120456],"mapped",[121]],[[120457,120457],"mapped",[122]],[[120458,120458],"mapped",[97]],[[120459,120459],"mapped",[98]],[[120460,120460],"mapped",[99]],[[120461,120461],"mapped",[100]],[[120462,120462],"mapped",[101]],[[120463,120463],"mapped",[102]],[[120464,120464],"mapped",[103]],[[120465,120465],"mapped",[104]],[[120466,120466],"mapped",[105]],[[120467,120467],"mapped",[106]],[[120468,120468],"mapped",[107]],[[120469,120469],"mapped",[108]],[[120470,120470],"mapped",[109]],[[120471,120471],"mapped",[110]],[[120472,120472],"mapped",[111]],[[120473,120473],"mapped",[112]],[[120474,120474],"mapped",[113]],[[120475,120475],"mapped",[114]],[[120476,120476],"mapped",[115]],[[120477,120477],"mapped",[116]],[[120478,120478],"mapped",[117]],[[120479,120479],"mapped",[118]],[[120480,120480],"mapped",[119]],[[120481,120481],"mapped",[120]],[[120482,120482],"mapped",[121]],[[120483,120483],"mapped",[122]],[[120484,120484],"mapped",[305]],[[120485,120485],"mapped",[567]],[[120486,120487],"disallowed"],[[120488,120488],"mapped",[945]],[[120489,120489],"mapped",[946]],[[120490,120490],"mapped",[947]],[[120491,120491],"mapped",[948]],[[120492,120492],"mapped",[949]],[[120493,120493],"mapped",[950]],[[120494,120494],"mapped",[951]],[[120495,120495],"mapped",[952]],[[120496,120496],"mapped",[953]],[[120497,120497],"mapped",[954]],[[120498,120498],"mapped",[955]],[[120499,120499],"mapped",[956]],[[120500,120500],"mapped",[957]],[[120501,120501],"mapped",[958]],[[120502,120502],"mapped",[959]],[[120503,120503],"mapped",[960]],[[120504,120504],"mapped",[961]],[[120505,120505],"mapped",[952]],[[120506,120506],"mapped",[963]],[[120507,120507],"mapped",[964]],[[120508,120508],"mapped",[965]],[[120509,120509],"mapped",[966]],[[120510,120510],"mapped",[967]],[[120511,120511],"mapped",[968]],[[120512,120512],"mapped",[969]],[[120513,120513],"mapped",[8711]],[[120514,120514],"mapped",[945]],[[120515,120515],"mapped",[946]],[[120516,120516],"mapped",[947]],[[120517,120517],"mapped",[948]],[[120518,120518],"mapped",[949]],[[120519,120519],"mapped",[950]],[[120520,120520],"mapped",[951]],[[120521,120521],"mapped",[952]],[[120522,120522],"mapped",[953]],[[120523,120523],"mapped",[954]],[[120524,120524],"mapped",[955]],[[120525,120525],"mapped",[956]],[[120526,120526],"mapped",[957]],[[120527,120527],"mapped",[958]],[[120528,120528],"mapped",[959]],[[120529,120529],"mapped",[960]],[[120530,120530],"mapped",[961]],[[120531,120532],"mapped",[963]],[[120533,120533],"mapped",[964]],[[120534,120534],"mapped",[965]],[[120535,120535],"mapped",[966]],[[120536,120536],"mapped",[967]],[[120537,120537],"mapped",[968]],[[120538,120538],"mapped",[969]],[[120539,120539],"mapped",[8706]],[[120540,120540],"mapped",[949]],[[120541,120541],"mapped",[952]],[[120542,120542],"mapped",[954]],[[120543,120543],"mapped",[966]],[[120544,120544],"mapped",[961]],[[120545,120545],"mapped",[960]],[[120546,120546],"mapped",[945]],[[120547,120547],"mapped",[946]],[[120548,120548],"mapped",[947]],[[120549,120549],"mapped",[948]],[[120550,120550],"mapped",[949]],[[120551,120551],"mapped",[950]],[[120552,120552],"mapped",[951]],[[120553,120553],"mapped",[952]],[[120554,120554],"mapped",[953]],[[120555,120555],"mapped",[954]],[[120556,120556],"mapped",[955]],[[120557,120557],"mapped",[956]],[[120558,120558],"mapped",[957]],[[120559,120559],"mapped",[958]],[[120560,120560],"mapped",[959]],[[120561,120561],"mapped",[960]],[[120562,120562],"mapped",[961]],[[120563,120563],"mapped",[952]],[[120564,120564],"mapped",[963]],[[120565,120565],"mapped",[964]],[[120566,120566],"mapped",[965]],[[120567,120567],"mapped",[966]],[[120568,120568],"mapped",[967]],[[120569,120569],"mapped",[968]],[[120570,120570],"mapped",[969]],[[120571,120571],"mapped",[8711]],[[120572,120572],"mapped",[945]],[[120573,120573],"mapped",[946]],[[120574,120574],"mapped",[947]],[[120575,120575],"mapped",[948]],[[120576,120576],"mapped",[949]],[[120577,120577],"mapped",[950]],[[120578,120578],"mapped",[951]],[[120579,120579],"mapped",[952]],[[120580,120580],"mapped",[953]],[[120581,120581],"mapped",[954]],[[120582,120582],"mapped",[955]],[[120583,120583],"mapped",[956]],[[120584,120584],"mapped",[957]],[[120585,120585],"mapped",[958]],[[120586,120586],"mapped",[959]],[[120587,120587],"mapped",[960]],[[120588,120588],"mapped",[961]],[[120589,120590],"mapped",[963]],[[120591,120591],"mapped",[964]],[[120592,120592],"mapped",[965]],[[120593,120593],"mapped",[966]],[[120594,120594],"mapped",[967]],[[120595,120595],"mapped",[968]],[[120596,120596],"mapped",[969]],[[120597,120597],"mapped",[8706]],[[120598,120598],"mapped",[949]],[[120599,120599],"mapped",[952]],[[120600,120600],"mapped",[954]],[[120601,120601],"mapped",[966]],[[120602,120602],"mapped",[961]],[[120603,120603],"mapped",[960]],[[120604,120604],"mapped",[945]],[[120605,120605],"mapped",[946]],[[120606,120606],"mapped",[947]],[[120607,120607],"mapped",[948]],[[120608,120608],"mapped",[949]],[[120609,120609],"mapped",[950]],[[120610,120610],"mapped",[951]],[[120611,120611],"mapped",[952]],[[120612,120612],"mapped",[953]],[[120613,120613],"mapped",[954]],[[120614,120614],"mapped",[955]],[[120615,120615],"mapped",[956]],[[120616,120616],"mapped",[957]],[[120617,120617],"mapped",[958]],[[120618,120618],"mapped",[959]],[[120619,120619],"mapped",[960]],[[120620,120620],"mapped",[961]],[[120621,120621],"mapped",[952]],[[120622,120622],"mapped",[963]],[[120623,120623],"mapped",[964]],[[120624,120624],"mapped",[965]],[[120625,120625],"mapped",[966]],[[120626,120626],"mapped",[967]],[[120627,120627],"mapped",[968]],[[120628,120628],"mapped",[969]],[[120629,120629],"mapped",[8711]],[[120630,120630],"mapped",[945]],[[120631,120631],"mapped",[946]],[[120632,120632],"mapped",[947]],[[120633,120633],"mapped",[948]],[[120634,120634],"mapped",[949]],[[120635,120635],"mapped",[950]],[[120636,120636],"mapped",[951]],[[120637,120637],"mapped",[952]],[[120638,120638],"mapped",[953]],[[120639,120639],"mapped",[954]],[[120640,120640],"mapped",[955]],[[120641,120641],"mapped",[956]],[[120642,120642],"mapped",[957]],[[120643,120643],"mapped",[958]],[[120644,120644],"mapped",[959]],[[120645,120645],"mapped",[960]],[[120646,120646],"mapped",[961]],[[120647,120648],"mapped",[963]],[[120649,120649],"mapped",[964]],[[120650,120650],"mapped",[965]],[[120651,120651],"mapped",[966]],[[120652,120652],"mapped",[967]],[[120653,120653],"mapped",[968]],[[120654,120654],"mapped",[969]],[[120655,120655],"mapped",[8706]],[[120656,120656],"mapped",[949]],[[120657,120657],"mapped",[952]],[[120658,120658],"mapped",[954]],[[120659,120659],"mapped",[966]],[[120660,120660],"mapped",[961]],[[120661,120661],"mapped",[960]],[[120662,120662],"mapped",[945]],[[120663,120663],"mapped",[946]],[[120664,120664],"mapped",[947]],[[120665,120665],"mapped",[948]],[[120666,120666],"mapped",[949]],[[120667,120667],"mapped",[950]],[[120668,120668],"mapped",[951]],[[120669,120669],"mapped",[952]],[[120670,120670],"mapped",[953]],[[120671,120671],"mapped",[954]],[[120672,120672],"mapped",[955]],[[120673,120673],"mapped",[956]],[[120674,120674],"mapped",[957]],[[120675,120675],"mapped",[958]],[[120676,120676],"mapped",[959]],[[120677,120677],"mapped",[960]],[[120678,120678],"mapped",[961]],[[120679,120679],"mapped",[952]],[[120680,120680],"mapped",[963]],[[120681,120681],"mapped",[964]],[[120682,120682],"mapped",[965]],[[120683,120683],"mapped",[966]],[[120684,120684],"mapped",[967]],[[120685,120685],"mapped",[968]],[[120686,120686],"mapped",[969]],[[120687,120687],"mapped",[8711]],[[120688,120688],"mapped",[945]],[[120689,120689],"mapped",[946]],[[120690,120690],"mapped",[947]],[[120691,120691],"mapped",[948]],[[120692,120692],"mapped",[949]],[[120693,120693],"mapped",[950]],[[120694,120694],"mapped",[951]],[[120695,120695],"mapped",[952]],[[120696,120696],"mapped",[953]],[[120697,120697],"mapped",[954]],[[120698,120698],"mapped",[955]],[[120699,120699],"mapped",[956]],[[120700,120700],"mapped",[957]],[[120701,120701],"mapped",[958]],[[120702,120702],"mapped",[959]],[[120703,120703],"mapped",[960]],[[120704,120704],"mapped",[961]],[[120705,120706],"mapped",[963]],[[120707,120707],"mapped",[964]],[[120708,120708],"mapped",[965]],[[120709,120709],"mapped",[966]],[[120710,120710],"mapped",[967]],[[120711,120711],"mapped",[968]],[[120712,120712],"mapped",[969]],[[120713,120713],"mapped",[8706]],[[120714,120714],"mapped",[949]],[[120715,120715],"mapped",[952]],[[120716,120716],"mapped",[954]],[[120717,120717],"mapped",[966]],[[120718,120718],"mapped",[961]],[[120719,120719],"mapped",[960]],[[120720,120720],"mapped",[945]],[[120721,120721],"mapped",[946]],[[120722,120722],"mapped",[947]],[[120723,120723],"mapped",[948]],[[120724,120724],"mapped",[949]],[[120725,120725],"mapped",[950]],[[120726,120726],"mapped",[951]],[[120727,120727],"mapped",[952]],[[120728,120728],"mapped",[953]],[[120729,120729],"mapped",[954]],[[120730,120730],"mapped",[955]],[[120731,120731],"mapped",[956]],[[120732,120732],"mapped",[957]],[[120733,120733],"mapped",[958]],[[120734,120734],"mapped",[959]],[[120735,120735],"mapped",[960]],[[120736,120736],"mapped",[961]],[[120737,120737],"mapped",[952]],[[120738,120738],"mapped",[963]],[[120739,120739],"mapped",[964]],[[120740,120740],"mapped",[965]],[[120741,120741],"mapped",[966]],[[120742,120742],"mapped",[967]],[[120743,120743],"mapped",[968]],[[120744,120744],"mapped",[969]],[[120745,120745],"mapped",[8711]],[[120746,120746],"mapped",[945]],[[120747,120747],"mapped",[946]],[[120748,120748],"mapped",[947]],[[120749,120749],"mapped",[948]],[[120750,120750],"mapped",[949]],[[120751,120751],"mapped",[950]],[[120752,120752],"mapped",[951]],[[120753,120753],"mapped",[952]],[[120754,120754],"mapped",[953]],[[120755,120755],"mapped",[954]],[[120756,120756],"mapped",[955]],[[120757,120757],"mapped",[956]],[[120758,120758],"mapped",[957]],[[120759,120759],"mapped",[958]],[[120760,120760],"mapped",[959]],[[120761,120761],"mapped",[960]],[[120762,120762],"mapped",[961]],[[120763,120764],"mapped",[963]],[[120765,120765],"mapped",[964]],[[120766,120766],"mapped",[965]],[[120767,120767],"mapped",[966]],[[120768,120768],"mapped",[967]],[[120769,120769],"mapped",[968]],[[120770,120770],"mapped",[969]],[[120771,120771],"mapped",[8706]],[[120772,120772],"mapped",[949]],[[120773,120773],"mapped",[952]],[[120774,120774],"mapped",[954]],[[120775,120775],"mapped",[966]],[[120776,120776],"mapped",[961]],[[120777,120777],"mapped",[960]],[[120778,120779],"mapped",[989]],[[120780,120781],"disallowed"],[[120782,120782],"mapped",[48]],[[120783,120783],"mapped",[49]],[[120784,120784],"mapped",[50]],[[120785,120785],"mapped",[51]],[[120786,120786],"mapped",[52]],[[120787,120787],"mapped",[53]],[[120788,120788],"mapped",[54]],[[120789,120789],"mapped",[55]],[[120790,120790],"mapped",[56]],[[120791,120791],"mapped",[57]],[[120792,120792],"mapped",[48]],[[120793,120793],"mapped",[49]],[[120794,120794],"mapped",[50]],[[120795,120795],"mapped",[51]],[[120796,120796],"mapped",[52]],[[120797,120797],"mapped",[53]],[[120798,120798],"mapped",[54]],[[120799,120799],"mapped",[55]],[[120800,120800],"mapped",[56]],[[120801,120801],"mapped",[57]],[[120802,120802],"mapped",[48]],[[120803,120803],"mapped",[49]],[[120804,120804],"mapped",[50]],[[120805,120805],"mapped",[51]],[[120806,120806],"mapped",[52]],[[120807,120807],"mapped",[53]],[[120808,120808],"mapped",[54]],[[120809,120809],"mapped",[55]],[[120810,120810],"mapped",[56]],[[120811,120811],"mapped",[57]],[[120812,120812],"mapped",[48]],[[120813,120813],"mapped",[49]],[[120814,120814],"mapped",[50]],[[120815,120815],"mapped",[51]],[[120816,120816],"mapped",[52]],[[120817,120817],"mapped",[53]],[[120818,120818],"mapped",[54]],[[120819,120819],"mapped",[55]],[[120820,120820],"mapped",[56]],[[120821,120821],"mapped",[57]],[[120822,120822],"mapped",[48]],[[120823,120823],"mapped",[49]],[[120824,120824],"mapped",[50]],[[120825,120825],"mapped",[51]],[[120826,120826],"mapped",[52]],[[120827,120827],"mapped",[53]],[[120828,120828],"mapped",[54]],[[120829,120829],"mapped",[55]],[[120830,120830],"mapped",[56]],[[120831,120831],"mapped",[57]],[[120832,121343],"valid",[],"NV8"],[[121344,121398],"valid"],[[121399,121402],"valid",[],"NV8"],[[121403,121452],"valid"],[[121453,121460],"valid",[],"NV8"],[[121461,121461],"valid"],[[121462,121475],"valid",[],"NV8"],[[121476,121476],"valid"],[[121477,121483],"valid",[],"NV8"],[[121484,121498],"disallowed"],[[121499,121503],"valid"],[[121504,121504],"disallowed"],[[121505,121519],"valid"],[[121520,124927],"disallowed"],[[124928,125124],"valid"],[[125125,125126],"disallowed"],[[125127,125135],"valid",[],"NV8"],[[125136,125142],"valid"],[[125143,126463],"disallowed"],[[126464,126464],"mapped",[1575]],[[126465,126465],"mapped",[1576]],[[126466,126466],"mapped",[1580]],[[126467,126467],"mapped",[1583]],[[126468,126468],"disallowed"],[[126469,126469],"mapped",[1608]],[[126470,126470],"mapped",[1586]],[[126471,126471],"mapped",[1581]],[[126472,126472],"mapped",[1591]],[[126473,126473],"mapped",[1610]],[[126474,126474],"mapped",[1603]],[[126475,126475],"mapped",[1604]],[[126476,126476],"mapped",[1605]],[[126477,126477],"mapped",[1606]],[[126478,126478],"mapped",[1587]],[[126479,126479],"mapped",[1593]],[[126480,126480],"mapped",[1601]],[[126481,126481],"mapped",[1589]],[[126482,126482],"mapped",[1602]],[[126483,126483],"mapped",[1585]],[[126484,126484],"mapped",[1588]],[[126485,126485],"mapped",[1578]],[[126486,126486],"mapped",[1579]],[[126487,126487],"mapped",[1582]],[[126488,126488],"mapped",[1584]],[[126489,126489],"mapped",[1590]],[[126490,126490],"mapped",[1592]],[[126491,126491],"mapped",[1594]],[[126492,126492],"mapped",[1646]],[[126493,126493],"mapped",[1722]],[[126494,126494],"mapped",[1697]],[[126495,126495],"mapped",[1647]],[[126496,126496],"disallowed"],[[126497,126497],"mapped",[1576]],[[126498,126498],"mapped",[1580]],[[126499,126499],"disallowed"],[[126500,126500],"mapped",[1607]],[[126501,126502],"disallowed"],[[126503,126503],"mapped",[1581]],[[126504,126504],"disallowed"],[[126505,126505],"mapped",[1610]],[[126506,126506],"mapped",[1603]],[[126507,126507],"mapped",[1604]],[[126508,126508],"mapped",[1605]],[[126509,126509],"mapped",[1606]],[[126510,126510],"mapped",[1587]],[[126511,126511],"mapped",[1593]],[[126512,126512],"mapped",[1601]],[[126513,126513],"mapped",[1589]],[[126514,126514],"mapped",[1602]],[[126515,126515],"disallowed"],[[126516,126516],"mapped",[1588]],[[126517,126517],"mapped",[1578]],[[126518,126518],"mapped",[1579]],[[126519,126519],"mapped",[1582]],[[126520,126520],"disallowed"],[[126521,126521],"mapped",[1590]],[[126522,126522],"disallowed"],[[126523,126523],"mapped",[1594]],[[126524,126529],"disallowed"],[[126530,126530],"mapped",[1580]],[[126531,126534],"disallowed"],[[126535,126535],"mapped",[1581]],[[126536,126536],"disallowed"],[[126537,126537],"mapped",[1610]],[[126538,126538],"disallowed"],[[126539,126539],"mapped",[1604]],[[126540,126540],"disallowed"],[[126541,126541],"mapped",[1606]],[[126542,126542],"mapped",[1587]],[[126543,126543],"mapped",[1593]],[[126544,126544],"disallowed"],[[126545,126545],"mapped",[1589]],[[126546,126546],"mapped",[1602]],[[126547,126547],"disallowed"],[[126548,126548],"mapped",[1588]],[[126549,126550],"disallowed"],[[126551,126551],"mapped",[1582]],[[126552,126552],"disallowed"],[[126553,126553],"mapped",[1590]],[[126554,126554],"disallowed"],[[126555,126555],"mapped",[1594]],[[126556,126556],"disallowed"],[[126557,126557],"mapped",[1722]],[[126558,126558],"disallowed"],[[126559,126559],"mapped",[1647]],[[126560,126560],"disallowed"],[[126561,126561],"mapped",[1576]],[[126562,126562],"mapped",[1580]],[[126563,126563],"disallowed"],[[126564,126564],"mapped",[1607]],[[126565,126566],"disallowed"],[[126567,126567],"mapped",[1581]],[[126568,126568],"mapped",[1591]],[[126569,126569],"mapped",[1610]],[[126570,126570],"mapped",[1603]],[[126571,126571],"disallowed"],[[126572,126572],"mapped",[1605]],[[126573,126573],"mapped",[1606]],[[126574,126574],"mapped",[1587]],[[126575,126575],"mapped",[1593]],[[126576,126576],"mapped",[1601]],[[126577,126577],"mapped",[1589]],[[126578,126578],"mapped",[1602]],[[126579,126579],"disallowed"],[[126580,126580],"mapped",[1588]],[[126581,126581],"mapped",[1578]],[[126582,126582],"mapped",[1579]],[[126583,126583],"mapped",[1582]],[[126584,126584],"disallowed"],[[126585,126585],"mapped",[1590]],[[126586,126586],"mapped",[1592]],[[126587,126587],"mapped",[1594]],[[126588,126588],"mapped",[1646]],[[126589,126589],"disallowed"],[[126590,126590],"mapped",[1697]],[[126591,126591],"disallowed"],[[126592,126592],"mapped",[1575]],[[126593,126593],"mapped",[1576]],[[126594,126594],"mapped",[1580]],[[126595,126595],"mapped",[1583]],[[126596,126596],"mapped",[1607]],[[126597,126597],"mapped",[1608]],[[126598,126598],"mapped",[1586]],[[126599,126599],"mapped",[1581]],[[126600,126600],"mapped",[1591]],[[126601,126601],"mapped",[1610]],[[126602,126602],"disallowed"],[[126603,126603],"mapped",[1604]],[[126604,126604],"mapped",[1605]],[[126605,126605],"mapped",[1606]],[[126606,126606],"mapped",[1587]],[[126607,126607],"mapped",[1593]],[[126608,126608],"mapped",[1601]],[[126609,126609],"mapped",[1589]],[[126610,126610],"mapped",[1602]],[[126611,126611],"mapped",[1585]],[[126612,126612],"mapped",[1588]],[[126613,126613],"mapped",[1578]],[[126614,126614],"mapped",[1579]],[[126615,126615],"mapped",[1582]],[[126616,126616],"mapped",[1584]],[[126617,126617],"mapped",[1590]],[[126618,126618],"mapped",[1592]],[[126619,126619],"mapped",[1594]],[[126620,126624],"disallowed"],[[126625,126625],"mapped",[1576]],[[126626,126626],"mapped",[1580]],[[126627,126627],"mapped",[1583]],[[126628,126628],"disallowed"],[[126629,126629],"mapped",[1608]],[[126630,126630],"mapped",[1586]],[[126631,126631],"mapped",[1581]],[[126632,126632],"mapped",[1591]],[[126633,126633],"mapped",[1610]],[[126634,126634],"disallowed"],[[126635,126635],"mapped",[1604]],[[126636,126636],"mapped",[1605]],[[126637,126637],"mapped",[1606]],[[126638,126638],"mapped",[1587]],[[126639,126639],"mapped",[1593]],[[126640,126640],"mapped",[1601]],[[126641,126641],"mapped",[1589]],[[126642,126642],"mapped",[1602]],[[126643,126643],"mapped",[1585]],[[126644,126644],"mapped",[1588]],[[126645,126645],"mapped",[1578]],[[126646,126646],"mapped",[1579]],[[126647,126647],"mapped",[1582]],[[126648,126648],"mapped",[1584]],[[126649,126649],"mapped",[1590]],[[126650,126650],"mapped",[1592]],[[126651,126651],"mapped",[1594]],[[126652,126703],"disallowed"],[[126704,126705],"valid",[],"NV8"],[[126706,126975],"disallowed"],[[126976,127019],"valid",[],"NV8"],[[127020,127023],"disallowed"],[[127024,127123],"valid",[],"NV8"],[[127124,127135],"disallowed"],[[127136,127150],"valid",[],"NV8"],[[127151,127152],"disallowed"],[[127153,127166],"valid",[],"NV8"],[[127167,127167],"valid",[],"NV8"],[[127168,127168],"disallowed"],[[127169,127183],"valid",[],"NV8"],[[127184,127184],"disallowed"],[[127185,127199],"valid",[],"NV8"],[[127200,127221],"valid",[],"NV8"],[[127222,127231],"disallowed"],[[127232,127232],"disallowed"],[[127233,127233],"disallowed_STD3_mapped",[48,44]],[[127234,127234],"disallowed_STD3_mapped",[49,44]],[[127235,127235],"disallowed_STD3_mapped",[50,44]],[[127236,127236],"disallowed_STD3_mapped",[51,44]],[[127237,127237],"disallowed_STD3_mapped",[52,44]],[[127238,127238],"disallowed_STD3_mapped",[53,44]],[[127239,127239],"disallowed_STD3_mapped",[54,44]],[[127240,127240],"disallowed_STD3_mapped",[55,44]],[[127241,127241],"disallowed_STD3_mapped",[56,44]],[[127242,127242],"disallowed_STD3_mapped",[57,44]],[[127243,127244],"valid",[],"NV8"],[[127245,127247],"disallowed"],[[127248,127248],"disallowed_STD3_mapped",[40,97,41]],[[127249,127249],"disallowed_STD3_mapped",[40,98,41]],[[127250,127250],"disallowed_STD3_mapped",[40,99,41]],[[127251,127251],"disallowed_STD3_mapped",[40,100,41]],[[127252,127252],"disallowed_STD3_mapped",[40,101,41]],[[127253,127253],"disallowed_STD3_mapped",[40,102,41]],[[127254,127254],"disallowed_STD3_mapped",[40,103,41]],[[127255,127255],"disallowed_STD3_mapped",[40,104,41]],[[127256,127256],"disallowed_STD3_mapped",[40,105,41]],[[127257,127257],"disallowed_STD3_mapped",[40,106,41]],[[127258,127258],"disallowed_STD3_mapped",[40,107,41]],[[127259,127259],"disallowed_STD3_mapped",[40,108,41]],[[127260,127260],"disallowed_STD3_mapped",[40,109,41]],[[127261,127261],"disallowed_STD3_mapped",[40,110,41]],[[127262,127262],"disallowed_STD3_mapped",[40,111,41]],[[127263,127263],"disallowed_STD3_mapped",[40,112,41]],[[127264,127264],"disallowed_STD3_mapped",[40,113,41]],[[127265,127265],"disallowed_STD3_mapped",[40,114,41]],[[127266,127266],"disallowed_STD3_mapped",[40,115,41]],[[127267,127267],"disallowed_STD3_mapped",[40,116,41]],[[127268,127268],"disallowed_STD3_mapped",[40,117,41]],[[127269,127269],"disallowed_STD3_mapped",[40,118,41]],[[127270,127270],"disallowed_STD3_mapped",[40,119,41]],[[127271,127271],"disallowed_STD3_mapped",[40,120,41]],[[127272,127272],"disallowed_STD3_mapped",[40,121,41]],[[127273,127273],"disallowed_STD3_mapped",[40,122,41]],[[127274,127274],"mapped",[12308,115,12309]],[[127275,127275],"mapped",[99]],[[127276,127276],"mapped",[114]],[[127277,127277],"mapped",[99,100]],[[127278,127278],"mapped",[119,122]],[[127279,127279],"disallowed"],[[127280,127280],"mapped",[97]],[[127281,127281],"mapped",[98]],[[127282,127282],"mapped",[99]],[[127283,127283],"mapped",[100]],[[127284,127284],"mapped",[101]],[[127285,127285],"mapped",[102]],[[127286,127286],"mapped",[103]],[[127287,127287],"mapped",[104]],[[127288,127288],"mapped",[105]],[[127289,127289],"mapped",[106]],[[127290,127290],"mapped",[107]],[[127291,127291],"mapped",[108]],[[127292,127292],"mapped",[109]],[[127293,127293],"mapped",[110]],[[127294,127294],"mapped",[111]],[[127295,127295],"mapped",[112]],[[127296,127296],"mapped",[113]],[[127297,127297],"mapped",[114]],[[127298,127298],"mapped",[115]],[[127299,127299],"mapped",[116]],[[127300,127300],"mapped",[117]],[[127301,127301],"mapped",[118]],[[127302,127302],"mapped",[119]],[[127303,127303],"mapped",[120]],[[127304,127304],"mapped",[121]],[[127305,127305],"mapped",[122]],[[127306,127306],"mapped",[104,118]],[[127307,127307],"mapped",[109,118]],[[127308,127308],"mapped",[115,100]],[[127309,127309],"mapped",[115,115]],[[127310,127310],"mapped",[112,112,118]],[[127311,127311],"mapped",[119,99]],[[127312,127318],"valid",[],"NV8"],[[127319,127319],"valid",[],"NV8"],[[127320,127326],"valid",[],"NV8"],[[127327,127327],"valid",[],"NV8"],[[127328,127337],"valid",[],"NV8"],[[127338,127338],"mapped",[109,99]],[[127339,127339],"mapped",[109,100]],[[127340,127343],"disallowed"],[[127344,127352],"valid",[],"NV8"],[[127353,127353],"valid",[],"NV8"],[[127354,127354],"valid",[],"NV8"],[[127355,127356],"valid",[],"NV8"],[[127357,127358],"valid",[],"NV8"],[[127359,127359],"valid",[],"NV8"],[[127360,127369],"valid",[],"NV8"],[[127370,127373],"valid",[],"NV8"],[[127374,127375],"valid",[],"NV8"],[[127376,127376],"mapped",[100,106]],[[127377,127386],"valid",[],"NV8"],[[127387,127461],"disallowed"],[[127462,127487],"valid",[],"NV8"],[[127488,127488],"mapped",[12411,12363]],[[127489,127489],"mapped",[12467,12467]],[[127490,127490],"mapped",[12469]],[[127491,127503],"disallowed"],[[127504,127504],"mapped",[25163]],[[127505,127505],"mapped",[23383]],[[127506,127506],"mapped",[21452]],[[127507,127507],"mapped",[12487]],[[127508,127508],"mapped",[20108]],[[127509,127509],"mapped",[22810]],[[127510,127510],"mapped",[35299]],[[127511,127511],"mapped",[22825]],[[127512,127512],"mapped",[20132]],[[127513,127513],"mapped",[26144]],[[127514,127514],"mapped",[28961]],[[127515,127515],"mapped",[26009]],[[127516,127516],"mapped",[21069]],[[127517,127517],"mapped",[24460]],[[127518,127518],"mapped",[20877]],[[127519,127519],"mapped",[26032]],[[127520,127520],"mapped",[21021]],[[127521,127521],"mapped",[32066]],[[127522,127522],"mapped",[29983]],[[127523,127523],"mapped",[36009]],[[127524,127524],"mapped",[22768]],[[127525,127525],"mapped",[21561]],[[127526,127526],"mapped",[28436]],[[127527,127527],"mapped",[25237]],[[127528,127528],"mapped",[25429]],[[127529,127529],"mapped",[19968]],[[127530,127530],"mapped",[19977]],[[127531,127531],"mapped",[36938]],[[127532,127532],"mapped",[24038]],[[127533,127533],"mapped",[20013]],[[127534,127534],"mapped",[21491]],[[127535,127535],"mapped",[25351]],[[127536,127536],"mapped",[36208]],[[127537,127537],"mapped",[25171]],[[127538,127538],"mapped",[31105]],[[127539,127539],"mapped",[31354]],[[127540,127540],"mapped",[21512]],[[127541,127541],"mapped",[28288]],[[127542,127542],"mapped",[26377]],[[127543,127543],"mapped",[26376]],[[127544,127544],"mapped",[30003]],[[127545,127545],"mapped",[21106]],[[127546,127546],"mapped",[21942]],[[127547,127551],"disallowed"],[[127552,127552],"mapped",[12308,26412,12309]],[[127553,127553],"mapped",[12308,19977,12309]],[[127554,127554],"mapped",[12308,20108,12309]],[[127555,127555],"mapped",[12308,23433,12309]],[[127556,127556],"mapped",[12308,28857,12309]],[[127557,127557],"mapped",[12308,25171,12309]],[[127558,127558],"mapped",[12308,30423,12309]],[[127559,127559],"mapped",[12308,21213,12309]],[[127560,127560],"mapped",[12308,25943,12309]],[[127561,127567],"disallowed"],[[127568,127568],"mapped",[24471]],[[127569,127569],"mapped",[21487]],[[127570,127743],"disallowed"],[[127744,127776],"valid",[],"NV8"],[[127777,127788],"valid",[],"NV8"],[[127789,127791],"valid",[],"NV8"],[[127792,127797],"valid",[],"NV8"],[[127798,127798],"valid",[],"NV8"],[[127799,127868],"valid",[],"NV8"],[[127869,127869],"valid",[],"NV8"],[[127870,127871],"valid",[],"NV8"],[[127872,127891],"valid",[],"NV8"],[[127892,127903],"valid",[],"NV8"],[[127904,127940],"valid",[],"NV8"],[[127941,127941],"valid",[],"NV8"],[[127942,127946],"valid",[],"NV8"],[[127947,127950],"valid",[],"NV8"],[[127951,127955],"valid",[],"NV8"],[[127956,127967],"valid",[],"NV8"],[[127968,127984],"valid",[],"NV8"],[[127985,127991],"valid",[],"NV8"],[[127992,127999],"valid",[],"NV8"],[[128000,128062],"valid",[],"NV8"],[[128063,128063],"valid",[],"NV8"],[[128064,128064],"valid",[],"NV8"],[[128065,128065],"valid",[],"NV8"],[[128066,128247],"valid",[],"NV8"],[[128248,128248],"valid",[],"NV8"],[[128249,128252],"valid",[],"NV8"],[[128253,128254],"valid",[],"NV8"],[[128255,128255],"valid",[],"NV8"],[[128256,128317],"valid",[],"NV8"],[[128318,128319],"valid",[],"NV8"],[[128320,128323],"valid",[],"NV8"],[[128324,128330],"valid",[],"NV8"],[[128331,128335],"valid",[],"NV8"],[[128336,128359],"valid",[],"NV8"],[[128360,128377],"valid",[],"NV8"],[[128378,128378],"disallowed"],[[128379,128419],"valid",[],"NV8"],[[128420,128420],"disallowed"],[[128421,128506],"valid",[],"NV8"],[[128507,128511],"valid",[],"NV8"],[[128512,128512],"valid",[],"NV8"],[[128513,128528],"valid",[],"NV8"],[[128529,128529],"valid",[],"NV8"],[[128530,128532],"valid",[],"NV8"],[[128533,128533],"valid",[],"NV8"],[[128534,128534],"valid",[],"NV8"],[[128535,128535],"valid",[],"NV8"],[[128536,128536],"valid",[],"NV8"],[[128537,128537],"valid",[],"NV8"],[[128538,128538],"valid",[],"NV8"],[[128539,128539],"valid",[],"NV8"],[[128540,128542],"valid",[],"NV8"],[[128543,128543],"valid",[],"NV8"],[[128544,128549],"valid",[],"NV8"],[[128550,128551],"valid",[],"NV8"],[[128552,128555],"valid",[],"NV8"],[[128556,128556],"valid",[],"NV8"],[[128557,128557],"valid",[],"NV8"],[[128558,128559],"valid",[],"NV8"],[[128560,128563],"valid",[],"NV8"],[[128564,128564],"valid",[],"NV8"],[[128565,128576],"valid",[],"NV8"],[[128577,128578],"valid",[],"NV8"],[[128579,128580],"valid",[],"NV8"],[[128581,128591],"valid",[],"NV8"],[[128592,128639],"valid",[],"NV8"],[[128640,128709],"valid",[],"NV8"],[[128710,128719],"valid",[],"NV8"],[[128720,128720],"valid",[],"NV8"],[[128721,128735],"disallowed"],[[128736,128748],"valid",[],"NV8"],[[128749,128751],"disallowed"],[[128752,128755],"valid",[],"NV8"],[[128756,128767],"disallowed"],[[128768,128883],"valid",[],"NV8"],[[128884,128895],"disallowed"],[[128896,128980],"valid",[],"NV8"],[[128981,129023],"disallowed"],[[129024,129035],"valid",[],"NV8"],[[129036,129039],"disallowed"],[[129040,129095],"valid",[],"NV8"],[[129096,129103],"disallowed"],[[129104,129113],"valid",[],"NV8"],[[129114,129119],"disallowed"],[[129120,129159],"valid",[],"NV8"],[[129160,129167],"disallowed"],[[129168,129197],"valid",[],"NV8"],[[129198,129295],"disallowed"],[[129296,129304],"valid",[],"NV8"],[[129305,129407],"disallowed"],[[129408,129412],"valid",[],"NV8"],[[129413,129471],"disallowed"],[[129472,129472],"valid",[],"NV8"],[[129473,131069],"disallowed"],[[131070,131071],"disallowed"],[[131072,173782],"valid"],[[173783,173823],"disallowed"],[[173824,177972],"valid"],[[177973,177983],"disallowed"],[[177984,178205],"valid"],[[178206,178207],"disallowed"],[[178208,183969],"valid"],[[183970,194559],"disallowed"],[[194560,194560],"mapped",[20029]],[[194561,194561],"mapped",[20024]],[[194562,194562],"mapped",[20033]],[[194563,194563],"mapped",[131362]],[[194564,194564],"mapped",[20320]],[[194565,194565],"mapped",[20398]],[[194566,194566],"mapped",[20411]],[[194567,194567],"mapped",[20482]],[[194568,194568],"mapped",[20602]],[[194569,194569],"mapped",[20633]],[[194570,194570],"mapped",[20711]],[[194571,194571],"mapped",[20687]],[[194572,194572],"mapped",[13470]],[[194573,194573],"mapped",[132666]],[[194574,194574],"mapped",[20813]],[[194575,194575],"mapped",[20820]],[[194576,194576],"mapped",[20836]],[[194577,194577],"mapped",[20855]],[[194578,194578],"mapped",[132380]],[[194579,194579],"mapped",[13497]],[[194580,194580],"mapped",[20839]],[[194581,194581],"mapped",[20877]],[[194582,194582],"mapped",[132427]],[[194583,194583],"mapped",[20887]],[[194584,194584],"mapped",[20900]],[[194585,194585],"mapped",[20172]],[[194586,194586],"mapped",[20908]],[[194587,194587],"mapped",[20917]],[[194588,194588],"mapped",[168415]],[[194589,194589],"mapped",[20981]],[[194590,194590],"mapped",[20995]],[[194591,194591],"mapped",[13535]],[[194592,194592],"mapped",[21051]],[[194593,194593],"mapped",[21062]],[[194594,194594],"mapped",[21106]],[[194595,194595],"mapped",[21111]],[[194596,194596],"mapped",[13589]],[[194597,194597],"mapped",[21191]],[[194598,194598],"mapped",[21193]],[[194599,194599],"mapped",[21220]],[[194600,194600],"mapped",[21242]],[[194601,194601],"mapped",[21253]],[[194602,194602],"mapped",[21254]],[[194603,194603],"mapped",[21271]],[[194604,194604],"mapped",[21321]],[[194605,194605],"mapped",[21329]],[[194606,194606],"mapped",[21338]],[[194607,194607],"mapped",[21363]],[[194608,194608],"mapped",[21373]],[[194609,194611],"mapped",[21375]],[[194612,194612],"mapped",[133676]],[[194613,194613],"mapped",[28784]],[[194614,194614],"mapped",[21450]],[[194615,194615],"mapped",[21471]],[[194616,194616],"mapped",[133987]],[[194617,194617],"mapped",[21483]],[[194618,194618],"mapped",[21489]],[[194619,194619],"mapped",[21510]],[[194620,194620],"mapped",[21662]],[[194621,194621],"mapped",[21560]],[[194622,194622],"mapped",[21576]],[[194623,194623],"mapped",[21608]],[[194624,194624],"mapped",[21666]],[[194625,194625],"mapped",[21750]],[[194626,194626],"mapped",[21776]],[[194627,194627],"mapped",[21843]],[[194628,194628],"mapped",[21859]],[[194629,194630],"mapped",[21892]],[[194631,194631],"mapped",[21913]],[[194632,194632],"mapped",[21931]],[[194633,194633],"mapped",[21939]],[[194634,194634],"mapped",[21954]],[[194635,194635],"mapped",[22294]],[[194636,194636],"mapped",[22022]],[[194637,194637],"mapped",[22295]],[[194638,194638],"mapped",[22097]],[[194639,194639],"mapped",[22132]],[[194640,194640],"mapped",[20999]],[[194641,194641],"mapped",[22766]],[[194642,194642],"mapped",[22478]],[[194643,194643],"mapped",[22516]],[[194644,194644],"mapped",[22541]],[[194645,194645],"mapped",[22411]],[[194646,194646],"mapped",[22578]],[[194647,194647],"mapped",[22577]],[[194648,194648],"mapped",[22700]],[[194649,194649],"mapped",[136420]],[[194650,194650],"mapped",[22770]],[[194651,194651],"mapped",[22775]],[[194652,194652],"mapped",[22790]],[[194653,194653],"mapped",[22810]],[[194654,194654],"mapped",[22818]],[[194655,194655],"mapped",[22882]],[[194656,194656],"mapped",[136872]],[[194657,194657],"mapped",[136938]],[[194658,194658],"mapped",[23020]],[[194659,194659],"mapped",[23067]],[[194660,194660],"mapped",[23079]],[[194661,194661],"mapped",[23000]],[[194662,194662],"mapped",[23142]],[[194663,194663],"mapped",[14062]],[[194664,194664],"disallowed"],[[194665,194665],"mapped",[23304]],[[194666,194667],"mapped",[23358]],[[194668,194668],"mapped",[137672]],[[194669,194669],"mapped",[23491]],[[194670,194670],"mapped",[23512]],[[194671,194671],"mapped",[23527]],[[194672,194672],"mapped",[23539]],[[194673,194673],"mapped",[138008]],[[194674,194674],"mapped",[23551]],[[194675,194675],"mapped",[23558]],[[194676,194676],"disallowed"],[[194677,194677],"mapped",[23586]],[[194678,194678],"mapped",[14209]],[[194679,194679],"mapped",[23648]],[[194680,194680],"mapped",[23662]],[[194681,194681],"mapped",[23744]],[[194682,194682],"mapped",[23693]],[[194683,194683],"mapped",[138724]],[[194684,194684],"mapped",[23875]],[[194685,194685],"mapped",[138726]],[[194686,194686],"mapped",[23918]],[[194687,194687],"mapped",[23915]],[[194688,194688],"mapped",[23932]],[[194689,194689],"mapped",[24033]],[[194690,194690],"mapped",[24034]],[[194691,194691],"mapped",[14383]],[[194692,194692],"mapped",[24061]],[[194693,194693],"mapped",[24104]],[[194694,194694],"mapped",[24125]],[[194695,194695],"mapped",[24169]],[[194696,194696],"mapped",[14434]],[[194697,194697],"mapped",[139651]],[[194698,194698],"mapped",[14460]],[[194699,194699],"mapped",[24240]],[[194700,194700],"mapped",[24243]],[[194701,194701],"mapped",[24246]],[[194702,194702],"mapped",[24266]],[[194703,194703],"mapped",[172946]],[[194704,194704],"mapped",[24318]],[[194705,194706],"mapped",[140081]],[[194707,194707],"mapped",[33281]],[[194708,194709],"mapped",[24354]],[[194710,194710],"mapped",[14535]],[[194711,194711],"mapped",[144056]],[[194712,194712],"mapped",[156122]],[[194713,194713],"mapped",[24418]],[[194714,194714],"mapped",[24427]],[[194715,194715],"mapped",[14563]],[[194716,194716],"mapped",[24474]],[[194717,194717],"mapped",[24525]],[[194718,194718],"mapped",[24535]],[[194719,194719],"mapped",[24569]],[[194720,194720],"mapped",[24705]],[[194721,194721],"mapped",[14650]],[[194722,194722],"mapped",[14620]],[[194723,194723],"mapped",[24724]],[[194724,194724],"mapped",[141012]],[[194725,194725],"mapped",[24775]],[[194726,194726],"mapped",[24904]],[[194727,194727],"mapped",[24908]],[[194728,194728],"mapped",[24910]],[[194729,194729],"mapped",[24908]],[[194730,194730],"mapped",[24954]],[[194731,194731],"mapped",[24974]],[[194732,194732],"mapped",[25010]],[[194733,194733],"mapped",[24996]],[[194734,194734],"mapped",[25007]],[[194735,194735],"mapped",[25054]],[[194736,194736],"mapped",[25074]],[[194737,194737],"mapped",[25078]],[[194738,194738],"mapped",[25104]],[[194739,194739],"mapped",[25115]],[[194740,194740],"mapped",[25181]],[[194741,194741],"mapped",[25265]],[[194742,194742],"mapped",[25300]],[[194743,194743],"mapped",[25424]],[[194744,194744],"mapped",[142092]],[[194745,194745],"mapped",[25405]],[[194746,194746],"mapped",[25340]],[[194747,194747],"mapped",[25448]],[[194748,194748],"mapped",[25475]],[[194749,194749],"mapped",[25572]],[[194750,194750],"mapped",[142321]],[[194751,194751],"mapped",[25634]],[[194752,194752],"mapped",[25541]],[[194753,194753],"mapped",[25513]],[[194754,194754],"mapped",[14894]],[[194755,194755],"mapped",[25705]],[[194756,194756],"mapped",[25726]],[[194757,194757],"mapped",[25757]],[[194758,194758],"mapped",[25719]],[[194759,194759],"mapped",[14956]],[[194760,194760],"mapped",[25935]],[[194761,194761],"mapped",[25964]],[[194762,194762],"mapped",[143370]],[[194763,194763],"mapped",[26083]],[[194764,194764],"mapped",[26360]],[[194765,194765],"mapped",[26185]],[[194766,194766],"mapped",[15129]],[[194767,194767],"mapped",[26257]],[[194768,194768],"mapped",[15112]],[[194769,194769],"mapped",[15076]],[[194770,194770],"mapped",[20882]],[[194771,194771],"mapped",[20885]],[[194772,194772],"mapped",[26368]],[[194773,194773],"mapped",[26268]],[[194774,194774],"mapped",[32941]],[[194775,194775],"mapped",[17369]],[[194776,194776],"mapped",[26391]],[[194777,194777],"mapped",[26395]],[[194778,194778],"mapped",[26401]],[[194779,194779],"mapped",[26462]],[[194780,194780],"mapped",[26451]],[[194781,194781],"mapped",[144323]],[[194782,194782],"mapped",[15177]],[[194783,194783],"mapped",[26618]],[[194784,194784],"mapped",[26501]],[[194785,194785],"mapped",[26706]],[[194786,194786],"mapped",[26757]],[[194787,194787],"mapped",[144493]],[[194788,194788],"mapped",[26766]],[[194789,194789],"mapped",[26655]],[[194790,194790],"mapped",[26900]],[[194791,194791],"mapped",[15261]],[[194792,194792],"mapped",[26946]],[[194793,194793],"mapped",[27043]],[[194794,194794],"mapped",[27114]],[[194795,194795],"mapped",[27304]],[[194796,194796],"mapped",[145059]],[[194797,194797],"mapped",[27355]],[[194798,194798],"mapped",[15384]],[[194799,194799],"mapped",[27425]],[[194800,194800],"mapped",[145575]],[[194801,194801],"mapped",[27476]],[[194802,194802],"mapped",[15438]],[[194803,194803],"mapped",[27506]],[[194804,194804],"mapped",[27551]],[[194805,194805],"mapped",[27578]],[[194806,194806],"mapped",[27579]],[[194807,194807],"mapped",[146061]],[[194808,194808],"mapped",[138507]],[[194809,194809],"mapped",[146170]],[[194810,194810],"mapped",[27726]],[[194811,194811],"mapped",[146620]],[[194812,194812],"mapped",[27839]],[[194813,194813],"mapped",[27853]],[[194814,194814],"mapped",[27751]],[[194815,194815],"mapped",[27926]],[[194816,194816],"mapped",[27966]],[[194817,194817],"mapped",[28023]],[[194818,194818],"mapped",[27969]],[[194819,194819],"mapped",[28009]],[[194820,194820],"mapped",[28024]],[[194821,194821],"mapped",[28037]],[[194822,194822],"mapped",[146718]],[[194823,194823],"mapped",[27956]],[[194824,194824],"mapped",[28207]],[[194825,194825],"mapped",[28270]],[[194826,194826],"mapped",[15667]],[[194827,194827],"mapped",[28363]],[[194828,194828],"mapped",[28359]],[[194829,194829],"mapped",[147153]],[[194830,194830],"mapped",[28153]],[[194831,194831],"mapped",[28526]],[[194832,194832],"mapped",[147294]],[[194833,194833],"mapped",[147342]],[[194834,194834],"mapped",[28614]],[[194835,194835],"mapped",[28729]],[[194836,194836],"mapped",[28702]],[[194837,194837],"mapped",[28699]],[[194838,194838],"mapped",[15766]],[[194839,194839],"mapped",[28746]],[[194840,194840],"mapped",[28797]],[[194841,194841],"mapped",[28791]],[[194842,194842],"mapped",[28845]],[[194843,194843],"mapped",[132389]],[[194844,194844],"mapped",[28997]],[[194845,194845],"mapped",[148067]],[[194846,194846],"mapped",[29084]],[[194847,194847],"disallowed"],[[194848,194848],"mapped",[29224]],[[194849,194849],"mapped",[29237]],[[194850,194850],"mapped",[29264]],[[194851,194851],"mapped",[149000]],[[194852,194852],"mapped",[29312]],[[194853,194853],"mapped",[29333]],[[194854,194854],"mapped",[149301]],[[194855,194855],"mapped",[149524]],[[194856,194856],"mapped",[29562]],[[194857,194857],"mapped",[29579]],[[194858,194858],"mapped",[16044]],[[194859,194859],"mapped",[29605]],[[194860,194861],"mapped",[16056]],[[194862,194862],"mapped",[29767]],[[194863,194863],"mapped",[29788]],[[194864,194864],"mapped",[29809]],[[194865,194865],"mapped",[29829]],[[194866,194866],"mapped",[29898]],[[194867,194867],"mapped",[16155]],[[194868,194868],"mapped",[29988]],[[194869,194869],"mapped",[150582]],[[194870,194870],"mapped",[30014]],[[194871,194871],"mapped",[150674]],[[194872,194872],"mapped",[30064]],[[194873,194873],"mapped",[139679]],[[194874,194874],"mapped",[30224]],[[194875,194875],"mapped",[151457]],[[194876,194876],"mapped",[151480]],[[194877,194877],"mapped",[151620]],[[194878,194878],"mapped",[16380]],[[194879,194879],"mapped",[16392]],[[194880,194880],"mapped",[30452]],[[194881,194881],"mapped",[151795]],[[194882,194882],"mapped",[151794]],[[194883,194883],"mapped",[151833]],[[194884,194884],"mapped",[151859]],[[194885,194885],"mapped",[30494]],[[194886,194887],"mapped",[30495]],[[194888,194888],"mapped",[30538]],[[194889,194889],"mapped",[16441]],[[194890,194890],"mapped",[30603]],[[194891,194891],"mapped",[16454]],[[194892,194892],"mapped",[16534]],[[194893,194893],"mapped",[152605]],[[194894,194894],"mapped",[30798]],[[194895,194895],"mapped",[30860]],[[194896,194896],"mapped",[30924]],[[194897,194897],"mapped",[16611]],[[194898,194898],"mapped",[153126]],[[194899,194899],"mapped",[31062]],[[194900,194900],"mapped",[153242]],[[194901,194901],"mapped",[153285]],[[194902,194902],"mapped",[31119]],[[194903,194903],"mapped",[31211]],[[194904,194904],"mapped",[16687]],[[194905,194905],"mapped",[31296]],[[194906,194906],"mapped",[31306]],[[194907,194907],"mapped",[31311]],[[194908,194908],"mapped",[153980]],[[194909,194910],"mapped",[154279]],[[194911,194911],"disallowed"],[[194912,194912],"mapped",[16898]],[[194913,194913],"mapped",[154539]],[[194914,194914],"mapped",[31686]],[[194915,194915],"mapped",[31689]],[[194916,194916],"mapped",[16935]],[[194917,194917],"mapped",[154752]],[[194918,194918],"mapped",[31954]],[[194919,194919],"mapped",[17056]],[[194920,194920],"mapped",[31976]],[[194921,194921],"mapped",[31971]],[[194922,194922],"mapped",[32000]],[[194923,194923],"mapped",[155526]],[[194924,194924],"mapped",[32099]],[[194925,194925],"mapped",[17153]],[[194926,194926],"mapped",[32199]],[[194927,194927],"mapped",[32258]],[[194928,194928],"mapped",[32325]],[[194929,194929],"mapped",[17204]],[[194930,194930],"mapped",[156200]],[[194931,194931],"mapped",[156231]],[[194932,194932],"mapped",[17241]],[[194933,194933],"mapped",[156377]],[[194934,194934],"mapped",[32634]],[[194935,194935],"mapped",[156478]],[[194936,194936],"mapped",[32661]],[[194937,194937],"mapped",[32762]],[[194938,194938],"mapped",[32773]],[[194939,194939],"mapped",[156890]],[[194940,194940],"mapped",[156963]],[[194941,194941],"mapped",[32864]],[[194942,194942],"mapped",[157096]],[[194943,194943],"mapped",[32880]],[[194944,194944],"mapped",[144223]],[[194945,194945],"mapped",[17365]],[[194946,194946],"mapped",[32946]],[[194947,194947],"mapped",[33027]],[[194948,194948],"mapped",[17419]],[[194949,194949],"mapped",[33086]],[[194950,194950],"mapped",[23221]],[[194951,194951],"mapped",[157607]],[[194952,194952],"mapped",[157621]],[[194953,194953],"mapped",[144275]],[[194954,194954],"mapped",[144284]],[[194955,194955],"mapped",[33281]],[[194956,194956],"mapped",[33284]],[[194957,194957],"mapped",[36766]],[[194958,194958],"mapped",[17515]],[[194959,194959],"mapped",[33425]],[[194960,194960],"mapped",[33419]],[[194961,194961],"mapped",[33437]],[[194962,194962],"mapped",[21171]],[[194963,194963],"mapped",[33457]],[[194964,194964],"mapped",[33459]],[[194965,194965],"mapped",[33469]],[[194966,194966],"mapped",[33510]],[[194967,194967],"mapped",[158524]],[[194968,194968],"mapped",[33509]],[[194969,194969],"mapped",[33565]],[[194970,194970],"mapped",[33635]],[[194971,194971],"mapped",[33709]],[[194972,194972],"mapped",[33571]],[[194973,194973],"mapped",[33725]],[[194974,194974],"mapped",[33767]],[[194975,194975],"mapped",[33879]],[[194976,194976],"mapped",[33619]],[[194977,194977],"mapped",[33738]],[[194978,194978],"mapped",[33740]],[[194979,194979],"mapped",[33756]],[[194980,194980],"mapped",[158774]],[[194981,194981],"mapped",[159083]],[[194982,194982],"mapped",[158933]],[[194983,194983],"mapped",[17707]],[[194984,194984],"mapped",[34033]],[[194985,194985],"mapped",[34035]],[[194986,194986],"mapped",[34070]],[[194987,194987],"mapped",[160714]],[[194988,194988],"mapped",[34148]],[[194989,194989],"mapped",[159532]],[[194990,194990],"mapped",[17757]],[[194991,194991],"mapped",[17761]],[[194992,194992],"mapped",[159665]],[[194993,194993],"mapped",[159954]],[[194994,194994],"mapped",[17771]],[[194995,194995],"mapped",[34384]],[[194996,194996],"mapped",[34396]],[[194997,194997],"mapped",[34407]],[[194998,194998],"mapped",[34409]],[[194999,194999],"mapped",[34473]],[[195000,195000],"mapped",[34440]],[[195001,195001],"mapped",[34574]],[[195002,195002],"mapped",[34530]],[[195003,195003],"mapped",[34681]],[[195004,195004],"mapped",[34600]],[[195005,195005],"mapped",[34667]],[[195006,195006],"mapped",[34694]],[[195007,195007],"disallowed"],[[195008,195008],"mapped",[34785]],[[195009,195009],"mapped",[34817]],[[195010,195010],"mapped",[17913]],[[195011,195011],"mapped",[34912]],[[195012,195012],"mapped",[34915]],[[195013,195013],"mapped",[161383]],[[195014,195014],"mapped",[35031]],[[195015,195015],"mapped",[35038]],[[195016,195016],"mapped",[17973]],[[195017,195017],"mapped",[35066]],[[195018,195018],"mapped",[13499]],[[195019,195019],"mapped",[161966]],[[195020,195020],"mapped",[162150]],[[195021,195021],"mapped",[18110]],[[195022,195022],"mapped",[18119]],[[195023,195023],"mapped",[35488]],[[195024,195024],"mapped",[35565]],[[195025,195025],"mapped",[35722]],[[195026,195026],"mapped",[35925]],[[195027,195027],"mapped",[162984]],[[195028,195028],"mapped",[36011]],[[195029,195029],"mapped",[36033]],[[195030,195030],"mapped",[36123]],[[195031,195031],"mapped",[36215]],[[195032,195032],"mapped",[163631]],[[195033,195033],"mapped",[133124]],[[195034,195034],"mapped",[36299]],[[195035,195035],"mapped",[36284]],[[195036,195036],"mapped",[36336]],[[195037,195037],"mapped",[133342]],[[195038,195038],"mapped",[36564]],[[195039,195039],"mapped",[36664]],[[195040,195040],"mapped",[165330]],[[195041,195041],"mapped",[165357]],[[195042,195042],"mapped",[37012]],[[195043,195043],"mapped",[37105]],[[195044,195044],"mapped",[37137]],[[195045,195045],"mapped",[165678]],[[195046,195046],"mapped",[37147]],[[195047,195047],"mapped",[37432]],[[195048,195048],"mapped",[37591]],[[195049,195049],"mapped",[37592]],[[195050,195050],"mapped",[37500]],[[195051,195051],"mapped",[37881]],[[195052,195052],"mapped",[37909]],[[195053,195053],"mapped",[166906]],[[195054,195054],"mapped",[38283]],[[195055,195055],"mapped",[18837]],[[195056,195056],"mapped",[38327]],[[195057,195057],"mapped",[167287]],[[195058,195058],"mapped",[18918]],[[195059,195059],"mapped",[38595]],[[195060,195060],"mapped",[23986]],[[195061,195061],"mapped",[38691]],[[195062,195062],"mapped",[168261]],[[195063,195063],"mapped",[168474]],[[195064,195064],"mapped",[19054]],[[195065,195065],"mapped",[19062]],[[195066,195066],"mapped",[38880]],[[195067,195067],"mapped",[168970]],[[195068,195068],"mapped",[19122]],[[195069,195069],"mapped",[169110]],[[195070,195071],"mapped",[38923]],[[195072,195072],"mapped",[38953]],[[195073,195073],"mapped",[169398]],[[195074,195074],"mapped",[39138]],[[195075,195075],"mapped",[19251]],[[195076,195076],"mapped",[39209]],[[195077,195077],"mapped",[39335]],[[195078,195078],"mapped",[39362]],[[195079,195079],"mapped",[39422]],[[195080,195080],"mapped",[19406]],[[195081,195081],"mapped",[170800]],[[195082,195082],"mapped",[39698]],[[195083,195083],"mapped",[40000]],[[195084,195084],"mapped",[40189]],[[195085,195085],"mapped",[19662]],[[195086,195086],"mapped",[19693]],[[195087,195087],"mapped",[40295]],[[195088,195088],"mapped",[172238]],[[195089,195089],"mapped",[19704]],[[195090,195090],"mapped",[172293]],[[195091,195091],"mapped",[172558]],[[195092,195092],"mapped",[172689]],[[195093,195093],"mapped",[40635]],[[195094,195094],"mapped",[19798]],[[195095,195095],"mapped",[40697]],[[195096,195096],"mapped",[40702]],[[195097,195097],"mapped",[40709]],[[195098,195098],"mapped",[40719]],[[195099,195099],"mapped",[40726]],[[195100,195100],"mapped",[40763]],[[195101,195101],"mapped",[173568]],[[195102,196605],"disallowed"],[[196606,196607],"disallowed"],[[196608,262141],"disallowed"],[[262142,262143],"disallowed"],[[262144,327677],"disallowed"],[[327678,327679],"disallowed"],[[327680,393213],"disallowed"],[[393214,393215],"disallowed"],[[393216,458749],"disallowed"],[[458750,458751],"disallowed"],[[458752,524285],"disallowed"],[[524286,524287],"disallowed"],[[524288,589821],"disallowed"],[[589822,589823],"disallowed"],[[589824,655357],"disallowed"],[[655358,655359],"disallowed"],[[655360,720893],"disallowed"],[[720894,720895],"disallowed"],[[720896,786429],"disallowed"],[[786430,786431],"disallowed"],[[786432,851965],"disallowed"],[[851966,851967],"disallowed"],[[851968,917501],"disallowed"],[[917502,917503],"disallowed"],[[917504,917504],"disallowed"],[[917505,917505],"disallowed"],[[917506,917535],"disallowed"],[[917536,917631],"disallowed"],[[917632,917759],"disallowed"],[[917760,917999],"ignored"],[[918000,983037],"disallowed"],[[983038,983039],"disallowed"],[[983040,1048573],"disallowed"],[[1048574,1048575],"disallowed"],[[1048576,1114109],"disallowed"],[[1114110,1114111],"disallowed"]]'); + +/***/ }) + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ var __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __nccwpck_require__(moduleId) { +/******/ // Check if module is in cache +/******/ var cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ var threw = true; +/******/ try { +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __nccwpck_require__); +/******/ threw = false; +/******/ } finally { +/******/ if(threw) delete __webpack_module_cache__[moduleId]; +/******/ } +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +/******/ /* webpack/runtime/compat */ +/******/ +/******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/"; +/******/ +/************************************************************************/ +/******/ +/******/ // startup +/******/ // Load entry module and return exports +/******/ // This entry module is referenced by other modules so it can't be inlined +/******/ var __webpack_exports__ = __nccwpck_require__(3571); +/******/ module.exports = __webpack_exports__; +/******/ +/******/ })() +; diff --git a/.github/workflows/proposalPolice.yml b/.github/workflows/proposalPolice.yml new file mode 100644 index 000000000000..01d468e4a90a --- /dev/null +++ b/.github/workflows/proposalPolice.yml @@ -0,0 +1,37 @@ +name: ProposalPolice™ - Issue Comment Workflow +on: + issue_comment: + types: [created, edited] + +jobs: + proposal-police-workflow: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Setup node version + uses: actions/setup-node@v2 + with: + node-version: "20" + + # Check comment created and if it's a proposal make sure it follows the template + - name: ProposalPolice™ Comment Check + if: github.event.action == 'created' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + OPENAI_ASSISTANT_ID: ${{ secrets.OPENAI_ASSISTANT_ID }} + ISSUE: ${{ toJson(github.event.issue) }} + COMMENT: ${{ toJson(github.event.comment) }} + run: node .github/actions/javascript/proposalPoliceComment/index.js + + # Checks if the comment is edited and if proposal template is followed + - name: ProposalPolice™ Edited Comment Check + if: github.event.action == 'edited' + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + OPENAI_ASSISTANT_ID: ${{ secrets.OPENAI_ASSISTANT_ID }} + ISSUE: ${{ toJson(github.event.issue) }} + COMMENT: ${{ toJson(github.event.comment) }} + run: node .github/actions/javascript/proposalPoliceCommentEdit/index.js From 741fc960320641f0a9e7368761fa03bc86e215b5 Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Sat, 25 May 2024 14:56:09 -0700 Subject: [PATCH 04/22] refactoring 2.0 --- .../javascript/proposalPoliceComment/index.js | 197 ++++++++++-------- .../proposalPoliceComment.ts | 183 ++++++++-------- .../proposalPoliceCommentEdit/index.js | 193 ++++++++++------- .../proposalPoliceCommentEdit.ts | 181 ++++++++-------- .github/libs/CONST.ts | 1 + 5 files changed, 410 insertions(+), 345 deletions(-) diff --git a/.github/actions/javascript/proposalPoliceComment/index.js b/.github/actions/javascript/proposalPoliceComment/index.js index f04d61e1a506..1a0e8d42ae01 100644 --- a/.github/actions/javascript/proposalPoliceComment/index.js +++ b/.github/actions/javascript/proposalPoliceComment/index.js @@ -13764,104 +13764,103 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -// Import GitHub toolkit and Octokit REST client const github_1 = __nccwpck_require__(5438); const openai_1 = __importDefault(__nccwpck_require__(47)); +const CONST_1 = __importDefault(__nccwpck_require__(9873)); // @ts-ignore - process is not imported const OpenAI = new openai_1.default({ apiKey: process.env.OPENAI_API_KEY }); -async function handleIssueCommentCreated(octokit, labelNames) { +async function processIssueComment(octokit) { const payload = github_1.context.payload; // @ts-ignore - process is not imported const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; - // check if the issue is opened and the has all passed labels - if (payload.issue?.state === 'open' && labelNames.every((labelName) => payload.issue?.labels.some((issueLabel) => issueLabel.name === labelName))) { - if (!OPENAI_ASSISTANT_ID) { - console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); - return; - } - // 1, check if comment is proposal and if proposal template is followed - const content = `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment?.body}`; - // create thread with first user message and run it - const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ - assistant_id: OPENAI_ASSISTANT_ID ?? '', - thread: { messages: [{ role: 'user', content }] }, - }); - // count calls for debug purposes - let count = 0; - // poll for run completion - const intervalID = setInterval(() => { - OpenAI.beta.threads.runs - .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) - .then((run) => { - // return if run is not completed - if (run.status !== 'completed') { - return; - } - // get assistant response - OpenAI.beta.threads.messages - .list(createAndRunResponse.thread_id) - .then((threadMessages) => { - // list thread messages content - threadMessages.data.forEach((message, index) => { - // @ts-ignore - we do have text value in content[0] but typescript doesn't know that - // this is a 'openai' package type issue - let assistantResponse = message.content?.[index]?.text?.value; - console.log('issue_comment.created - assistantResponse', assistantResponse); - if (!assistantResponse) { - return console.log('issue_comment.created - assistantResponse is empty'); - } - // check if assistant response is either NO_ACTION or "NO_ACTION" strings - // as sometimes the assistant response varies - const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; - // if assistant response is NO_ACTION or message role is 'user', do nothing - if (isNoAction || threadMessages.data?.[index]?.role === 'user') { - if (threadMessages.data?.[index]?.role === 'user') { - return; - } - return console.log('issue_comment.created - NO_ACTION'); - } - // if the assistant responded with no action but there's some context in the response - if (assistantResponse.includes('[NO_ACTION]')) { - // extract the text after [NO_ACTION] from assistantResponse since this is a - // bot related action keyword - const noActionContext = assistantResponse.split('[NO_ACTION] ')?.[1]?.replace('"', ''); - console.log('issue_comment.created - [NO_ACTION] w/ context: ', noActionContext); + // check if the issue is open and the has labels + if (payload.issue?.state !== 'open' && !payload.issue?.labels.some((issueLabel) => issueLabel.name === CONST_1.default.LABELS.HELP_WANTED)) { + return; + } + if (!OPENAI_ASSISTANT_ID) { + console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); + return; + } + // 1, check if comment is proposal and if proposal template is followed + const content = `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment?.body}`; + // create thread with first user message and run it + const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ + assistant_id: OPENAI_ASSISTANT_ID ?? '', + thread: { messages: [{ role: 'user', content }] }, + }); + // count calls for debug purposes + let count = 0; + // poll for run completion + const intervalID = setInterval(() => { + OpenAI.beta.threads.runs + .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) + .then((run) => { + // return if run is not completed + if (run.status !== 'completed') { + return; + } + // get assistant response + OpenAI.beta.threads.messages + .list(createAndRunResponse.thread_id) + .then((threadMessages) => { + // list thread messages content + threadMessages.data.forEach((message, index) => { + // @ts-ignore - we do have text value in content[0] but typescript doesn't know that + // this is a 'openai' package type issue + let assistantResponse = message.content?.[index]?.text?.value; + console.log('issue_comment.created - assistantResponse', assistantResponse); + if (!assistantResponse) { + return console.log('issue_comment.created - assistantResponse is empty'); + } + // check if assistant response is either NO_ACTION or "NO_ACTION" strings + // as sometimes the assistant response varies + const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; + // if assistant response is NO_ACTION or message role is 'user', do nothing + if (isNoAction || threadMessages.data?.[index]?.role === 'user') { + if (threadMessages.data?.[index]?.role === 'user') { return; } - // replace {user} from response template with @username - assistantResponse = assistantResponse.replace('{user}', `@${payload.comment?.user.login}`); - // replace {proposalLink} from response template with the link to the comment - assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment?.html_url); - // remove any double quotes from the final comment because sometimes the assistant's - // response contains double quotes / sometimes it doesn't - assistantResponse = assistantResponse.replace('"', ''); - // create a comment with the assistant's response - console.log('issue_comment.created - proposal-police posts comment'); - return octokit.issues.createComment({ - ...github_1.context.repo, - issue_number: payload.issue?.number, - body: assistantResponse, - }); + return console.log('issue_comment.created - NO_ACTION'); + } + // if the assistant responded with no action but there's some context in the response + if (assistantResponse.includes('[NO_ACTION]')) { + // extract the text after [NO_ACTION] from assistantResponse since this is a + // bot related action keyword + const noActionContext = assistantResponse.split('[NO_ACTION] ')?.[1]?.replace('"', ''); + console.log('issue_comment.created - [NO_ACTION] w/ context: ', noActionContext); + return; + } + // replace {user} from response template with @username + assistantResponse = assistantResponse.replace('{user}', `@${payload.comment?.user.login}`); + // replace {proposalLink} from response template with the link to the comment + assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment?.html_url); + // remove any double quotes from the final comment because sometimes the assistant's + // response contains double quotes / sometimes it doesn't + assistantResponse = assistantResponse.replace('"', ''); + // create a comment with the assistant's response + console.log('issue_comment.created - proposal-police posts comment'); + return octokit.issues.createComment({ + ...github_1.context.repo, + issue_number: payload.issue?.number, + body: assistantResponse, }); - }) - .catch((err) => console.log('threads.messages.list - err', err)); - // stop polling - clearInterval(intervalID); + }); }) - .catch((err) => console.log('threads.runs.retrieve - err', err)); - // increment count for every threads.runs.retrieve call - count++; - console.log('threads.runs.retrieve - called:', count); - }, 1500); - } - // return so that the script doesn't hang - return false; + .catch((error) => console.log('threads.messages.list - error', error)); + // stop polling + clearInterval(intervalID); + }) + .catch((error) => console.log('threads.runs.retrieve - error', error)); + // increment count for every threads.runs.retrieve call + count++; + console.log('threads.runs.retrieve - called:', count); + }, 1500); } // Main function to process the workflow event async function run() { // @ts-ignore - process is not imported const octokit = (0, github_1.getOctokit)(process.env.GITHUB_TOKEN); - await handleIssueCommentCreated(octokit, ['Help Wanted']); + await processIssueComment(octokit); } run().catch((error) => { console.error(error); @@ -13870,6 +13869,40 @@ run().catch((error) => { }); +/***/ }), + +/***/ 9873: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const GITHUB_BASE_URL_REGEX = new RegExp('https?://(?:github\\.com|api\\.github\\.com)'); +const GIT_CONST = { + GITHUB_OWNER: 'Expensify', + APP_REPO: 'App', +}; +const CONST = { + ...GIT_CONST, + APPLAUSE_BOT: 'applausebot', + OS_BOTIFY: 'OSBotify', + LABELS: { + STAGING_DEPLOY: 'StagingDeployCash', + DEPLOY_BLOCKER: 'DeployBlockerCash', + INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', + }, + DATE_FORMAT_STRING: 'yyyy-MM-dd', + PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), + ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), + ISSUE_OR_PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/(?:pull|issues)/([0-9]+).*`), + POLL_RATE: 10000, + APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, + APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, +}; +exports["default"] = CONST; + + /***/ }), /***/ 2877: diff --git a/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts b/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts index d06e2d35f673..9e3598a27e3c 100644 --- a/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts +++ b/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts @@ -1,117 +1,116 @@ -// Import GitHub toolkit and Octokit REST client import {context, getOctokit} from '@actions/github'; import InitOpenAI from 'openai'; +import CONST from '@github/libs/CONST'; import type {GitHubType} from '@github/libs/GithubUtils'; // @ts-ignore - process is not imported const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); -async function handleIssueCommentCreated(octokit: InstanceType, labelNames: string[]) { +async function processIssueComment(octokit: InstanceType) { const payload = context.payload; // @ts-ignore - process is not imported const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; - // check if the issue is opened and the has all passed labels - if (payload.issue?.state === 'open' && labelNames.every((labelName: string) => payload.issue?.labels.some((issueLabel: {name: string}) => issueLabel.name === labelName))) { - if (!OPENAI_ASSISTANT_ID) { - console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); - return; - } - - // 1, check if comment is proposal and if proposal template is followed - const content = `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment?.body}`; - - // create thread with first user message and run it - const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ - assistant_id: OPENAI_ASSISTANT_ID ?? '', - thread: {messages: [{role: 'user', content}]}, - }); - - // count calls for debug purposes - let count = 0; - // poll for run completion - const intervalID = setInterval(() => { - OpenAI.beta.threads.runs - .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) - .then((run) => { - // return if run is not completed - if (run.status !== 'completed') { - return; - } - - // get assistant response - OpenAI.beta.threads.messages - .list(createAndRunResponse.thread_id) - .then((threadMessages) => { - // list thread messages content - threadMessages.data.forEach((message, index) => { - // @ts-ignore - we do have text value in content[0] but typescript doesn't know that - // this is a 'openai' package type issue - let assistantResponse = message.content?.[index]?.text?.value; - console.log('issue_comment.created - assistantResponse', assistantResponse); - - if (!assistantResponse) { - return console.log('issue_comment.created - assistantResponse is empty'); - } + // check if the issue is open and the has labels + if (payload.issue?.state !== 'open' && !payload.issue?.labels.some((issueLabel: {name: string}) => issueLabel.name === CONST.LABELS.HELP_WANTED)) { + return; + } - // check if assistant response is either NO_ACTION or "NO_ACTION" strings - // as sometimes the assistant response varies - const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; - // if assistant response is NO_ACTION or message role is 'user', do nothing - if (isNoAction || threadMessages.data?.[index]?.role === 'user') { - if (threadMessages.data?.[index]?.role === 'user') { - return; - } - return console.log('issue_comment.created - NO_ACTION'); - } + if (!OPENAI_ASSISTANT_ID) { + console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); + return; + } - // if the assistant responded with no action but there's some context in the response - if (assistantResponse.includes('[NO_ACTION]')) { - // extract the text after [NO_ACTION] from assistantResponse since this is a - // bot related action keyword - const noActionContext = assistantResponse.split('[NO_ACTION] ')?.[1]?.replace('"', ''); - console.log('issue_comment.created - [NO_ACTION] w/ context: ', noActionContext); + // 1, check if comment is proposal and if proposal template is followed + const content = `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment?.body}`; + + // create thread with first user message and run it + const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ + assistant_id: OPENAI_ASSISTANT_ID ?? '', + thread: {messages: [{role: 'user', content}]}, + }); + + // count calls for debug purposes + let count = 0; + // poll for run completion + const intervalID = setInterval(() => { + OpenAI.beta.threads.runs + .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) + .then((run) => { + // return if run is not completed + if (run.status !== 'completed') { + return; + } + + // get assistant response + OpenAI.beta.threads.messages + .list(createAndRunResponse.thread_id) + .then((threadMessages) => { + // list thread messages content + threadMessages.data.forEach((message, index) => { + // @ts-ignore - we do have text value in content[0] but typescript doesn't know that + // this is a 'openai' package type issue + let assistantResponse = message.content?.[index]?.text?.value; + console.log('issue_comment.created - assistantResponse', assistantResponse); + + if (!assistantResponse) { + return console.log('issue_comment.created - assistantResponse is empty'); + } + + // check if assistant response is either NO_ACTION or "NO_ACTION" strings + // as sometimes the assistant response varies + const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; + // if assistant response is NO_ACTION or message role is 'user', do nothing + if (isNoAction || threadMessages.data?.[index]?.role === 'user') { + if (threadMessages.data?.[index]?.role === 'user') { return; } - // replace {user} from response template with @username - assistantResponse = assistantResponse.replace('{user}', `@${payload.comment?.user.login}`); - // replace {proposalLink} from response template with the link to the comment - assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment?.html_url); - - // remove any double quotes from the final comment because sometimes the assistant's - // response contains double quotes / sometimes it doesn't - assistantResponse = assistantResponse.replace('"', ''); - // create a comment with the assistant's response - console.log('issue_comment.created - proposal-police posts comment'); - return octokit.issues.createComment({ - ...context.repo, - issue_number: payload.issue?.number as number, - body: assistantResponse, - }); + return console.log('issue_comment.created - NO_ACTION'); + } + + // if the assistant responded with no action but there's some context in the response + if (assistantResponse.includes('[NO_ACTION]')) { + // extract the text after [NO_ACTION] from assistantResponse since this is a + // bot related action keyword + const noActionContext = assistantResponse.split('[NO_ACTION] ')?.[1]?.replace('"', ''); + console.log('issue_comment.created - [NO_ACTION] w/ context: ', noActionContext); + return; + } + // replace {user} from response template with @username + assistantResponse = assistantResponse.replace('{user}', `@${payload.comment?.user.login}`); + // replace {proposalLink} from response template with the link to the comment + assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment?.html_url); + + // remove any double quotes from the final comment because sometimes the assistant's + // response contains double quotes / sometimes it doesn't + assistantResponse = assistantResponse.replace('"', ''); + // create a comment with the assistant's response + console.log('issue_comment.created - proposal-police posts comment'); + return octokit.issues.createComment({ + ...context.repo, + issue_number: payload.issue?.number as number, + body: assistantResponse, }); - }) - .catch((err) => console.log('threads.messages.list - err', err)); - - // stop polling - clearInterval(intervalID); - }) - .catch((err) => console.log('threads.runs.retrieve - err', err)); - - // increment count for every threads.runs.retrieve call - count++; - console.log('threads.runs.retrieve - called:', count); - }, 1500); - } - - // return so that the script doesn't hang - return false; + }); + }) + .catch((error) => console.log('threads.messages.list - error', error)); + + // stop polling + clearInterval(intervalID); + }) + .catch((error) => console.log('threads.runs.retrieve - error', error)); + + // increment count for every threads.runs.retrieve call + count++; + console.log('threads.runs.retrieve - called:', count); + }, 1500); } // Main function to process the workflow event async function run() { // @ts-ignore - process is not imported const octokit: InstanceType = getOctokit(process.env.GITHUB_TOKEN); - await handleIssueCommentCreated(octokit, ['Help Wanted']); + await processIssueComment(octokit); } run().catch((error) => { diff --git a/.github/actions/javascript/proposalPoliceCommentEdit/index.js b/.github/actions/javascript/proposalPoliceCommentEdit/index.js index 58b741a59361..2c65cd10b755 100644 --- a/.github/actions/javascript/proposalPoliceCommentEdit/index.js +++ b/.github/actions/javascript/proposalPoliceCommentEdit/index.js @@ -13764,99 +13764,98 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -// Import GitHub toolkit and Octokit REST client const github_1 = __nccwpck_require__(5438); const openai_1 = __importDefault(__nccwpck_require__(47)); +const CONST_1 = __importDefault(__nccwpck_require__(9873)); // @ts-ignore - process is not imported const OpenAI = new openai_1.default({ apiKey: process.env.OPENAI_API_KEY }); -async function handleIssueCommentEdited(octokit, labelNames) { +async function processIssueCommentEdit(octokit) { const payload = github_1.context.payload; // @ts-ignore - process is not imported const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; - // check if the issue is opened and the has all passed labels - if (payload.issue?.state === 'open' && labelNames.every((labelName) => payload.issue?.labels.some((issueLabel) => issueLabel.name === labelName))) { - if (!OPENAI_ASSISTANT_ID) { - console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); - return; - } - // You need to adapt this part to fit the Edit Use Case as in the original function - const content = `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body?.from}.\n\nEdited comment content: ${payload.comment?.body}`; - // create thread with first user message and run it - const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ - assistant_id: OPENAI_ASSISTANT_ID ?? '', - thread: { messages: [{ role: 'user', content }] }, - }); - // count calls for debug purposes - let count = 0; - // poll for run completion - const intervalID = setInterval(() => { - OpenAI.beta.threads.runs - .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) - .then((run) => { - // return if run is not completed yet - if (run.status !== 'completed') { - console.log('issue_comment.edited - run pending completion'); - return; - } - // get assistant response - OpenAI.beta.threads.messages - .list(createAndRunResponse.thread_id) - .then((threadMessages) => { - // list thread messages content - threadMessages.data.forEach((message, index) => { - // @ts-ignore - we do have text value in content[0] but typescript doesn't know that - // this is a 'openai' package type issue - let assistantResponse = message.content?.[index]?.text?.value; - console.log('issue_comment.edited - assistantResponse', assistantResponse); - if (!assistantResponse) { - return console.log('issue_comment.edited - assistantResponse is empty'); - } - // check if assistant response is either NO_ACTION or "NO_ACTION" strings - // as sometimes the assistant response varies - const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; - // if assistant response is NO_ACTION or message role is 'user', do nothing - if (isNoAction || threadMessages.data?.[index]?.role === 'user') { - if (threadMessages.data?.[index]?.role === 'user') { - return; - } - return console.log('issue_comment.edited - NO_ACTION'); - } - // edit comment if assistant detected substantial changes and if the comment was not edited already by the bot - if (assistantResponse.includes('[EDIT_COMMENT]') && !payload.comment?.body.includes('Edited by **proposal-police**')) { - // extract the text after [EDIT_COMMENT] from assistantResponse since this is a - // bot related action keyword - let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); - // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC - const date = new Date(payload.comment?.updated_at); - const formattedDate = date.toISOString()?.split('.')?.[0]?.replace('T', ' ') + ' UTC'; - extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); - console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment?.id}`); - return octokit.issues.updateComment({ - ...github_1.context.repo, - comment_id: payload.comment?.id, - body: `${extractedNotice}\n\n` + payload.comment?.body, - }); + // check if the issue is open and the has labels + if (payload.issue?.state !== 'open' && !payload.issue?.labels.some((issueLabel) => issueLabel.name === CONST_1.default.LABELS.HELP_WANTED)) { + return; + } + if (!OPENAI_ASSISTANT_ID) { + console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); + return; + } + // You need to adapt this part to fit the Edit Use Case as in the original function + const content = `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body?.from}.\n\nEdited comment content: ${payload.comment?.body}`; + // create thread with first user message and run it + const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ + assistant_id: OPENAI_ASSISTANT_ID ?? '', + thread: { messages: [{ role: 'user', content }] }, + }); + // count calls for debug purposes + let count = 0; + // poll for run completion + const intervalID = setInterval(() => { + OpenAI.beta.threads.runs + .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) + .then((run) => { + // return if run is not completed yet + if (run.status !== 'completed') { + console.log('issue_comment.edited - run pending completion'); + return; + } + // get assistant response + OpenAI.beta.threads.messages + .list(createAndRunResponse.thread_id) + .then((threadMessages) => { + // list thread messages content + threadMessages.data.forEach((message, index) => { + // @ts-ignore - we do have text value in content[0] but typescript doesn't know that + // this is a 'openai' package type issue + let assistantResponse = message.content?.[index]?.text?.value; + console.log('issue_comment.edited - assistantResponse', assistantResponse); + if (!assistantResponse) { + return console.log('issue_comment.edited - assistantResponse is empty'); + } + // check if assistant response is either NO_ACTION or "NO_ACTION" strings + // as sometimes the assistant response varies + const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; + // if assistant response is NO_ACTION or message role is 'user', do nothing + if (isNoAction || threadMessages.data?.[index]?.role === 'user') { + if (threadMessages.data?.[index]?.role === 'user') { + return; } - return false; - }); - }) - .catch((err) => console.log('threads.messages.list - err', err)); - // stop polling - clearInterval(intervalID); + return console.log('issue_comment.edited - NO_ACTION'); + } + // edit comment if assistant detected substantial changes and if the comment was not edited already by the bot + if (assistantResponse.includes('[EDIT_COMMENT]') && !payload.comment?.body.includes('Edited by **proposal-police**')) { + // extract the text after [EDIT_COMMENT] from assistantResponse since this is a + // bot related action keyword + let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); + // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC + const date = new Date(payload.comment?.updated_at); + const formattedDate = date.toISOString()?.split('.')?.[0]?.replace('T', ' ') + ' UTC'; + extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); + console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment?.id}`); + return octokit.issues.updateComment({ + ...github_1.context.repo, + comment_id: payload.comment?.id, + body: `${extractedNotice}\n\n` + payload.comment?.body, + }); + } + return false; + }); }) - .catch((err) => console.log('threads.runs.retrieve - err', err)); - // increment count for every threads.runs.retrieve call - count++; - console.log('threads.runs.retrieve - called:', count); - }, 1500); - } - // return so that the script doesn't hang - return false; + .catch((error) => console.log('threads.messages.list - error', error)); + // stop polling + clearInterval(intervalID); + }) + .catch((error) => console.log('threads.runs.retrieve - error', error)); + // increment count for every threads.runs.retrieve call + count++; + console.log('threads.runs.retrieve - called:', count); + }, 1500); } async function run() { // @ts-ignore - process is not imported const octokit = (0, github_1.getOctokit)(process.env.GITHUB_TOKEN); - await handleIssueCommentEdited(octokit, ['Help Wanted']); + await processIssueCommentEdit(octokit); } run().catch((error) => { console.error(error); @@ -13865,6 +13864,40 @@ run().catch((error) => { }); +/***/ }), + +/***/ 9873: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const GITHUB_BASE_URL_REGEX = new RegExp('https?://(?:github\\.com|api\\.github\\.com)'); +const GIT_CONST = { + GITHUB_OWNER: 'Expensify', + APP_REPO: 'App', +}; +const CONST = { + ...GIT_CONST, + APPLAUSE_BOT: 'applausebot', + OS_BOTIFY: 'OSBotify', + LABELS: { + STAGING_DEPLOY: 'StagingDeployCash', + DEPLOY_BLOCKER: 'DeployBlockerCash', + INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', + }, + DATE_FORMAT_STRING: 'yyyy-MM-dd', + PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), + ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), + ISSUE_OR_PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/(?:pull|issues)/([0-9]+).*`), + POLL_RATE: 10000, + APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, + APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, +}; +exports["default"] = CONST; + + /***/ }), /***/ 2877: diff --git a/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts b/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts index 1d5fe462430a..3770f0293743 100644 --- a/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts +++ b/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts @@ -1,113 +1,112 @@ -// Import GitHub toolkit and Octokit REST client import {context, getOctokit} from '@actions/github'; import InitOpenAI from 'openai'; +import CONST from '@github/libs/CONST'; import type {GitHubType} from '@github/libs/GithubUtils'; // @ts-ignore - process is not imported const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); -async function handleIssueCommentEdited(octokit: InstanceType, labelNames: string[]) { +async function processIssueCommentEdit(octokit: InstanceType) { const payload = context.payload; // @ts-ignore - process is not imported const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; - // check if the issue is opened and the has all passed labels - if (payload.issue?.state === 'open' && labelNames.every((labelName: string) => payload.issue?.labels.some((issueLabel: {name: string}) => issueLabel.name === labelName))) { - if (!OPENAI_ASSISTANT_ID) { - console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); - return; - } - - // You need to adapt this part to fit the Edit Use Case as in the original function - const content = `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body?.from}.\n\nEdited comment content: ${payload.comment?.body}`; - - // create thread with first user message and run it - const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ - assistant_id: OPENAI_ASSISTANT_ID ?? '', - thread: {messages: [{role: 'user', content}]}, - }); - - // count calls for debug purposes - let count = 0; - // poll for run completion - const intervalID = setInterval(() => { - OpenAI.beta.threads.runs - .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) - .then((run) => { - // return if run is not completed yet - if (run.status !== 'completed') { - console.log('issue_comment.edited - run pending completion'); - return; - } - - // get assistant response - OpenAI.beta.threads.messages - .list(createAndRunResponse.thread_id) - .then((threadMessages) => { - // list thread messages content - threadMessages.data.forEach((message, index) => { - // @ts-ignore - we do have text value in content[0] but typescript doesn't know that - // this is a 'openai' package type issue - let assistantResponse = message.content?.[index]?.text?.value; - console.log('issue_comment.edited - assistantResponse', assistantResponse); - - if (!assistantResponse) { - return console.log('issue_comment.edited - assistantResponse is empty'); - } - - // check if assistant response is either NO_ACTION or "NO_ACTION" strings - // as sometimes the assistant response varies - const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; - // if assistant response is NO_ACTION or message role is 'user', do nothing - if (isNoAction || threadMessages.data?.[index]?.role === 'user') { - if (threadMessages.data?.[index]?.role === 'user') { - return; - } - return console.log('issue_comment.edited - NO_ACTION'); - } - - // edit comment if assistant detected substantial changes and if the comment was not edited already by the bot - if (assistantResponse.includes('[EDIT_COMMENT]') && !payload.comment?.body.includes('Edited by **proposal-police**')) { - // extract the text after [EDIT_COMMENT] from assistantResponse since this is a - // bot related action keyword - let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); - // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC - const date = new Date(payload.comment?.updated_at); - const formattedDate = date.toISOString()?.split('.')?.[0]?.replace('T', ' ') + ' UTC'; - extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); - - console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment?.id}`); - return octokit.issues.updateComment({ - ...context.repo, - comment_id: payload.comment?.id as number, - body: `${extractedNotice}\n\n` + payload.comment?.body, - }); - } - - return false; - }); - }) - .catch((err) => console.log('threads.messages.list - err', err)); - - // stop polling - clearInterval(intervalID); - }) - .catch((err) => console.log('threads.runs.retrieve - err', err)); + // check if the issue is open and the has labels + if (payload.issue?.state !== 'open' && !payload.issue?.labels.some((issueLabel: {name: string}) => issueLabel.name === CONST.LABELS.HELP_WANTED)) { + return; + } - // increment count for every threads.runs.retrieve call - count++; - console.log('threads.runs.retrieve - called:', count); - }, 1500); + if (!OPENAI_ASSISTANT_ID) { + console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); + return; } - // return so that the script doesn't hang - return false; + // You need to adapt this part to fit the Edit Use Case as in the original function + const content = `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body?.from}.\n\nEdited comment content: ${payload.comment?.body}`; + + // create thread with first user message and run it + const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ + assistant_id: OPENAI_ASSISTANT_ID ?? '', + thread: {messages: [{role: 'user', content}]}, + }); + + // count calls for debug purposes + let count = 0; + // poll for run completion + const intervalID = setInterval(() => { + OpenAI.beta.threads.runs + .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) + .then((run) => { + // return if run is not completed yet + if (run.status !== 'completed') { + console.log('issue_comment.edited - run pending completion'); + return; + } + + // get assistant response + OpenAI.beta.threads.messages + .list(createAndRunResponse.thread_id) + .then((threadMessages) => { + // list thread messages content + threadMessages.data.forEach((message, index) => { + // @ts-ignore - we do have text value in content[0] but typescript doesn't know that + // this is a 'openai' package type issue + let assistantResponse = message.content?.[index]?.text?.value; + console.log('issue_comment.edited - assistantResponse', assistantResponse); + + if (!assistantResponse) { + return console.log('issue_comment.edited - assistantResponse is empty'); + } + + // check if assistant response is either NO_ACTION or "NO_ACTION" strings + // as sometimes the assistant response varies + const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; + // if assistant response is NO_ACTION or message role is 'user', do nothing + if (isNoAction || threadMessages.data?.[index]?.role === 'user') { + if (threadMessages.data?.[index]?.role === 'user') { + return; + } + return console.log('issue_comment.edited - NO_ACTION'); + } + + // edit comment if assistant detected substantial changes and if the comment was not edited already by the bot + if (assistantResponse.includes('[EDIT_COMMENT]') && !payload.comment?.body.includes('Edited by **proposal-police**')) { + // extract the text after [EDIT_COMMENT] from assistantResponse since this is a + // bot related action keyword + let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); + // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC + const date = new Date(payload.comment?.updated_at); + const formattedDate = date.toISOString()?.split('.')?.[0]?.replace('T', ' ') + ' UTC'; + extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); + + console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment?.id}`); + return octokit.issues.updateComment({ + ...context.repo, + comment_id: payload.comment?.id as number, + body: `${extractedNotice}\n\n` + payload.comment?.body, + }); + } + + return false; + }); + }) + .catch((error) => console.log('threads.messages.list - error', error)); + + // stop polling + clearInterval(intervalID); + }) + .catch((error) => console.log('threads.runs.retrieve - error', error)); + + // increment count for every threads.runs.retrieve call + count++; + console.log('threads.runs.retrieve - called:', count); + }, 1500); } async function run() { // @ts-ignore - process is not imported const octokit: InstanceType = getOctokit(process.env.GITHUB_TOKEN); - await handleIssueCommentEdited(octokit, ['Help Wanted']); + await processIssueCommentEdit(octokit); } run().catch((error) => { diff --git a/.github/libs/CONST.ts b/.github/libs/CONST.ts index 8d9aae9bff83..b1e38a18a4a1 100644 --- a/.github/libs/CONST.ts +++ b/.github/libs/CONST.ts @@ -13,6 +13,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), From da27fb3148c207384005c122408d680ede54306a Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Sat, 25 May 2024 15:04:06 -0700 Subject: [PATCH 05/22] synced w/ main and npm ci, package-lock.json bump --- package-lock.json | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index d1e40560cf11..d41bff7f409a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1854,19 +1854,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-object-assign": { - "version": "7.18.6", - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-object-rest-spread": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", @@ -37109,6 +37096,15 @@ "defaults": "^1.0.3" } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/webidl-conversions": { "version": "7.0.0", "license": "BSD-2-Clause", From 0245beb92a7ea9962f9fbf327a05db5cb6c6c16b Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Sat, 25 May 2024 16:57:32 -0700 Subject: [PATCH 06/22] fixed lint and rebuilt --- .../javascript/proposalPoliceComment/index.js | 1018 ++++++++++++---- .../proposalPoliceComment.ts | 18 +- .../proposalPoliceCommentEdit/index.js | 1026 +++++++++++++---- .../proposalPoliceCommentEdit.ts | 26 +- 4 files changed, 1564 insertions(+), 524 deletions(-) diff --git a/.github/actions/javascript/proposalPoliceComment/index.js b/.github/actions/javascript/proposalPoliceComment/index.js index 1a0e8d42ae01..9a4f7cbe67cd 100644 --- a/.github/actions/javascript/proposalPoliceComment/index.js +++ b/.github/actions/javascript/proposalPoliceComment/index.js @@ -9500,51 +9500,50 @@ exports.getUserAgent = getUserAgent; /***/ (function(__unused_webpack_module, exports) { /** - * web-streams-polyfill v3.2.1 + * @license + * web-streams-polyfill v3.3.3 + * Copyright 2024 Mattias Buelens, Diwank Singh Tomer and other contributors. + * This code is released under the MIT license. + * SPDX-License-Identifier: MIT */ (function (global, factory) { true ? factory(exports) : 0; -}(this, (function (exports) { 'use strict'; +})(this, (function (exports) { 'use strict'; - /// - const SymbolPolyfill = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? - Symbol : - description => `Symbol(${description})`; - - /// function noop() { return undefined; } - function getGlobals() { - if (typeof self !== 'undefined') { - return self; - } - else if (typeof window !== 'undefined') { - return window; - } - else if (typeof global !== 'undefined') { - return global; - } - return undefined; - } - const globals = getGlobals(); function typeIsObject(x) { return (typeof x === 'object' && x !== null) || typeof x === 'function'; } const rethrowAssertionErrorRejection = noop; + function setFunctionName(fn, name) { + try { + Object.defineProperty(fn, 'name', { + value: name, + configurable: true + }); + } + catch (_a) { + // This property is non-configurable in older browsers, so ignore if this throws. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility + } + } const originalPromise = Promise; const originalPromiseThen = Promise.prototype.then; - const originalPromiseResolve = Promise.resolve.bind(originalPromise); const originalPromiseReject = Promise.reject.bind(originalPromise); + // https://webidl.spec.whatwg.org/#a-new-promise function newPromise(executor) { return new originalPromise(executor); } + // https://webidl.spec.whatwg.org/#a-promise-resolved-with function promiseResolvedWith(value) { - return originalPromiseResolve(value); + return newPromise(resolve => resolve(value)); } + // https://webidl.spec.whatwg.org/#a-promise-rejected-with function promiseRejectedWith(reason) { return originalPromiseReject(reason); } @@ -9553,6 +9552,9 @@ exports.getUserAgent = getUserAgent; // approximation. return originalPromiseThen.call(promise, onFulfilled, onRejected); } + // Bluebird logs a warning when a promise is created within a fulfillment handler, but then isn't returned + // from that handler. To prevent this, return null instead of void from all handlers. + // http://bluebirdjs.com/docs/warning-explanations.html#warning-a-promise-was-created-in-a-handler-but-was-not-returned-from-it function uponPromise(promise, onFulfilled, onRejected) { PerformPromiseThen(PerformPromiseThen(promise, onFulfilled, onRejected), undefined, rethrowAssertionErrorRejection); } @@ -9568,14 +9570,16 @@ exports.getUserAgent = getUserAgent; function setPromiseIsHandledToTrue(promise) { PerformPromiseThen(promise, undefined, rethrowAssertionErrorRejection); } - const queueMicrotask = (() => { - const globalQueueMicrotask = globals && globals.queueMicrotask; - if (typeof globalQueueMicrotask === 'function') { - return globalQueueMicrotask; + let _queueMicrotask = callback => { + if (typeof queueMicrotask === 'function') { + _queueMicrotask = queueMicrotask; } - const resolvedPromise = promiseResolvedWith(undefined); - return (fn) => PerformPromiseThen(resolvedPromise, fn); - })(); + else { + const resolvedPromise = promiseResolvedWith(undefined); + _queueMicrotask = cb => PerformPromiseThen(resolvedPromise, cb); + } + return _queueMicrotask(callback); + }; function reflectCall(F, V, args) { if (typeof F !== 'function') { throw new TypeError('Argument is not a function'); @@ -9699,6 +9703,12 @@ exports.getUserAgent = getUserAgent; } } + const AbortSteps = Symbol('[[AbortSteps]]'); + const ErrorSteps = Symbol('[[ErrorSteps]]'); + const CancelSteps = Symbol('[[CancelSteps]]'); + const PullSteps = Symbol('[[PullSteps]]'); + const ReleaseSteps = Symbol('[[ReleaseSteps]]'); + function ReadableStreamReaderGenericInitialize(reader, stream) { reader._ownerReadableStream = stream; stream._reader = reader; @@ -9719,13 +9729,15 @@ exports.getUserAgent = getUserAgent; return ReadableStreamCancel(stream, reason); } function ReadableStreamReaderGenericRelease(reader) { - if (reader._ownerReadableStream._state === 'readable') { + const stream = reader._ownerReadableStream; + if (stream._state === 'readable') { defaultReaderClosedPromiseReject(reader, new TypeError(`Reader was released and can no longer be used to monitor the stream's closedness`)); } else { defaultReaderClosedPromiseResetToRejected(reader, new TypeError(`Reader was released and can no longer be used to monitor the stream's closedness`)); } - reader._ownerReadableStream._reader = undefined; + stream._readableStreamController[ReleaseSteps](); + stream._reader = undefined; reader._ownerReadableStream = undefined; } // Helper functions for the readers. @@ -9768,11 +9780,6 @@ exports.getUserAgent = getUserAgent; reader._closedPromise_reject = undefined; } - const AbortSteps = SymbolPolyfill('[[AbortSteps]]'); - const ErrorSteps = SymbolPolyfill('[[ErrorSteps]]'); - const CancelSteps = SymbolPolyfill('[[CancelSteps]]'); - const PullSteps = SymbolPolyfill('[[PullSteps]]'); - /// // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite#Polyfill const NumberIsFinite = Number.isFinite || function (x) { @@ -9968,10 +9975,7 @@ exports.getUserAgent = getUserAgent; if (this._ownerReadableStream === undefined) { return; } - if (this._readRequests.length > 0) { - throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled'); - } - ReadableStreamReaderGenericRelease(this); + ReadableStreamDefaultReaderRelease(this); } } Object.defineProperties(ReadableStreamDefaultReader.prototype, { @@ -9980,8 +9984,11 @@ exports.getUserAgent = getUserAgent; releaseLock: { enumerable: true }, closed: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(ReadableStreamDefaultReader.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(ReadableStreamDefaultReader.prototype.cancel, 'cancel'); + setFunctionName(ReadableStreamDefaultReader.prototype.read, 'read'); + setFunctionName(ReadableStreamDefaultReader.prototype.releaseLock, 'releaseLock'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamDefaultReader.prototype, Symbol.toStringTag, { value: 'ReadableStreamDefaultReader', configurable: true }); @@ -10009,6 +10016,18 @@ exports.getUserAgent = getUserAgent; stream._readableStreamController[PullSteps](readRequest); } } + function ReadableStreamDefaultReaderRelease(reader) { + ReadableStreamReaderGenericRelease(reader); + const e = new TypeError('Reader was released'); + ReadableStreamDefaultReaderErrorReadRequests(reader, e); + } + function ReadableStreamDefaultReaderErrorReadRequests(reader, e) { + const readRequests = reader._readRequests; + reader._readRequests = new SimpleQueue(); + readRequests.forEach(readRequest => { + readRequest._errorSteps(e); + }); + } // Helper functions for the ReadableStreamDefaultReader. function defaultReaderBrandCheckException(name) { return new TypeError(`ReadableStreamDefaultReader.prototype.${name} can only be used on a ReadableStreamDefaultReader`); @@ -10044,9 +10063,6 @@ exports.getUserAgent = getUserAgent; return Promise.resolve({ value: undefined, done: true }); } const reader = this._reader; - if (reader._ownerReadableStream === undefined) { - return promiseRejectedWith(readerLockException('iterate')); - } let resolvePromise; let rejectPromise; const promise = newPromise((resolve, reject) => { @@ -10058,7 +10074,7 @@ exports.getUserAgent = getUserAgent; this._ongoingPromise = undefined; // This needs to be delayed by one microtask, otherwise we stop pulling too early which breaks a test. // FIXME Is this a bug in the specification, or in the test? - queueMicrotask(() => resolvePromise({ value: chunk, done: false })); + _queueMicrotask(() => resolvePromise({ value: chunk, done: false })); }, _closeSteps: () => { this._ongoingPromise = undefined; @@ -10082,9 +10098,6 @@ exports.getUserAgent = getUserAgent; } this._isFinished = true; const reader = this._reader; - if (reader._ownerReadableStream === undefined) { - return promiseRejectedWith(readerLockException('finish iterating')); - } if (!this._preventCancel) { const result = ReadableStreamReaderGenericCancel(reader, value); ReadableStreamReaderGenericRelease(reader); @@ -10108,9 +10121,7 @@ exports.getUserAgent = getUserAgent; return this._asyncIteratorImpl.return(value); } }; - if (AsyncIteratorPrototype !== undefined) { - Object.setPrototypeOf(ReadableStreamAsyncIteratorPrototype, AsyncIteratorPrototype); - } + Object.setPrototypeOf(ReadableStreamAsyncIteratorPrototype, AsyncIteratorPrototype); // Abstract operations for the ReadableStream. function AcquireReadableStreamAsyncIterator(stream, preventCancel) { const reader = AcquireReadableStreamDefaultReader(stream); @@ -10147,6 +10158,7 @@ exports.getUserAgent = getUserAgent; return x !== x; }; + var _a, _b, _c; function CreateArrayFromList(elements) { // We use arrays to represent lists, so this is basically a no-op. // Do a slice though just in case we happen to depend on the unique-ness. @@ -10155,15 +10167,29 @@ exports.getUserAgent = getUserAgent; function CopyDataBlockBytes(dest, destOffset, src, srcOffset, n) { new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset); } - // Not implemented correctly - function TransferArrayBuffer(O) { - return O; - } - // Not implemented correctly - // eslint-disable-next-line @typescript-eslint/no-unused-vars - function IsDetachedBuffer(O) { - return false; - } + let TransferArrayBuffer = (O) => { + if (typeof O.transfer === 'function') { + TransferArrayBuffer = buffer => buffer.transfer(); + } + else if (typeof structuredClone === 'function') { + TransferArrayBuffer = buffer => structuredClone(buffer, { transfer: [buffer] }); + } + else { + // Not implemented correctly + TransferArrayBuffer = buffer => buffer; + } + return TransferArrayBuffer(O); + }; + let IsDetachedBuffer = (O) => { + if (typeof O.detached === 'boolean') { + IsDetachedBuffer = buffer => buffer.detached; + } + else { + // Not implemented correctly + IsDetachedBuffer = buffer => buffer.byteLength === 0; + } + return IsDetachedBuffer(O); + }; function ArrayBufferSlice(buffer, begin, end) { // ArrayBuffer.prototype.slice is not available on IE10 // https://www.caniuse.com/mdn-javascript_builtins_arraybuffer_slice @@ -10175,6 +10201,70 @@ exports.getUserAgent = getUserAgent; CopyDataBlockBytes(slice, 0, buffer, begin, length); return slice; } + function GetMethod(receiver, prop) { + const func = receiver[prop]; + if (func === undefined || func === null) { + return undefined; + } + if (typeof func !== 'function') { + throw new TypeError(`${String(prop)} is not a function`); + } + return func; + } + function CreateAsyncFromSyncIterator(syncIteratorRecord) { + // Instead of re-implementing CreateAsyncFromSyncIterator and %AsyncFromSyncIteratorPrototype%, + // we use yield* inside an async generator function to achieve the same result. + // Wrap the sync iterator inside a sync iterable, so we can use it with yield*. + const syncIterable = { + [Symbol.iterator]: () => syncIteratorRecord.iterator + }; + // Create an async generator function and immediately invoke it. + const asyncIterator = (async function* () { + return yield* syncIterable; + }()); + // Return as an async iterator record. + const nextMethod = asyncIterator.next; + return { iterator: asyncIterator, nextMethod, done: false }; + } + // Aligns with core-js/modules/es.symbol.async-iterator.js + const SymbolAsyncIterator = (_c = (_a = Symbol.asyncIterator) !== null && _a !== void 0 ? _a : (_b = Symbol.for) === null || _b === void 0 ? void 0 : _b.call(Symbol, 'Symbol.asyncIterator')) !== null && _c !== void 0 ? _c : '@@asyncIterator'; + function GetIterator(obj, hint = 'sync', method) { + if (method === undefined) { + if (hint === 'async') { + method = GetMethod(obj, SymbolAsyncIterator); + if (method === undefined) { + const syncMethod = GetMethod(obj, Symbol.iterator); + const syncIteratorRecord = GetIterator(obj, 'sync', syncMethod); + return CreateAsyncFromSyncIterator(syncIteratorRecord); + } + } + else { + method = GetMethod(obj, Symbol.iterator); + } + } + if (method === undefined) { + throw new TypeError('The object is not iterable'); + } + const iterator = reflectCall(method, obj, []); + if (!typeIsObject(iterator)) { + throw new TypeError('The iterator method must return an object'); + } + const nextMethod = iterator.next; + return { iterator, nextMethod, done: false }; + } + function IteratorNext(iteratorRecord) { + const result = reflectCall(iteratorRecord.nextMethod, iteratorRecord.iterator, []); + if (!typeIsObject(result)) { + throw new TypeError('The iterator.next() method must return an object'); + } + return result; + } + function IteratorComplete(iterResult) { + return Boolean(iterResult.done); + } + function IteratorValue(iterResult) { + return iterResult.value; + } function IsNonNegativeNumber(v) { if (typeof v !== 'number') { @@ -10217,6 +10307,19 @@ exports.getUserAgent = getUserAgent; container._queueTotalSize = 0; } + function isDataViewConstructor(ctor) { + return ctor === DataView; + } + function isDataView(view) { + return isDataViewConstructor(view.constructor); + } + function arrayBufferViewElementSize(ctor) { + if (isDataViewConstructor(ctor)) { + return 1; + } + return ctor.BYTES_PER_ELEMENT; + } + /** * A pull-into request in a {@link ReadableByteStreamController}. * @@ -10244,7 +10347,9 @@ exports.getUserAgent = getUserAgent; if (this._associatedReadableByteStreamController === undefined) { throw new TypeError('This BYOB request has been invalidated'); } - if (IsDetachedBuffer(this._view.buffer)) ; + if (IsDetachedBuffer(this._view.buffer)) { + throw new TypeError(`The BYOB request's buffer has been detached and so cannot be used as a response`); + } ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten); } respondWithNewView(view) { @@ -10258,7 +10363,9 @@ exports.getUserAgent = getUserAgent; if (this._associatedReadableByteStreamController === undefined) { throw new TypeError('This BYOB request has been invalidated'); } - if (IsDetachedBuffer(view.buffer)) ; + if (IsDetachedBuffer(view.buffer)) { + throw new TypeError('The given view\'s buffer has been detached and so cannot be used as a response'); + } ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view); } } @@ -10267,8 +10374,10 @@ exports.getUserAgent = getUserAgent; respondWithNewView: { enumerable: true }, view: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(ReadableStreamBYOBRequest.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(ReadableStreamBYOBRequest.prototype.respond, 'respond'); + setFunctionName(ReadableStreamBYOBRequest.prototype.respondWithNewView, 'respondWithNewView'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamBYOBRequest.prototype, Symbol.toStringTag, { value: 'ReadableStreamBYOBRequest', configurable: true }); @@ -10362,11 +10471,7 @@ exports.getUserAgent = getUserAgent; [PullSteps](readRequest) { const stream = this._controlledReadableByteStream; if (this._queueTotalSize > 0) { - const entry = this._queue.shift(); - this._queueTotalSize -= entry.byteLength; - ReadableByteStreamControllerHandleQueueDrain(this); - const view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength); - readRequest._chunkSteps(view); + ReadableByteStreamControllerFillReadRequestFromQueue(this, readRequest); return; } const autoAllocateChunkSize = this._autoAllocateChunkSize; @@ -10385,6 +10490,7 @@ exports.getUserAgent = getUserAgent; byteOffset: 0, byteLength: autoAllocateChunkSize, bytesFilled: 0, + minimumFill: 1, elementSize: 1, viewConstructor: Uint8Array, readerType: 'default' @@ -10394,6 +10500,15 @@ exports.getUserAgent = getUserAgent; ReadableStreamAddReadRequest(stream, readRequest); ReadableByteStreamControllerCallPullIfNeeded(this); } + /** @internal */ + [ReleaseSteps]() { + if (this._pendingPullIntos.length > 0) { + const firstPullInto = this._pendingPullIntos.peek(); + firstPullInto.readerType = 'none'; + this._pendingPullIntos = new SimpleQueue(); + this._pendingPullIntos.push(firstPullInto); + } + } } Object.defineProperties(ReadableByteStreamController.prototype, { close: { enumerable: true }, @@ -10402,8 +10517,11 @@ exports.getUserAgent = getUserAgent; byobRequest: { enumerable: true }, desiredSize: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(ReadableByteStreamController.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(ReadableByteStreamController.prototype.close, 'close'); + setFunctionName(ReadableByteStreamController.prototype.enqueue, 'enqueue'); + setFunctionName(ReadableByteStreamController.prototype.error, 'error'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(ReadableByteStreamController.prototype, Symbol.toStringTag, { value: 'ReadableByteStreamController', configurable: true }); @@ -10445,8 +10563,10 @@ exports.getUserAgent = getUserAgent; controller._pullAgain = false; ReadableByteStreamControllerCallPullIfNeeded(controller); } + return null; }, e => { ReadableByteStreamControllerError(controller, e); + return null; }); } function ReadableByteStreamControllerClearPendingPullIntos(controller) { @@ -10475,15 +10595,33 @@ exports.getUserAgent = getUserAgent; controller._queue.push({ buffer, byteOffset, byteLength }); controller._queueTotalSize += byteLength; } + function ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, buffer, byteOffset, byteLength) { + let clonedChunk; + try { + clonedChunk = ArrayBufferSlice(buffer, byteOffset, byteOffset + byteLength); + } + catch (cloneE) { + ReadableByteStreamControllerError(controller, cloneE); + throw cloneE; + } + ReadableByteStreamControllerEnqueueChunkToQueue(controller, clonedChunk, 0, byteLength); + } + function ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, firstDescriptor) { + if (firstDescriptor.bytesFilled > 0) { + ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, firstDescriptor.buffer, firstDescriptor.byteOffset, firstDescriptor.bytesFilled); + } + ReadableByteStreamControllerShiftPendingPullInto(controller); + } function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) { - const elementSize = pullIntoDescriptor.elementSize; - const currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize; const maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled); const maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy; - const maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize; let totalBytesToCopyRemaining = maxBytesToCopy; let ready = false; - if (maxAlignedBytes > currentAlignedBytes) { + const remainderBytes = maxBytesFilled % pullIntoDescriptor.elementSize; + const maxAlignedBytes = maxBytesFilled - remainderBytes; + // A descriptor for a read() request that is not yet filled up to its minimum length will stay at the head + // of the queue, so the underlying source can keep filling it. + if (maxAlignedBytes >= pullIntoDescriptor.minimumFill) { totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled; ready = true; } @@ -10538,25 +10676,37 @@ exports.getUserAgent = getUserAgent; } } } - function ReadableByteStreamControllerPullInto(controller, view, readIntoRequest) { - const stream = controller._controlledReadableByteStream; - let elementSize = 1; - if (view.constructor !== DataView) { - elementSize = view.constructor.BYTES_PER_ELEMENT; + function ReadableByteStreamControllerProcessReadRequestsUsingQueue(controller) { + const reader = controller._controlledReadableByteStream._reader; + while (reader._readRequests.length > 0) { + if (controller._queueTotalSize === 0) { + return; + } + const readRequest = reader._readRequests.shift(); + ReadableByteStreamControllerFillReadRequestFromQueue(controller, readRequest); } + } + function ReadableByteStreamControllerPullInto(controller, view, min, readIntoRequest) { + const stream = controller._controlledReadableByteStream; const ctor = view.constructor; - // try { - const buffer = TransferArrayBuffer(view.buffer); - // } catch (e) { - // readIntoRequest._errorSteps(e); - // return; - // } + const elementSize = arrayBufferViewElementSize(ctor); + const { byteOffset, byteLength } = view; + const minimumFill = min * elementSize; + let buffer; + try { + buffer = TransferArrayBuffer(view.buffer); + } + catch (e) { + readIntoRequest._errorSteps(e); + return; + } const pullIntoDescriptor = { buffer, bufferByteLength: buffer.byteLength, - byteOffset: view.byteOffset, - byteLength: view.byteLength, + byteOffset, + byteLength, bytesFilled: 0, + minimumFill, elementSize, viewConstructor: ctor, readerType: 'byob' @@ -10593,6 +10743,9 @@ exports.getUserAgent = getUserAgent; ReadableByteStreamControllerCallPullIfNeeded(controller); } function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) { + if (firstDescriptor.readerType === 'none') { + ReadableByteStreamControllerShiftPendingPullInto(controller); + } const stream = controller._controlledReadableByteStream; if (ReadableStreamHasBYOBReader(stream)) { while (ReadableStreamGetNumReadIntoRequests(stream) > 0) { @@ -10603,15 +10756,21 @@ exports.getUserAgent = getUserAgent; } function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) { ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor); - if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) { + if (pullIntoDescriptor.readerType === 'none') { + ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, pullIntoDescriptor); + ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); + return; + } + if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.minimumFill) { + // A descriptor for a read() request that is not yet filled up to its minimum length will stay at the head + // of the queue, so the underlying source can keep filling it. return; } ReadableByteStreamControllerShiftPendingPullInto(controller); const remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize; if (remainderSize > 0) { const end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled; - const remainder = ArrayBufferSlice(pullIntoDescriptor.buffer, end - remainderSize, end); - ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength); + ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, pullIntoDescriptor.buffer, end - remainderSize, remainderSize); } pullIntoDescriptor.bytesFilled -= remainderSize; ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableByteStream, pullIntoDescriptor); @@ -10622,7 +10781,7 @@ exports.getUserAgent = getUserAgent; ReadableByteStreamControllerInvalidateBYOBRequest(controller); const state = controller._controlledReadableByteStream._state; if (state === 'closed') { - ReadableByteStreamControllerRespondInClosedState(controller); + ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor); } else { ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor); @@ -10672,7 +10831,7 @@ exports.getUserAgent = getUserAgent; } if (controller._pendingPullIntos.length > 0) { const firstPendingPullInto = controller._pendingPullIntos.peek(); - if (firstPendingPullInto.bytesFilled > 0) { + if (firstPendingPullInto.bytesFilled % firstPendingPullInto.elementSize !== 0) { const e = new TypeError('Insufficient bytes to fill elements in the given buffer'); ReadableByteStreamControllerError(controller, e); throw e; @@ -10686,17 +10845,24 @@ exports.getUserAgent = getUserAgent; if (controller._closeRequested || stream._state !== 'readable') { return; } - const buffer = chunk.buffer; - const byteOffset = chunk.byteOffset; - const byteLength = chunk.byteLength; + const { buffer, byteOffset, byteLength } = chunk; + if (IsDetachedBuffer(buffer)) { + throw new TypeError('chunk\'s buffer is detached and so cannot be enqueued'); + } const transferredBuffer = TransferArrayBuffer(buffer); if (controller._pendingPullIntos.length > 0) { const firstPendingPullInto = controller._pendingPullIntos.peek(); - if (IsDetachedBuffer(firstPendingPullInto.buffer)) ; + if (IsDetachedBuffer(firstPendingPullInto.buffer)) { + throw new TypeError('The BYOB request\'s buffer has been detached and so cannot be filled with an enqueued chunk'); + } + ReadableByteStreamControllerInvalidateBYOBRequest(controller); firstPendingPullInto.buffer = TransferArrayBuffer(firstPendingPullInto.buffer); + if (firstPendingPullInto.readerType === 'none') { + ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, firstPendingPullInto); + } } - ReadableByteStreamControllerInvalidateBYOBRequest(controller); if (ReadableStreamHasDefaultReader(stream)) { + ReadableByteStreamControllerProcessReadRequestsUsingQueue(controller); if (ReadableStreamGetNumReadRequests(stream) === 0) { ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); } @@ -10728,6 +10894,13 @@ exports.getUserAgent = getUserAgent; ReadableByteStreamControllerClearAlgorithms(controller); ReadableStreamError(stream, e); } + function ReadableByteStreamControllerFillReadRequestFromQueue(controller, readRequest) { + const entry = controller._queue.shift(); + controller._queueTotalSize -= entry.byteLength; + ReadableByteStreamControllerHandleQueueDrain(controller); + const view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength); + readRequest._chunkSteps(view); + } function ReadableByteStreamControllerGetBYOBRequest(controller) { if (controller._byobRequest === null && controller._pendingPullIntos.length > 0) { const firstDescriptor = controller._pendingPullIntos.peek(); @@ -10813,24 +10986,35 @@ exports.getUserAgent = getUserAgent; uponPromise(promiseResolvedWith(startResult), () => { controller._started = true; ReadableByteStreamControllerCallPullIfNeeded(controller); + return null; }, r => { ReadableByteStreamControllerError(controller, r); + return null; }); } function SetUpReadableByteStreamControllerFromUnderlyingSource(stream, underlyingByteSource, highWaterMark) { const controller = Object.create(ReadableByteStreamController.prototype); - let startAlgorithm = () => undefined; - let pullAlgorithm = () => promiseResolvedWith(undefined); - let cancelAlgorithm = () => promiseResolvedWith(undefined); + let startAlgorithm; + let pullAlgorithm; + let cancelAlgorithm; if (underlyingByteSource.start !== undefined) { startAlgorithm = () => underlyingByteSource.start(controller); } + else { + startAlgorithm = () => undefined; + } if (underlyingByteSource.pull !== undefined) { pullAlgorithm = () => underlyingByteSource.pull(controller); } + else { + pullAlgorithm = () => promiseResolvedWith(undefined); + } if (underlyingByteSource.cancel !== undefined) { cancelAlgorithm = reason => underlyingByteSource.cancel(reason); } + else { + cancelAlgorithm = () => promiseResolvedWith(undefined); + } const autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize; if (autoAllocateChunkSize === 0) { throw new TypeError('autoAllocateChunkSize must be greater than 0'); @@ -10850,6 +11034,29 @@ exports.getUserAgent = getUserAgent; return new TypeError(`ReadableByteStreamController.prototype.${name} can only be used on a ReadableByteStreamController`); } + function convertReaderOptions(options, context) { + assertDictionary(options, context); + const mode = options === null || options === void 0 ? void 0 : options.mode; + return { + mode: mode === undefined ? undefined : convertReadableStreamReaderMode(mode, `${context} has member 'mode' that`) + }; + } + function convertReadableStreamReaderMode(mode, context) { + mode = `${mode}`; + if (mode !== 'byob') { + throw new TypeError(`${context} '${mode}' is not a valid enumeration value for ReadableStreamReaderMode`); + } + return mode; + } + function convertByobReadOptions(options, context) { + var _a; + assertDictionary(options, context); + const min = (_a = options === null || options === void 0 ? void 0 : options.min) !== null && _a !== void 0 ? _a : 1; + return { + min: convertUnsignedLongLongWithEnforceRange(min, `${context} has member 'min' that`) + }; + } + // Abstract operations for the ReadableStream. function AcquireReadableStreamBYOBReader(stream) { return new ReadableStreamBYOBReader(stream); @@ -10922,12 +11129,7 @@ exports.getUserAgent = getUserAgent; } return ReadableStreamReaderGenericCancel(this, reason); } - /** - * Attempts to reads bytes into view, and returns a promise resolved with the result. - * - * If reading a chunk causes the queue to become empty, more data will be pulled from the underlying source. - */ - read(view) { + read(view, rawOptions = {}) { if (!IsReadableStreamBYOBReader(this)) { return promiseRejectedWith(byobReaderBrandCheckException('read')); } @@ -10940,7 +11142,28 @@ exports.getUserAgent = getUserAgent; if (view.buffer.byteLength === 0) { return promiseRejectedWith(new TypeError(`view's buffer must have non-zero byteLength`)); } - if (IsDetachedBuffer(view.buffer)) ; + if (IsDetachedBuffer(view.buffer)) { + return promiseRejectedWith(new TypeError('view\'s buffer has been detached')); + } + let options; + try { + options = convertByobReadOptions(rawOptions, 'options'); + } + catch (e) { + return promiseRejectedWith(e); + } + const min = options.min; + if (min === 0) { + return promiseRejectedWith(new TypeError('options.min must be greater than 0')); + } + if (!isDataView(view)) { + if (min > view.length) { + return promiseRejectedWith(new RangeError('options.min must be less than or equal to view\'s length')); + } + } + else if (min > view.byteLength) { + return promiseRejectedWith(new RangeError('options.min must be less than or equal to view\'s byteLength')); + } if (this._ownerReadableStream === undefined) { return promiseRejectedWith(readerLockException('read from')); } @@ -10955,7 +11178,7 @@ exports.getUserAgent = getUserAgent; _closeSteps: chunk => resolvePromise({ value: chunk, done: true }), _errorSteps: e => rejectPromise(e) }; - ReadableStreamBYOBReaderRead(this, view, readIntoRequest); + ReadableStreamBYOBReaderRead(this, view, min, readIntoRequest); return promise; } /** @@ -10974,10 +11197,7 @@ exports.getUserAgent = getUserAgent; if (this._ownerReadableStream === undefined) { return; } - if (this._readIntoRequests.length > 0) { - throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled'); - } - ReadableStreamReaderGenericRelease(this); + ReadableStreamBYOBReaderRelease(this); } } Object.defineProperties(ReadableStreamBYOBReader.prototype, { @@ -10986,8 +11206,11 @@ exports.getUserAgent = getUserAgent; releaseLock: { enumerable: true }, closed: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(ReadableStreamBYOBReader.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(ReadableStreamBYOBReader.prototype.cancel, 'cancel'); + setFunctionName(ReadableStreamBYOBReader.prototype.read, 'read'); + setFunctionName(ReadableStreamBYOBReader.prototype.releaseLock, 'releaseLock'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamBYOBReader.prototype, Symbol.toStringTag, { value: 'ReadableStreamBYOBReader', configurable: true }); @@ -11002,16 +11225,28 @@ exports.getUserAgent = getUserAgent; } return x instanceof ReadableStreamBYOBReader; } - function ReadableStreamBYOBReaderRead(reader, view, readIntoRequest) { + function ReadableStreamBYOBReaderRead(reader, view, min, readIntoRequest) { const stream = reader._ownerReadableStream; stream._disturbed = true; if (stream._state === 'errored') { readIntoRequest._errorSteps(stream._storedError); } else { - ReadableByteStreamControllerPullInto(stream._readableStreamController, view, readIntoRequest); + ReadableByteStreamControllerPullInto(stream._readableStreamController, view, min, readIntoRequest); } } + function ReadableStreamBYOBReaderRelease(reader) { + ReadableStreamReaderGenericRelease(reader); + const e = new TypeError('Reader was released'); + ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e); + } + function ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e) { + const readIntoRequests = reader._readIntoRequests; + reader._readIntoRequests = new SimpleQueue(); + readIntoRequests.forEach(readIntoRequest => { + readIntoRequest._errorSteps(e); + }); + } // Helper functions for the ReadableStreamBYOBReader. function byobReaderBrandCheckException(name) { return new TypeError(`ReadableStreamBYOBReader.prototype.${name} can only be used on a ReadableStreamBYOBReader`); @@ -11212,8 +11447,11 @@ exports.getUserAgent = getUserAgent; getWriter: { enumerable: true }, locked: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(WritableStream.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(WritableStream.prototype.abort, 'abort'); + setFunctionName(WritableStream.prototype.close, 'close'); + setFunctionName(WritableStream.prototype.getWriter, 'getWriter'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(WritableStream.prototype, Symbol.toStringTag, { value: 'WritableStream', configurable: true }); @@ -11277,7 +11515,7 @@ exports.getUserAgent = getUserAgent; return promiseResolvedWith(undefined); } stream._writableStreamController._abortReason = reason; - (_a = stream._writableStreamController._abortController) === null || _a === void 0 ? void 0 : _a.abort(); + (_a = stream._writableStreamController._abortController) === null || _a === void 0 ? void 0 : _a.abort(reason); // TypeScript narrows the type of `stream._state` down to 'writable' | 'erroring', // but it doesn't know that signaling abort runs author code that might have changed the state. // Widen the type again by casting to WritableStreamState. @@ -11382,9 +11620,11 @@ exports.getUserAgent = getUserAgent; uponPromise(promise, () => { abortRequest._resolve(); WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); + return null; }, (reason) => { abortRequest._reject(reason); WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); + return null; }); } function WritableStreamFinishInFlightWrite(stream) { @@ -11612,8 +11852,12 @@ exports.getUserAgent = getUserAgent; desiredSize: { enumerable: true }, ready: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(WritableStreamDefaultWriter.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(WritableStreamDefaultWriter.prototype.abort, 'abort'); + setFunctionName(WritableStreamDefaultWriter.prototype.close, 'close'); + setFunctionName(WritableStreamDefaultWriter.prototype.releaseLock, 'releaseLock'); + setFunctionName(WritableStreamDefaultWriter.prototype.write, 'write'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(WritableStreamDefaultWriter.prototype, Symbol.toStringTag, { value: 'WritableStreamDefaultWriter', configurable: true }); @@ -11779,8 +12023,8 @@ exports.getUserAgent = getUserAgent; signal: { enumerable: true }, error: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(WritableStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(WritableStreamDefaultController.prototype, Symbol.toStringTag, { value: 'WritableStreamDefaultController', configurable: true }); @@ -11817,29 +12061,43 @@ exports.getUserAgent = getUserAgent; uponPromise(startPromise, () => { controller._started = true; WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); + return null; }, r => { controller._started = true; WritableStreamDealWithRejection(stream, r); + return null; }); } function SetUpWritableStreamDefaultControllerFromUnderlyingSink(stream, underlyingSink, highWaterMark, sizeAlgorithm) { const controller = Object.create(WritableStreamDefaultController.prototype); - let startAlgorithm = () => undefined; - let writeAlgorithm = () => promiseResolvedWith(undefined); - let closeAlgorithm = () => promiseResolvedWith(undefined); - let abortAlgorithm = () => promiseResolvedWith(undefined); + let startAlgorithm; + let writeAlgorithm; + let closeAlgorithm; + let abortAlgorithm; if (underlyingSink.start !== undefined) { startAlgorithm = () => underlyingSink.start(controller); } + else { + startAlgorithm = () => undefined; + } if (underlyingSink.write !== undefined) { writeAlgorithm = chunk => underlyingSink.write(chunk, controller); } + else { + writeAlgorithm = () => promiseResolvedWith(undefined); + } if (underlyingSink.close !== undefined) { closeAlgorithm = () => underlyingSink.close(); } + else { + closeAlgorithm = () => promiseResolvedWith(undefined); + } if (underlyingSink.abort !== undefined) { abortAlgorithm = reason => underlyingSink.abort(reason); } + else { + abortAlgorithm = () => promiseResolvedWith(undefined); + } SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm); } // ClearAlgorithms may be called twice. Erroring the same stream in multiple ways will often result in redundant calls. @@ -11918,8 +12176,10 @@ exports.getUserAgent = getUserAgent; WritableStreamDefaultControllerClearAlgorithms(controller); uponPromise(sinkClosePromise, () => { WritableStreamFinishInFlightClose(stream); + return null; }, reason => { WritableStreamFinishInFlightCloseWithError(stream, reason); + return null; }); } function WritableStreamDefaultControllerProcessWrite(controller, chunk) { @@ -11935,11 +12195,13 @@ exports.getUserAgent = getUserAgent; WritableStreamUpdateBackpressure(stream, backpressure); } WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); + return null; }, reason => { if (stream._state === 'writable') { WritableStreamDefaultControllerClearAlgorithms(controller); } WritableStreamFinishInFlightWriteWithError(stream, reason); + return null; }); } function WritableStreamDefaultControllerGetBackpressure(controller) { @@ -12046,13 +12308,28 @@ exports.getUserAgent = getUserAgent; } /// - const NativeDOMException = typeof DOMException !== 'undefined' ? DOMException : undefined; + function getGlobals() { + if (typeof globalThis !== 'undefined') { + return globalThis; + } + else if (typeof self !== 'undefined') { + return self; + } + else if (typeof global !== 'undefined') { + return global; + } + return undefined; + } + const globals = getGlobals(); /// function isDOMExceptionConstructor(ctor) { if (!(typeof ctor === 'function' || typeof ctor === 'object')) { return false; } + if (ctor.name !== 'DOMException') { + return false; + } try { new ctor(); return true; @@ -12061,8 +12338,21 @@ exports.getUserAgent = getUserAgent; return false; } } - function createDOMExceptionPolyfill() { - // eslint-disable-next-line no-shadow + /** + * Support: + * - Web browsers + * - Node 18 and higher (https://github.com/nodejs/node/commit/e4b1fb5e6422c1ff151234bb9de792d45dd88d87) + */ + function getFromGlobal() { + const ctor = globals === null || globals === void 0 ? void 0 : globals.DOMException; + return isDOMExceptionConstructor(ctor) ? ctor : undefined; + } + /** + * Support: + * - All platforms + */ + function createPolyfill() { + // eslint-disable-next-line @typescript-eslint/no-shadow const ctor = function DOMException(message, name) { this.message = message || ''; this.name = name || 'Error'; @@ -12070,12 +12360,13 @@ exports.getUserAgent = getUserAgent; Error.captureStackTrace(this, this.constructor); } }; + setFunctionName(ctor, 'DOMException'); ctor.prototype = Object.create(Error.prototype); Object.defineProperty(ctor.prototype, 'constructor', { value: ctor, writable: true, configurable: true }); return ctor; } - // eslint-disable-next-line no-redeclare - const DOMException$1 = isDOMExceptionConstructor(NativeDOMException) ? NativeDOMException : createDOMExceptionPolyfill(); + // eslint-disable-next-line @typescript-eslint/no-redeclare + const DOMException = getFromGlobal() || createPolyfill(); function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventCancel, signal) { const reader = AcquireReadableStreamDefaultReader(source); @@ -12088,7 +12379,7 @@ exports.getUserAgent = getUserAgent; let abortAlgorithm; if (signal !== undefined) { abortAlgorithm = () => { - const error = new DOMException$1('Aborted', 'AbortError'); + const error = signal.reason !== undefined ? signal.reason : new DOMException('Aborted', 'AbortError'); const actions = []; if (!preventAbort) { actions.push(() => { @@ -12157,6 +12448,7 @@ exports.getUserAgent = getUserAgent; else { shutdown(true, storedError); } + return null; }); // Errors must be propagated backward isOrBecomesErrored(dest, writer._closedPromise, storedError => { @@ -12166,6 +12458,7 @@ exports.getUserAgent = getUserAgent; else { shutdown(true, storedError); } + return null; }); // Closing must be propagated forward isOrBecomesClosed(source, reader._closedPromise, () => { @@ -12175,6 +12468,7 @@ exports.getUserAgent = getUserAgent; else { shutdown(); } + return null; }); // Closing must be propagated backward if (WritableStreamCloseQueuedOrInFlight(dest) || dest._state === 'closed') { @@ -12222,6 +12516,7 @@ exports.getUserAgent = getUserAgent; } function doTheRest() { uponPromise(action(), () => finalize(originalIsError, originalError), newError => finalize(true, newError)); + return null; } } function shutdown(isError, error) { @@ -12248,6 +12543,7 @@ exports.getUserAgent = getUserAgent; else { resolve(undefined); } + return null; } }); } @@ -12328,6 +12624,10 @@ exports.getUserAgent = getUserAgent; ReadableStreamDefaultControllerCallPullIfNeeded(this); } } + /** @internal */ + [ReleaseSteps]() { + // Do nothing. + } } Object.defineProperties(ReadableStreamDefaultController.prototype, { close: { enumerable: true }, @@ -12335,8 +12635,11 @@ exports.getUserAgent = getUserAgent; error: { enumerable: true }, desiredSize: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(ReadableStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(ReadableStreamDefaultController.prototype.close, 'close'); + setFunctionName(ReadableStreamDefaultController.prototype.enqueue, 'enqueue'); + setFunctionName(ReadableStreamDefaultController.prototype.error, 'error'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamDefaultController.prototype, Symbol.toStringTag, { value: 'ReadableStreamDefaultController', configurable: true }); @@ -12368,8 +12671,10 @@ exports.getUserAgent = getUserAgent; controller._pullAgain = false; ReadableStreamDefaultControllerCallPullIfNeeded(controller); } + return null; }, e => { ReadableStreamDefaultControllerError(controller, e); + return null; }); } function ReadableStreamDefaultControllerShouldCallPull(controller) { @@ -12484,24 +12789,35 @@ exports.getUserAgent = getUserAgent; uponPromise(promiseResolvedWith(startResult), () => { controller._started = true; ReadableStreamDefaultControllerCallPullIfNeeded(controller); + return null; }, r => { ReadableStreamDefaultControllerError(controller, r); + return null; }); } function SetUpReadableStreamDefaultControllerFromUnderlyingSource(stream, underlyingSource, highWaterMark, sizeAlgorithm) { const controller = Object.create(ReadableStreamDefaultController.prototype); - let startAlgorithm = () => undefined; - let pullAlgorithm = () => promiseResolvedWith(undefined); - let cancelAlgorithm = () => promiseResolvedWith(undefined); + let startAlgorithm; + let pullAlgorithm; + let cancelAlgorithm; if (underlyingSource.start !== undefined) { startAlgorithm = () => underlyingSource.start(controller); } + else { + startAlgorithm = () => undefined; + } if (underlyingSource.pull !== undefined) { pullAlgorithm = () => underlyingSource.pull(controller); } + else { + pullAlgorithm = () => promiseResolvedWith(undefined); + } if (underlyingSource.cancel !== undefined) { cancelAlgorithm = reason => underlyingSource.cancel(reason); } + else { + cancelAlgorithm = () => promiseResolvedWith(undefined); + } SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm); } // Helper functions for the ReadableStreamDefaultController. @@ -12540,7 +12856,7 @@ exports.getUserAgent = getUserAgent; // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let // successful synchronously-available reads get ahead of asynchronously-available errors. - queueMicrotask(() => { + _queueMicrotask(() => { readAgain = false; const chunk1 = chunk; const chunk2 = chunk; @@ -12611,6 +12927,7 @@ exports.getUserAgent = getUserAgent; if (!canceled1 || !canceled2) { resolveCancelPromise(undefined); } + return null; }); return [branch1, branch2]; } @@ -12632,13 +12949,14 @@ exports.getUserAgent = getUserAgent; function forwardReaderError(thisReader) { uponRejection(thisReader._closedPromise, r => { if (thisReader !== reader) { - return; + return null; } ReadableByteStreamControllerError(branch1._readableStreamController, r); ReadableByteStreamControllerError(branch2._readableStreamController, r); if (!canceled1 || !canceled2) { resolveCancelPromise(undefined); } + return null; }); } function pullWithDefaultReader() { @@ -12652,7 +12970,7 @@ exports.getUserAgent = getUserAgent; // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let // successful synchronously-available reads get ahead of asynchronously-available errors. - queueMicrotask(() => { + _queueMicrotask(() => { readAgainForBranch1 = false; readAgainForBranch2 = false; const chunk1 = chunk; @@ -12720,7 +13038,7 @@ exports.getUserAgent = getUserAgent; // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let // successful synchronously-available reads get ahead of asynchronously-available errors. - queueMicrotask(() => { + _queueMicrotask(() => { readAgainForBranch1 = false; readAgainForBranch2 = false; const byobCanceled = forBranch2 ? canceled2 : canceled1; @@ -12779,7 +13097,7 @@ exports.getUserAgent = getUserAgent; reading = false; } }; - ReadableStreamBYOBReaderRead(reader, view, readIntoRequest); + ReadableStreamBYOBReaderRead(reader, view, 1, readIntoRequest); } function pull1Algorithm() { if (reading) { @@ -12840,6 +13158,109 @@ exports.getUserAgent = getUserAgent; return [branch1, branch2]; } + function isReadableStreamLike(stream) { + return typeIsObject(stream) && typeof stream.getReader !== 'undefined'; + } + + function ReadableStreamFrom(source) { + if (isReadableStreamLike(source)) { + return ReadableStreamFromDefaultReader(source.getReader()); + } + return ReadableStreamFromIterable(source); + } + function ReadableStreamFromIterable(asyncIterable) { + let stream; + const iteratorRecord = GetIterator(asyncIterable, 'async'); + const startAlgorithm = noop; + function pullAlgorithm() { + let nextResult; + try { + nextResult = IteratorNext(iteratorRecord); + } + catch (e) { + return promiseRejectedWith(e); + } + const nextPromise = promiseResolvedWith(nextResult); + return transformPromiseWith(nextPromise, iterResult => { + if (!typeIsObject(iterResult)) { + throw new TypeError('The promise returned by the iterator.next() method must fulfill with an object'); + } + const done = IteratorComplete(iterResult); + if (done) { + ReadableStreamDefaultControllerClose(stream._readableStreamController); + } + else { + const value = IteratorValue(iterResult); + ReadableStreamDefaultControllerEnqueue(stream._readableStreamController, value); + } + }); + } + function cancelAlgorithm(reason) { + const iterator = iteratorRecord.iterator; + let returnMethod; + try { + returnMethod = GetMethod(iterator, 'return'); + } + catch (e) { + return promiseRejectedWith(e); + } + if (returnMethod === undefined) { + return promiseResolvedWith(undefined); + } + let returnResult; + try { + returnResult = reflectCall(returnMethod, iterator, [reason]); + } + catch (e) { + return promiseRejectedWith(e); + } + const returnPromise = promiseResolvedWith(returnResult); + return transformPromiseWith(returnPromise, iterResult => { + if (!typeIsObject(iterResult)) { + throw new TypeError('The promise returned by the iterator.return() method must fulfill with an object'); + } + return undefined; + }); + } + stream = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, 0); + return stream; + } + function ReadableStreamFromDefaultReader(reader) { + let stream; + const startAlgorithm = noop; + function pullAlgorithm() { + let readPromise; + try { + readPromise = reader.read(); + } + catch (e) { + return promiseRejectedWith(e); + } + return transformPromiseWith(readPromise, readResult => { + if (!typeIsObject(readResult)) { + throw new TypeError('The promise returned by the reader.read() method must fulfill with an object'); + } + if (readResult.done) { + ReadableStreamDefaultControllerClose(stream._readableStreamController); + } + else { + const value = readResult.value; + ReadableStreamDefaultControllerEnqueue(stream._readableStreamController, value); + } + }); + } + function cancelAlgorithm(reason) { + try { + return promiseResolvedWith(reader.cancel(reason)); + } + catch (e) { + return promiseRejectedWith(e); + } + } + stream = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, 0); + return stream; + } + function convertUnderlyingDefaultOrByteSource(source, context) { assertDictionary(source, context); const original = source; @@ -12884,21 +13305,6 @@ exports.getUserAgent = getUserAgent; return type; } - function convertReaderOptions(options, context) { - assertDictionary(options, context); - const mode = options === null || options === void 0 ? void 0 : options.mode; - return { - mode: mode === undefined ? undefined : convertReadableStreamReaderMode(mode, `${context} has member 'mode' that`) - }; - } - function convertReadableStreamReaderMode(mode, context) { - mode = `${mode}`; - if (mode !== 'byob') { - throw new TypeError(`${context} '${mode}' is not a valid enumeration value for ReadableStreamReaderMode`); - } - return mode; - } - function convertIteratorOptions(options, context) { assertDictionary(options, context); const preventCancel = options === null || options === void 0 ? void 0 : options.preventCancel; @@ -13068,7 +13474,23 @@ exports.getUserAgent = getUserAgent; const options = convertIteratorOptions(rawOptions, 'First parameter'); return AcquireReadableStreamAsyncIterator(this, options.preventCancel); } + [SymbolAsyncIterator](options) { + // Stub implementation, overridden below + return this.values(options); + } + /** + * Creates a new ReadableStream wrapping the provided iterable or async iterable. + * + * This can be used to adapt various kinds of objects into a readable stream, + * such as an array, an async generator, or a Node.js readable stream. + */ + static from(asyncIterable) { + return ReadableStreamFrom(asyncIterable); + } } + Object.defineProperties(ReadableStream, { + from: { enumerable: true } + }); Object.defineProperties(ReadableStream.prototype, { cancel: { enumerable: true }, getReader: { enumerable: true }, @@ -13078,19 +13500,24 @@ exports.getUserAgent = getUserAgent; values: { enumerable: true }, locked: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(ReadableStream.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(ReadableStream.from, 'from'); + setFunctionName(ReadableStream.prototype.cancel, 'cancel'); + setFunctionName(ReadableStream.prototype.getReader, 'getReader'); + setFunctionName(ReadableStream.prototype.pipeThrough, 'pipeThrough'); + setFunctionName(ReadableStream.prototype.pipeTo, 'pipeTo'); + setFunctionName(ReadableStream.prototype.tee, 'tee'); + setFunctionName(ReadableStream.prototype.values, 'values'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(ReadableStream.prototype, Symbol.toStringTag, { value: 'ReadableStream', configurable: true }); } - if (typeof SymbolPolyfill.asyncIterator === 'symbol') { - Object.defineProperty(ReadableStream.prototype, SymbolPolyfill.asyncIterator, { - value: ReadableStream.prototype.values, - writable: true, - configurable: true - }); - } + Object.defineProperty(ReadableStream.prototype, SymbolAsyncIterator, { + value: ReadableStream.prototype.values, + writable: true, + configurable: true + }); // Abstract operations for the ReadableStream. // Throws if and only if startAlgorithm throws. function CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark = 1, sizeAlgorithm = () => 1) { @@ -13141,10 +13568,11 @@ exports.getUserAgent = getUserAgent; ReadableStreamClose(stream); const reader = stream._reader; if (reader !== undefined && IsReadableStreamBYOBReader(reader)) { - reader._readIntoRequests.forEach(readIntoRequest => { + const readIntoRequests = reader._readIntoRequests; + reader._readIntoRequests = new SimpleQueue(); + readIntoRequests.forEach(readIntoRequest => { readIntoRequest._closeSteps(undefined); }); - reader._readIntoRequests = new SimpleQueue(); } const sourceCancelPromise = stream._readableStreamController[CancelSteps](reason); return transformPromiseWith(sourceCancelPromise, noop); @@ -13157,10 +13585,11 @@ exports.getUserAgent = getUserAgent; } defaultReaderClosedPromiseResolve(reader); if (IsReadableStreamDefaultReader(reader)) { - reader._readRequests.forEach(readRequest => { + const readRequests = reader._readRequests; + reader._readRequests = new SimpleQueue(); + readRequests.forEach(readRequest => { readRequest._closeSteps(); }); - reader._readRequests = new SimpleQueue(); } } function ReadableStreamError(stream, e) { @@ -13172,16 +13601,10 @@ exports.getUserAgent = getUserAgent; } defaultReaderClosedPromiseReject(reader, e); if (IsReadableStreamDefaultReader(reader)) { - reader._readRequests.forEach(readRequest => { - readRequest._errorSteps(e); - }); - reader._readRequests = new SimpleQueue(); + ReadableStreamDefaultReaderErrorReadRequests(reader, e); } else { - reader._readIntoRequests.forEach(readIntoRequest => { - readIntoRequest._errorSteps(e); - }); - reader._readIntoRequests = new SimpleQueue(); + ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e); } } // Helper functions for the ReadableStream. @@ -13202,16 +13625,7 @@ exports.getUserAgent = getUserAgent; const byteLengthSizeFunction = (chunk) => { return chunk.byteLength; }; - try { - Object.defineProperty(byteLengthSizeFunction, 'name', { - value: 'size', - configurable: true - }); - } - catch (_a) { - // This property is non-configurable in older browsers, so ignore if this throws. - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility - } + setFunctionName(byteLengthSizeFunction, 'size'); /** * A queuing strategy that counts the number of bytes in each chunk. * @@ -13246,8 +13660,8 @@ exports.getUserAgent = getUserAgent; highWaterMark: { enumerable: true }, size: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(ByteLengthQueuingStrategy.prototype, SymbolPolyfill.toStringTag, { + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(ByteLengthQueuingStrategy.prototype, Symbol.toStringTag, { value: 'ByteLengthQueuingStrategy', configurable: true }); @@ -13270,16 +13684,7 @@ exports.getUserAgent = getUserAgent; const countSizeFunction = () => { return 1; }; - try { - Object.defineProperty(countSizeFunction, 'name', { - value: 'size', - configurable: true - }); - } - catch (_a) { - // This property is non-configurable in older browsers, so ignore if this throws. - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility - } + setFunctionName(countSizeFunction, 'size'); /** * A queuing strategy that counts the number of chunks. * @@ -13315,8 +13720,8 @@ exports.getUserAgent = getUserAgent; highWaterMark: { enumerable: true }, size: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(CountQueuingStrategy.prototype, SymbolPolyfill.toStringTag, { + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(CountQueuingStrategy.prototype, Symbol.toStringTag, { value: 'CountQueuingStrategy', configurable: true }); @@ -13337,12 +13742,16 @@ exports.getUserAgent = getUserAgent; function convertTransformer(original, context) { assertDictionary(original, context); + const cancel = original === null || original === void 0 ? void 0 : original.cancel; const flush = original === null || original === void 0 ? void 0 : original.flush; const readableType = original === null || original === void 0 ? void 0 : original.readableType; const start = original === null || original === void 0 ? void 0 : original.start; const transform = original === null || original === void 0 ? void 0 : original.transform; const writableType = original === null || original === void 0 ? void 0 : original.writableType; return { + cancel: cancel === undefined ? + undefined : + convertTransformerCancelCallback(cancel, original, `${context} has member 'cancel' that`), flush: flush === undefined ? undefined : convertTransformerFlushCallback(flush, original, `${context} has member 'flush' that`), @@ -13368,6 +13777,10 @@ exports.getUserAgent = getUserAgent; assertFunction(fn, context); return (chunk, controller) => promiseCall(fn, original, [chunk, controller]); } + function convertTransformerCancelCallback(fn, original, context) { + assertFunction(fn, context); + return (reason) => promiseCall(fn, original, [reason]); + } // Class TransformStream /** @@ -13432,8 +13845,8 @@ exports.getUserAgent = getUserAgent; readable: { enumerable: true }, writable: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(TransformStream.prototype, SymbolPolyfill.toStringTag, { + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(TransformStream.prototype, Symbol.toStringTag, { value: 'TransformStream', configurable: true }); @@ -13456,8 +13869,7 @@ exports.getUserAgent = getUserAgent; return TransformStreamDefaultSourcePullAlgorithm(stream); } function cancelAlgorithm(reason) { - TransformStreamErrorWritableAndUnblockWrite(stream, reason); - return promiseResolvedWith(undefined); + return TransformStreamDefaultSourceCancelAlgorithm(stream, reason); } stream._readable = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, readableHighWaterMark, readableSizeAlgorithm); // The [[backpressure]] slot is set to undefined so that it can be initialised by TransformStreamSetBackpressure. @@ -13484,6 +13896,9 @@ exports.getUserAgent = getUserAgent; function TransformStreamErrorWritableAndUnblockWrite(stream, e) { TransformStreamDefaultControllerClearAlgorithms(stream._transformStreamController); WritableStreamDefaultControllerErrorIfNeeded(stream._writable._writableStreamController, e); + TransformStreamUnblockWrite(stream); + } + function TransformStreamUnblockWrite(stream) { if (stream._backpressure) { // Pretend that pull() was called to permit any pending write() calls to complete. TransformStreamSetBackpressure() // cannot be called from enqueue() or pull() once the ReadableStream is errored, so this will will be the final time @@ -13554,8 +13969,11 @@ exports.getUserAgent = getUserAgent; terminate: { enumerable: true }, desiredSize: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(TransformStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(TransformStreamDefaultController.prototype.enqueue, 'enqueue'); + setFunctionName(TransformStreamDefaultController.prototype.error, 'error'); + setFunctionName(TransformStreamDefaultController.prototype.terminate, 'terminate'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(TransformStreamDefaultController.prototype, Symbol.toStringTag, { value: 'TransformStreamDefaultController', configurable: true }); @@ -13570,35 +13988,53 @@ exports.getUserAgent = getUserAgent; } return x instanceof TransformStreamDefaultController; } - function SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm) { + function SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm, cancelAlgorithm) { controller._controlledTransformStream = stream; stream._transformStreamController = controller; controller._transformAlgorithm = transformAlgorithm; controller._flushAlgorithm = flushAlgorithm; + controller._cancelAlgorithm = cancelAlgorithm; + controller._finishPromise = undefined; + controller._finishPromise_resolve = undefined; + controller._finishPromise_reject = undefined; } function SetUpTransformStreamDefaultControllerFromTransformer(stream, transformer) { const controller = Object.create(TransformStreamDefaultController.prototype); - let transformAlgorithm = (chunk) => { - try { - TransformStreamDefaultControllerEnqueue(controller, chunk); - return promiseResolvedWith(undefined); - } - catch (transformResultE) { - return promiseRejectedWith(transformResultE); - } - }; - let flushAlgorithm = () => promiseResolvedWith(undefined); + let transformAlgorithm; + let flushAlgorithm; + let cancelAlgorithm; if (transformer.transform !== undefined) { transformAlgorithm = chunk => transformer.transform(chunk, controller); } + else { + transformAlgorithm = chunk => { + try { + TransformStreamDefaultControllerEnqueue(controller, chunk); + return promiseResolvedWith(undefined); + } + catch (transformResultE) { + return promiseRejectedWith(transformResultE); + } + }; + } if (transformer.flush !== undefined) { flushAlgorithm = () => transformer.flush(controller); } - SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm); + else { + flushAlgorithm = () => promiseResolvedWith(undefined); + } + if (transformer.cancel !== undefined) { + cancelAlgorithm = reason => transformer.cancel(reason); + } + else { + cancelAlgorithm = () => promiseResolvedWith(undefined); + } + SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm, cancelAlgorithm); } function TransformStreamDefaultControllerClearAlgorithms(controller) { controller._transformAlgorithm = undefined; controller._flushAlgorithm = undefined; + controller._cancelAlgorithm = undefined; } function TransformStreamDefaultControllerEnqueue(controller, chunk) { const stream = controller._controlledTransformStream; @@ -13655,27 +14091,66 @@ exports.getUserAgent = getUserAgent; return TransformStreamDefaultControllerPerformTransform(controller, chunk); } function TransformStreamDefaultSinkAbortAlgorithm(stream, reason) { - // abort() is not called synchronously, so it is possible for abort() to be called when the stream is already - // errored. - TransformStreamError(stream, reason); - return promiseResolvedWith(undefined); + const controller = stream._transformStreamController; + if (controller._finishPromise !== undefined) { + return controller._finishPromise; + } + // stream._readable cannot change after construction, so caching it across a call to user code is safe. + const readable = stream._readable; + // Assign the _finishPromise now so that if _cancelAlgorithm calls readable.cancel() internally, + // we don't run the _cancelAlgorithm again. + controller._finishPromise = newPromise((resolve, reject) => { + controller._finishPromise_resolve = resolve; + controller._finishPromise_reject = reject; + }); + const cancelPromise = controller._cancelAlgorithm(reason); + TransformStreamDefaultControllerClearAlgorithms(controller); + uponPromise(cancelPromise, () => { + if (readable._state === 'errored') { + defaultControllerFinishPromiseReject(controller, readable._storedError); + } + else { + ReadableStreamDefaultControllerError(readable._readableStreamController, reason); + defaultControllerFinishPromiseResolve(controller); + } + return null; + }, r => { + ReadableStreamDefaultControllerError(readable._readableStreamController, r); + defaultControllerFinishPromiseReject(controller, r); + return null; + }); + return controller._finishPromise; } function TransformStreamDefaultSinkCloseAlgorithm(stream) { + const controller = stream._transformStreamController; + if (controller._finishPromise !== undefined) { + return controller._finishPromise; + } // stream._readable cannot change after construction, so caching it across a call to user code is safe. const readable = stream._readable; - const controller = stream._transformStreamController; + // Assign the _finishPromise now so that if _flushAlgorithm calls readable.cancel() internally, + // we don't also run the _cancelAlgorithm. + controller._finishPromise = newPromise((resolve, reject) => { + controller._finishPromise_resolve = resolve; + controller._finishPromise_reject = reject; + }); const flushPromise = controller._flushAlgorithm(); TransformStreamDefaultControllerClearAlgorithms(controller); - // Return a promise that is fulfilled with undefined on success. - return transformPromiseWith(flushPromise, () => { + uponPromise(flushPromise, () => { if (readable._state === 'errored') { - throw readable._storedError; + defaultControllerFinishPromiseReject(controller, readable._storedError); } - ReadableStreamDefaultControllerClose(readable._readableStreamController); + else { + ReadableStreamDefaultControllerClose(readable._readableStreamController); + defaultControllerFinishPromiseResolve(controller); + } + return null; }, r => { - TransformStreamError(stream, r); - throw readable._storedError; + ReadableStreamDefaultControllerError(readable._readableStreamController, r); + defaultControllerFinishPromiseReject(controller, r); + return null; }); + return controller._finishPromise; } // TransformStreamDefaultSource Algorithms function TransformStreamDefaultSourcePullAlgorithm(stream) { @@ -13684,10 +14159,61 @@ exports.getUserAgent = getUserAgent; // Prevent the next pull() call until there is backpressure. return stream._backpressureChangePromise; } + function TransformStreamDefaultSourceCancelAlgorithm(stream, reason) { + const controller = stream._transformStreamController; + if (controller._finishPromise !== undefined) { + return controller._finishPromise; + } + // stream._writable cannot change after construction, so caching it across a call to user code is safe. + const writable = stream._writable; + // Assign the _finishPromise now so that if _flushAlgorithm calls writable.abort() or + // writable.cancel() internally, we don't run the _cancelAlgorithm again, or also run the + // _flushAlgorithm. + controller._finishPromise = newPromise((resolve, reject) => { + controller._finishPromise_resolve = resolve; + controller._finishPromise_reject = reject; + }); + const cancelPromise = controller._cancelAlgorithm(reason); + TransformStreamDefaultControllerClearAlgorithms(controller); + uponPromise(cancelPromise, () => { + if (writable._state === 'errored') { + defaultControllerFinishPromiseReject(controller, writable._storedError); + } + else { + WritableStreamDefaultControllerErrorIfNeeded(writable._writableStreamController, reason); + TransformStreamUnblockWrite(stream); + defaultControllerFinishPromiseResolve(controller); + } + return null; + }, r => { + WritableStreamDefaultControllerErrorIfNeeded(writable._writableStreamController, r); + TransformStreamUnblockWrite(stream); + defaultControllerFinishPromiseReject(controller, r); + return null; + }); + return controller._finishPromise; + } // Helper functions for the TransformStreamDefaultController. function defaultControllerBrandCheckException(name) { return new TypeError(`TransformStreamDefaultController.prototype.${name} can only be used on a TransformStreamDefaultController`); } + function defaultControllerFinishPromiseResolve(controller) { + if (controller._finishPromise_resolve === undefined) { + return; + } + controller._finishPromise_resolve(); + controller._finishPromise_resolve = undefined; + controller._finishPromise_reject = undefined; + } + function defaultControllerFinishPromiseReject(controller, reason) { + if (controller._finishPromise_reject === undefined) { + return; + } + setPromiseIsHandledToTrue(controller._finishPromise); + controller._finishPromise_reject(reason); + controller._finishPromise_resolve = undefined; + controller._finishPromise_reject = undefined; + } // Helper functions for the TransformStream. function streamBrandCheckException(name) { return new TypeError(`TransformStream.prototype.${name} can only be used on a TransformStream`); @@ -13707,9 +14233,7 @@ exports.getUserAgent = getUserAgent; exports.WritableStreamDefaultController = WritableStreamDefaultController; exports.WritableStreamDefaultWriter = WritableStreamDefaultWriter; - Object.defineProperty(exports, '__esModule', { value: true }); - -}))); +})); //# sourceMappingURL=ponyfill.es2018.js.map @@ -13767,11 +14291,9 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); const github_1 = __nccwpck_require__(5438); const openai_1 = __importDefault(__nccwpck_require__(47)); const CONST_1 = __importDefault(__nccwpck_require__(9873)); -// @ts-ignore - process is not imported const OpenAI = new openai_1.default({ apiKey: process.env.OPENAI_API_KEY }); async function processIssueComment(octokit) { const payload = github_1.context.payload; - // @ts-ignore - process is not imported const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; // check if the issue is open and the has labels if (payload.issue?.state !== 'open' && !payload.issue?.labels.some((issueLabel) => issueLabel.name === CONST_1.default.LABELS.HELP_WANTED)) { @@ -13785,6 +14307,7 @@ async function processIssueComment(octokit) { const content = `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment?.body}`; // create thread with first user message and run it const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ + /* eslint-disable @typescript-eslint/naming-convention */ assistant_id: OPENAI_ASSISTANT_ID ?? '', thread: { messages: [{ role: 'user', content }] }, }); @@ -13794,9 +14317,9 @@ async function processIssueComment(octokit) { const intervalID = setInterval(() => { OpenAI.beta.threads.runs .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) - .then((run) => { + .then((threadRun) => { // return if run is not completed - if (run.status !== 'completed') { + if (threadRun.status !== 'completed') { return; } // get assistant response @@ -13805,8 +14328,7 @@ async function processIssueComment(octokit) { .then((threadMessages) => { // list thread messages content threadMessages.data.forEach((message, index) => { - // @ts-ignore - we do have text value in content[0] but typescript doesn't know that - // this is a 'openai' package type issue + // @ts-expect-error - we do have `text` in content[0] but typescript doesn't know that this is an 'openai' package type issue let assistantResponse = message.content?.[index]?.text?.value; console.log('issue_comment.created - assistantResponse', assistantResponse); if (!assistantResponse) { @@ -13839,9 +14361,10 @@ async function processIssueComment(octokit) { assistantResponse = assistantResponse.replace('"', ''); // create a comment with the assistant's response console.log('issue_comment.created - proposal-police posts comment'); - return octokit.issues.createComment({ + octokit.issues.createComment({ ...github_1.context.repo, - issue_number: payload.issue?.number, + /* eslint-disable @typescript-eslint/naming-convention */ + issue_number: payload.issue?.number ?? -1, body: assistantResponse, }); }); @@ -13858,13 +14381,12 @@ async function processIssueComment(octokit) { } // Main function to process the workflow event async function run() { - // @ts-ignore - process is not imported + // @ts-expect-error - process is not imported const octokit = (0, github_1.getOctokit)(process.env.GITHUB_TOKEN); await processIssueComment(octokit); } run().catch((error) => { console.error(error); - // @ts-ignore - process is not imported process.exit(1); }); diff --git a/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts b/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts index 9e3598a27e3c..699236693512 100644 --- a/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts +++ b/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts @@ -3,12 +3,10 @@ import InitOpenAI from 'openai'; import CONST from '@github/libs/CONST'; import type {GitHubType} from '@github/libs/GithubUtils'; -// @ts-ignore - process is not imported const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); async function processIssueComment(octokit: InstanceType) { const payload = context.payload; - // @ts-ignore - process is not imported const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; // check if the issue is open and the has labels @@ -26,6 +24,7 @@ async function processIssueComment(octokit: InstanceType) { // create thread with first user message and run it const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ + /* eslint-disable @typescript-eslint/naming-convention */ assistant_id: OPENAI_ASSISTANT_ID ?? '', thread: {messages: [{role: 'user', content}]}, }); @@ -36,9 +35,9 @@ async function processIssueComment(octokit: InstanceType) { const intervalID = setInterval(() => { OpenAI.beta.threads.runs .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) - .then((run) => { + .then((threadRun) => { // return if run is not completed - if (run.status !== 'completed') { + if (threadRun.status !== 'completed') { return; } @@ -48,8 +47,7 @@ async function processIssueComment(octokit: InstanceType) { .then((threadMessages) => { // list thread messages content threadMessages.data.forEach((message, index) => { - // @ts-ignore - we do have text value in content[0] but typescript doesn't know that - // this is a 'openai' package type issue + // @ts-expect-error - we do have `text` in content[0] but typescript doesn't know that this is an 'openai' package type issue let assistantResponse = message.content?.[index]?.text?.value; console.log('issue_comment.created - assistantResponse', assistantResponse); @@ -86,9 +84,10 @@ async function processIssueComment(octokit: InstanceType) { assistantResponse = assistantResponse.replace('"', ''); // create a comment with the assistant's response console.log('issue_comment.created - proposal-police posts comment'); - return octokit.issues.createComment({ + octokit.issues.createComment({ ...context.repo, - issue_number: payload.issue?.number as number, + /* eslint-disable @typescript-eslint/naming-convention */ + issue_number: payload.issue?.number ?? -1, body: assistantResponse, }); }); @@ -108,13 +107,12 @@ async function processIssueComment(octokit: InstanceType) { // Main function to process the workflow event async function run() { - // @ts-ignore - process is not imported + // @ts-expect-error - process is not imported const octokit: InstanceType = getOctokit(process.env.GITHUB_TOKEN); await processIssueComment(octokit); } run().catch((error) => { console.error(error); - // @ts-ignore - process is not imported process.exit(1); }); diff --git a/.github/actions/javascript/proposalPoliceCommentEdit/index.js b/.github/actions/javascript/proposalPoliceCommentEdit/index.js index 2c65cd10b755..b781643678a7 100644 --- a/.github/actions/javascript/proposalPoliceCommentEdit/index.js +++ b/.github/actions/javascript/proposalPoliceCommentEdit/index.js @@ -9500,51 +9500,50 @@ exports.getUserAgent = getUserAgent; /***/ (function(__unused_webpack_module, exports) { /** - * web-streams-polyfill v3.2.1 + * @license + * web-streams-polyfill v3.3.3 + * Copyright 2024 Mattias Buelens, Diwank Singh Tomer and other contributors. + * This code is released under the MIT license. + * SPDX-License-Identifier: MIT */ (function (global, factory) { true ? factory(exports) : 0; -}(this, (function (exports) { 'use strict'; +})(this, (function (exports) { 'use strict'; - /// - const SymbolPolyfill = typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol' ? - Symbol : - description => `Symbol(${description})`; - - /// function noop() { return undefined; } - function getGlobals() { - if (typeof self !== 'undefined') { - return self; - } - else if (typeof window !== 'undefined') { - return window; - } - else if (typeof global !== 'undefined') { - return global; - } - return undefined; - } - const globals = getGlobals(); function typeIsObject(x) { return (typeof x === 'object' && x !== null) || typeof x === 'function'; } const rethrowAssertionErrorRejection = noop; + function setFunctionName(fn, name) { + try { + Object.defineProperty(fn, 'name', { + value: name, + configurable: true + }); + } + catch (_a) { + // This property is non-configurable in older browsers, so ignore if this throws. + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility + } + } const originalPromise = Promise; const originalPromiseThen = Promise.prototype.then; - const originalPromiseResolve = Promise.resolve.bind(originalPromise); const originalPromiseReject = Promise.reject.bind(originalPromise); + // https://webidl.spec.whatwg.org/#a-new-promise function newPromise(executor) { return new originalPromise(executor); } + // https://webidl.spec.whatwg.org/#a-promise-resolved-with function promiseResolvedWith(value) { - return originalPromiseResolve(value); + return newPromise(resolve => resolve(value)); } + // https://webidl.spec.whatwg.org/#a-promise-rejected-with function promiseRejectedWith(reason) { return originalPromiseReject(reason); } @@ -9553,6 +9552,9 @@ exports.getUserAgent = getUserAgent; // approximation. return originalPromiseThen.call(promise, onFulfilled, onRejected); } + // Bluebird logs a warning when a promise is created within a fulfillment handler, but then isn't returned + // from that handler. To prevent this, return null instead of void from all handlers. + // http://bluebirdjs.com/docs/warning-explanations.html#warning-a-promise-was-created-in-a-handler-but-was-not-returned-from-it function uponPromise(promise, onFulfilled, onRejected) { PerformPromiseThen(PerformPromiseThen(promise, onFulfilled, onRejected), undefined, rethrowAssertionErrorRejection); } @@ -9568,14 +9570,16 @@ exports.getUserAgent = getUserAgent; function setPromiseIsHandledToTrue(promise) { PerformPromiseThen(promise, undefined, rethrowAssertionErrorRejection); } - const queueMicrotask = (() => { - const globalQueueMicrotask = globals && globals.queueMicrotask; - if (typeof globalQueueMicrotask === 'function') { - return globalQueueMicrotask; + let _queueMicrotask = callback => { + if (typeof queueMicrotask === 'function') { + _queueMicrotask = queueMicrotask; } - const resolvedPromise = promiseResolvedWith(undefined); - return (fn) => PerformPromiseThen(resolvedPromise, fn); - })(); + else { + const resolvedPromise = promiseResolvedWith(undefined); + _queueMicrotask = cb => PerformPromiseThen(resolvedPromise, cb); + } + return _queueMicrotask(callback); + }; function reflectCall(F, V, args) { if (typeof F !== 'function') { throw new TypeError('Argument is not a function'); @@ -9699,6 +9703,12 @@ exports.getUserAgent = getUserAgent; } } + const AbortSteps = Symbol('[[AbortSteps]]'); + const ErrorSteps = Symbol('[[ErrorSteps]]'); + const CancelSteps = Symbol('[[CancelSteps]]'); + const PullSteps = Symbol('[[PullSteps]]'); + const ReleaseSteps = Symbol('[[ReleaseSteps]]'); + function ReadableStreamReaderGenericInitialize(reader, stream) { reader._ownerReadableStream = stream; stream._reader = reader; @@ -9719,13 +9729,15 @@ exports.getUserAgent = getUserAgent; return ReadableStreamCancel(stream, reason); } function ReadableStreamReaderGenericRelease(reader) { - if (reader._ownerReadableStream._state === 'readable') { + const stream = reader._ownerReadableStream; + if (stream._state === 'readable') { defaultReaderClosedPromiseReject(reader, new TypeError(`Reader was released and can no longer be used to monitor the stream's closedness`)); } else { defaultReaderClosedPromiseResetToRejected(reader, new TypeError(`Reader was released and can no longer be used to monitor the stream's closedness`)); } - reader._ownerReadableStream._reader = undefined; + stream._readableStreamController[ReleaseSteps](); + stream._reader = undefined; reader._ownerReadableStream = undefined; } // Helper functions for the readers. @@ -9768,11 +9780,6 @@ exports.getUserAgent = getUserAgent; reader._closedPromise_reject = undefined; } - const AbortSteps = SymbolPolyfill('[[AbortSteps]]'); - const ErrorSteps = SymbolPolyfill('[[ErrorSteps]]'); - const CancelSteps = SymbolPolyfill('[[CancelSteps]]'); - const PullSteps = SymbolPolyfill('[[PullSteps]]'); - /// // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite#Polyfill const NumberIsFinite = Number.isFinite || function (x) { @@ -9968,10 +9975,7 @@ exports.getUserAgent = getUserAgent; if (this._ownerReadableStream === undefined) { return; } - if (this._readRequests.length > 0) { - throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled'); - } - ReadableStreamReaderGenericRelease(this); + ReadableStreamDefaultReaderRelease(this); } } Object.defineProperties(ReadableStreamDefaultReader.prototype, { @@ -9980,8 +9984,11 @@ exports.getUserAgent = getUserAgent; releaseLock: { enumerable: true }, closed: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(ReadableStreamDefaultReader.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(ReadableStreamDefaultReader.prototype.cancel, 'cancel'); + setFunctionName(ReadableStreamDefaultReader.prototype.read, 'read'); + setFunctionName(ReadableStreamDefaultReader.prototype.releaseLock, 'releaseLock'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamDefaultReader.prototype, Symbol.toStringTag, { value: 'ReadableStreamDefaultReader', configurable: true }); @@ -10009,6 +10016,18 @@ exports.getUserAgent = getUserAgent; stream._readableStreamController[PullSteps](readRequest); } } + function ReadableStreamDefaultReaderRelease(reader) { + ReadableStreamReaderGenericRelease(reader); + const e = new TypeError('Reader was released'); + ReadableStreamDefaultReaderErrorReadRequests(reader, e); + } + function ReadableStreamDefaultReaderErrorReadRequests(reader, e) { + const readRequests = reader._readRequests; + reader._readRequests = new SimpleQueue(); + readRequests.forEach(readRequest => { + readRequest._errorSteps(e); + }); + } // Helper functions for the ReadableStreamDefaultReader. function defaultReaderBrandCheckException(name) { return new TypeError(`ReadableStreamDefaultReader.prototype.${name} can only be used on a ReadableStreamDefaultReader`); @@ -10044,9 +10063,6 @@ exports.getUserAgent = getUserAgent; return Promise.resolve({ value: undefined, done: true }); } const reader = this._reader; - if (reader._ownerReadableStream === undefined) { - return promiseRejectedWith(readerLockException('iterate')); - } let resolvePromise; let rejectPromise; const promise = newPromise((resolve, reject) => { @@ -10058,7 +10074,7 @@ exports.getUserAgent = getUserAgent; this._ongoingPromise = undefined; // This needs to be delayed by one microtask, otherwise we stop pulling too early which breaks a test. // FIXME Is this a bug in the specification, or in the test? - queueMicrotask(() => resolvePromise({ value: chunk, done: false })); + _queueMicrotask(() => resolvePromise({ value: chunk, done: false })); }, _closeSteps: () => { this._ongoingPromise = undefined; @@ -10082,9 +10098,6 @@ exports.getUserAgent = getUserAgent; } this._isFinished = true; const reader = this._reader; - if (reader._ownerReadableStream === undefined) { - return promiseRejectedWith(readerLockException('finish iterating')); - } if (!this._preventCancel) { const result = ReadableStreamReaderGenericCancel(reader, value); ReadableStreamReaderGenericRelease(reader); @@ -10108,9 +10121,7 @@ exports.getUserAgent = getUserAgent; return this._asyncIteratorImpl.return(value); } }; - if (AsyncIteratorPrototype !== undefined) { - Object.setPrototypeOf(ReadableStreamAsyncIteratorPrototype, AsyncIteratorPrototype); - } + Object.setPrototypeOf(ReadableStreamAsyncIteratorPrototype, AsyncIteratorPrototype); // Abstract operations for the ReadableStream. function AcquireReadableStreamAsyncIterator(stream, preventCancel) { const reader = AcquireReadableStreamDefaultReader(stream); @@ -10147,6 +10158,7 @@ exports.getUserAgent = getUserAgent; return x !== x; }; + var _a, _b, _c; function CreateArrayFromList(elements) { // We use arrays to represent lists, so this is basically a no-op. // Do a slice though just in case we happen to depend on the unique-ness. @@ -10155,15 +10167,29 @@ exports.getUserAgent = getUserAgent; function CopyDataBlockBytes(dest, destOffset, src, srcOffset, n) { new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset); } - // Not implemented correctly - function TransferArrayBuffer(O) { - return O; - } - // Not implemented correctly - // eslint-disable-next-line @typescript-eslint/no-unused-vars - function IsDetachedBuffer(O) { - return false; - } + let TransferArrayBuffer = (O) => { + if (typeof O.transfer === 'function') { + TransferArrayBuffer = buffer => buffer.transfer(); + } + else if (typeof structuredClone === 'function') { + TransferArrayBuffer = buffer => structuredClone(buffer, { transfer: [buffer] }); + } + else { + // Not implemented correctly + TransferArrayBuffer = buffer => buffer; + } + return TransferArrayBuffer(O); + }; + let IsDetachedBuffer = (O) => { + if (typeof O.detached === 'boolean') { + IsDetachedBuffer = buffer => buffer.detached; + } + else { + // Not implemented correctly + IsDetachedBuffer = buffer => buffer.byteLength === 0; + } + return IsDetachedBuffer(O); + }; function ArrayBufferSlice(buffer, begin, end) { // ArrayBuffer.prototype.slice is not available on IE10 // https://www.caniuse.com/mdn-javascript_builtins_arraybuffer_slice @@ -10175,6 +10201,70 @@ exports.getUserAgent = getUserAgent; CopyDataBlockBytes(slice, 0, buffer, begin, length); return slice; } + function GetMethod(receiver, prop) { + const func = receiver[prop]; + if (func === undefined || func === null) { + return undefined; + } + if (typeof func !== 'function') { + throw new TypeError(`${String(prop)} is not a function`); + } + return func; + } + function CreateAsyncFromSyncIterator(syncIteratorRecord) { + // Instead of re-implementing CreateAsyncFromSyncIterator and %AsyncFromSyncIteratorPrototype%, + // we use yield* inside an async generator function to achieve the same result. + // Wrap the sync iterator inside a sync iterable, so we can use it with yield*. + const syncIterable = { + [Symbol.iterator]: () => syncIteratorRecord.iterator + }; + // Create an async generator function and immediately invoke it. + const asyncIterator = (async function* () { + return yield* syncIterable; + }()); + // Return as an async iterator record. + const nextMethod = asyncIterator.next; + return { iterator: asyncIterator, nextMethod, done: false }; + } + // Aligns with core-js/modules/es.symbol.async-iterator.js + const SymbolAsyncIterator = (_c = (_a = Symbol.asyncIterator) !== null && _a !== void 0 ? _a : (_b = Symbol.for) === null || _b === void 0 ? void 0 : _b.call(Symbol, 'Symbol.asyncIterator')) !== null && _c !== void 0 ? _c : '@@asyncIterator'; + function GetIterator(obj, hint = 'sync', method) { + if (method === undefined) { + if (hint === 'async') { + method = GetMethod(obj, SymbolAsyncIterator); + if (method === undefined) { + const syncMethod = GetMethod(obj, Symbol.iterator); + const syncIteratorRecord = GetIterator(obj, 'sync', syncMethod); + return CreateAsyncFromSyncIterator(syncIteratorRecord); + } + } + else { + method = GetMethod(obj, Symbol.iterator); + } + } + if (method === undefined) { + throw new TypeError('The object is not iterable'); + } + const iterator = reflectCall(method, obj, []); + if (!typeIsObject(iterator)) { + throw new TypeError('The iterator method must return an object'); + } + const nextMethod = iterator.next; + return { iterator, nextMethod, done: false }; + } + function IteratorNext(iteratorRecord) { + const result = reflectCall(iteratorRecord.nextMethod, iteratorRecord.iterator, []); + if (!typeIsObject(result)) { + throw new TypeError('The iterator.next() method must return an object'); + } + return result; + } + function IteratorComplete(iterResult) { + return Boolean(iterResult.done); + } + function IteratorValue(iterResult) { + return iterResult.value; + } function IsNonNegativeNumber(v) { if (typeof v !== 'number') { @@ -10217,6 +10307,19 @@ exports.getUserAgent = getUserAgent; container._queueTotalSize = 0; } + function isDataViewConstructor(ctor) { + return ctor === DataView; + } + function isDataView(view) { + return isDataViewConstructor(view.constructor); + } + function arrayBufferViewElementSize(ctor) { + if (isDataViewConstructor(ctor)) { + return 1; + } + return ctor.BYTES_PER_ELEMENT; + } + /** * A pull-into request in a {@link ReadableByteStreamController}. * @@ -10244,7 +10347,9 @@ exports.getUserAgent = getUserAgent; if (this._associatedReadableByteStreamController === undefined) { throw new TypeError('This BYOB request has been invalidated'); } - if (IsDetachedBuffer(this._view.buffer)) ; + if (IsDetachedBuffer(this._view.buffer)) { + throw new TypeError(`The BYOB request's buffer has been detached and so cannot be used as a response`); + } ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten); } respondWithNewView(view) { @@ -10258,7 +10363,9 @@ exports.getUserAgent = getUserAgent; if (this._associatedReadableByteStreamController === undefined) { throw new TypeError('This BYOB request has been invalidated'); } - if (IsDetachedBuffer(view.buffer)) ; + if (IsDetachedBuffer(view.buffer)) { + throw new TypeError('The given view\'s buffer has been detached and so cannot be used as a response'); + } ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view); } } @@ -10267,8 +10374,10 @@ exports.getUserAgent = getUserAgent; respondWithNewView: { enumerable: true }, view: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(ReadableStreamBYOBRequest.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(ReadableStreamBYOBRequest.prototype.respond, 'respond'); + setFunctionName(ReadableStreamBYOBRequest.prototype.respondWithNewView, 'respondWithNewView'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamBYOBRequest.prototype, Symbol.toStringTag, { value: 'ReadableStreamBYOBRequest', configurable: true }); @@ -10362,11 +10471,7 @@ exports.getUserAgent = getUserAgent; [PullSteps](readRequest) { const stream = this._controlledReadableByteStream; if (this._queueTotalSize > 0) { - const entry = this._queue.shift(); - this._queueTotalSize -= entry.byteLength; - ReadableByteStreamControllerHandleQueueDrain(this); - const view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength); - readRequest._chunkSteps(view); + ReadableByteStreamControllerFillReadRequestFromQueue(this, readRequest); return; } const autoAllocateChunkSize = this._autoAllocateChunkSize; @@ -10385,6 +10490,7 @@ exports.getUserAgent = getUserAgent; byteOffset: 0, byteLength: autoAllocateChunkSize, bytesFilled: 0, + minimumFill: 1, elementSize: 1, viewConstructor: Uint8Array, readerType: 'default' @@ -10394,6 +10500,15 @@ exports.getUserAgent = getUserAgent; ReadableStreamAddReadRequest(stream, readRequest); ReadableByteStreamControllerCallPullIfNeeded(this); } + /** @internal */ + [ReleaseSteps]() { + if (this._pendingPullIntos.length > 0) { + const firstPullInto = this._pendingPullIntos.peek(); + firstPullInto.readerType = 'none'; + this._pendingPullIntos = new SimpleQueue(); + this._pendingPullIntos.push(firstPullInto); + } + } } Object.defineProperties(ReadableByteStreamController.prototype, { close: { enumerable: true }, @@ -10402,8 +10517,11 @@ exports.getUserAgent = getUserAgent; byobRequest: { enumerable: true }, desiredSize: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(ReadableByteStreamController.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(ReadableByteStreamController.prototype.close, 'close'); + setFunctionName(ReadableByteStreamController.prototype.enqueue, 'enqueue'); + setFunctionName(ReadableByteStreamController.prototype.error, 'error'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(ReadableByteStreamController.prototype, Symbol.toStringTag, { value: 'ReadableByteStreamController', configurable: true }); @@ -10445,8 +10563,10 @@ exports.getUserAgent = getUserAgent; controller._pullAgain = false; ReadableByteStreamControllerCallPullIfNeeded(controller); } + return null; }, e => { ReadableByteStreamControllerError(controller, e); + return null; }); } function ReadableByteStreamControllerClearPendingPullIntos(controller) { @@ -10475,15 +10595,33 @@ exports.getUserAgent = getUserAgent; controller._queue.push({ buffer, byteOffset, byteLength }); controller._queueTotalSize += byteLength; } + function ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, buffer, byteOffset, byteLength) { + let clonedChunk; + try { + clonedChunk = ArrayBufferSlice(buffer, byteOffset, byteOffset + byteLength); + } + catch (cloneE) { + ReadableByteStreamControllerError(controller, cloneE); + throw cloneE; + } + ReadableByteStreamControllerEnqueueChunkToQueue(controller, clonedChunk, 0, byteLength); + } + function ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, firstDescriptor) { + if (firstDescriptor.bytesFilled > 0) { + ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, firstDescriptor.buffer, firstDescriptor.byteOffset, firstDescriptor.bytesFilled); + } + ReadableByteStreamControllerShiftPendingPullInto(controller); + } function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) { - const elementSize = pullIntoDescriptor.elementSize; - const currentAlignedBytes = pullIntoDescriptor.bytesFilled - pullIntoDescriptor.bytesFilled % elementSize; const maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled); const maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy; - const maxAlignedBytes = maxBytesFilled - maxBytesFilled % elementSize; let totalBytesToCopyRemaining = maxBytesToCopy; let ready = false; - if (maxAlignedBytes > currentAlignedBytes) { + const remainderBytes = maxBytesFilled % pullIntoDescriptor.elementSize; + const maxAlignedBytes = maxBytesFilled - remainderBytes; + // A descriptor for a read() request that is not yet filled up to its minimum length will stay at the head + // of the queue, so the underlying source can keep filling it. + if (maxAlignedBytes >= pullIntoDescriptor.minimumFill) { totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled; ready = true; } @@ -10538,25 +10676,37 @@ exports.getUserAgent = getUserAgent; } } } - function ReadableByteStreamControllerPullInto(controller, view, readIntoRequest) { - const stream = controller._controlledReadableByteStream; - let elementSize = 1; - if (view.constructor !== DataView) { - elementSize = view.constructor.BYTES_PER_ELEMENT; + function ReadableByteStreamControllerProcessReadRequestsUsingQueue(controller) { + const reader = controller._controlledReadableByteStream._reader; + while (reader._readRequests.length > 0) { + if (controller._queueTotalSize === 0) { + return; + } + const readRequest = reader._readRequests.shift(); + ReadableByteStreamControllerFillReadRequestFromQueue(controller, readRequest); } + } + function ReadableByteStreamControllerPullInto(controller, view, min, readIntoRequest) { + const stream = controller._controlledReadableByteStream; const ctor = view.constructor; - // try { - const buffer = TransferArrayBuffer(view.buffer); - // } catch (e) { - // readIntoRequest._errorSteps(e); - // return; - // } + const elementSize = arrayBufferViewElementSize(ctor); + const { byteOffset, byteLength } = view; + const minimumFill = min * elementSize; + let buffer; + try { + buffer = TransferArrayBuffer(view.buffer); + } + catch (e) { + readIntoRequest._errorSteps(e); + return; + } const pullIntoDescriptor = { buffer, bufferByteLength: buffer.byteLength, - byteOffset: view.byteOffset, - byteLength: view.byteLength, + byteOffset, + byteLength, bytesFilled: 0, + minimumFill, elementSize, viewConstructor: ctor, readerType: 'byob' @@ -10593,6 +10743,9 @@ exports.getUserAgent = getUserAgent; ReadableByteStreamControllerCallPullIfNeeded(controller); } function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) { + if (firstDescriptor.readerType === 'none') { + ReadableByteStreamControllerShiftPendingPullInto(controller); + } const stream = controller._controlledReadableByteStream; if (ReadableStreamHasBYOBReader(stream)) { while (ReadableStreamGetNumReadIntoRequests(stream) > 0) { @@ -10603,15 +10756,21 @@ exports.getUserAgent = getUserAgent; } function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) { ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor); - if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.elementSize) { + if (pullIntoDescriptor.readerType === 'none') { + ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, pullIntoDescriptor); + ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); + return; + } + if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.minimumFill) { + // A descriptor for a read() request that is not yet filled up to its minimum length will stay at the head + // of the queue, so the underlying source can keep filling it. return; } ReadableByteStreamControllerShiftPendingPullInto(controller); const remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize; if (remainderSize > 0) { const end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled; - const remainder = ArrayBufferSlice(pullIntoDescriptor.buffer, end - remainderSize, end); - ReadableByteStreamControllerEnqueueChunkToQueue(controller, remainder, 0, remainder.byteLength); + ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, pullIntoDescriptor.buffer, end - remainderSize, remainderSize); } pullIntoDescriptor.bytesFilled -= remainderSize; ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableByteStream, pullIntoDescriptor); @@ -10622,7 +10781,7 @@ exports.getUserAgent = getUserAgent; ReadableByteStreamControllerInvalidateBYOBRequest(controller); const state = controller._controlledReadableByteStream._state; if (state === 'closed') { - ReadableByteStreamControllerRespondInClosedState(controller); + ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor); } else { ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor); @@ -10672,7 +10831,7 @@ exports.getUserAgent = getUserAgent; } if (controller._pendingPullIntos.length > 0) { const firstPendingPullInto = controller._pendingPullIntos.peek(); - if (firstPendingPullInto.bytesFilled > 0) { + if (firstPendingPullInto.bytesFilled % firstPendingPullInto.elementSize !== 0) { const e = new TypeError('Insufficient bytes to fill elements in the given buffer'); ReadableByteStreamControllerError(controller, e); throw e; @@ -10686,17 +10845,24 @@ exports.getUserAgent = getUserAgent; if (controller._closeRequested || stream._state !== 'readable') { return; } - const buffer = chunk.buffer; - const byteOffset = chunk.byteOffset; - const byteLength = chunk.byteLength; + const { buffer, byteOffset, byteLength } = chunk; + if (IsDetachedBuffer(buffer)) { + throw new TypeError('chunk\'s buffer is detached and so cannot be enqueued'); + } const transferredBuffer = TransferArrayBuffer(buffer); if (controller._pendingPullIntos.length > 0) { const firstPendingPullInto = controller._pendingPullIntos.peek(); - if (IsDetachedBuffer(firstPendingPullInto.buffer)) ; + if (IsDetachedBuffer(firstPendingPullInto.buffer)) { + throw new TypeError('The BYOB request\'s buffer has been detached and so cannot be filled with an enqueued chunk'); + } + ReadableByteStreamControllerInvalidateBYOBRequest(controller); firstPendingPullInto.buffer = TransferArrayBuffer(firstPendingPullInto.buffer); + if (firstPendingPullInto.readerType === 'none') { + ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, firstPendingPullInto); + } } - ReadableByteStreamControllerInvalidateBYOBRequest(controller); if (ReadableStreamHasDefaultReader(stream)) { + ReadableByteStreamControllerProcessReadRequestsUsingQueue(controller); if (ReadableStreamGetNumReadRequests(stream) === 0) { ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); } @@ -10728,6 +10894,13 @@ exports.getUserAgent = getUserAgent; ReadableByteStreamControllerClearAlgorithms(controller); ReadableStreamError(stream, e); } + function ReadableByteStreamControllerFillReadRequestFromQueue(controller, readRequest) { + const entry = controller._queue.shift(); + controller._queueTotalSize -= entry.byteLength; + ReadableByteStreamControllerHandleQueueDrain(controller); + const view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength); + readRequest._chunkSteps(view); + } function ReadableByteStreamControllerGetBYOBRequest(controller) { if (controller._byobRequest === null && controller._pendingPullIntos.length > 0) { const firstDescriptor = controller._pendingPullIntos.peek(); @@ -10813,24 +10986,35 @@ exports.getUserAgent = getUserAgent; uponPromise(promiseResolvedWith(startResult), () => { controller._started = true; ReadableByteStreamControllerCallPullIfNeeded(controller); + return null; }, r => { ReadableByteStreamControllerError(controller, r); + return null; }); } function SetUpReadableByteStreamControllerFromUnderlyingSource(stream, underlyingByteSource, highWaterMark) { const controller = Object.create(ReadableByteStreamController.prototype); - let startAlgorithm = () => undefined; - let pullAlgorithm = () => promiseResolvedWith(undefined); - let cancelAlgorithm = () => promiseResolvedWith(undefined); + let startAlgorithm; + let pullAlgorithm; + let cancelAlgorithm; if (underlyingByteSource.start !== undefined) { startAlgorithm = () => underlyingByteSource.start(controller); } + else { + startAlgorithm = () => undefined; + } if (underlyingByteSource.pull !== undefined) { pullAlgorithm = () => underlyingByteSource.pull(controller); } + else { + pullAlgorithm = () => promiseResolvedWith(undefined); + } if (underlyingByteSource.cancel !== undefined) { cancelAlgorithm = reason => underlyingByteSource.cancel(reason); } + else { + cancelAlgorithm = () => promiseResolvedWith(undefined); + } const autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize; if (autoAllocateChunkSize === 0) { throw new TypeError('autoAllocateChunkSize must be greater than 0'); @@ -10850,6 +11034,29 @@ exports.getUserAgent = getUserAgent; return new TypeError(`ReadableByteStreamController.prototype.${name} can only be used on a ReadableByteStreamController`); } + function convertReaderOptions(options, context) { + assertDictionary(options, context); + const mode = options === null || options === void 0 ? void 0 : options.mode; + return { + mode: mode === undefined ? undefined : convertReadableStreamReaderMode(mode, `${context} has member 'mode' that`) + }; + } + function convertReadableStreamReaderMode(mode, context) { + mode = `${mode}`; + if (mode !== 'byob') { + throw new TypeError(`${context} '${mode}' is not a valid enumeration value for ReadableStreamReaderMode`); + } + return mode; + } + function convertByobReadOptions(options, context) { + var _a; + assertDictionary(options, context); + const min = (_a = options === null || options === void 0 ? void 0 : options.min) !== null && _a !== void 0 ? _a : 1; + return { + min: convertUnsignedLongLongWithEnforceRange(min, `${context} has member 'min' that`) + }; + } + // Abstract operations for the ReadableStream. function AcquireReadableStreamBYOBReader(stream) { return new ReadableStreamBYOBReader(stream); @@ -10922,12 +11129,7 @@ exports.getUserAgent = getUserAgent; } return ReadableStreamReaderGenericCancel(this, reason); } - /** - * Attempts to reads bytes into view, and returns a promise resolved with the result. - * - * If reading a chunk causes the queue to become empty, more data will be pulled from the underlying source. - */ - read(view) { + read(view, rawOptions = {}) { if (!IsReadableStreamBYOBReader(this)) { return promiseRejectedWith(byobReaderBrandCheckException('read')); } @@ -10940,7 +11142,28 @@ exports.getUserAgent = getUserAgent; if (view.buffer.byteLength === 0) { return promiseRejectedWith(new TypeError(`view's buffer must have non-zero byteLength`)); } - if (IsDetachedBuffer(view.buffer)) ; + if (IsDetachedBuffer(view.buffer)) { + return promiseRejectedWith(new TypeError('view\'s buffer has been detached')); + } + let options; + try { + options = convertByobReadOptions(rawOptions, 'options'); + } + catch (e) { + return promiseRejectedWith(e); + } + const min = options.min; + if (min === 0) { + return promiseRejectedWith(new TypeError('options.min must be greater than 0')); + } + if (!isDataView(view)) { + if (min > view.length) { + return promiseRejectedWith(new RangeError('options.min must be less than or equal to view\'s length')); + } + } + else if (min > view.byteLength) { + return promiseRejectedWith(new RangeError('options.min must be less than or equal to view\'s byteLength')); + } if (this._ownerReadableStream === undefined) { return promiseRejectedWith(readerLockException('read from')); } @@ -10955,7 +11178,7 @@ exports.getUserAgent = getUserAgent; _closeSteps: chunk => resolvePromise({ value: chunk, done: true }), _errorSteps: e => rejectPromise(e) }; - ReadableStreamBYOBReaderRead(this, view, readIntoRequest); + ReadableStreamBYOBReaderRead(this, view, min, readIntoRequest); return promise; } /** @@ -10974,10 +11197,7 @@ exports.getUserAgent = getUserAgent; if (this._ownerReadableStream === undefined) { return; } - if (this._readIntoRequests.length > 0) { - throw new TypeError('Tried to release a reader lock when that reader has pending read() calls un-settled'); - } - ReadableStreamReaderGenericRelease(this); + ReadableStreamBYOBReaderRelease(this); } } Object.defineProperties(ReadableStreamBYOBReader.prototype, { @@ -10986,8 +11206,11 @@ exports.getUserAgent = getUserAgent; releaseLock: { enumerable: true }, closed: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(ReadableStreamBYOBReader.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(ReadableStreamBYOBReader.prototype.cancel, 'cancel'); + setFunctionName(ReadableStreamBYOBReader.prototype.read, 'read'); + setFunctionName(ReadableStreamBYOBReader.prototype.releaseLock, 'releaseLock'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamBYOBReader.prototype, Symbol.toStringTag, { value: 'ReadableStreamBYOBReader', configurable: true }); @@ -11002,16 +11225,28 @@ exports.getUserAgent = getUserAgent; } return x instanceof ReadableStreamBYOBReader; } - function ReadableStreamBYOBReaderRead(reader, view, readIntoRequest) { + function ReadableStreamBYOBReaderRead(reader, view, min, readIntoRequest) { const stream = reader._ownerReadableStream; stream._disturbed = true; if (stream._state === 'errored') { readIntoRequest._errorSteps(stream._storedError); } else { - ReadableByteStreamControllerPullInto(stream._readableStreamController, view, readIntoRequest); + ReadableByteStreamControllerPullInto(stream._readableStreamController, view, min, readIntoRequest); } } + function ReadableStreamBYOBReaderRelease(reader) { + ReadableStreamReaderGenericRelease(reader); + const e = new TypeError('Reader was released'); + ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e); + } + function ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e) { + const readIntoRequests = reader._readIntoRequests; + reader._readIntoRequests = new SimpleQueue(); + readIntoRequests.forEach(readIntoRequest => { + readIntoRequest._errorSteps(e); + }); + } // Helper functions for the ReadableStreamBYOBReader. function byobReaderBrandCheckException(name) { return new TypeError(`ReadableStreamBYOBReader.prototype.${name} can only be used on a ReadableStreamBYOBReader`); @@ -11212,8 +11447,11 @@ exports.getUserAgent = getUserAgent; getWriter: { enumerable: true }, locked: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(WritableStream.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(WritableStream.prototype.abort, 'abort'); + setFunctionName(WritableStream.prototype.close, 'close'); + setFunctionName(WritableStream.prototype.getWriter, 'getWriter'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(WritableStream.prototype, Symbol.toStringTag, { value: 'WritableStream', configurable: true }); @@ -11277,7 +11515,7 @@ exports.getUserAgent = getUserAgent; return promiseResolvedWith(undefined); } stream._writableStreamController._abortReason = reason; - (_a = stream._writableStreamController._abortController) === null || _a === void 0 ? void 0 : _a.abort(); + (_a = stream._writableStreamController._abortController) === null || _a === void 0 ? void 0 : _a.abort(reason); // TypeScript narrows the type of `stream._state` down to 'writable' | 'erroring', // but it doesn't know that signaling abort runs author code that might have changed the state. // Widen the type again by casting to WritableStreamState. @@ -11382,9 +11620,11 @@ exports.getUserAgent = getUserAgent; uponPromise(promise, () => { abortRequest._resolve(); WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); + return null; }, (reason) => { abortRequest._reject(reason); WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); + return null; }); } function WritableStreamFinishInFlightWrite(stream) { @@ -11612,8 +11852,12 @@ exports.getUserAgent = getUserAgent; desiredSize: { enumerable: true }, ready: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(WritableStreamDefaultWriter.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(WritableStreamDefaultWriter.prototype.abort, 'abort'); + setFunctionName(WritableStreamDefaultWriter.prototype.close, 'close'); + setFunctionName(WritableStreamDefaultWriter.prototype.releaseLock, 'releaseLock'); + setFunctionName(WritableStreamDefaultWriter.prototype.write, 'write'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(WritableStreamDefaultWriter.prototype, Symbol.toStringTag, { value: 'WritableStreamDefaultWriter', configurable: true }); @@ -11779,8 +12023,8 @@ exports.getUserAgent = getUserAgent; signal: { enumerable: true }, error: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(WritableStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(WritableStreamDefaultController.prototype, Symbol.toStringTag, { value: 'WritableStreamDefaultController', configurable: true }); @@ -11817,29 +12061,43 @@ exports.getUserAgent = getUserAgent; uponPromise(startPromise, () => { controller._started = true; WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); + return null; }, r => { controller._started = true; WritableStreamDealWithRejection(stream, r); + return null; }); } function SetUpWritableStreamDefaultControllerFromUnderlyingSink(stream, underlyingSink, highWaterMark, sizeAlgorithm) { const controller = Object.create(WritableStreamDefaultController.prototype); - let startAlgorithm = () => undefined; - let writeAlgorithm = () => promiseResolvedWith(undefined); - let closeAlgorithm = () => promiseResolvedWith(undefined); - let abortAlgorithm = () => promiseResolvedWith(undefined); + let startAlgorithm; + let writeAlgorithm; + let closeAlgorithm; + let abortAlgorithm; if (underlyingSink.start !== undefined) { startAlgorithm = () => underlyingSink.start(controller); } + else { + startAlgorithm = () => undefined; + } if (underlyingSink.write !== undefined) { writeAlgorithm = chunk => underlyingSink.write(chunk, controller); } + else { + writeAlgorithm = () => promiseResolvedWith(undefined); + } if (underlyingSink.close !== undefined) { closeAlgorithm = () => underlyingSink.close(); } + else { + closeAlgorithm = () => promiseResolvedWith(undefined); + } if (underlyingSink.abort !== undefined) { abortAlgorithm = reason => underlyingSink.abort(reason); } + else { + abortAlgorithm = () => promiseResolvedWith(undefined); + } SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm); } // ClearAlgorithms may be called twice. Erroring the same stream in multiple ways will often result in redundant calls. @@ -11918,8 +12176,10 @@ exports.getUserAgent = getUserAgent; WritableStreamDefaultControllerClearAlgorithms(controller); uponPromise(sinkClosePromise, () => { WritableStreamFinishInFlightClose(stream); + return null; }, reason => { WritableStreamFinishInFlightCloseWithError(stream, reason); + return null; }); } function WritableStreamDefaultControllerProcessWrite(controller, chunk) { @@ -11935,11 +12195,13 @@ exports.getUserAgent = getUserAgent; WritableStreamUpdateBackpressure(stream, backpressure); } WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); + return null; }, reason => { if (stream._state === 'writable') { WritableStreamDefaultControllerClearAlgorithms(controller); } WritableStreamFinishInFlightWriteWithError(stream, reason); + return null; }); } function WritableStreamDefaultControllerGetBackpressure(controller) { @@ -12046,13 +12308,28 @@ exports.getUserAgent = getUserAgent; } /// - const NativeDOMException = typeof DOMException !== 'undefined' ? DOMException : undefined; + function getGlobals() { + if (typeof globalThis !== 'undefined') { + return globalThis; + } + else if (typeof self !== 'undefined') { + return self; + } + else if (typeof global !== 'undefined') { + return global; + } + return undefined; + } + const globals = getGlobals(); /// function isDOMExceptionConstructor(ctor) { if (!(typeof ctor === 'function' || typeof ctor === 'object')) { return false; } + if (ctor.name !== 'DOMException') { + return false; + } try { new ctor(); return true; @@ -12061,8 +12338,21 @@ exports.getUserAgent = getUserAgent; return false; } } - function createDOMExceptionPolyfill() { - // eslint-disable-next-line no-shadow + /** + * Support: + * - Web browsers + * - Node 18 and higher (https://github.com/nodejs/node/commit/e4b1fb5e6422c1ff151234bb9de792d45dd88d87) + */ + function getFromGlobal() { + const ctor = globals === null || globals === void 0 ? void 0 : globals.DOMException; + return isDOMExceptionConstructor(ctor) ? ctor : undefined; + } + /** + * Support: + * - All platforms + */ + function createPolyfill() { + // eslint-disable-next-line @typescript-eslint/no-shadow const ctor = function DOMException(message, name) { this.message = message || ''; this.name = name || 'Error'; @@ -12070,12 +12360,13 @@ exports.getUserAgent = getUserAgent; Error.captureStackTrace(this, this.constructor); } }; + setFunctionName(ctor, 'DOMException'); ctor.prototype = Object.create(Error.prototype); Object.defineProperty(ctor.prototype, 'constructor', { value: ctor, writable: true, configurable: true }); return ctor; } - // eslint-disable-next-line no-redeclare - const DOMException$1 = isDOMExceptionConstructor(NativeDOMException) ? NativeDOMException : createDOMExceptionPolyfill(); + // eslint-disable-next-line @typescript-eslint/no-redeclare + const DOMException = getFromGlobal() || createPolyfill(); function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventCancel, signal) { const reader = AcquireReadableStreamDefaultReader(source); @@ -12088,7 +12379,7 @@ exports.getUserAgent = getUserAgent; let abortAlgorithm; if (signal !== undefined) { abortAlgorithm = () => { - const error = new DOMException$1('Aborted', 'AbortError'); + const error = signal.reason !== undefined ? signal.reason : new DOMException('Aborted', 'AbortError'); const actions = []; if (!preventAbort) { actions.push(() => { @@ -12157,6 +12448,7 @@ exports.getUserAgent = getUserAgent; else { shutdown(true, storedError); } + return null; }); // Errors must be propagated backward isOrBecomesErrored(dest, writer._closedPromise, storedError => { @@ -12166,6 +12458,7 @@ exports.getUserAgent = getUserAgent; else { shutdown(true, storedError); } + return null; }); // Closing must be propagated forward isOrBecomesClosed(source, reader._closedPromise, () => { @@ -12175,6 +12468,7 @@ exports.getUserAgent = getUserAgent; else { shutdown(); } + return null; }); // Closing must be propagated backward if (WritableStreamCloseQueuedOrInFlight(dest) || dest._state === 'closed') { @@ -12222,6 +12516,7 @@ exports.getUserAgent = getUserAgent; } function doTheRest() { uponPromise(action(), () => finalize(originalIsError, originalError), newError => finalize(true, newError)); + return null; } } function shutdown(isError, error) { @@ -12248,6 +12543,7 @@ exports.getUserAgent = getUserAgent; else { resolve(undefined); } + return null; } }); } @@ -12328,6 +12624,10 @@ exports.getUserAgent = getUserAgent; ReadableStreamDefaultControllerCallPullIfNeeded(this); } } + /** @internal */ + [ReleaseSteps]() { + // Do nothing. + } } Object.defineProperties(ReadableStreamDefaultController.prototype, { close: { enumerable: true }, @@ -12335,8 +12635,11 @@ exports.getUserAgent = getUserAgent; error: { enumerable: true }, desiredSize: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(ReadableStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(ReadableStreamDefaultController.prototype.close, 'close'); + setFunctionName(ReadableStreamDefaultController.prototype.enqueue, 'enqueue'); + setFunctionName(ReadableStreamDefaultController.prototype.error, 'error'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(ReadableStreamDefaultController.prototype, Symbol.toStringTag, { value: 'ReadableStreamDefaultController', configurable: true }); @@ -12368,8 +12671,10 @@ exports.getUserAgent = getUserAgent; controller._pullAgain = false; ReadableStreamDefaultControllerCallPullIfNeeded(controller); } + return null; }, e => { ReadableStreamDefaultControllerError(controller, e); + return null; }); } function ReadableStreamDefaultControllerShouldCallPull(controller) { @@ -12484,24 +12789,35 @@ exports.getUserAgent = getUserAgent; uponPromise(promiseResolvedWith(startResult), () => { controller._started = true; ReadableStreamDefaultControllerCallPullIfNeeded(controller); + return null; }, r => { ReadableStreamDefaultControllerError(controller, r); + return null; }); } function SetUpReadableStreamDefaultControllerFromUnderlyingSource(stream, underlyingSource, highWaterMark, sizeAlgorithm) { const controller = Object.create(ReadableStreamDefaultController.prototype); - let startAlgorithm = () => undefined; - let pullAlgorithm = () => promiseResolvedWith(undefined); - let cancelAlgorithm = () => promiseResolvedWith(undefined); + let startAlgorithm; + let pullAlgorithm; + let cancelAlgorithm; if (underlyingSource.start !== undefined) { startAlgorithm = () => underlyingSource.start(controller); } + else { + startAlgorithm = () => undefined; + } if (underlyingSource.pull !== undefined) { pullAlgorithm = () => underlyingSource.pull(controller); } + else { + pullAlgorithm = () => promiseResolvedWith(undefined); + } if (underlyingSource.cancel !== undefined) { cancelAlgorithm = reason => underlyingSource.cancel(reason); } + else { + cancelAlgorithm = () => promiseResolvedWith(undefined); + } SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm); } // Helper functions for the ReadableStreamDefaultController. @@ -12540,7 +12856,7 @@ exports.getUserAgent = getUserAgent; // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let // successful synchronously-available reads get ahead of asynchronously-available errors. - queueMicrotask(() => { + _queueMicrotask(() => { readAgain = false; const chunk1 = chunk; const chunk2 = chunk; @@ -12611,6 +12927,7 @@ exports.getUserAgent = getUserAgent; if (!canceled1 || !canceled2) { resolveCancelPromise(undefined); } + return null; }); return [branch1, branch2]; } @@ -12632,13 +12949,14 @@ exports.getUserAgent = getUserAgent; function forwardReaderError(thisReader) { uponRejection(thisReader._closedPromise, r => { if (thisReader !== reader) { - return; + return null; } ReadableByteStreamControllerError(branch1._readableStreamController, r); ReadableByteStreamControllerError(branch2._readableStreamController, r); if (!canceled1 || !canceled2) { resolveCancelPromise(undefined); } + return null; }); } function pullWithDefaultReader() { @@ -12652,7 +12970,7 @@ exports.getUserAgent = getUserAgent; // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let // successful synchronously-available reads get ahead of asynchronously-available errors. - queueMicrotask(() => { + _queueMicrotask(() => { readAgainForBranch1 = false; readAgainForBranch2 = false; const chunk1 = chunk; @@ -12720,7 +13038,7 @@ exports.getUserAgent = getUserAgent; // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let // successful synchronously-available reads get ahead of asynchronously-available errors. - queueMicrotask(() => { + _queueMicrotask(() => { readAgainForBranch1 = false; readAgainForBranch2 = false; const byobCanceled = forBranch2 ? canceled2 : canceled1; @@ -12779,7 +13097,7 @@ exports.getUserAgent = getUserAgent; reading = false; } }; - ReadableStreamBYOBReaderRead(reader, view, readIntoRequest); + ReadableStreamBYOBReaderRead(reader, view, 1, readIntoRequest); } function pull1Algorithm() { if (reading) { @@ -12840,6 +13158,109 @@ exports.getUserAgent = getUserAgent; return [branch1, branch2]; } + function isReadableStreamLike(stream) { + return typeIsObject(stream) && typeof stream.getReader !== 'undefined'; + } + + function ReadableStreamFrom(source) { + if (isReadableStreamLike(source)) { + return ReadableStreamFromDefaultReader(source.getReader()); + } + return ReadableStreamFromIterable(source); + } + function ReadableStreamFromIterable(asyncIterable) { + let stream; + const iteratorRecord = GetIterator(asyncIterable, 'async'); + const startAlgorithm = noop; + function pullAlgorithm() { + let nextResult; + try { + nextResult = IteratorNext(iteratorRecord); + } + catch (e) { + return promiseRejectedWith(e); + } + const nextPromise = promiseResolvedWith(nextResult); + return transformPromiseWith(nextPromise, iterResult => { + if (!typeIsObject(iterResult)) { + throw new TypeError('The promise returned by the iterator.next() method must fulfill with an object'); + } + const done = IteratorComplete(iterResult); + if (done) { + ReadableStreamDefaultControllerClose(stream._readableStreamController); + } + else { + const value = IteratorValue(iterResult); + ReadableStreamDefaultControllerEnqueue(stream._readableStreamController, value); + } + }); + } + function cancelAlgorithm(reason) { + const iterator = iteratorRecord.iterator; + let returnMethod; + try { + returnMethod = GetMethod(iterator, 'return'); + } + catch (e) { + return promiseRejectedWith(e); + } + if (returnMethod === undefined) { + return promiseResolvedWith(undefined); + } + let returnResult; + try { + returnResult = reflectCall(returnMethod, iterator, [reason]); + } + catch (e) { + return promiseRejectedWith(e); + } + const returnPromise = promiseResolvedWith(returnResult); + return transformPromiseWith(returnPromise, iterResult => { + if (!typeIsObject(iterResult)) { + throw new TypeError('The promise returned by the iterator.return() method must fulfill with an object'); + } + return undefined; + }); + } + stream = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, 0); + return stream; + } + function ReadableStreamFromDefaultReader(reader) { + let stream; + const startAlgorithm = noop; + function pullAlgorithm() { + let readPromise; + try { + readPromise = reader.read(); + } + catch (e) { + return promiseRejectedWith(e); + } + return transformPromiseWith(readPromise, readResult => { + if (!typeIsObject(readResult)) { + throw new TypeError('The promise returned by the reader.read() method must fulfill with an object'); + } + if (readResult.done) { + ReadableStreamDefaultControllerClose(stream._readableStreamController); + } + else { + const value = readResult.value; + ReadableStreamDefaultControllerEnqueue(stream._readableStreamController, value); + } + }); + } + function cancelAlgorithm(reason) { + try { + return promiseResolvedWith(reader.cancel(reason)); + } + catch (e) { + return promiseRejectedWith(e); + } + } + stream = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, 0); + return stream; + } + function convertUnderlyingDefaultOrByteSource(source, context) { assertDictionary(source, context); const original = source; @@ -12884,21 +13305,6 @@ exports.getUserAgent = getUserAgent; return type; } - function convertReaderOptions(options, context) { - assertDictionary(options, context); - const mode = options === null || options === void 0 ? void 0 : options.mode; - return { - mode: mode === undefined ? undefined : convertReadableStreamReaderMode(mode, `${context} has member 'mode' that`) - }; - } - function convertReadableStreamReaderMode(mode, context) { - mode = `${mode}`; - if (mode !== 'byob') { - throw new TypeError(`${context} '${mode}' is not a valid enumeration value for ReadableStreamReaderMode`); - } - return mode; - } - function convertIteratorOptions(options, context) { assertDictionary(options, context); const preventCancel = options === null || options === void 0 ? void 0 : options.preventCancel; @@ -13068,7 +13474,23 @@ exports.getUserAgent = getUserAgent; const options = convertIteratorOptions(rawOptions, 'First parameter'); return AcquireReadableStreamAsyncIterator(this, options.preventCancel); } + [SymbolAsyncIterator](options) { + // Stub implementation, overridden below + return this.values(options); + } + /** + * Creates a new ReadableStream wrapping the provided iterable or async iterable. + * + * This can be used to adapt various kinds of objects into a readable stream, + * such as an array, an async generator, or a Node.js readable stream. + */ + static from(asyncIterable) { + return ReadableStreamFrom(asyncIterable); + } } + Object.defineProperties(ReadableStream, { + from: { enumerable: true } + }); Object.defineProperties(ReadableStream.prototype, { cancel: { enumerable: true }, getReader: { enumerable: true }, @@ -13078,19 +13500,24 @@ exports.getUserAgent = getUserAgent; values: { enumerable: true }, locked: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(ReadableStream.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(ReadableStream.from, 'from'); + setFunctionName(ReadableStream.prototype.cancel, 'cancel'); + setFunctionName(ReadableStream.prototype.getReader, 'getReader'); + setFunctionName(ReadableStream.prototype.pipeThrough, 'pipeThrough'); + setFunctionName(ReadableStream.prototype.pipeTo, 'pipeTo'); + setFunctionName(ReadableStream.prototype.tee, 'tee'); + setFunctionName(ReadableStream.prototype.values, 'values'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(ReadableStream.prototype, Symbol.toStringTag, { value: 'ReadableStream', configurable: true }); } - if (typeof SymbolPolyfill.asyncIterator === 'symbol') { - Object.defineProperty(ReadableStream.prototype, SymbolPolyfill.asyncIterator, { - value: ReadableStream.prototype.values, - writable: true, - configurable: true - }); - } + Object.defineProperty(ReadableStream.prototype, SymbolAsyncIterator, { + value: ReadableStream.prototype.values, + writable: true, + configurable: true + }); // Abstract operations for the ReadableStream. // Throws if and only if startAlgorithm throws. function CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark = 1, sizeAlgorithm = () => 1) { @@ -13141,10 +13568,11 @@ exports.getUserAgent = getUserAgent; ReadableStreamClose(stream); const reader = stream._reader; if (reader !== undefined && IsReadableStreamBYOBReader(reader)) { - reader._readIntoRequests.forEach(readIntoRequest => { + const readIntoRequests = reader._readIntoRequests; + reader._readIntoRequests = new SimpleQueue(); + readIntoRequests.forEach(readIntoRequest => { readIntoRequest._closeSteps(undefined); }); - reader._readIntoRequests = new SimpleQueue(); } const sourceCancelPromise = stream._readableStreamController[CancelSteps](reason); return transformPromiseWith(sourceCancelPromise, noop); @@ -13157,10 +13585,11 @@ exports.getUserAgent = getUserAgent; } defaultReaderClosedPromiseResolve(reader); if (IsReadableStreamDefaultReader(reader)) { - reader._readRequests.forEach(readRequest => { + const readRequests = reader._readRequests; + reader._readRequests = new SimpleQueue(); + readRequests.forEach(readRequest => { readRequest._closeSteps(); }); - reader._readRequests = new SimpleQueue(); } } function ReadableStreamError(stream, e) { @@ -13172,16 +13601,10 @@ exports.getUserAgent = getUserAgent; } defaultReaderClosedPromiseReject(reader, e); if (IsReadableStreamDefaultReader(reader)) { - reader._readRequests.forEach(readRequest => { - readRequest._errorSteps(e); - }); - reader._readRequests = new SimpleQueue(); + ReadableStreamDefaultReaderErrorReadRequests(reader, e); } else { - reader._readIntoRequests.forEach(readIntoRequest => { - readIntoRequest._errorSteps(e); - }); - reader._readIntoRequests = new SimpleQueue(); + ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e); } } // Helper functions for the ReadableStream. @@ -13202,16 +13625,7 @@ exports.getUserAgent = getUserAgent; const byteLengthSizeFunction = (chunk) => { return chunk.byteLength; }; - try { - Object.defineProperty(byteLengthSizeFunction, 'name', { - value: 'size', - configurable: true - }); - } - catch (_a) { - // This property is non-configurable in older browsers, so ignore if this throws. - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility - } + setFunctionName(byteLengthSizeFunction, 'size'); /** * A queuing strategy that counts the number of bytes in each chunk. * @@ -13246,8 +13660,8 @@ exports.getUserAgent = getUserAgent; highWaterMark: { enumerable: true }, size: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(ByteLengthQueuingStrategy.prototype, SymbolPolyfill.toStringTag, { + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(ByteLengthQueuingStrategy.prototype, Symbol.toStringTag, { value: 'ByteLengthQueuingStrategy', configurable: true }); @@ -13270,16 +13684,7 @@ exports.getUserAgent = getUserAgent; const countSizeFunction = () => { return 1; }; - try { - Object.defineProperty(countSizeFunction, 'name', { - value: 'size', - configurable: true - }); - } - catch (_a) { - // This property is non-configurable in older browsers, so ignore if this throws. - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility - } + setFunctionName(countSizeFunction, 'size'); /** * A queuing strategy that counts the number of chunks. * @@ -13315,8 +13720,8 @@ exports.getUserAgent = getUserAgent; highWaterMark: { enumerable: true }, size: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(CountQueuingStrategy.prototype, SymbolPolyfill.toStringTag, { + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(CountQueuingStrategy.prototype, Symbol.toStringTag, { value: 'CountQueuingStrategy', configurable: true }); @@ -13337,12 +13742,16 @@ exports.getUserAgent = getUserAgent; function convertTransformer(original, context) { assertDictionary(original, context); + const cancel = original === null || original === void 0 ? void 0 : original.cancel; const flush = original === null || original === void 0 ? void 0 : original.flush; const readableType = original === null || original === void 0 ? void 0 : original.readableType; const start = original === null || original === void 0 ? void 0 : original.start; const transform = original === null || original === void 0 ? void 0 : original.transform; const writableType = original === null || original === void 0 ? void 0 : original.writableType; return { + cancel: cancel === undefined ? + undefined : + convertTransformerCancelCallback(cancel, original, `${context} has member 'cancel' that`), flush: flush === undefined ? undefined : convertTransformerFlushCallback(flush, original, `${context} has member 'flush' that`), @@ -13368,6 +13777,10 @@ exports.getUserAgent = getUserAgent; assertFunction(fn, context); return (chunk, controller) => promiseCall(fn, original, [chunk, controller]); } + function convertTransformerCancelCallback(fn, original, context) { + assertFunction(fn, context); + return (reason) => promiseCall(fn, original, [reason]); + } // Class TransformStream /** @@ -13432,8 +13845,8 @@ exports.getUserAgent = getUserAgent; readable: { enumerable: true }, writable: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(TransformStream.prototype, SymbolPolyfill.toStringTag, { + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(TransformStream.prototype, Symbol.toStringTag, { value: 'TransformStream', configurable: true }); @@ -13456,8 +13869,7 @@ exports.getUserAgent = getUserAgent; return TransformStreamDefaultSourcePullAlgorithm(stream); } function cancelAlgorithm(reason) { - TransformStreamErrorWritableAndUnblockWrite(stream, reason); - return promiseResolvedWith(undefined); + return TransformStreamDefaultSourceCancelAlgorithm(stream, reason); } stream._readable = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, readableHighWaterMark, readableSizeAlgorithm); // The [[backpressure]] slot is set to undefined so that it can be initialised by TransformStreamSetBackpressure. @@ -13484,6 +13896,9 @@ exports.getUserAgent = getUserAgent; function TransformStreamErrorWritableAndUnblockWrite(stream, e) { TransformStreamDefaultControllerClearAlgorithms(stream._transformStreamController); WritableStreamDefaultControllerErrorIfNeeded(stream._writable._writableStreamController, e); + TransformStreamUnblockWrite(stream); + } + function TransformStreamUnblockWrite(stream) { if (stream._backpressure) { // Pretend that pull() was called to permit any pending write() calls to complete. TransformStreamSetBackpressure() // cannot be called from enqueue() or pull() once the ReadableStream is errored, so this will will be the final time @@ -13554,8 +13969,11 @@ exports.getUserAgent = getUserAgent; terminate: { enumerable: true }, desiredSize: { enumerable: true } }); - if (typeof SymbolPolyfill.toStringTag === 'symbol') { - Object.defineProperty(TransformStreamDefaultController.prototype, SymbolPolyfill.toStringTag, { + setFunctionName(TransformStreamDefaultController.prototype.enqueue, 'enqueue'); + setFunctionName(TransformStreamDefaultController.prototype.error, 'error'); + setFunctionName(TransformStreamDefaultController.prototype.terminate, 'terminate'); + if (typeof Symbol.toStringTag === 'symbol') { + Object.defineProperty(TransformStreamDefaultController.prototype, Symbol.toStringTag, { value: 'TransformStreamDefaultController', configurable: true }); @@ -13570,35 +13988,53 @@ exports.getUserAgent = getUserAgent; } return x instanceof TransformStreamDefaultController; } - function SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm) { + function SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm, cancelAlgorithm) { controller._controlledTransformStream = stream; stream._transformStreamController = controller; controller._transformAlgorithm = transformAlgorithm; controller._flushAlgorithm = flushAlgorithm; + controller._cancelAlgorithm = cancelAlgorithm; + controller._finishPromise = undefined; + controller._finishPromise_resolve = undefined; + controller._finishPromise_reject = undefined; } function SetUpTransformStreamDefaultControllerFromTransformer(stream, transformer) { const controller = Object.create(TransformStreamDefaultController.prototype); - let transformAlgorithm = (chunk) => { - try { - TransformStreamDefaultControllerEnqueue(controller, chunk); - return promiseResolvedWith(undefined); - } - catch (transformResultE) { - return promiseRejectedWith(transformResultE); - } - }; - let flushAlgorithm = () => promiseResolvedWith(undefined); + let transformAlgorithm; + let flushAlgorithm; + let cancelAlgorithm; if (transformer.transform !== undefined) { transformAlgorithm = chunk => transformer.transform(chunk, controller); } + else { + transformAlgorithm = chunk => { + try { + TransformStreamDefaultControllerEnqueue(controller, chunk); + return promiseResolvedWith(undefined); + } + catch (transformResultE) { + return promiseRejectedWith(transformResultE); + } + }; + } if (transformer.flush !== undefined) { flushAlgorithm = () => transformer.flush(controller); } - SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm); + else { + flushAlgorithm = () => promiseResolvedWith(undefined); + } + if (transformer.cancel !== undefined) { + cancelAlgorithm = reason => transformer.cancel(reason); + } + else { + cancelAlgorithm = () => promiseResolvedWith(undefined); + } + SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm, cancelAlgorithm); } function TransformStreamDefaultControllerClearAlgorithms(controller) { controller._transformAlgorithm = undefined; controller._flushAlgorithm = undefined; + controller._cancelAlgorithm = undefined; } function TransformStreamDefaultControllerEnqueue(controller, chunk) { const stream = controller._controlledTransformStream; @@ -13655,27 +14091,66 @@ exports.getUserAgent = getUserAgent; return TransformStreamDefaultControllerPerformTransform(controller, chunk); } function TransformStreamDefaultSinkAbortAlgorithm(stream, reason) { - // abort() is not called synchronously, so it is possible for abort() to be called when the stream is already - // errored. - TransformStreamError(stream, reason); - return promiseResolvedWith(undefined); + const controller = stream._transformStreamController; + if (controller._finishPromise !== undefined) { + return controller._finishPromise; + } + // stream._readable cannot change after construction, so caching it across a call to user code is safe. + const readable = stream._readable; + // Assign the _finishPromise now so that if _cancelAlgorithm calls readable.cancel() internally, + // we don't run the _cancelAlgorithm again. + controller._finishPromise = newPromise((resolve, reject) => { + controller._finishPromise_resolve = resolve; + controller._finishPromise_reject = reject; + }); + const cancelPromise = controller._cancelAlgorithm(reason); + TransformStreamDefaultControllerClearAlgorithms(controller); + uponPromise(cancelPromise, () => { + if (readable._state === 'errored') { + defaultControllerFinishPromiseReject(controller, readable._storedError); + } + else { + ReadableStreamDefaultControllerError(readable._readableStreamController, reason); + defaultControllerFinishPromiseResolve(controller); + } + return null; + }, r => { + ReadableStreamDefaultControllerError(readable._readableStreamController, r); + defaultControllerFinishPromiseReject(controller, r); + return null; + }); + return controller._finishPromise; } function TransformStreamDefaultSinkCloseAlgorithm(stream) { + const controller = stream._transformStreamController; + if (controller._finishPromise !== undefined) { + return controller._finishPromise; + } // stream._readable cannot change after construction, so caching it across a call to user code is safe. const readable = stream._readable; - const controller = stream._transformStreamController; + // Assign the _finishPromise now so that if _flushAlgorithm calls readable.cancel() internally, + // we don't also run the _cancelAlgorithm. + controller._finishPromise = newPromise((resolve, reject) => { + controller._finishPromise_resolve = resolve; + controller._finishPromise_reject = reject; + }); const flushPromise = controller._flushAlgorithm(); TransformStreamDefaultControllerClearAlgorithms(controller); - // Return a promise that is fulfilled with undefined on success. - return transformPromiseWith(flushPromise, () => { + uponPromise(flushPromise, () => { if (readable._state === 'errored') { - throw readable._storedError; + defaultControllerFinishPromiseReject(controller, readable._storedError); } - ReadableStreamDefaultControllerClose(readable._readableStreamController); + else { + ReadableStreamDefaultControllerClose(readable._readableStreamController); + defaultControllerFinishPromiseResolve(controller); + } + return null; }, r => { - TransformStreamError(stream, r); - throw readable._storedError; + ReadableStreamDefaultControllerError(readable._readableStreamController, r); + defaultControllerFinishPromiseReject(controller, r); + return null; }); + return controller._finishPromise; } // TransformStreamDefaultSource Algorithms function TransformStreamDefaultSourcePullAlgorithm(stream) { @@ -13684,10 +14159,61 @@ exports.getUserAgent = getUserAgent; // Prevent the next pull() call until there is backpressure. return stream._backpressureChangePromise; } + function TransformStreamDefaultSourceCancelAlgorithm(stream, reason) { + const controller = stream._transformStreamController; + if (controller._finishPromise !== undefined) { + return controller._finishPromise; + } + // stream._writable cannot change after construction, so caching it across a call to user code is safe. + const writable = stream._writable; + // Assign the _finishPromise now so that if _flushAlgorithm calls writable.abort() or + // writable.cancel() internally, we don't run the _cancelAlgorithm again, or also run the + // _flushAlgorithm. + controller._finishPromise = newPromise((resolve, reject) => { + controller._finishPromise_resolve = resolve; + controller._finishPromise_reject = reject; + }); + const cancelPromise = controller._cancelAlgorithm(reason); + TransformStreamDefaultControllerClearAlgorithms(controller); + uponPromise(cancelPromise, () => { + if (writable._state === 'errored') { + defaultControllerFinishPromiseReject(controller, writable._storedError); + } + else { + WritableStreamDefaultControllerErrorIfNeeded(writable._writableStreamController, reason); + TransformStreamUnblockWrite(stream); + defaultControllerFinishPromiseResolve(controller); + } + return null; + }, r => { + WritableStreamDefaultControllerErrorIfNeeded(writable._writableStreamController, r); + TransformStreamUnblockWrite(stream); + defaultControllerFinishPromiseReject(controller, r); + return null; + }); + return controller._finishPromise; + } // Helper functions for the TransformStreamDefaultController. function defaultControllerBrandCheckException(name) { return new TypeError(`TransformStreamDefaultController.prototype.${name} can only be used on a TransformStreamDefaultController`); } + function defaultControllerFinishPromiseResolve(controller) { + if (controller._finishPromise_resolve === undefined) { + return; + } + controller._finishPromise_resolve(); + controller._finishPromise_resolve = undefined; + controller._finishPromise_reject = undefined; + } + function defaultControllerFinishPromiseReject(controller, reason) { + if (controller._finishPromise_reject === undefined) { + return; + } + setPromiseIsHandledToTrue(controller._finishPromise); + controller._finishPromise_reject(reason); + controller._finishPromise_resolve = undefined; + controller._finishPromise_reject = undefined; + } // Helper functions for the TransformStream. function streamBrandCheckException(name) { return new TypeError(`TransformStream.prototype.${name} can only be used on a TransformStream`); @@ -13707,9 +14233,7 @@ exports.getUserAgent = getUserAgent; exports.WritableStreamDefaultController = WritableStreamDefaultController; exports.WritableStreamDefaultWriter = WritableStreamDefaultWriter; - Object.defineProperty(exports, '__esModule', { value: true }); - -}))); +})); //# sourceMappingURL=ponyfill.es2018.js.map @@ -13767,11 +14291,9 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); const github_1 = __nccwpck_require__(5438); const openai_1 = __importDefault(__nccwpck_require__(47)); const CONST_1 = __importDefault(__nccwpck_require__(9873)); -// @ts-ignore - process is not imported const OpenAI = new openai_1.default({ apiKey: process.env.OPENAI_API_KEY }); async function processIssueCommentEdit(octokit) { const payload = github_1.context.payload; - // @ts-ignore - process is not imported const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; // check if the issue is open and the has labels if (payload.issue?.state !== 'open' && !payload.issue?.labels.some((issueLabel) => issueLabel.name === CONST_1.default.LABELS.HELP_WANTED)) { @@ -13785,6 +14307,7 @@ async function processIssueCommentEdit(octokit) { const content = `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body?.from}.\n\nEdited comment content: ${payload.comment?.body}`; // create thread with first user message and run it const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ + /* eslint-disable @typescript-eslint/naming-convention */ assistant_id: OPENAI_ASSISTANT_ID ?? '', thread: { messages: [{ role: 'user', content }] }, }); @@ -13794,9 +14317,9 @@ async function processIssueCommentEdit(octokit) { const intervalID = setInterval(() => { OpenAI.beta.threads.runs .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) - .then((run) => { + .then((threadRun) => { // return if run is not completed yet - if (run.status !== 'completed') { + if (threadRun.status !== 'completed') { console.log('issue_comment.edited - run pending completion'); return; } @@ -13806,9 +14329,8 @@ async function processIssueCommentEdit(octokit) { .then((threadMessages) => { // list thread messages content threadMessages.data.forEach((message, index) => { - // @ts-ignore - we do have text value in content[0] but typescript doesn't know that - // this is a 'openai' package type issue - let assistantResponse = message.content?.[index]?.text?.value; + // @ts-expect-error - we do have `text` in content[0] but typescript doesn't know that this is a 'openai' package type issue + const assistantResponse = message.content?.[index]?.text?.value; console.log('issue_comment.edited - assistantResponse', assistantResponse); if (!assistantResponse) { return console.log('issue_comment.edited - assistantResponse is empty'); @@ -13829,14 +14351,15 @@ async function processIssueCommentEdit(octokit) { // bot related action keyword let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC - const date = new Date(payload.comment?.updated_at); - const formattedDate = date.toISOString()?.split('.')?.[0]?.replace('T', ' ') + ' UTC'; + const date = new Date(payload.comment?.updated_at ?? ''); + const formattedDate = `${date.toISOString()?.split('.')?.[0]?.replace('T', ' ')} UTC`; extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment?.id}`); - return octokit.issues.updateComment({ + octokit.issues.updateComment({ ...github_1.context.repo, - comment_id: payload.comment?.id, - body: `${extractedNotice}\n\n` + payload.comment?.body, + /* eslint-disable @typescript-eslint/naming-convention */ + comment_id: payload.comment?.id ?? -1, + body: `${extractedNotice}\n\n${payload.comment?.body}`, }); } return false; @@ -13853,13 +14376,12 @@ async function processIssueCommentEdit(octokit) { }, 1500); } async function run() { - // @ts-ignore - process is not imported + // @ts-expect-error - process is not imported const octokit = (0, github_1.getOctokit)(process.env.GITHUB_TOKEN); await processIssueCommentEdit(octokit); } run().catch((error) => { console.error(error); - // @ts-ignore - process is not imported process.exit(1); }); diff --git a/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts b/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts index 3770f0293743..3c84262a6387 100644 --- a/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts +++ b/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts @@ -3,12 +3,10 @@ import InitOpenAI from 'openai'; import CONST from '@github/libs/CONST'; import type {GitHubType} from '@github/libs/GithubUtils'; -// @ts-ignore - process is not imported const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); async function processIssueCommentEdit(octokit: InstanceType) { const payload = context.payload; - // @ts-ignore - process is not imported const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; // check if the issue is open and the has labels @@ -26,6 +24,7 @@ async function processIssueCommentEdit(octokit: InstanceType) // create thread with first user message and run it const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ + /* eslint-disable @typescript-eslint/naming-convention */ assistant_id: OPENAI_ASSISTANT_ID ?? '', thread: {messages: [{role: 'user', content}]}, }); @@ -36,9 +35,9 @@ async function processIssueCommentEdit(octokit: InstanceType) const intervalID = setInterval(() => { OpenAI.beta.threads.runs .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) - .then((run) => { + .then((threadRun) => { // return if run is not completed yet - if (run.status !== 'completed') { + if (threadRun.status !== 'completed') { console.log('issue_comment.edited - run pending completion'); return; } @@ -49,9 +48,8 @@ async function processIssueCommentEdit(octokit: InstanceType) .then((threadMessages) => { // list thread messages content threadMessages.data.forEach((message, index) => { - // @ts-ignore - we do have text value in content[0] but typescript doesn't know that - // this is a 'openai' package type issue - let assistantResponse = message.content?.[index]?.text?.value; + // @ts-expect-error - we do have `text` in content[0] but typescript doesn't know that this is a 'openai' package type issue + const assistantResponse = message.content?.[index]?.text?.value; console.log('issue_comment.edited - assistantResponse', assistantResponse); if (!assistantResponse) { @@ -75,15 +73,16 @@ async function processIssueCommentEdit(octokit: InstanceType) // bot related action keyword let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC - const date = new Date(payload.comment?.updated_at); - const formattedDate = date.toISOString()?.split('.')?.[0]?.replace('T', ' ') + ' UTC'; + const date = new Date(payload.comment?.updated_at as string ?? ''); + const formattedDate = `${date.toISOString()?.split('.')?.[0]?.replace('T', ' ')} UTC`; extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment?.id}`); - return octokit.issues.updateComment({ + octokit.issues.updateComment({ ...context.repo, - comment_id: payload.comment?.id as number, - body: `${extractedNotice}\n\n` + payload.comment?.body, + /* eslint-disable @typescript-eslint/naming-convention */ + comment_id: payload.comment?.id ?? -1, + body: `${extractedNotice}\n\n${payload.comment?.body}`, }); } @@ -104,13 +103,12 @@ async function processIssueCommentEdit(octokit: InstanceType) } async function run() { - // @ts-ignore - process is not imported + // @ts-expect-error - process is not imported const octokit: InstanceType = getOctokit(process.env.GITHUB_TOKEN); await processIssueCommentEdit(octokit); } run().catch((error) => { console.error(error); - // @ts-ignore - process is not imported process.exit(1); }); From a85b61fe6a689b4a3e1827401d8807c6a52e7408 Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Sat, 25 May 2024 17:08:48 -0700 Subject: [PATCH 07/22] prettier --- .../proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts b/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts index 3c84262a6387..cbbe75f35e59 100644 --- a/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts +++ b/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts @@ -73,7 +73,7 @@ async function processIssueCommentEdit(octokit: InstanceType) // bot related action keyword let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC - const date = new Date(payload.comment?.updated_at as string ?? ''); + const date = new Date((payload.comment?.updated_at as string) ?? ''); const formattedDate = `${date.toISOString()?.split('.')?.[0]?.replace('T', ' ')} UTC`; extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); From 00b8d890933f0794c998383bf60a16584ef452af Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Tue, 28 May 2024 13:53:25 -0700 Subject: [PATCH 08/22] github actions build --- .github/actions/javascript/authorChecklist/index.js | 2 ++ .github/actions/javascript/awaitStagingDeploys/index.js | 2 ++ .github/actions/javascript/checkDeployBlockers/index.js | 2 ++ .github/actions/javascript/createOrUpdateStagingDeploy/index.js | 2 ++ .github/actions/javascript/getArtifactInfo/index.js | 2 ++ .github/actions/javascript/getDeployPullRequestList/index.js | 2 ++ .github/actions/javascript/getPullRequestDetails/index.js | 2 ++ .github/actions/javascript/getReleaseBody/index.js | 2 ++ .github/actions/javascript/isStagingDeployLocked/index.js | 2 ++ .github/actions/javascript/markPullRequestsAsDeployed/index.js | 2 ++ .github/actions/javascript/postTestBuildComment/index.js | 2 ++ .github/actions/javascript/reopenIssueWithComment/index.js | 2 ++ .github/actions/javascript/reviewerChecklist/index.js | 2 ++ .github/actions/javascript/verifySignedCommits/index.js | 2 ++ 14 files changed, 28 insertions(+) diff --git a/.github/actions/javascript/authorChecklist/index.js b/.github/actions/javascript/authorChecklist/index.js index 337fe7398fb3..ec80f0012295 100644 --- a/.github/actions/javascript/authorChecklist/index.js +++ b/.github/actions/javascript/authorChecklist/index.js @@ -17016,6 +17016,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), @@ -17062,6 +17063,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GitHubType = void 0; /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ const core = __importStar(__nccwpck_require__(2186)); const utils_1 = __nccwpck_require__(3030); diff --git a/.github/actions/javascript/awaitStagingDeploys/index.js b/.github/actions/javascript/awaitStagingDeploys/index.js index 0e0168fdb7ae..2f1ee7b18ae1 100644 --- a/.github/actions/javascript/awaitStagingDeploys/index.js +++ b/.github/actions/javascript/awaitStagingDeploys/index.js @@ -12257,6 +12257,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), @@ -12303,6 +12304,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GitHubType = void 0; /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ const core = __importStar(__nccwpck_require__(2186)); const utils_1 = __nccwpck_require__(3030); diff --git a/.github/actions/javascript/checkDeployBlockers/index.js b/.github/actions/javascript/checkDeployBlockers/index.js index 842deb1cbb5d..df25d10b640e 100644 --- a/.github/actions/javascript/checkDeployBlockers/index.js +++ b/.github/actions/javascript/checkDeployBlockers/index.js @@ -11540,6 +11540,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), @@ -11586,6 +11587,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GitHubType = void 0; /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ const core = __importStar(__nccwpck_require__(2186)); const utils_1 = __nccwpck_require__(3030); diff --git a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js index 127fb1fe3dca..61ea6361a951 100644 --- a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js +++ b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js @@ -14352,6 +14352,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), @@ -14556,6 +14557,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GitHubType = void 0; /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ const core = __importStar(__nccwpck_require__(2186)); const utils_1 = __nccwpck_require__(3030); diff --git a/.github/actions/javascript/getArtifactInfo/index.js b/.github/actions/javascript/getArtifactInfo/index.js index 77f61f491fec..844e684cc951 100644 --- a/.github/actions/javascript/getArtifactInfo/index.js +++ b/.github/actions/javascript/getArtifactInfo/index.js @@ -11501,6 +11501,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), @@ -11547,6 +11548,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GitHubType = void 0; /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ const core = __importStar(__nccwpck_require__(2186)); const utils_1 = __nccwpck_require__(3030); diff --git a/.github/actions/javascript/getDeployPullRequestList/index.js b/.github/actions/javascript/getDeployPullRequestList/index.js index 8f9f9deea896..1de4caebdc33 100644 --- a/.github/actions/javascript/getDeployPullRequestList/index.js +++ b/.github/actions/javascript/getDeployPullRequestList/index.js @@ -11616,6 +11616,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), @@ -11820,6 +11821,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GitHubType = void 0; /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ const core = __importStar(__nccwpck_require__(2186)); const utils_1 = __nccwpck_require__(3030); diff --git a/.github/actions/javascript/getPullRequestDetails/index.js b/.github/actions/javascript/getPullRequestDetails/index.js index 14814367e3cd..515eb046a964 100644 --- a/.github/actions/javascript/getPullRequestDetails/index.js +++ b/.github/actions/javascript/getPullRequestDetails/index.js @@ -11603,6 +11603,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), @@ -11649,6 +11650,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GitHubType = void 0; /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ const core = __importStar(__nccwpck_require__(2186)); const utils_1 = __nccwpck_require__(3030); diff --git a/.github/actions/javascript/getReleaseBody/index.js b/.github/actions/javascript/getReleaseBody/index.js index 6c746e26a4a4..40dfc9b61d46 100644 --- a/.github/actions/javascript/getReleaseBody/index.js +++ b/.github/actions/javascript/getReleaseBody/index.js @@ -11547,6 +11547,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), @@ -11593,6 +11594,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GitHubType = void 0; /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ const core = __importStar(__nccwpck_require__(2186)); const utils_1 = __nccwpck_require__(3030); diff --git a/.github/actions/javascript/isStagingDeployLocked/index.js b/.github/actions/javascript/isStagingDeployLocked/index.js index f71b89dc051c..2d7d619037cd 100644 --- a/.github/actions/javascript/isStagingDeployLocked/index.js +++ b/.github/actions/javascript/isStagingDeployLocked/index.js @@ -11501,6 +11501,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), @@ -11547,6 +11548,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GitHubType = void 0; /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ const core = __importStar(__nccwpck_require__(2186)); const utils_1 = __nccwpck_require__(3030); diff --git a/.github/actions/javascript/markPullRequestsAsDeployed/index.js b/.github/actions/javascript/markPullRequestsAsDeployed/index.js index 804d3ea610f3..303265af71c7 100644 --- a/.github/actions/javascript/markPullRequestsAsDeployed/index.js +++ b/.github/actions/javascript/markPullRequestsAsDeployed/index.js @@ -11698,6 +11698,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), @@ -11744,6 +11745,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GitHubType = void 0; /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ const core = __importStar(__nccwpck_require__(2186)); const utils_1 = __nccwpck_require__(3030); diff --git a/.github/actions/javascript/postTestBuildComment/index.js b/.github/actions/javascript/postTestBuildComment/index.js index 0b8eb29f1750..d9fac87133bb 100644 --- a/.github/actions/javascript/postTestBuildComment/index.js +++ b/.github/actions/javascript/postTestBuildComment/index.js @@ -11600,6 +11600,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), @@ -11646,6 +11647,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GitHubType = void 0; /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ const core = __importStar(__nccwpck_require__(2186)); const utils_1 = __nccwpck_require__(3030); diff --git a/.github/actions/javascript/reopenIssueWithComment/index.js b/.github/actions/javascript/reopenIssueWithComment/index.js index d4341ce37dc4..6e2504ab30e2 100644 --- a/.github/actions/javascript/reopenIssueWithComment/index.js +++ b/.github/actions/javascript/reopenIssueWithComment/index.js @@ -11511,6 +11511,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), @@ -11557,6 +11558,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GitHubType = void 0; /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ const core = __importStar(__nccwpck_require__(2186)); const utils_1 = __nccwpck_require__(3030); diff --git a/.github/actions/javascript/reviewerChecklist/index.js b/.github/actions/javascript/reviewerChecklist/index.js index cc1c0b5a581b..1173dae0557f 100644 --- a/.github/actions/javascript/reviewerChecklist/index.js +++ b/.github/actions/javascript/reviewerChecklist/index.js @@ -11603,6 +11603,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), @@ -11649,6 +11650,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GitHubType = void 0; /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ const core = __importStar(__nccwpck_require__(2186)); const utils_1 = __nccwpck_require__(3030); diff --git a/.github/actions/javascript/verifySignedCommits/index.js b/.github/actions/javascript/verifySignedCommits/index.js index aea35331b1d0..032c4b34547e 100644 --- a/.github/actions/javascript/verifySignedCommits/index.js +++ b/.github/actions/javascript/verifySignedCommits/index.js @@ -11543,6 +11543,7 @@ const CONST = { STAGING_DEPLOY: 'StagingDeployCash', DEPLOY_BLOCKER: 'DeployBlockerCash', INTERNAL_QA: 'InternalQA', + HELP_WANTED: 'Help Wanted', }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), @@ -11589,6 +11590,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GitHubType = void 0; /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ const core = __importStar(__nccwpck_require__(2186)); const utils_1 = __nccwpck_require__(3030); From bf2f25284f79fe210584342c83af574eae2326aa Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Tue, 28 May 2024 14:13:07 -0700 Subject: [PATCH 09/22] updated actions/ version --- .github/workflows/proposalPolice.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/proposalPolice.yml b/.github/workflows/proposalPolice.yml index 01d468e4a90a..c01ef2d504d6 100644 --- a/.github/workflows/proposalPolice.yml +++ b/.github/workflows/proposalPolice.yml @@ -7,10 +7,10 @@ jobs: proposal-police-workflow: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v4 - name: Setup node version - uses: actions/setup-node@v2 + uses: actions/setup-node@v4 with: node-version: "20" From a94954859e4f1bc78d1c810c2c461f1e0b8b5a08 Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Tue, 28 May 2024 14:21:49 -0700 Subject: [PATCH 10/22] fixed action.yml errors --- .github/actions/javascript/proposalPoliceComment/action.yml | 3 --- .../actions/javascript/proposalPoliceCommentEdit/action.yml | 3 --- 2 files changed, 6 deletions(-) diff --git a/.github/actions/javascript/proposalPoliceComment/action.yml b/.github/actions/javascript/proposalPoliceComment/action.yml index fb3667570553..e50cb90446cb 100644 --- a/.github/actions/javascript/proposalPoliceComment/action.yml +++ b/.github/actions/javascript/proposalPoliceComment/action.yml @@ -13,6 +13,3 @@ inputs: runs: using: 'node20' main: './index.js' - env: - ISSUE: '${{ toJson(github.event.issue) }}' - COMMENT: '${{ toJson(github.event.comment) }}' diff --git a/.github/actions/javascript/proposalPoliceCommentEdit/action.yml b/.github/actions/javascript/proposalPoliceCommentEdit/action.yml index 937ad513d103..6357b3b8d607 100644 --- a/.github/actions/javascript/proposalPoliceCommentEdit/action.yml +++ b/.github/actions/javascript/proposalPoliceCommentEdit/action.yml @@ -13,6 +13,3 @@ inputs: runs: using: 'node20' main: './index.js' - env: - ISSUE: '${{ toJson(github.event.issue) }}' - COMMENT: '${{ toJson(github.event.comment) }}' From 98dd06c6b7f2b28c2d2a2740fa896382d38b54dd Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Thu, 30 May 2024 17:29:36 -0700 Subject: [PATCH 11/22] refactoring 3.0: OpenAIUtils, one action, constants --- .../javascript/authorChecklist/index.js | 6 + .../javascript/awaitStagingDeploys/index.js | 6 + .../javascript/checkDeployBlockers/index.js | 6 + .../createOrUpdateStagingDeploy/index.js | 6 + .../javascript/getArtifactInfo/index.js | 6 + .../getDeployPullRequestList/index.js | 6 + .../javascript/getPullRequestDetails/index.js | 6 + .../javascript/getReleaseBody/index.js | 6 + .../javascript/isStagingDeployLocked/index.js | 6 + .../markPullRequestsAsDeployed/index.js | 6 + .../javascript/postTestBuildComment/index.js | 6 + .../proposalPoliceComment/action.yml | 4 +- .../javascript/proposalPoliceComment/index.js | 465 +- .../proposalPoliceComment.ts | 104 +- .../proposalPoliceCommentEdit/action.yml | 15 - .../proposalPoliceCommentEdit/index.js | 21491 ---------------- .../proposalPoliceCommentEdit.ts | 114 - .../reopenIssueWithComment/index.js | 6 + .../javascript/reviewerChecklist/index.js | 6 + .../javascript/verifySignedCommits/index.js | 6 + .github/libs/CONST.ts | 6 + .github/libs/OpenAIUtils.ts | 198 + .github/scripts/buildActions.sh | 1 - .github/workflows/proposalPolice.yml | 18 +- package-lock.json | 173 +- package.json | 4 +- 26 files changed, 819 insertions(+), 21858 deletions(-) delete mode 100644 .github/actions/javascript/proposalPoliceCommentEdit/action.yml delete mode 100644 .github/actions/javascript/proposalPoliceCommentEdit/index.js delete mode 100644 .github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts create mode 100644 .github/libs/OpenAIUtils.ts diff --git a/.github/actions/javascript/authorChecklist/index.js b/.github/actions/javascript/authorChecklist/index.js index ec80f0012295..9861f3b5d38d 100644 --- a/.github/actions/javascript/authorChecklist/index.js +++ b/.github/actions/javascript/authorChecklist/index.js @@ -17018,6 +17018,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -17025,6 +17029,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; diff --git a/.github/actions/javascript/awaitStagingDeploys/index.js b/.github/actions/javascript/awaitStagingDeploys/index.js index 2f1ee7b18ae1..e27fb6990074 100644 --- a/.github/actions/javascript/awaitStagingDeploys/index.js +++ b/.github/actions/javascript/awaitStagingDeploys/index.js @@ -12259,6 +12259,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -12266,6 +12270,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; diff --git a/.github/actions/javascript/checkDeployBlockers/index.js b/.github/actions/javascript/checkDeployBlockers/index.js index df25d10b640e..99639a58a9dd 100644 --- a/.github/actions/javascript/checkDeployBlockers/index.js +++ b/.github/actions/javascript/checkDeployBlockers/index.js @@ -11542,6 +11542,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -11549,6 +11553,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; diff --git a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js index 61ea6361a951..816f8f4d6c57 100644 --- a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js +++ b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js @@ -14354,6 +14354,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -14361,6 +14365,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; diff --git a/.github/actions/javascript/getArtifactInfo/index.js b/.github/actions/javascript/getArtifactInfo/index.js index 844e684cc951..0036f7fcb0ca 100644 --- a/.github/actions/javascript/getArtifactInfo/index.js +++ b/.github/actions/javascript/getArtifactInfo/index.js @@ -11503,6 +11503,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -11510,6 +11514,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; diff --git a/.github/actions/javascript/getDeployPullRequestList/index.js b/.github/actions/javascript/getDeployPullRequestList/index.js index 1de4caebdc33..27b3df798f33 100644 --- a/.github/actions/javascript/getDeployPullRequestList/index.js +++ b/.github/actions/javascript/getDeployPullRequestList/index.js @@ -11618,6 +11618,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -11625,6 +11629,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; diff --git a/.github/actions/javascript/getPullRequestDetails/index.js b/.github/actions/javascript/getPullRequestDetails/index.js index 515eb046a964..66507b031164 100644 --- a/.github/actions/javascript/getPullRequestDetails/index.js +++ b/.github/actions/javascript/getPullRequestDetails/index.js @@ -11605,6 +11605,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -11612,6 +11616,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; diff --git a/.github/actions/javascript/getReleaseBody/index.js b/.github/actions/javascript/getReleaseBody/index.js index 40dfc9b61d46..afc786066526 100644 --- a/.github/actions/javascript/getReleaseBody/index.js +++ b/.github/actions/javascript/getReleaseBody/index.js @@ -11549,6 +11549,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -11556,6 +11560,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; diff --git a/.github/actions/javascript/isStagingDeployLocked/index.js b/.github/actions/javascript/isStagingDeployLocked/index.js index 2d7d619037cd..02c1424c229a 100644 --- a/.github/actions/javascript/isStagingDeployLocked/index.js +++ b/.github/actions/javascript/isStagingDeployLocked/index.js @@ -11503,6 +11503,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -11510,6 +11514,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; diff --git a/.github/actions/javascript/markPullRequestsAsDeployed/index.js b/.github/actions/javascript/markPullRequestsAsDeployed/index.js index 303265af71c7..c84eb008e5a2 100644 --- a/.github/actions/javascript/markPullRequestsAsDeployed/index.js +++ b/.github/actions/javascript/markPullRequestsAsDeployed/index.js @@ -11700,6 +11700,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -11707,6 +11711,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; diff --git a/.github/actions/javascript/postTestBuildComment/index.js b/.github/actions/javascript/postTestBuildComment/index.js index d9fac87133bb..e9ba6fb92b94 100644 --- a/.github/actions/javascript/postTestBuildComment/index.js +++ b/.github/actions/javascript/postTestBuildComment/index.js @@ -11602,6 +11602,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -11609,6 +11613,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; diff --git a/.github/actions/javascript/proposalPoliceComment/action.yml b/.github/actions/javascript/proposalPoliceComment/action.yml index e50cb90446cb..829b3efbf256 100644 --- a/.github/actions/javascript/proposalPoliceComment/action.yml +++ b/.github/actions/javascript/proposalPoliceComment/action.yml @@ -1,5 +1,5 @@ -name: 'ProposalPolice™ Comment Check' -description: 'Verifies whether a proposal comment follows the template' +name: 'ProposalPolice™ Comment Check Script' +description: 'Verifies whether a proposal comment follows the template OR an updated proposal had substantial changes' inputs: GITHUB_TOKEN: description: 'Auth token for New Expensify Github' diff --git a/.github/actions/javascript/proposalPoliceComment/index.js b/.github/actions/javascript/proposalPoliceComment/index.js index 9a4f7cbe67cd..b50fb8619caa 100644 --- a/.github/actions/javascript/proposalPoliceComment/index.js +++ b/.github/actions/javascript/proposalPoliceComment/index.js @@ -14284,6 +14284,29 @@ function wrappy (fn, cb) { "use strict"; +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; @@ -14291,6 +14314,7 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); const github_1 = __nccwpck_require__(5438); const openai_1 = __importDefault(__nccwpck_require__(47)); const CONST_1 = __importDefault(__nccwpck_require__(9873)); +const OpenAIUtils = __importStar(__nccwpck_require__(3)); const OpenAI = new openai_1.default({ apiKey: process.env.OPENAI_API_KEY }); async function processIssueComment(octokit) { const payload = github_1.context.payload; @@ -14300,84 +14324,38 @@ async function processIssueComment(octokit) { return; } if (!OPENAI_ASSISTANT_ID) { - console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); + console.error('OPENAI_ASSISTANT_ID missing from the environment variables'); + return; + } + if (!payload.comment?.body.trim()) { + return; + } + console.log('Action triggered for comment:', payload.comment?.body); + let content = ''; + console.log('-> GitHub Action Type: ', payload.action?.toUpperCase()); + if (payload.action === CONST_1.default.ACTIONS.CREATED) { + content = `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "${CONST_1.default.NO_ACTION}" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment?.body}`; + } + else if (payload.action === CONST_1.default.ACTIONS.EDIT) { + content = `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "${CONST_1.default.NO_ACTION}" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body?.from}.\n\nEdited comment content: ${payload.comment?.body}`; + } + if (content === '') { + console.log('Early return - Comment body content is empty.'); return; } - // 1, check if comment is proposal and if proposal template is followed - const content = `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment?.body}`; + console.log('Comment body content for assistant:', content); // create thread with first user message and run it const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ /* eslint-disable @typescript-eslint/naming-convention */ assistant_id: OPENAI_ASSISTANT_ID ?? '', thread: { messages: [{ role: 'user', content }] }, }); - // count calls for debug purposes - let count = 0; - // poll for run completion - const intervalID = setInterval(() => { - OpenAI.beta.threads.runs - .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) - .then((threadRun) => { - // return if run is not completed - if (threadRun.status !== 'completed') { - return; - } - // get assistant response - OpenAI.beta.threads.messages - .list(createAndRunResponse.thread_id) - .then((threadMessages) => { - // list thread messages content - threadMessages.data.forEach((message, index) => { - // @ts-expect-error - we do have `text` in content[0] but typescript doesn't know that this is an 'openai' package type issue - let assistantResponse = message.content?.[index]?.text?.value; - console.log('issue_comment.created - assistantResponse', assistantResponse); - if (!assistantResponse) { - return console.log('issue_comment.created - assistantResponse is empty'); - } - // check if assistant response is either NO_ACTION or "NO_ACTION" strings - // as sometimes the assistant response varies - const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; - // if assistant response is NO_ACTION or message role is 'user', do nothing - if (isNoAction || threadMessages.data?.[index]?.role === 'user') { - if (threadMessages.data?.[index]?.role === 'user') { - return; - } - return console.log('issue_comment.created - NO_ACTION'); - } - // if the assistant responded with no action but there's some context in the response - if (assistantResponse.includes('[NO_ACTION]')) { - // extract the text after [NO_ACTION] from assistantResponse since this is a - // bot related action keyword - const noActionContext = assistantResponse.split('[NO_ACTION] ')?.[1]?.replace('"', ''); - console.log('issue_comment.created - [NO_ACTION] w/ context: ', noActionContext); - return; - } - // replace {user} from response template with @username - assistantResponse = assistantResponse.replace('{user}', `@${payload.comment?.user.login}`); - // replace {proposalLink} from response template with the link to the comment - assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment?.html_url); - // remove any double quotes from the final comment because sometimes the assistant's - // response contains double quotes / sometimes it doesn't - assistantResponse = assistantResponse.replace('"', ''); - // create a comment with the assistant's response - console.log('issue_comment.created - proposal-police posts comment'); - octokit.issues.createComment({ - ...github_1.context.repo, - /* eslint-disable @typescript-eslint/naming-convention */ - issue_number: payload.issue?.number ?? -1, - body: assistantResponse, - }); - }); - }) - .catch((error) => console.log('threads.messages.list - error', error)); - // stop polling - clearInterval(intervalID); - }) - .catch((error) => console.log('threads.runs.retrieve - error', error)); - // increment count for every threads.runs.retrieve call - count++; - console.log('threads.runs.retrieve - called:', count); - }, 1500); + if (payload.action === CONST_1.default.ACTIONS.CREATED) { + await OpenAIUtils.prompt({ createAndRunResponse, payload, octokit }); + } + else if (payload.action === CONST_1.default.ACTIONS.EDIT) { + await OpenAIUtils.promptEdit({ createAndRunResponse, payload, octokit }); + } } // Main function to process the workflow event async function run() { @@ -14414,6 +14392,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -14421,10 +14403,197 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; +/***/ }), + +/***/ 3: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.promptEdit = exports.prompt = void 0; +const github_1 = __nccwpck_require__(5438); +const openai_1 = __importDefault(__nccwpck_require__(47)); +const CONST_1 = __importDefault(__nccwpck_require__(9873)); +const OpenAI = new openai_1.default({ apiKey: process.env.OPENAI_API_KEY }); +async function prompt({ createAndRunResponse, payload, octokit }) { + return new Promise((resolve, reject) => { + // count calls for debug purposes + let count = 0; + // poll for run completion + const intervalID = setInterval(() => { + OpenAI.beta.threads.runs + .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) + .then((threadRun) => { + // return if run is not completed + if (threadRun.status !== 'completed') { + return; + } + // get assistant response + OpenAI.beta.threads.messages + .list(createAndRunResponse.thread_id) + .then((threadMessages) => { + // list thread messages content + threadMessages.data.forEach((message, index) => { + // @ts-expect-error - we do have `text` in content[0] but typescript doesn't know that this is an 'openai' package type issue + let assistantResponse = message.content?.[index]?.text?.value; + console.log('issue_comment.created - assistantResponse', assistantResponse); + if (!assistantResponse) { + return console.log('issue_comment.created - assistantResponse is empty'); + } + // check if assistant response is either NO_ACTION or "NO_ACTION" strings + // as sometimes the assistant response varies + const isNoAction = assistantResponse.replaceAll('"', '').toUpperCase() === CONST_1.default.NO_ACTION; + // If assistant response is NO_ACTION, do nothing + if (isNoAction) { + console.log('Detected NO_ACTION for comment, returning early'); + return; + } + // If thread message role is 'user', do nothing + if (threadMessages.data?.[index]?.role === 'user') { + console.log('Detected message role "user", returning early...'); + return; + } + // if the assistant responded with no action but there's some context in the response + if (assistantResponse.includes(`[${CONST_1.default.NO_ACTION}]`)) { + // extract the text after [NO_ACTION] from assistantResponse since this is a + // bot related action keyword + const noActionContext = assistantResponse.split(`[${CONST_1.default.NO_ACTION}] `)?.[1]?.replace('"', ''); + console.log('issue_comment.created - [NO_ACTION] w/ context: ', noActionContext); + return; + } + // replace {user} from response template with @username + assistantResponse = assistantResponse.replace('{user}', `@${payload.comment?.user.login}`); + // replace {proposalLink} from response template with the link to the comment + assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment?.html_url); + // remove any double quotes from the final comment because sometimes the assistant's + // response contains double quotes / sometimes it doesn't + assistantResponse = assistantResponse.replace('"', '').replace(/^"|"$/g, ''); + // create a comment with the assistant's response + console.log('issue_comment.created - proposal-police posts comment'); + octokit.issues.createComment({ + ...github_1.context.repo, + /* eslint-disable @typescript-eslint/naming-convention */ + issue_number: payload.issue?.number ?? -1, + body: assistantResponse, + }); + // resolve the Promise with the response + resolve({ response: assistantResponse }); + // stop polling + clearInterval(intervalID); + }); + }) + .catch((error) => { + console.error('threads.messages.list - error', error); + reject(error); + clearInterval(intervalID); + }); + // stop polling + clearInterval(intervalID); + }) + .catch((error) => { + console.error('threads.runs.retrieve - error', error); + reject(error); + clearInterval(intervalID); + }); + // increment count for every threads.runs.retrieve call + count++; + console.log('threads.runs.retrieve - called:', count); + }, CONST_1.default.OPENAI_POLL_RATE); + }); +} +exports.prompt = prompt; +async function promptEdit({ createAndRunResponse, payload, octokit }) { + return new Promise((resolve, reject) => { + // count calls for debug purposes + let count = 0; + // poll for run completion + const intervalID = setInterval(() => { + OpenAI.beta.threads.runs + .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) + .then((threadRun) => { + // return if run is not completed yet + if (threadRun.status !== 'completed') { + console.log('issue_comment.edited - run pending completion'); + return; + } + // get assistant response + OpenAI.beta.threads.messages + .list(createAndRunResponse.thread_id) + .then((threadMessages) => { + // list thread messages content + threadMessages.data.forEach((message, index) => { + // @ts-expect-error - we do have `text` in content[0] but typescript doesn't know that this is a 'openai' package type issue + const assistantResponse = message.content?.[index]?.text?.value; + console.log('issue_comment.edited - assistantResponse', assistantResponse); + if (!assistantResponse) { + return console.log('issue_comment.edited - assistantResponse is empty'); + } + // check if assistant response is either NO_ACTION or "NO_ACTION" strings + // as sometimes the assistant response varies + const isNoAction = assistantResponse.replaceAll('"', '').toUpperCase() === CONST_1.default.NO_ACTION; + // If assistant response is NO_ACTION, do nothing + if (isNoAction) { + console.log('Detected NO_ACTION for comment, returning early'); + return; + } + // If thread message role is 'user', do nothing + if (threadMessages.data?.[index]?.role === 'user') { + console.log('Detected message role "user", returning early...'); + return; + } + // edit comment if assistant detected substantial changes and if the comment was not edited already by the bot + if (assistantResponse.includes('[EDIT_COMMENT]') && !payload.comment?.body.includes('Edited by **proposal-police**')) { + // extract the text after [EDIT_COMMENT] from assistantResponse since this is a + // bot related action keyword + let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); + // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC + const date = new Date(payload.comment?.updated_at ?? ''); + const formattedDate = `${date.toISOString()?.split('.')?.[0]?.replace('T', ' ')} UTC`; + extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); + console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment?.id}`); + octokit.issues.updateComment({ + ...github_1.context.repo, + /* eslint-disable @typescript-eslint/naming-convention */ + comment_id: payload.comment?.id ?? -1, + body: `${extractedNotice}\n\n${payload.comment?.body}`, + }); + } + // resolve the Promise with the response + resolve({ response: assistantResponse }); + clearInterval(intervalID); + }); + }) + .catch((error) => { + console.error('threads.messages.list - error', error); + reject(error); + clearInterval(intervalID); + }); + clearInterval(intervalID); + }) + .catch((error) => { + console.error('threads.runs.retrieve - error', error); + reject(error); + clearInterval(intervalID); + }); + // increment count for every threads.runs.retrieve call + count++; + console.log('threads.runs.retrieve - called:', count); + }, CONST_1.default.OPENAI_POLL_RATE); + }); +} +exports.promptEdit = promptEdit; + + /***/ }), /***/ 2877: @@ -16815,7 +16984,7 @@ var __importStar = (this && this.__importStar) || function (mod) { }; var _a; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.fileFromPath = exports.toFile = exports.UnprocessableEntityError = exports.PermissionDeniedError = exports.InternalServerError = exports.AuthenticationError = exports.BadRequestError = exports.RateLimitError = exports.ConflictError = exports.NotFoundError = exports.APIUserAbortError = exports.APIConnectionTimeoutError = exports.APIConnectionError = exports.APIError = exports.OpenAIError = exports.OpenAI = void 0; +exports.AzureOpenAI = exports.fileFromPath = exports.toFile = exports.UnprocessableEntityError = exports.PermissionDeniedError = exports.InternalServerError = exports.AuthenticationError = exports.BadRequestError = exports.RateLimitError = exports.ConflictError = exports.NotFoundError = exports.APIUserAbortError = exports.APIConnectionTimeoutError = exports.APIConnectionError = exports.APIError = exports.OpenAIError = exports.OpenAI = void 0; const Core = __importStar(__nccwpck_require__(1798)); const Errors = __importStar(__nccwpck_require__(8905)); const Uploads = __importStar(__nccwpck_require__(3394)); @@ -16929,7 +17098,125 @@ exports.fileFromPath = Uploads.fileFromPath; OpenAI.Batches = API.Batches; OpenAI.BatchesPage = API.BatchesPage; })(OpenAI = exports.OpenAI || (exports.OpenAI = {})); +/** API Client for interfacing with the Azure OpenAI API. */ +class AzureOpenAI extends OpenAI { + /** + * API Client for interfacing with the Azure OpenAI API. + * + * @param {string | undefined} [opts.apiVersion=process.env['OPENAI_API_VERSION'] ?? undefined] + * @param {string | undefined} [opts.endpoint=process.env['AZURE_OPENAI_ENDPOINT'] ?? undefined] - Your Azure endpoint, including the resource, e.g. `https://example-resource.azure.openai.com/` + * @param {string | undefined} [opts.apiKey=process.env['AZURE_OPENAI_API_KEY'] ?? undefined] + * @param {string | undefined} opts.deployment - A model deployment, if given, sets the base client URL to include `/deployments/{deployment}`. + * @param {string | null | undefined} [opts.organization=process.env['OPENAI_ORG_ID'] ?? null] + * @param {string} [opts.baseURL=process.env['OPENAI_BASE_URL']] - Sets the base URL for the API. + * @param {number} [opts.timeout=10 minutes] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out. + * @param {number} [opts.httpAgent] - An HTTP agent used to manage HTTP(s) connections. + * @param {Core.Fetch} [opts.fetch] - Specify a custom `fetch` function implementation. + * @param {number} [opts.maxRetries=2] - The maximum number of times the client will retry a request. + * @param {Core.Headers} opts.defaultHeaders - Default headers to include with every request to the API. + * @param {Core.DefaultQuery} opts.defaultQuery - Default query parameters to include with every request to the API. + * @param {boolean} [opts.dangerouslyAllowBrowser=false] - By default, client-side use of this library is not allowed, as it risks exposing your secret API credentials to attackers. + */ + constructor({ baseURL = Core.readEnv('OPENAI_BASE_URL'), apiKey = Core.readEnv('AZURE_OPENAI_API_KEY'), apiVersion = Core.readEnv('OPENAI_API_VERSION'), endpoint, deployment, azureADTokenProvider, dangerouslyAllowBrowser, ...opts } = {}) { + if (!apiVersion) { + throw new Errors.OpenAIError("The OPENAI_API_VERSION environment variable is missing or empty; either provide it, or instantiate the AzureOpenAI client with an apiVersion option, like new AzureOpenAI({ apiVersion: 'My API Version' })."); + } + if (typeof azureADTokenProvider === 'function') { + dangerouslyAllowBrowser = true; + } + if (!azureADTokenProvider && !apiKey) { + throw new Errors.OpenAIError('Missing credentials. Please pass one of `apiKey` and `azureADTokenProvider`, or set the `AZURE_OPENAI_API_KEY` environment variable.'); + } + if (azureADTokenProvider && apiKey) { + throw new Errors.OpenAIError('The `apiKey` and `azureADTokenProvider` arguments are mutually exclusive; only one can be passed at a time.'); + } + // define a sentinel value to avoid any typing issues + apiKey ?? (apiKey = API_KEY_SENTINEL); + opts.defaultQuery = { ...opts.defaultQuery, 'api-version': apiVersion }; + if (!baseURL) { + if (!endpoint) { + endpoint = process.env['AZURE_OPENAI_ENDPOINT']; + } + if (!endpoint) { + throw new Errors.OpenAIError('Must provide one of the `baseURL` or `endpoint` arguments, or the `AZURE_OPENAI_ENDPOINT` environment variable'); + } + baseURL = `${endpoint}/openai`; + } + else { + if (endpoint) { + throw new Errors.OpenAIError('baseURL and endpoint are mutually exclusive'); + } + } + super({ + apiKey, + baseURL, + ...opts, + ...(dangerouslyAllowBrowser !== undefined ? { dangerouslyAllowBrowser } : {}), + }); + this.apiVersion = ''; + this._azureADTokenProvider = azureADTokenProvider; + this.apiVersion = apiVersion; + this._deployment = deployment; + } + buildRequest(options) { + if (_deployments_endpoints.has(options.path) && options.method === 'post' && options.body !== undefined) { + if (!Core.isObj(options.body)) { + throw new Error('Expected request body to be an object'); + } + const model = this._deployment || options.body['model']; + delete options.body['model']; + if (model !== undefined && !this.baseURL.includes('/deployments')) { + options.path = `/deployments/${model}${options.path}`; + } + } + return super.buildRequest(options); + } + async _getAzureADToken() { + if (typeof this._azureADTokenProvider === 'function') { + const token = await this._azureADTokenProvider(); + if (!token || typeof token !== 'string') { + throw new Errors.OpenAIError(`Expected 'azureADTokenProvider' argument to return a string but it returned ${token}`); + } + return token; + } + return undefined; + } + authHeaders(opts) { + return {}; + } + async prepareOptions(opts) { + if (opts.headers?.['Authorization'] || opts.headers?.['api-key']) { + return super.prepareOptions(opts); + } + const token = await this._getAzureADToken(); + opts.headers ?? (opts.headers = {}); + if (token) { + opts.headers['Authorization'] = `Bearer ${token}`; + } + else if (this.apiKey !== API_KEY_SENTINEL) { + opts.headers['api-key'] = this.apiKey; + } + else { + throw new Errors.OpenAIError('Unable to handle auth'); + } + return super.prepareOptions(opts); + } +} +exports.AzureOpenAI = AzureOpenAI; +const _deployments_endpoints = new Set([ + '/completions', + '/chat/completions', + '/embeddings', + '/audio/transcriptions', + '/audio/translations', + '/audio/speech', + '/images/generations', + '/batches', +]); +const API_KEY_SENTINEL = ''; +// ---------------------- End Azure ---------------------- exports = module.exports = OpenAI; +module.exports.AzureOpenAI = AzureOpenAI; exports["default"] = OpenAI; //# sourceMappingURL=index.js.map @@ -18221,7 +18508,7 @@ _AssistantStream_addEvent = function _AssistantStream_addEvent(event) { } else { snapshot.content[contentElement.index] = contentElement; - //This is a new element + // This is a new element newContent.push(contentElement); } } @@ -19380,6 +19667,15 @@ class Messages extends resource_1.APIResource { headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, }); } + /** + * Deletes a message. + */ + del(threadId, messageId, options) { + return this._client.delete(`/threads/${threadId}/messages/${messageId}`, { + ...options, + headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, + }); + } } exports.Messages = Messages; class MessagesPage extends pagination_1.CursorPage { @@ -19535,6 +19831,7 @@ class Runs extends resource_1.APIResource { break; //We return the run in any terminal state. case 'requires_action': + case 'incomplete': case 'cancelled': case 'completed': case 'failed': @@ -19861,6 +20158,7 @@ class FileBatches extends resource_1.APIResource { await (0, core_2.sleep)(sleepInterval); break; case 'failed': + case 'cancelled': case 'completed': return batch; } @@ -20034,6 +20332,7 @@ class Files extends resource_1.APIResource { } /** * Upload a file to the `files` API and then attach it to the given vector store. + * * Note the file will be asynchronously processed (you can use the alternative * polling helper method to wait for processing to complete). */ @@ -20045,7 +20344,7 @@ class Files extends resource_1.APIResource { * Add a file to a vector store and poll until processing is complete. */ async uploadAndPoll(vectorStoreId, file, options) { - const fileInfo = await this._client.files.create({ file: file, purpose: 'assistants' }, options); + const fileInfo = await this.upload(vectorStoreId, file, options); return await this.poll(vectorStoreId, fileInfo.id, options); } } @@ -20335,14 +20634,18 @@ const core_3 = __nccwpck_require__(1798); const pagination_1 = __nccwpck_require__(7401); class Files extends resource_1.APIResource { /** - * Upload a file that can be used across various endpoints. The size of all the - * files uploaded by one organization can be up to 100 GB. + * Upload a file that can be used across various endpoints. Individual files can be + * up to 512 MB, and the size of all files uploaded by one organization can be up + * to 100 GB. + * + * The Assistants API supports files up to 2 million tokens and of specific file + * types. See the + * [Assistants Tools guide](https://platform.openai.com/docs/assistants/tools) for + * details. + * + * The Fine-tuning API only supports `.jsonl` files. * - * The size of individual files can be a maximum of 512 MB or 2 million tokens for - * Assistants. See the - * [Assistants Tools guide](https://platform.openai.com/docs/assistants/tools) to - * learn more about the types of files supported. The Fine-tuning API only supports - * `.jsonl` files. + * The Batch API only supports `.jsonl` files up to 100 MB in size. * * Please [contact us](https://help.openai.com/) if you need to increase these * storage limits. @@ -21434,7 +21737,7 @@ const addFormValue = async (form, key, value) => { Object.defineProperty(exports, "__esModule", ({ value: true })); exports.VERSION = void 0; -exports.VERSION = '4.38.5'; // x-release-please-version +exports.VERSION = '4.47.2'; // x-release-please-version //# sourceMappingURL=version.js.map /***/ }), diff --git a/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts b/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts index 699236693512..76523d0b4d9e 100644 --- a/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts +++ b/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts @@ -2,6 +2,7 @@ import {context, getOctokit} from '@actions/github'; import InitOpenAI from 'openai'; import CONST from '@github/libs/CONST'; import type {GitHubType} from '@github/libs/GithubUtils'; +import * as OpenAIUtils from '@github/libs/OpenAIUtils'; const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); @@ -15,12 +16,30 @@ async function processIssueComment(octokit: InstanceType) { } if (!OPENAI_ASSISTANT_ID) { - console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); + console.error('OPENAI_ASSISTANT_ID missing from the environment variables'); return; } - // 1, check if comment is proposal and if proposal template is followed - const content = `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment?.body}`; + if (!payload.comment?.body.trim()) { + return; + } + console.log('Action triggered for comment:', payload.comment?.body); + + let content = ''; + + console.log('-> GitHub Action Type: ', payload.action?.toUpperCase()); + + if (payload.action === CONST.ACTIONS.CREATED) { + content = `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "${CONST.NO_ACTION}" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment?.body}`; + } else if (payload.action === CONST.ACTIONS.EDIT) { + content = `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "${CONST.NO_ACTION}" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body?.from}.\n\nEdited comment content: ${payload.comment?.body}`; + } + + if (content === '') { + console.log('Early return - Comment body content is empty.'); + return; + } + console.log('Comment body content for assistant:', content); // create thread with first user message and run it const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ @@ -29,80 +48,11 @@ async function processIssueComment(octokit: InstanceType) { thread: {messages: [{role: 'user', content}]}, }); - // count calls for debug purposes - let count = 0; - // poll for run completion - const intervalID = setInterval(() => { - OpenAI.beta.threads.runs - .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) - .then((threadRun) => { - // return if run is not completed - if (threadRun.status !== 'completed') { - return; - } - - // get assistant response - OpenAI.beta.threads.messages - .list(createAndRunResponse.thread_id) - .then((threadMessages) => { - // list thread messages content - threadMessages.data.forEach((message, index) => { - // @ts-expect-error - we do have `text` in content[0] but typescript doesn't know that this is an 'openai' package type issue - let assistantResponse = message.content?.[index]?.text?.value; - console.log('issue_comment.created - assistantResponse', assistantResponse); - - if (!assistantResponse) { - return console.log('issue_comment.created - assistantResponse is empty'); - } - - // check if assistant response is either NO_ACTION or "NO_ACTION" strings - // as sometimes the assistant response varies - const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; - // if assistant response is NO_ACTION or message role is 'user', do nothing - if (isNoAction || threadMessages.data?.[index]?.role === 'user') { - if (threadMessages.data?.[index]?.role === 'user') { - return; - } - return console.log('issue_comment.created - NO_ACTION'); - } - - // if the assistant responded with no action but there's some context in the response - if (assistantResponse.includes('[NO_ACTION]')) { - // extract the text after [NO_ACTION] from assistantResponse since this is a - // bot related action keyword - const noActionContext = assistantResponse.split('[NO_ACTION] ')?.[1]?.replace('"', ''); - console.log('issue_comment.created - [NO_ACTION] w/ context: ', noActionContext); - return; - } - // replace {user} from response template with @username - assistantResponse = assistantResponse.replace('{user}', `@${payload.comment?.user.login}`); - // replace {proposalLink} from response template with the link to the comment - assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment?.html_url); - - // remove any double quotes from the final comment because sometimes the assistant's - // response contains double quotes / sometimes it doesn't - assistantResponse = assistantResponse.replace('"', ''); - // create a comment with the assistant's response - console.log('issue_comment.created - proposal-police posts comment'); - octokit.issues.createComment({ - ...context.repo, - /* eslint-disable @typescript-eslint/naming-convention */ - issue_number: payload.issue?.number ?? -1, - body: assistantResponse, - }); - }); - }) - .catch((error) => console.log('threads.messages.list - error', error)); - - // stop polling - clearInterval(intervalID); - }) - .catch((error) => console.log('threads.runs.retrieve - error', error)); - - // increment count for every threads.runs.retrieve call - count++; - console.log('threads.runs.retrieve - called:', count); - }, 1500); + if (payload.action === CONST.ACTIONS.CREATED) { + await OpenAIUtils.prompt({createAndRunResponse, payload, octokit}); + } else if (payload.action === CONST.ACTIONS.EDIT) { + await OpenAIUtils.promptEdit({createAndRunResponse, payload, octokit}); + } } // Main function to process the workflow event diff --git a/.github/actions/javascript/proposalPoliceCommentEdit/action.yml b/.github/actions/javascript/proposalPoliceCommentEdit/action.yml deleted file mode 100644 index 6357b3b8d607..000000000000 --- a/.github/actions/javascript/proposalPoliceCommentEdit/action.yml +++ /dev/null @@ -1,15 +0,0 @@ -name: 'ProposalPolice™ Edited Comment Check' -description: 'Verifies whether an updated proposal had substantial changes' -inputs: - GITHUB_TOKEN: - description: 'Auth token for New Expensify Github' - required: true - OPENAI_API_KEY: - description: 'OpenAI API key for accessing AI services' - required: true - OPENAI_ASSISTANT_ID: - description: 'OpenAI Assistant ID for personalized AI assistant' - required: true -runs: - using: 'node20' - main: './index.js' diff --git a/.github/actions/javascript/proposalPoliceCommentEdit/index.js b/.github/actions/javascript/proposalPoliceCommentEdit/index.js deleted file mode 100644 index b781643678a7..000000000000 --- a/.github/actions/javascript/proposalPoliceCommentEdit/index.js +++ /dev/null @@ -1,21491 +0,0 @@ -/** - * NOTE: This is a compiled file. DO NOT directly edit this file. - */ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ 4087: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Context = void 0; -const fs_1 = __nccwpck_require__(7147); -const os_1 = __nccwpck_require__(2037); -class Context { - /** - * Hydrate the context from the environment - */ - constructor() { - var _a, _b, _c; - this.payload = {}; - if (process.env.GITHUB_EVENT_PATH) { - if (fs_1.existsSync(process.env.GITHUB_EVENT_PATH)) { - this.payload = JSON.parse(fs_1.readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' })); - } - else { - const path = process.env.GITHUB_EVENT_PATH; - process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`); - } - } - this.eventName = process.env.GITHUB_EVENT_NAME; - this.sha = process.env.GITHUB_SHA; - this.ref = process.env.GITHUB_REF; - this.workflow = process.env.GITHUB_WORKFLOW; - this.action = process.env.GITHUB_ACTION; - this.actor = process.env.GITHUB_ACTOR; - this.job = process.env.GITHUB_JOB; - this.runNumber = parseInt(process.env.GITHUB_RUN_NUMBER, 10); - this.runId = parseInt(process.env.GITHUB_RUN_ID, 10); - this.apiUrl = (_a = process.env.GITHUB_API_URL) !== null && _a !== void 0 ? _a : `https://api.github.com`; - this.serverUrl = (_b = process.env.GITHUB_SERVER_URL) !== null && _b !== void 0 ? _b : `https://github.com`; - this.graphqlUrl = (_c = process.env.GITHUB_GRAPHQL_URL) !== null && _c !== void 0 ? _c : `https://api.github.com/graphql`; - } - get issue() { - const payload = this.payload; - return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number }); - } - get repo() { - if (process.env.GITHUB_REPOSITORY) { - const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/'); - return { owner, repo }; - } - if (this.payload.repository) { - return { - owner: this.payload.repository.owner.login, - repo: this.payload.repository.name - }; - } - throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'"); - } -} -exports.Context = Context; -//# sourceMappingURL=context.js.map - -/***/ }), - -/***/ 5438: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getOctokit = exports.context = void 0; -const Context = __importStar(__nccwpck_require__(4087)); -const utils_1 = __nccwpck_require__(3030); -exports.context = new Context.Context(); -/** - * Returns a hydrated octokit ready to use for GitHub Actions - * - * @param token the repo PAT or GITHUB_TOKEN - * @param options other options to set - */ -function getOctokit(token, options, ...additionalPlugins) { - const GitHubWithPlugins = utils_1.GitHub.plugin(...additionalPlugins); - return new GitHubWithPlugins(utils_1.getOctokitOptions(token, options)); -} -exports.getOctokit = getOctokit; -//# sourceMappingURL=github.js.map - -/***/ }), - -/***/ 7914: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getApiBaseUrl = exports.getProxyAgent = exports.getAuthString = void 0; -const httpClient = __importStar(__nccwpck_require__(6255)); -function getAuthString(token, options) { - if (!token && !options.auth) { - throw new Error('Parameter token or opts.auth is required'); - } - else if (token && options.auth) { - throw new Error('Parameters token and opts.auth may not both be specified'); - } - return typeof options.auth === 'string' ? options.auth : `token ${token}`; -} -exports.getAuthString = getAuthString; -function getProxyAgent(destinationUrl) { - const hc = new httpClient.HttpClient(); - return hc.getAgent(destinationUrl); -} -exports.getProxyAgent = getProxyAgent; -function getApiBaseUrl() { - return process.env['GITHUB_API_URL'] || 'https://api.github.com'; -} -exports.getApiBaseUrl = getApiBaseUrl; -//# sourceMappingURL=utils.js.map - -/***/ }), - -/***/ 3030: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getOctokitOptions = exports.GitHub = exports.defaults = exports.context = void 0; -const Context = __importStar(__nccwpck_require__(4087)); -const Utils = __importStar(__nccwpck_require__(7914)); -// octokit + plugins -const core_1 = __nccwpck_require__(8525); -const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044); -const plugin_paginate_rest_1 = __nccwpck_require__(8945); -exports.context = new Context.Context(); -const baseUrl = Utils.getApiBaseUrl(); -exports.defaults = { - baseUrl, - request: { - agent: Utils.getProxyAgent(baseUrl) - } -}; -exports.GitHub = core_1.Octokit.plugin(plugin_rest_endpoint_methods_1.restEndpointMethods, plugin_paginate_rest_1.paginateRest).defaults(exports.defaults); -/** - * Convience function to correctly format Octokit Options to pass into the constructor. - * - * @param token the repo PAT or GITHUB_TOKEN - * @param options other options to set - */ -function getOctokitOptions(token, options) { - const opts = Object.assign({}, options || {}); // Shallow clone - don't mutate the object provided by the caller - // Auth - const auth = Utils.getAuthString(token, opts); - if (auth) { - opts.auth = auth; - } - return opts; -} -exports.getOctokitOptions = getOctokitOptions; -//# sourceMappingURL=utils.js.map - -/***/ }), - -/***/ 673: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -const REGEX_IS_INSTALLATION_LEGACY = /^v1\./; -const REGEX_IS_INSTALLATION = /^ghs_/; -const REGEX_IS_USER_TO_SERVER = /^ghu_/; -async function auth(token) { - const isApp = token.split(/\./).length === 3; - const isInstallation = REGEX_IS_INSTALLATION_LEGACY.test(token) || REGEX_IS_INSTALLATION.test(token); - const isUserToServer = REGEX_IS_USER_TO_SERVER.test(token); - const tokenType = isApp ? "app" : isInstallation ? "installation" : isUserToServer ? "user-to-server" : "oauth"; - return { - type: "token", - token: token, - tokenType - }; -} - -/** - * Prefix token for usage in the Authorization header - * - * @param token OAuth token or JSON Web Token - */ -function withAuthorizationPrefix(token) { - if (token.split(/\./).length === 3) { - return `bearer ${token}`; - } - - return `token ${token}`; -} - -async function hook(token, request, route, parameters) { - const endpoint = request.endpoint.merge(route, parameters); - endpoint.headers.authorization = withAuthorizationPrefix(token); - return request(endpoint); -} - -const createTokenAuth = function createTokenAuth(token) { - if (!token) { - throw new Error("[@octokit/auth-token] No token passed to createTokenAuth"); - } - - if (typeof token !== "string") { - throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string"); - } - - token = token.replace(/^(token|bearer) +/i, ""); - return Object.assign(auth.bind(null, token), { - hook: hook.bind(null, token) - }); -}; - -exports.createTokenAuth = createTokenAuth; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 8525: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -var universalUserAgent = __nccwpck_require__(5030); -var beforeAfterHook = __nccwpck_require__(3682); -var request = __nccwpck_require__(9353); -var graphql = __nccwpck_require__(6422); -var authToken = __nccwpck_require__(673); - -function _objectWithoutPropertiesLoose(source, excluded) { - if (source == null) return {}; - var target = {}; - var sourceKeys = Object.keys(source); - var key, i; - - for (i = 0; i < sourceKeys.length; i++) { - key = sourceKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - target[key] = source[key]; - } - - return target; -} - -function _objectWithoutProperties(source, excluded) { - if (source == null) return {}; - - var target = _objectWithoutPropertiesLoose(source, excluded); - - var key, i; - - if (Object.getOwnPropertySymbols) { - var sourceSymbolKeys = Object.getOwnPropertySymbols(source); - - for (i = 0; i < sourceSymbolKeys.length; i++) { - key = sourceSymbolKeys[i]; - if (excluded.indexOf(key) >= 0) continue; - if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; - target[key] = source[key]; - } - } - - return target; -} - -const VERSION = "3.6.0"; - -const _excluded = ["authStrategy"]; -class Octokit { - constructor(options = {}) { - const hook = new beforeAfterHook.Collection(); - const requestDefaults = { - baseUrl: request.request.endpoint.DEFAULTS.baseUrl, - headers: {}, - request: Object.assign({}, options.request, { - // @ts-ignore internal usage only, no need to type - hook: hook.bind(null, "request") - }), - mediaType: { - previews: [], - format: "" - } - }; // prepend default user agent with `options.userAgent` if set - - requestDefaults.headers["user-agent"] = [options.userAgent, `octokit-core.js/${VERSION} ${universalUserAgent.getUserAgent()}`].filter(Boolean).join(" "); - - if (options.baseUrl) { - requestDefaults.baseUrl = options.baseUrl; - } - - if (options.previews) { - requestDefaults.mediaType.previews = options.previews; - } - - if (options.timeZone) { - requestDefaults.headers["time-zone"] = options.timeZone; - } - - this.request = request.request.defaults(requestDefaults); - this.graphql = graphql.withCustomRequest(this.request).defaults(requestDefaults); - this.log = Object.assign({ - debug: () => {}, - info: () => {}, - warn: console.warn.bind(console), - error: console.error.bind(console) - }, options.log); - this.hook = hook; // (1) If neither `options.authStrategy` nor `options.auth` are set, the `octokit` instance - // is unauthenticated. The `this.auth()` method is a no-op and no request hook is registered. - // (2) If only `options.auth` is set, use the default token authentication strategy. - // (3) If `options.authStrategy` is set then use it and pass in `options.auth`. Always pass own request as many strategies accept a custom request instance. - // TODO: type `options.auth` based on `options.authStrategy`. - - if (!options.authStrategy) { - if (!options.auth) { - // (1) - this.auth = async () => ({ - type: "unauthenticated" - }); - } else { - // (2) - const auth = authToken.createTokenAuth(options.auth); // @ts-ignore ¯\_(ツ)_/¯ - - hook.wrap("request", auth.hook); - this.auth = auth; - } - } else { - const { - authStrategy - } = options, - otherOptions = _objectWithoutProperties(options, _excluded); - - const auth = authStrategy(Object.assign({ - request: this.request, - log: this.log, - // we pass the current octokit instance as well as its constructor options - // to allow for authentication strategies that return a new octokit instance - // that shares the same internal state as the current one. The original - // requirement for this was the "event-octokit" authentication strategy - // of https://github.com/probot/octokit-auth-probot. - octokit: this, - octokitOptions: otherOptions - }, options.auth)); // @ts-ignore ¯\_(ツ)_/¯ - - hook.wrap("request", auth.hook); - this.auth = auth; - } // apply plugins - // https://stackoverflow.com/a/16345172 - - - const classConstructor = this.constructor; - classConstructor.plugins.forEach(plugin => { - Object.assign(this, plugin(this, options)); - }); - } - - static defaults(defaults) { - const OctokitWithDefaults = class extends this { - constructor(...args) { - const options = args[0] || {}; - - if (typeof defaults === "function") { - super(defaults(options)); - return; - } - - super(Object.assign({}, defaults, options, options.userAgent && defaults.userAgent ? { - userAgent: `${options.userAgent} ${defaults.userAgent}` - } : null)); - } - - }; - return OctokitWithDefaults; - } - /** - * Attach a plugin (or many) to your Octokit instance. - * - * @example - * const API = Octokit.plugin(plugin1, plugin2, plugin3, ...) - */ - - - static plugin(...newPlugins) { - var _a; - - const currentPlugins = this.plugins; - const NewOctokit = (_a = class extends this {}, _a.plugins = currentPlugins.concat(newPlugins.filter(plugin => !currentPlugins.includes(plugin))), _a); - return NewOctokit; - } - -} -Octokit.VERSION = VERSION; -Octokit.plugins = []; - -exports.Octokit = Octokit; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 8713: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -var isPlainObject = __nccwpck_require__(3287); -var universalUserAgent = __nccwpck_require__(5030); - -function lowercaseKeys(object) { - if (!object) { - return {}; - } - - return Object.keys(object).reduce((newObj, key) => { - newObj[key.toLowerCase()] = object[key]; - return newObj; - }, {}); -} - -function mergeDeep(defaults, options) { - const result = Object.assign({}, defaults); - Object.keys(options).forEach(key => { - if (isPlainObject.isPlainObject(options[key])) { - if (!(key in defaults)) Object.assign(result, { - [key]: options[key] - });else result[key] = mergeDeep(defaults[key], options[key]); - } else { - Object.assign(result, { - [key]: options[key] - }); - } - }); - return result; -} - -function removeUndefinedProperties(obj) { - for (const key in obj) { - if (obj[key] === undefined) { - delete obj[key]; - } - } - - return obj; -} - -function merge(defaults, route, options) { - if (typeof route === "string") { - let [method, url] = route.split(" "); - options = Object.assign(url ? { - method, - url - } : { - url: method - }, options); - } else { - options = Object.assign({}, route); - } // lowercase header names before merging with defaults to avoid duplicates - - - options.headers = lowercaseKeys(options.headers); // remove properties with undefined values before merging - - removeUndefinedProperties(options); - removeUndefinedProperties(options.headers); - const mergedOptions = mergeDeep(defaults || {}, options); // mediaType.previews arrays are merged, instead of overwritten - - if (defaults && defaults.mediaType.previews.length) { - mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(preview => !mergedOptions.mediaType.previews.includes(preview)).concat(mergedOptions.mediaType.previews); - } - - mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map(preview => preview.replace(/-preview/, "")); - return mergedOptions; -} - -function addQueryParameters(url, parameters) { - const separator = /\?/.test(url) ? "&" : "?"; - const names = Object.keys(parameters); - - if (names.length === 0) { - return url; - } - - return url + separator + names.map(name => { - if (name === "q") { - return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+"); - } - - return `${name}=${encodeURIComponent(parameters[name])}`; - }).join("&"); -} - -const urlVariableRegex = /\{[^}]+\}/g; - -function removeNonChars(variableName) { - return variableName.replace(/^\W+|\W+$/g, "").split(/,/); -} - -function extractUrlVariableNames(url) { - const matches = url.match(urlVariableRegex); - - if (!matches) { - return []; - } - - return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []); -} - -function omit(object, keysToOmit) { - return Object.keys(object).filter(option => !keysToOmit.includes(option)).reduce((obj, key) => { - obj[key] = object[key]; - return obj; - }, {}); -} - -// Based on https://github.com/bramstein/url-template, licensed under BSD -// TODO: create separate package. -// -// Copyright (c) 2012-2014, Bram Stein -// All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions -// are met: -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// 3. The name of the author may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED -// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO -// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY -// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, -// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/* istanbul ignore file */ -function encodeReserved(str) { - return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) { - if (!/%[0-9A-Fa-f]/.test(part)) { - part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]"); - } - - return part; - }).join(""); -} - -function encodeUnreserved(str) { - return encodeURIComponent(str).replace(/[!'()*]/g, function (c) { - return "%" + c.charCodeAt(0).toString(16).toUpperCase(); - }); -} - -function encodeValue(operator, value, key) { - value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value); - - if (key) { - return encodeUnreserved(key) + "=" + value; - } else { - return value; - } -} - -function isDefined(value) { - return value !== undefined && value !== null; -} - -function isKeyOperator(operator) { - return operator === ";" || operator === "&" || operator === "?"; -} - -function getValues(context, operator, key, modifier) { - var value = context[key], - result = []; - - if (isDefined(value) && value !== "") { - if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") { - value = value.toString(); - - if (modifier && modifier !== "*") { - value = value.substring(0, parseInt(modifier, 10)); - } - - result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); - } else { - if (modifier === "*") { - if (Array.isArray(value)) { - value.filter(isDefined).forEach(function (value) { - result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : "")); - }); - } else { - Object.keys(value).forEach(function (k) { - if (isDefined(value[k])) { - result.push(encodeValue(operator, value[k], k)); - } - }); - } - } else { - const tmp = []; - - if (Array.isArray(value)) { - value.filter(isDefined).forEach(function (value) { - tmp.push(encodeValue(operator, value)); - }); - } else { - Object.keys(value).forEach(function (k) { - if (isDefined(value[k])) { - tmp.push(encodeUnreserved(k)); - tmp.push(encodeValue(operator, value[k].toString())); - } - }); - } - - if (isKeyOperator(operator)) { - result.push(encodeUnreserved(key) + "=" + tmp.join(",")); - } else if (tmp.length !== 0) { - result.push(tmp.join(",")); - } - } - } - } else { - if (operator === ";") { - if (isDefined(value)) { - result.push(encodeUnreserved(key)); - } - } else if (value === "" && (operator === "&" || operator === "?")) { - result.push(encodeUnreserved(key) + "="); - } else if (value === "") { - result.push(""); - } - } - - return result; -} - -function parseUrl(template) { - return { - expand: expand.bind(null, template) - }; -} - -function expand(template, context) { - var operators = ["+", "#", ".", "/", ";", "?", "&"]; - return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) { - if (expression) { - let operator = ""; - const values = []; - - if (operators.indexOf(expression.charAt(0)) !== -1) { - operator = expression.charAt(0); - expression = expression.substr(1); - } - - expression.split(/,/g).forEach(function (variable) { - var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable); - values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3])); - }); - - if (operator && operator !== "+") { - var separator = ","; - - if (operator === "?") { - separator = "&"; - } else if (operator !== "#") { - separator = operator; - } - - return (values.length !== 0 ? operator : "") + values.join(separator); - } else { - return values.join(","); - } - } else { - return encodeReserved(literal); - } - }); -} - -function parse(options) { - // https://fetch.spec.whatwg.org/#methods - let method = options.method.toUpperCase(); // replace :varname with {varname} to make it RFC 6570 compatible - - let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{$1}"); - let headers = Object.assign({}, options.headers); - let body; - let parameters = omit(options, ["method", "baseUrl", "url", "headers", "request", "mediaType"]); // extract variable names from URL to calculate remaining variables later - - const urlVariableNames = extractUrlVariableNames(url); - url = parseUrl(url).expand(parameters); - - if (!/^http/.test(url)) { - url = options.baseUrl + url; - } - - const omittedParameters = Object.keys(options).filter(option => urlVariableNames.includes(option)).concat("baseUrl"); - const remainingParameters = omit(parameters, omittedParameters); - const isBinaryRequest = /application\/octet-stream/i.test(headers.accept); - - if (!isBinaryRequest) { - if (options.mediaType.format) { - // e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw - headers.accept = headers.accept.split(/,/).map(preview => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`)).join(","); - } - - if (options.mediaType.previews.length) { - const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || []; - headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map(preview => { - const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json"; - return `application/vnd.github.${preview}-preview${format}`; - }).join(","); - } - } // for GET/HEAD requests, set URL query parameters from remaining parameters - // for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters - - - if (["GET", "HEAD"].includes(method)) { - url = addQueryParameters(url, remainingParameters); - } else { - if ("data" in remainingParameters) { - body = remainingParameters.data; - } else { - if (Object.keys(remainingParameters).length) { - body = remainingParameters; - } else { - headers["content-length"] = 0; - } - } - } // default content-type for JSON if body is set - - - if (!headers["content-type"] && typeof body !== "undefined") { - headers["content-type"] = "application/json; charset=utf-8"; - } // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body. - // fetch does not allow to set `content-length` header, but we can set body to an empty string - - - if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") { - body = ""; - } // Only return body/request keys if present - - - return Object.assign({ - method, - url, - headers - }, typeof body !== "undefined" ? { - body - } : null, options.request ? { - request: options.request - } : null); -} - -function endpointWithDefaults(defaults, route, options) { - return parse(merge(defaults, route, options)); -} - -function withDefaults(oldDefaults, newDefaults) { - const DEFAULTS = merge(oldDefaults, newDefaults); - const endpoint = endpointWithDefaults.bind(null, DEFAULTS); - return Object.assign(endpoint, { - DEFAULTS, - defaults: withDefaults.bind(null, DEFAULTS), - merge: merge.bind(null, DEFAULTS), - parse - }); -} - -const VERSION = "6.0.12"; - -const userAgent = `octokit-endpoint.js/${VERSION} ${universalUserAgent.getUserAgent()}`; // DEFAULTS has all properties set that EndpointOptions has, except url. -// So we use RequestParameters and add method as additional required property. - -const DEFAULTS = { - method: "GET", - baseUrl: "https://api.github.com", - headers: { - accept: "application/vnd.github.v3+json", - "user-agent": userAgent - }, - mediaType: { - format: "", - previews: [] - } -}; - -const endpoint = withDefaults(null, DEFAULTS); - -exports.endpoint = endpoint; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 6422: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -var request = __nccwpck_require__(9353); -var universalUserAgent = __nccwpck_require__(5030); - -const VERSION = "4.8.0"; - -function _buildMessageForResponseErrors(data) { - return `Request failed due to following response errors:\n` + data.errors.map(e => ` - ${e.message}`).join("\n"); -} - -class GraphqlResponseError extends Error { - constructor(request, headers, response) { - super(_buildMessageForResponseErrors(response)); - this.request = request; - this.headers = headers; - this.response = response; - this.name = "GraphqlResponseError"; // Expose the errors and response data in their shorthand properties. - - this.errors = response.errors; - this.data = response.data; // Maintains proper stack trace (only available on V8) - - /* istanbul ignore next */ - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - } - -} - -const NON_VARIABLE_OPTIONS = ["method", "baseUrl", "url", "headers", "request", "query", "mediaType"]; -const FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; -const GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; -function graphql(request, query, options) { - if (options) { - if (typeof query === "string" && "query" in options) { - return Promise.reject(new Error(`[@octokit/graphql] "query" cannot be used as variable name`)); - } - - for (const key in options) { - if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) continue; - return Promise.reject(new Error(`[@octokit/graphql] "${key}" cannot be used as variable name`)); - } - } - - const parsedOptions = typeof query === "string" ? Object.assign({ - query - }, options) : query; - const requestOptions = Object.keys(parsedOptions).reduce((result, key) => { - if (NON_VARIABLE_OPTIONS.includes(key)) { - result[key] = parsedOptions[key]; - return result; - } - - if (!result.variables) { - result.variables = {}; - } - - result.variables[key] = parsedOptions[key]; - return result; - }, {}); // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix - // https://github.com/octokit/auth-app.js/issues/111#issuecomment-657610451 - - const baseUrl = parsedOptions.baseUrl || request.endpoint.DEFAULTS.baseUrl; - - if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { - requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); - } - - return request(requestOptions).then(response => { - if (response.data.errors) { - const headers = {}; - - for (const key of Object.keys(response.headers)) { - headers[key] = response.headers[key]; - } - - throw new GraphqlResponseError(requestOptions, headers, response.data); - } - - return response.data.data; - }); -} - -function withDefaults(request$1, newDefaults) { - const newRequest = request$1.defaults(newDefaults); - - const newApi = (query, options) => { - return graphql(newRequest, query, options); - }; - - return Object.assign(newApi, { - defaults: withDefaults.bind(null, newRequest), - endpoint: request.request.endpoint - }); -} - -const graphql$1 = withDefaults(request.request, { - headers: { - "user-agent": `octokit-graphql.js/${VERSION} ${universalUserAgent.getUserAgent()}` - }, - method: "POST", - url: "/graphql" -}); -function withCustomRequest(customRequest) { - return withDefaults(customRequest, { - method: "POST", - url: "/graphql" - }); -} - -exports.GraphqlResponseError = GraphqlResponseError; -exports.graphql = graphql$1; -exports.withCustomRequest = withCustomRequest; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 8945: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -const VERSION = "2.21.3"; - -function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - enumerableOnly && (symbols = symbols.filter(function (sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - })), keys.push.apply(keys, symbols); - } - - return keys; -} - -function _objectSpread2(target) { - for (var i = 1; i < arguments.length; i++) { - var source = null != arguments[i] ? arguments[i] : {}; - i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { - _defineProperty(target, key, source[key]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { - Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); - }); - } - - return target; -} - -function _defineProperty(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - - return obj; -} - -/** - * Some “list” response that can be paginated have a different response structure - * - * They have a `total_count` key in the response (search also has `incomplete_results`, - * /installation/repositories also has `repository_selection`), as well as a key with - * the list of the items which name varies from endpoint to endpoint. - * - * Octokit normalizes these responses so that paginated results are always returned following - * the same structure. One challenge is that if the list response has only one page, no Link - * header is provided, so this header alone is not sufficient to check wether a response is - * paginated or not. - * - * We check if a "total_count" key is present in the response data, but also make sure that - * a "url" property is not, as the "Get the combined status for a specific ref" endpoint would - * otherwise match: https://developer.github.com/v3/repos/statuses/#get-the-combined-status-for-a-specific-ref - */ -function normalizePaginatedListResponse(response) { - // endpoints can respond with 204 if repository is empty - if (!response.data) { - return _objectSpread2(_objectSpread2({}, response), {}, { - data: [] - }); - } - - const responseNeedsNormalization = "total_count" in response.data && !("url" in response.data); - if (!responseNeedsNormalization) return response; // keep the additional properties intact as there is currently no other way - // to retrieve the same information. - - const incompleteResults = response.data.incomplete_results; - const repositorySelection = response.data.repository_selection; - const totalCount = response.data.total_count; - delete response.data.incomplete_results; - delete response.data.repository_selection; - delete response.data.total_count; - const namespaceKey = Object.keys(response.data)[0]; - const data = response.data[namespaceKey]; - response.data = data; - - if (typeof incompleteResults !== "undefined") { - response.data.incomplete_results = incompleteResults; - } - - if (typeof repositorySelection !== "undefined") { - response.data.repository_selection = repositorySelection; - } - - response.data.total_count = totalCount; - return response; -} - -function iterator(octokit, route, parameters) { - const options = typeof route === "function" ? route.endpoint(parameters) : octokit.request.endpoint(route, parameters); - const requestMethod = typeof route === "function" ? route : octokit.request; - const method = options.method; - const headers = options.headers; - let url = options.url; - return { - [Symbol.asyncIterator]: () => ({ - async next() { - if (!url) return { - done: true - }; - - try { - const response = await requestMethod({ - method, - url, - headers - }); - const normalizedResponse = normalizePaginatedListResponse(response); // `response.headers.link` format: - // '; rel="next", ; rel="last"' - // sets `url` to undefined if "next" URL is not present or `link` header is not set - - url = ((normalizedResponse.headers.link || "").match(/<([^>]+)>;\s*rel="next"/) || [])[1]; - return { - value: normalizedResponse - }; - } catch (error) { - if (error.status !== 409) throw error; - url = ""; - return { - value: { - status: 200, - headers: {}, - data: [] - } - }; - } - } - - }) - }; -} - -function paginate(octokit, route, parameters, mapFn) { - if (typeof parameters === "function") { - mapFn = parameters; - parameters = undefined; - } - - return gather(octokit, [], iterator(octokit, route, parameters)[Symbol.asyncIterator](), mapFn); -} - -function gather(octokit, results, iterator, mapFn) { - return iterator.next().then(result => { - if (result.done) { - return results; - } - - let earlyExit = false; - - function done() { - earlyExit = true; - } - - results = results.concat(mapFn ? mapFn(result.value, done) : result.value.data); - - if (earlyExit) { - return results; - } - - return gather(octokit, results, iterator, mapFn); - }); -} - -const composePaginateRest = Object.assign(paginate, { - iterator -}); - -const paginatingEndpoints = ["GET /app/hook/deliveries", "GET /app/installations", "GET /applications/grants", "GET /authorizations", "GET /enterprises/{enterprise}/actions/permissions/organizations", "GET /enterprises/{enterprise}/actions/runner-groups", "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/organizations", "GET /enterprises/{enterprise}/actions/runner-groups/{runner_group_id}/runners", "GET /enterprises/{enterprise}/actions/runners", "GET /enterprises/{enterprise}/audit-log", "GET /enterprises/{enterprise}/secret-scanning/alerts", "GET /enterprises/{enterprise}/settings/billing/advanced-security", "GET /events", "GET /gists", "GET /gists/public", "GET /gists/starred", "GET /gists/{gist_id}/comments", "GET /gists/{gist_id}/commits", "GET /gists/{gist_id}/forks", "GET /installation/repositories", "GET /issues", "GET /licenses", "GET /marketplace_listing/plans", "GET /marketplace_listing/plans/{plan_id}/accounts", "GET /marketplace_listing/stubbed/plans", "GET /marketplace_listing/stubbed/plans/{plan_id}/accounts", "GET /networks/{owner}/{repo}/events", "GET /notifications", "GET /organizations", "GET /orgs/{org}/actions/cache/usage-by-repository", "GET /orgs/{org}/actions/permissions/repositories", "GET /orgs/{org}/actions/runner-groups", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/repositories", "GET /orgs/{org}/actions/runner-groups/{runner_group_id}/runners", "GET /orgs/{org}/actions/runners", "GET /orgs/{org}/actions/secrets", "GET /orgs/{org}/actions/secrets/{secret_name}/repositories", "GET /orgs/{org}/audit-log", "GET /orgs/{org}/blocks", "GET /orgs/{org}/code-scanning/alerts", "GET /orgs/{org}/codespaces", "GET /orgs/{org}/credential-authorizations", "GET /orgs/{org}/dependabot/secrets", "GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories", "GET /orgs/{org}/events", "GET /orgs/{org}/external-groups", "GET /orgs/{org}/failed_invitations", "GET /orgs/{org}/hooks", "GET /orgs/{org}/hooks/{hook_id}/deliveries", "GET /orgs/{org}/installations", "GET /orgs/{org}/invitations", "GET /orgs/{org}/invitations/{invitation_id}/teams", "GET /orgs/{org}/issues", "GET /orgs/{org}/members", "GET /orgs/{org}/migrations", "GET /orgs/{org}/migrations/{migration_id}/repositories", "GET /orgs/{org}/outside_collaborators", "GET /orgs/{org}/packages", "GET /orgs/{org}/packages/{package_type}/{package_name}/versions", "GET /orgs/{org}/projects", "GET /orgs/{org}/public_members", "GET /orgs/{org}/repos", "GET /orgs/{org}/secret-scanning/alerts", "GET /orgs/{org}/settings/billing/advanced-security", "GET /orgs/{org}/team-sync/groups", "GET /orgs/{org}/teams", "GET /orgs/{org}/teams/{team_slug}/discussions", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions", "GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions", "GET /orgs/{org}/teams/{team_slug}/invitations", "GET /orgs/{org}/teams/{team_slug}/members", "GET /orgs/{org}/teams/{team_slug}/projects", "GET /orgs/{org}/teams/{team_slug}/repos", "GET /orgs/{org}/teams/{team_slug}/teams", "GET /projects/columns/{column_id}/cards", "GET /projects/{project_id}/collaborators", "GET /projects/{project_id}/columns", "GET /repos/{owner}/{repo}/actions/artifacts", "GET /repos/{owner}/{repo}/actions/caches", "GET /repos/{owner}/{repo}/actions/runners", "GET /repos/{owner}/{repo}/actions/runs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs", "GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs", "GET /repos/{owner}/{repo}/actions/secrets", "GET /repos/{owner}/{repo}/actions/workflows", "GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs", "GET /repos/{owner}/{repo}/assignees", "GET /repos/{owner}/{repo}/branches", "GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations", "GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs", "GET /repos/{owner}/{repo}/code-scanning/alerts", "GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", "GET /repos/{owner}/{repo}/code-scanning/analyses", "GET /repos/{owner}/{repo}/codespaces", "GET /repos/{owner}/{repo}/codespaces/devcontainers", "GET /repos/{owner}/{repo}/codespaces/secrets", "GET /repos/{owner}/{repo}/collaborators", "GET /repos/{owner}/{repo}/comments", "GET /repos/{owner}/{repo}/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/commits", "GET /repos/{owner}/{repo}/commits/{commit_sha}/comments", "GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls", "GET /repos/{owner}/{repo}/commits/{ref}/check-runs", "GET /repos/{owner}/{repo}/commits/{ref}/check-suites", "GET /repos/{owner}/{repo}/commits/{ref}/status", "GET /repos/{owner}/{repo}/commits/{ref}/statuses", "GET /repos/{owner}/{repo}/contributors", "GET /repos/{owner}/{repo}/dependabot/secrets", "GET /repos/{owner}/{repo}/deployments", "GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses", "GET /repos/{owner}/{repo}/environments", "GET /repos/{owner}/{repo}/events", "GET /repos/{owner}/{repo}/forks", "GET /repos/{owner}/{repo}/git/matching-refs/{ref}", "GET /repos/{owner}/{repo}/hooks", "GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries", "GET /repos/{owner}/{repo}/invitations", "GET /repos/{owner}/{repo}/issues", "GET /repos/{owner}/{repo}/issues/comments", "GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/issues/events", "GET /repos/{owner}/{repo}/issues/{issue_number}/comments", "GET /repos/{owner}/{repo}/issues/{issue_number}/events", "GET /repos/{owner}/{repo}/issues/{issue_number}/labels", "GET /repos/{owner}/{repo}/issues/{issue_number}/reactions", "GET /repos/{owner}/{repo}/issues/{issue_number}/timeline", "GET /repos/{owner}/{repo}/keys", "GET /repos/{owner}/{repo}/labels", "GET /repos/{owner}/{repo}/milestones", "GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels", "GET /repos/{owner}/{repo}/notifications", "GET /repos/{owner}/{repo}/pages/builds", "GET /repos/{owner}/{repo}/projects", "GET /repos/{owner}/{repo}/pulls", "GET /repos/{owner}/{repo}/pulls/comments", "GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions", "GET /repos/{owner}/{repo}/pulls/{pull_number}/comments", "GET /repos/{owner}/{repo}/pulls/{pull_number}/commits", "GET /repos/{owner}/{repo}/pulls/{pull_number}/files", "GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers", "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews", "GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments", "GET /repos/{owner}/{repo}/releases", "GET /repos/{owner}/{repo}/releases/{release_id}/assets", "GET /repos/{owner}/{repo}/releases/{release_id}/reactions", "GET /repos/{owner}/{repo}/secret-scanning/alerts", "GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations", "GET /repos/{owner}/{repo}/stargazers", "GET /repos/{owner}/{repo}/subscribers", "GET /repos/{owner}/{repo}/tags", "GET /repos/{owner}/{repo}/teams", "GET /repos/{owner}/{repo}/topics", "GET /repositories", "GET /repositories/{repository_id}/environments/{environment_name}/secrets", "GET /search/code", "GET /search/commits", "GET /search/issues", "GET /search/labels", "GET /search/repositories", "GET /search/topics", "GET /search/users", "GET /teams/{team_id}/discussions", "GET /teams/{team_id}/discussions/{discussion_number}/comments", "GET /teams/{team_id}/discussions/{discussion_number}/comments/{comment_number}/reactions", "GET /teams/{team_id}/discussions/{discussion_number}/reactions", "GET /teams/{team_id}/invitations", "GET /teams/{team_id}/members", "GET /teams/{team_id}/projects", "GET /teams/{team_id}/repos", "GET /teams/{team_id}/teams", "GET /user/blocks", "GET /user/codespaces", "GET /user/codespaces/secrets", "GET /user/emails", "GET /user/followers", "GET /user/following", "GET /user/gpg_keys", "GET /user/installations", "GET /user/installations/{installation_id}/repositories", "GET /user/issues", "GET /user/keys", "GET /user/marketplace_purchases", "GET /user/marketplace_purchases/stubbed", "GET /user/memberships/orgs", "GET /user/migrations", "GET /user/migrations/{migration_id}/repositories", "GET /user/orgs", "GET /user/packages", "GET /user/packages/{package_type}/{package_name}/versions", "GET /user/public_emails", "GET /user/repos", "GET /user/repository_invitations", "GET /user/starred", "GET /user/subscriptions", "GET /user/teams", "GET /users", "GET /users/{username}/events", "GET /users/{username}/events/orgs/{org}", "GET /users/{username}/events/public", "GET /users/{username}/followers", "GET /users/{username}/following", "GET /users/{username}/gists", "GET /users/{username}/gpg_keys", "GET /users/{username}/keys", "GET /users/{username}/orgs", "GET /users/{username}/packages", "GET /users/{username}/projects", "GET /users/{username}/received_events", "GET /users/{username}/received_events/public", "GET /users/{username}/repos", "GET /users/{username}/starred", "GET /users/{username}/subscriptions"]; - -function isPaginatingEndpoint(arg) { - if (typeof arg === "string") { - return paginatingEndpoints.includes(arg); - } else { - return false; - } -} - -/** - * @param octokit Octokit instance - * @param options Options passed to Octokit constructor - */ - -function paginateRest(octokit) { - return { - paginate: Object.assign(paginate.bind(null, octokit), { - iterator: iterator.bind(null, octokit) - }) - }; -} -paginateRest.VERSION = VERSION; - -exports.composePaginateRest = composePaginateRest; -exports.isPaginatingEndpoint = isPaginatingEndpoint; -exports.paginateRest = paginateRest; -exports.paginatingEndpoints = paginatingEndpoints; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 7471: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } - -var deprecation = __nccwpck_require__(8932); -var once = _interopDefault(__nccwpck_require__(1223)); - -const logOnceCode = once(deprecation => console.warn(deprecation)); -const logOnceHeaders = once(deprecation => console.warn(deprecation)); -/** - * Error with extra properties to help with debugging - */ - -class RequestError extends Error { - constructor(message, statusCode, options) { - super(message); // Maintains proper stack trace (only available on V8) - - /* istanbul ignore next */ - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = "HttpError"; - this.status = statusCode; - let headers; - - if ("headers" in options && typeof options.headers !== "undefined") { - headers = options.headers; - } - - if ("response" in options) { - this.response = options.response; - headers = options.response.headers; - } // redact request credentials without mutating original request options - - - const requestCopy = Object.assign({}, options.request); - - if (options.request.headers.authorization) { - requestCopy.headers = Object.assign({}, options.request.headers, { - authorization: options.request.headers.authorization.replace(/ .*$/, " [REDACTED]") - }); - } - - requestCopy.url = requestCopy.url // client_id & client_secret can be passed as URL query parameters to increase rate limit - // see https://developer.github.com/v3/#increasing-the-unauthenticated-rate-limit-for-oauth-applications - .replace(/\bclient_secret=\w+/g, "client_secret=[REDACTED]") // OAuth tokens can be passed as URL query parameters, although it is not recommended - // see https://developer.github.com/v3/#oauth2-token-sent-in-a-header - .replace(/\baccess_token=\w+/g, "access_token=[REDACTED]"); - this.request = requestCopy; // deprecations - - Object.defineProperty(this, "code", { - get() { - logOnceCode(new deprecation.Deprecation("[@octokit/request-error] `error.code` is deprecated, use `error.status`.")); - return statusCode; - } - - }); - Object.defineProperty(this, "headers", { - get() { - logOnceHeaders(new deprecation.Deprecation("[@octokit/request-error] `error.headers` is deprecated, use `error.response.headers`.")); - return headers || {}; - } - - }); - } - -} - -exports.RequestError = RequestError; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 9353: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } - -var endpoint = __nccwpck_require__(8713); -var universalUserAgent = __nccwpck_require__(5030); -var isPlainObject = __nccwpck_require__(3287); -var nodeFetch = _interopDefault(__nccwpck_require__(467)); -var requestError = __nccwpck_require__(7471); - -const VERSION = "5.6.3"; - -function getBufferResponse(response) { - return response.arrayBuffer(); -} - -function fetchWrapper(requestOptions) { - const log = requestOptions.request && requestOptions.request.log ? requestOptions.request.log : console; - - if (isPlainObject.isPlainObject(requestOptions.body) || Array.isArray(requestOptions.body)) { - requestOptions.body = JSON.stringify(requestOptions.body); - } - - let headers = {}; - let status; - let url; - const fetch = requestOptions.request && requestOptions.request.fetch || nodeFetch; - return fetch(requestOptions.url, Object.assign({ - method: requestOptions.method, - body: requestOptions.body, - headers: requestOptions.headers, - redirect: requestOptions.redirect - }, // `requestOptions.request.agent` type is incompatible - // see https://github.com/octokit/types.ts/pull/264 - requestOptions.request)).then(async response => { - url = response.url; - status = response.status; - - for (const keyAndValue of response.headers) { - headers[keyAndValue[0]] = keyAndValue[1]; - } - - if ("deprecation" in headers) { - const matches = headers.link && headers.link.match(/<([^>]+)>; rel="deprecation"/); - const deprecationLink = matches && matches.pop(); - log.warn(`[@octokit/request] "${requestOptions.method} ${requestOptions.url}" is deprecated. It is scheduled to be removed on ${headers.sunset}${deprecationLink ? `. See ${deprecationLink}` : ""}`); - } - - if (status === 204 || status === 205) { - return; - } // GitHub API returns 200 for HEAD requests - - - if (requestOptions.method === "HEAD") { - if (status < 400) { - return; - } - - throw new requestError.RequestError(response.statusText, status, { - response: { - url, - status, - headers, - data: undefined - }, - request: requestOptions - }); - } - - if (status === 304) { - throw new requestError.RequestError("Not modified", status, { - response: { - url, - status, - headers, - data: await getResponseData(response) - }, - request: requestOptions - }); - } - - if (status >= 400) { - const data = await getResponseData(response); - const error = new requestError.RequestError(toErrorMessage(data), status, { - response: { - url, - status, - headers, - data - }, - request: requestOptions - }); - throw error; - } - - return getResponseData(response); - }).then(data => { - return { - status, - url, - headers, - data - }; - }).catch(error => { - if (error instanceof requestError.RequestError) throw error; - throw new requestError.RequestError(error.message, 500, { - request: requestOptions - }); - }); -} - -async function getResponseData(response) { - const contentType = response.headers.get("content-type"); - - if (/application\/json/.test(contentType)) { - return response.json(); - } - - if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { - return response.text(); - } - - return getBufferResponse(response); -} - -function toErrorMessage(data) { - if (typeof data === "string") return data; // istanbul ignore else - just in case - - if ("message" in data) { - if (Array.isArray(data.errors)) { - return `${data.message}: ${data.errors.map(JSON.stringify).join(", ")}`; - } - - return data.message; - } // istanbul ignore next - just in case - - - return `Unknown error: ${JSON.stringify(data)}`; -} - -function withDefaults(oldEndpoint, newDefaults) { - const endpoint = oldEndpoint.defaults(newDefaults); - - const newApi = function (route, parameters) { - const endpointOptions = endpoint.merge(route, parameters); - - if (!endpointOptions.request || !endpointOptions.request.hook) { - return fetchWrapper(endpoint.parse(endpointOptions)); - } - - const request = (route, parameters) => { - return fetchWrapper(endpoint.parse(endpoint.merge(route, parameters))); - }; - - Object.assign(request, { - endpoint, - defaults: withDefaults.bind(null, endpoint) - }); - return endpointOptions.request.hook(request, endpointOptions); - }; - - return Object.assign(newApi, { - endpoint, - defaults: withDefaults.bind(null, endpoint) - }); -} - -const request = withDefaults(endpoint.endpoint, { - headers: { - "user-agent": `octokit-request.js/${VERSION} ${universalUserAgent.getUserAgent()}` - } -}); - -exports.request = request; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 6255: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -/* eslint-disable @typescript-eslint/no-explicit-any */ -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.HttpClient = exports.isHttps = exports.HttpClientResponse = exports.HttpClientError = exports.getProxyUrl = exports.MediaTypes = exports.Headers = exports.HttpCodes = void 0; -const http = __importStar(__nccwpck_require__(3685)); -const https = __importStar(__nccwpck_require__(5687)); -const pm = __importStar(__nccwpck_require__(9835)); -const tunnel = __importStar(__nccwpck_require__(4294)); -var HttpCodes; -(function (HttpCodes) { - HttpCodes[HttpCodes["OK"] = 200] = "OK"; - HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices"; - HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently"; - HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved"; - HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther"; - HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified"; - HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy"; - HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy"; - HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect"; - HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect"; - HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest"; - HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized"; - HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired"; - HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden"; - HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound"; - HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed"; - HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable"; - HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired"; - HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout"; - HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict"; - HttpCodes[HttpCodes["Gone"] = 410] = "Gone"; - HttpCodes[HttpCodes["TooManyRequests"] = 429] = "TooManyRequests"; - HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError"; - HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented"; - HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway"; - HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable"; - HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout"; -})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {})); -var Headers; -(function (Headers) { - Headers["Accept"] = "accept"; - Headers["ContentType"] = "content-type"; -})(Headers = exports.Headers || (exports.Headers = {})); -var MediaTypes; -(function (MediaTypes) { - MediaTypes["ApplicationJson"] = "application/json"; -})(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {})); -/** - * Returns the proxy URL, depending upon the supplied url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ -function getProxyUrl(serverUrl) { - const proxyUrl = pm.getProxyUrl(new URL(serverUrl)); - return proxyUrl ? proxyUrl.href : ''; -} -exports.getProxyUrl = getProxyUrl; -const HttpRedirectCodes = [ - HttpCodes.MovedPermanently, - HttpCodes.ResourceMoved, - HttpCodes.SeeOther, - HttpCodes.TemporaryRedirect, - HttpCodes.PermanentRedirect -]; -const HttpResponseRetryCodes = [ - HttpCodes.BadGateway, - HttpCodes.ServiceUnavailable, - HttpCodes.GatewayTimeout -]; -const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD']; -const ExponentialBackoffCeiling = 10; -const ExponentialBackoffTimeSlice = 5; -class HttpClientError extends Error { - constructor(message, statusCode) { - super(message); - this.name = 'HttpClientError'; - this.statusCode = statusCode; - Object.setPrototypeOf(this, HttpClientError.prototype); - } -} -exports.HttpClientError = HttpClientError; -class HttpClientResponse { - constructor(message) { - this.message = message; - } - readBody() { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () { - let output = Buffer.alloc(0); - this.message.on('data', (chunk) => { - output = Buffer.concat([output, chunk]); - }); - this.message.on('end', () => { - resolve(output.toString()); - }); - })); - }); - } -} -exports.HttpClientResponse = HttpClientResponse; -function isHttps(requestUrl) { - const parsedUrl = new URL(requestUrl); - return parsedUrl.protocol === 'https:'; -} -exports.isHttps = isHttps; -class HttpClient { - constructor(userAgent, handlers, requestOptions) { - this._ignoreSslError = false; - this._allowRedirects = true; - this._allowRedirectDowngrade = false; - this._maxRedirects = 50; - this._allowRetries = false; - this._maxRetries = 1; - this._keepAlive = false; - this._disposed = false; - this.userAgent = userAgent; - this.handlers = handlers || []; - this.requestOptions = requestOptions; - if (requestOptions) { - if (requestOptions.ignoreSslError != null) { - this._ignoreSslError = requestOptions.ignoreSslError; - } - this._socketTimeout = requestOptions.socketTimeout; - if (requestOptions.allowRedirects != null) { - this._allowRedirects = requestOptions.allowRedirects; - } - if (requestOptions.allowRedirectDowngrade != null) { - this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade; - } - if (requestOptions.maxRedirects != null) { - this._maxRedirects = Math.max(requestOptions.maxRedirects, 0); - } - if (requestOptions.keepAlive != null) { - this._keepAlive = requestOptions.keepAlive; - } - if (requestOptions.allowRetries != null) { - this._allowRetries = requestOptions.allowRetries; - } - if (requestOptions.maxRetries != null) { - this._maxRetries = requestOptions.maxRetries; - } - } - } - options(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('OPTIONS', requestUrl, null, additionalHeaders || {}); - }); - } - get(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('GET', requestUrl, null, additionalHeaders || {}); - }); - } - del(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('DELETE', requestUrl, null, additionalHeaders || {}); - }); - } - post(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('POST', requestUrl, data, additionalHeaders || {}); - }); - } - patch(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('PATCH', requestUrl, data, additionalHeaders || {}); - }); - } - put(requestUrl, data, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('PUT', requestUrl, data, additionalHeaders || {}); - }); - } - head(requestUrl, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request('HEAD', requestUrl, null, additionalHeaders || {}); - }); - } - sendStream(verb, requestUrl, stream, additionalHeaders) { - return __awaiter(this, void 0, void 0, function* () { - return this.request(verb, requestUrl, stream, additionalHeaders); - }); - } - /** - * Gets a typed object from an endpoint - * Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise - */ - getJson(requestUrl, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - const res = yield this.get(requestUrl, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - postJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.post(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - putJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.put(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - patchJson(requestUrl, obj, additionalHeaders = {}) { - return __awaiter(this, void 0, void 0, function* () { - const data = JSON.stringify(obj, null, 2); - additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson); - additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson); - const res = yield this.patch(requestUrl, data, additionalHeaders); - return this._processResponse(res, this.requestOptions); - }); - } - /** - * Makes a raw http request. - * All other methods such as get, post, patch, and request ultimately call this. - * Prefer get, del, post and patch - */ - request(verb, requestUrl, data, headers) { - return __awaiter(this, void 0, void 0, function* () { - if (this._disposed) { - throw new Error('Client has already been disposed.'); - } - const parsedUrl = new URL(requestUrl); - let info = this._prepareRequest(verb, parsedUrl, headers); - // Only perform retries on reads since writes may not be idempotent. - const maxTries = this._allowRetries && RetryableHttpVerbs.includes(verb) - ? this._maxRetries + 1 - : 1; - let numTries = 0; - let response; - do { - response = yield this.requestRaw(info, data); - // Check if it's an authentication challenge - if (response && - response.message && - response.message.statusCode === HttpCodes.Unauthorized) { - let authenticationHandler; - for (const handler of this.handlers) { - if (handler.canHandleAuthentication(response)) { - authenticationHandler = handler; - break; - } - } - if (authenticationHandler) { - return authenticationHandler.handleAuthentication(this, info, data); - } - else { - // We have received an unauthorized response but have no handlers to handle it. - // Let the response return to the caller. - return response; - } - } - let redirectsRemaining = this._maxRedirects; - while (response.message.statusCode && - HttpRedirectCodes.includes(response.message.statusCode) && - this._allowRedirects && - redirectsRemaining > 0) { - const redirectUrl = response.message.headers['location']; - if (!redirectUrl) { - // if there's no location to redirect to, we won't - break; - } - const parsedRedirectUrl = new URL(redirectUrl); - if (parsedUrl.protocol === 'https:' && - parsedUrl.protocol !== parsedRedirectUrl.protocol && - !this._allowRedirectDowngrade) { - throw new Error('Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.'); - } - // we need to finish reading the response before reassigning response - // which will leak the open socket. - yield response.readBody(); - // strip authorization header if redirected to a different hostname - if (parsedRedirectUrl.hostname !== parsedUrl.hostname) { - for (const header in headers) { - // header names are case insensitive - if (header.toLowerCase() === 'authorization') { - delete headers[header]; - } - } - } - // let's make the request with the new redirectUrl - info = this._prepareRequest(verb, parsedRedirectUrl, headers); - response = yield this.requestRaw(info, data); - redirectsRemaining--; - } - if (!response.message.statusCode || - !HttpResponseRetryCodes.includes(response.message.statusCode)) { - // If not a retry code, return immediately instead of retrying - return response; - } - numTries += 1; - if (numTries < maxTries) { - yield response.readBody(); - yield this._performExponentialBackoff(numTries); - } - } while (numTries < maxTries); - return response; - }); - } - /** - * Needs to be called if keepAlive is set to true in request options. - */ - dispose() { - if (this._agent) { - this._agent.destroy(); - } - this._disposed = true; - } - /** - * Raw request. - * @param info - * @param data - */ - requestRaw(info, data) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => { - function callbackForResult(err, res) { - if (err) { - reject(err); - } - else if (!res) { - // If `err` is not passed, then `res` must be passed. - reject(new Error('Unknown error')); - } - else { - resolve(res); - } - } - this.requestRawWithCallback(info, data, callbackForResult); - }); - }); - } - /** - * Raw request with callback. - * @param info - * @param data - * @param onResult - */ - requestRawWithCallback(info, data, onResult) { - if (typeof data === 'string') { - if (!info.options.headers) { - info.options.headers = {}; - } - info.options.headers['Content-Length'] = Buffer.byteLength(data, 'utf8'); - } - let callbackCalled = false; - function handleResult(err, res) { - if (!callbackCalled) { - callbackCalled = true; - onResult(err, res); - } - } - const req = info.httpModule.request(info.options, (msg) => { - const res = new HttpClientResponse(msg); - handleResult(undefined, res); - }); - let socket; - req.on('socket', sock => { - socket = sock; - }); - // If we ever get disconnected, we want the socket to timeout eventually - req.setTimeout(this._socketTimeout || 3 * 60000, () => { - if (socket) { - socket.end(); - } - handleResult(new Error(`Request timeout: ${info.options.path}`)); - }); - req.on('error', function (err) { - // err has statusCode property - // res should have headers - handleResult(err); - }); - if (data && typeof data === 'string') { - req.write(data, 'utf8'); - } - if (data && typeof data !== 'string') { - data.on('close', function () { - req.end(); - }); - data.pipe(req); - } - else { - req.end(); - } - } - /** - * Gets an http agent. This function is useful when you need an http agent that handles - * routing through a proxy server - depending upon the url and proxy environment variables. - * @param serverUrl The server URL where the request will be sent. For example, https://api.github.com - */ - getAgent(serverUrl) { - const parsedUrl = new URL(serverUrl); - return this._getAgent(parsedUrl); - } - _prepareRequest(method, requestUrl, headers) { - const info = {}; - info.parsedUrl = requestUrl; - const usingSsl = info.parsedUrl.protocol === 'https:'; - info.httpModule = usingSsl ? https : http; - const defaultPort = usingSsl ? 443 : 80; - info.options = {}; - info.options.host = info.parsedUrl.hostname; - info.options.port = info.parsedUrl.port - ? parseInt(info.parsedUrl.port) - : defaultPort; - info.options.path = - (info.parsedUrl.pathname || '') + (info.parsedUrl.search || ''); - info.options.method = method; - info.options.headers = this._mergeHeaders(headers); - if (this.userAgent != null) { - info.options.headers['user-agent'] = this.userAgent; - } - info.options.agent = this._getAgent(info.parsedUrl); - // gives handlers an opportunity to participate - if (this.handlers) { - for (const handler of this.handlers) { - handler.prepareRequest(info.options); - } - } - return info; - } - _mergeHeaders(headers) { - if (this.requestOptions && this.requestOptions.headers) { - return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers || {})); - } - return lowercaseKeys(headers || {}); - } - _getExistingOrDefaultHeader(additionalHeaders, header, _default) { - let clientHeader; - if (this.requestOptions && this.requestOptions.headers) { - clientHeader = lowercaseKeys(this.requestOptions.headers)[header]; - } - return additionalHeaders[header] || clientHeader || _default; - } - _getAgent(parsedUrl) { - let agent; - const proxyUrl = pm.getProxyUrl(parsedUrl); - const useProxy = proxyUrl && proxyUrl.hostname; - if (this._keepAlive && useProxy) { - agent = this._proxyAgent; - } - if (this._keepAlive && !useProxy) { - agent = this._agent; - } - // if agent is already assigned use that agent. - if (agent) { - return agent; - } - const usingSsl = parsedUrl.protocol === 'https:'; - let maxSockets = 100; - if (this.requestOptions) { - maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets; - } - // This is `useProxy` again, but we need to check `proxyURl` directly for TypeScripts's flow analysis. - if (proxyUrl && proxyUrl.hostname) { - const agentOptions = { - maxSockets, - keepAlive: this._keepAlive, - proxy: Object.assign(Object.assign({}, ((proxyUrl.username || proxyUrl.password) && { - proxyAuth: `${proxyUrl.username}:${proxyUrl.password}` - })), { host: proxyUrl.hostname, port: proxyUrl.port }) - }; - let tunnelAgent; - const overHttps = proxyUrl.protocol === 'https:'; - if (usingSsl) { - tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp; - } - else { - tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp; - } - agent = tunnelAgent(agentOptions); - this._proxyAgent = agent; - } - // if reusing agent across request and tunneling agent isn't assigned create a new agent - if (this._keepAlive && !agent) { - const options = { keepAlive: this._keepAlive, maxSockets }; - agent = usingSsl ? new https.Agent(options) : new http.Agent(options); - this._agent = agent; - } - // if not using private agent and tunnel agent isn't setup then use global agent - if (!agent) { - agent = usingSsl ? https.globalAgent : http.globalAgent; - } - if (usingSsl && this._ignoreSslError) { - // we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process - // http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options - // we have to cast it to any and change it directly - agent.options = Object.assign(agent.options || {}, { - rejectUnauthorized: false - }); - } - return agent; - } - _performExponentialBackoff(retryNumber) { - return __awaiter(this, void 0, void 0, function* () { - retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber); - const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber); - return new Promise(resolve => setTimeout(() => resolve(), ms)); - }); - } - _processResponse(res, options) { - return __awaiter(this, void 0, void 0, function* () { - return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { - const statusCode = res.message.statusCode || 0; - const response = { - statusCode, - result: null, - headers: {} - }; - // not found leads to null obj returned - if (statusCode === HttpCodes.NotFound) { - resolve(response); - } - // get the result from the body - function dateTimeDeserializer(key, value) { - if (typeof value === 'string') { - const a = new Date(value); - if (!isNaN(a.valueOf())) { - return a; - } - } - return value; - } - let obj; - let contents; - try { - contents = yield res.readBody(); - if (contents && contents.length > 0) { - if (options && options.deserializeDates) { - obj = JSON.parse(contents, dateTimeDeserializer); - } - else { - obj = JSON.parse(contents); - } - response.result = obj; - } - response.headers = res.message.headers; - } - catch (err) { - // Invalid resource (contents not json); leaving result obj null - } - // note that 3xx redirects are handled by the http layer. - if (statusCode > 299) { - let msg; - // if exception/error in body, attempt to get better error - if (obj && obj.message) { - msg = obj.message; - } - else if (contents && contents.length > 0) { - // it may be the case that the exception is in the body message as string - msg = contents; - } - else { - msg = `Failed request: (${statusCode})`; - } - const err = new HttpClientError(msg, statusCode); - err.result = response.result; - reject(err); - } - else { - resolve(response); - } - })); - }); - } -} -exports.HttpClient = HttpClient; -const lowercaseKeys = (obj) => Object.keys(obj).reduce((c, k) => ((c[k.toLowerCase()] = obj[k]), c), {}); -//# sourceMappingURL=index.js.map - -/***/ }), - -/***/ 9835: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.checkBypass = exports.getProxyUrl = void 0; -function getProxyUrl(reqUrl) { - const usingSsl = reqUrl.protocol === 'https:'; - if (checkBypass(reqUrl)) { - return undefined; - } - const proxyVar = (() => { - if (usingSsl) { - return process.env['https_proxy'] || process.env['HTTPS_PROXY']; - } - else { - return process.env['http_proxy'] || process.env['HTTP_PROXY']; - } - })(); - if (proxyVar) { - return new URL(proxyVar); - } - else { - return undefined; - } -} -exports.getProxyUrl = getProxyUrl; -function checkBypass(reqUrl) { - if (!reqUrl.hostname) { - return false; - } - const noProxy = process.env['no_proxy'] || process.env['NO_PROXY'] || ''; - if (!noProxy) { - return false; - } - // Determine the request port - let reqPort; - if (reqUrl.port) { - reqPort = Number(reqUrl.port); - } - else if (reqUrl.protocol === 'http:') { - reqPort = 80; - } - else if (reqUrl.protocol === 'https:') { - reqPort = 443; - } - // Format the request hostname and hostname with port - const upperReqHosts = [reqUrl.hostname.toUpperCase()]; - if (typeof reqPort === 'number') { - upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`); - } - // Compare request host against noproxy - for (const upperNoProxyItem of noProxy - .split(',') - .map(x => x.trim().toUpperCase()) - .filter(x => x)) { - if (upperReqHosts.some(x => x === upperNoProxyItem)) { - return true; - } - } - return false; -} -exports.checkBypass = checkBypass; -//# sourceMappingURL=proxy.js.map - -/***/ }), - -/***/ 3044: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -function ownKeys(object, enumerableOnly) { - var keys = Object.keys(object); - - if (Object.getOwnPropertySymbols) { - var symbols = Object.getOwnPropertySymbols(object); - - if (enumerableOnly) { - symbols = symbols.filter(function (sym) { - return Object.getOwnPropertyDescriptor(object, sym).enumerable; - }); - } - - keys.push.apply(keys, symbols); - } - - return keys; -} - -function _objectSpread2(target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i] != null ? arguments[i] : {}; - - if (i % 2) { - ownKeys(Object(source), true).forEach(function (key) { - _defineProperty(target, key, source[key]); - }); - } else if (Object.getOwnPropertyDescriptors) { - Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); - } else { - ownKeys(Object(source)).forEach(function (key) { - Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); - }); - } - } - - return target; -} - -function _defineProperty(obj, key, value) { - if (key in obj) { - Object.defineProperty(obj, key, { - value: value, - enumerable: true, - configurable: true, - writable: true - }); - } else { - obj[key] = value; - } - - return obj; -} - -const Endpoints = { - actions: { - addCustomLabelsToSelfHostedRunnerForOrg: ["POST /orgs/{org}/actions/runners/{runner_id}/labels"], - addCustomLabelsToSelfHostedRunnerForRepo: ["POST /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], - addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], - approveWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/approve"], - cancelWorkflowRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/cancel"], - createOrUpdateEnvironmentSecret: ["PUT /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], - createOrUpdateOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}"], - createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/actions/secrets/{secret_name}"], - createRegistrationTokenForOrg: ["POST /orgs/{org}/actions/runners/registration-token"], - createRegistrationTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/registration-token"], - createRemoveTokenForOrg: ["POST /orgs/{org}/actions/runners/remove-token"], - createRemoveTokenForRepo: ["POST /repos/{owner}/{repo}/actions/runners/remove-token"], - createWorkflowDispatch: ["POST /repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches"], - deleteActionsCacheById: ["DELETE /repos/{owner}/{repo}/actions/caches/{cache_id}"], - deleteActionsCacheByKey: ["DELETE /repos/{owner}/{repo}/actions/caches{?key,ref}"], - deleteArtifact: ["DELETE /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], - deleteEnvironmentSecret: ["DELETE /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], - deleteOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}"], - deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/actions/secrets/{secret_name}"], - deleteSelfHostedRunnerFromOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}"], - deleteSelfHostedRunnerFromRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}"], - deleteWorkflowRun: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}"], - deleteWorkflowRunLogs: ["DELETE /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], - disableSelectedRepositoryGithubActionsOrganization: ["DELETE /orgs/{org}/actions/permissions/repositories/{repository_id}"], - disableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/disable"], - downloadArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}/{archive_format}"], - downloadJobLogsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}/logs"], - downloadWorkflowRunAttemptLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/logs"], - downloadWorkflowRunLogs: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/logs"], - enableSelectedRepositoryGithubActionsOrganization: ["PUT /orgs/{org}/actions/permissions/repositories/{repository_id}"], - enableWorkflow: ["PUT /repos/{owner}/{repo}/actions/workflows/{workflow_id}/enable"], - getActionsCacheList: ["GET /repos/{owner}/{repo}/actions/caches"], - getActionsCacheUsage: ["GET /repos/{owner}/{repo}/actions/cache/usage"], - getActionsCacheUsageByRepoForOrg: ["GET /orgs/{org}/actions/cache/usage-by-repository"], - getActionsCacheUsageForEnterprise: ["GET /enterprises/{enterprise}/actions/cache/usage"], - getActionsCacheUsageForOrg: ["GET /orgs/{org}/actions/cache/usage"], - getAllowedActionsOrganization: ["GET /orgs/{org}/actions/permissions/selected-actions"], - getAllowedActionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/selected-actions"], - getArtifact: ["GET /repos/{owner}/{repo}/actions/artifacts/{artifact_id}"], - getEnvironmentPublicKey: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets/public-key"], - getEnvironmentSecret: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets/{secret_name}"], - getGithubActionsDefaultWorkflowPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/workflow"], - getGithubActionsDefaultWorkflowPermissionsOrganization: ["GET /orgs/{org}/actions/permissions/workflow"], - getGithubActionsDefaultWorkflowPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions/workflow"], - getGithubActionsPermissionsOrganization: ["GET /orgs/{org}/actions/permissions"], - getGithubActionsPermissionsRepository: ["GET /repos/{owner}/{repo}/actions/permissions"], - getJobForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/jobs/{job_id}"], - getOrgPublicKey: ["GET /orgs/{org}/actions/secrets/public-key"], - getOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}"], - getPendingDeploymentsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"], - getRepoPermissions: ["GET /repos/{owner}/{repo}/actions/permissions", {}, { - renamed: ["actions", "getGithubActionsPermissionsRepository"] - }], - getRepoPublicKey: ["GET /repos/{owner}/{repo}/actions/secrets/public-key"], - getRepoSecret: ["GET /repos/{owner}/{repo}/actions/secrets/{secret_name}"], - getReviewsForRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/approvals"], - getSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}"], - getSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}"], - getWorkflow: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}"], - getWorkflowAccessToRepository: ["GET /repos/{owner}/{repo}/actions/permissions/access"], - getWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}"], - getWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}"], - getWorkflowRunUsage: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/timing"], - getWorkflowUsage: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/timing"], - listArtifactsForRepo: ["GET /repos/{owner}/{repo}/actions/artifacts"], - listEnvironmentSecrets: ["GET /repositories/{repository_id}/environments/{environment_name}/secrets"], - listJobsForWorkflowRun: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/jobs"], - listJobsForWorkflowRunAttempt: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/attempts/{attempt_number}/jobs"], - listLabelsForSelfHostedRunnerForOrg: ["GET /orgs/{org}/actions/runners/{runner_id}/labels"], - listLabelsForSelfHostedRunnerForRepo: ["GET /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], - listOrgSecrets: ["GET /orgs/{org}/actions/secrets"], - listRepoSecrets: ["GET /repos/{owner}/{repo}/actions/secrets"], - listRepoWorkflows: ["GET /repos/{owner}/{repo}/actions/workflows"], - listRunnerApplicationsForOrg: ["GET /orgs/{org}/actions/runners/downloads"], - listRunnerApplicationsForRepo: ["GET /repos/{owner}/{repo}/actions/runners/downloads"], - listSelectedReposForOrgSecret: ["GET /orgs/{org}/actions/secrets/{secret_name}/repositories"], - listSelectedRepositoriesEnabledGithubActionsOrganization: ["GET /orgs/{org}/actions/permissions/repositories"], - listSelfHostedRunnersForOrg: ["GET /orgs/{org}/actions/runners"], - listSelfHostedRunnersForRepo: ["GET /repos/{owner}/{repo}/actions/runners"], - listWorkflowRunArtifacts: ["GET /repos/{owner}/{repo}/actions/runs/{run_id}/artifacts"], - listWorkflowRuns: ["GET /repos/{owner}/{repo}/actions/workflows/{workflow_id}/runs"], - listWorkflowRunsForRepo: ["GET /repos/{owner}/{repo}/actions/runs"], - reRunJobForWorkflowRun: ["POST /repos/{owner}/{repo}/actions/jobs/{job_id}/rerun"], - reRunWorkflow: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun"], - reRunWorkflowFailedJobs: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs"], - removeAllCustomLabelsFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels"], - removeAllCustomLabelsFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], - removeCustomLabelFromSelfHostedRunnerForOrg: ["DELETE /orgs/{org}/actions/runners/{runner_id}/labels/{name}"], - removeCustomLabelFromSelfHostedRunnerForRepo: ["DELETE /repos/{owner}/{repo}/actions/runners/{runner_id}/labels/{name}"], - removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/actions/secrets/{secret_name}/repositories/{repository_id}"], - reviewPendingDeploymentsForRun: ["POST /repos/{owner}/{repo}/actions/runs/{run_id}/pending_deployments"], - setAllowedActionsOrganization: ["PUT /orgs/{org}/actions/permissions/selected-actions"], - setAllowedActionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/selected-actions"], - setCustomLabelsForSelfHostedRunnerForOrg: ["PUT /orgs/{org}/actions/runners/{runner_id}/labels"], - setCustomLabelsForSelfHostedRunnerForRepo: ["PUT /repos/{owner}/{repo}/actions/runners/{runner_id}/labels"], - setGithubActionsDefaultWorkflowPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/workflow"], - setGithubActionsDefaultWorkflowPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions/workflow"], - setGithubActionsDefaultWorkflowPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/workflow"], - setGithubActionsPermissionsOrganization: ["PUT /orgs/{org}/actions/permissions"], - setGithubActionsPermissionsRepository: ["PUT /repos/{owner}/{repo}/actions/permissions"], - setSelectedReposForOrgSecret: ["PUT /orgs/{org}/actions/secrets/{secret_name}/repositories"], - setSelectedRepositoriesEnabledGithubActionsOrganization: ["PUT /orgs/{org}/actions/permissions/repositories"], - setWorkflowAccessToRepository: ["PUT /repos/{owner}/{repo}/actions/permissions/access"] - }, - activity: { - checkRepoIsStarredByAuthenticatedUser: ["GET /user/starred/{owner}/{repo}"], - deleteRepoSubscription: ["DELETE /repos/{owner}/{repo}/subscription"], - deleteThreadSubscription: ["DELETE /notifications/threads/{thread_id}/subscription"], - getFeeds: ["GET /feeds"], - getRepoSubscription: ["GET /repos/{owner}/{repo}/subscription"], - getThread: ["GET /notifications/threads/{thread_id}"], - getThreadSubscriptionForAuthenticatedUser: ["GET /notifications/threads/{thread_id}/subscription"], - listEventsForAuthenticatedUser: ["GET /users/{username}/events"], - listNotificationsForAuthenticatedUser: ["GET /notifications"], - listOrgEventsForAuthenticatedUser: ["GET /users/{username}/events/orgs/{org}"], - listPublicEvents: ["GET /events"], - listPublicEventsForRepoNetwork: ["GET /networks/{owner}/{repo}/events"], - listPublicEventsForUser: ["GET /users/{username}/events/public"], - listPublicOrgEvents: ["GET /orgs/{org}/events"], - listReceivedEventsForUser: ["GET /users/{username}/received_events"], - listReceivedPublicEventsForUser: ["GET /users/{username}/received_events/public"], - listRepoEvents: ["GET /repos/{owner}/{repo}/events"], - listRepoNotificationsForAuthenticatedUser: ["GET /repos/{owner}/{repo}/notifications"], - listReposStarredByAuthenticatedUser: ["GET /user/starred"], - listReposStarredByUser: ["GET /users/{username}/starred"], - listReposWatchedByUser: ["GET /users/{username}/subscriptions"], - listStargazersForRepo: ["GET /repos/{owner}/{repo}/stargazers"], - listWatchedReposForAuthenticatedUser: ["GET /user/subscriptions"], - listWatchersForRepo: ["GET /repos/{owner}/{repo}/subscribers"], - markNotificationsAsRead: ["PUT /notifications"], - markRepoNotificationsAsRead: ["PUT /repos/{owner}/{repo}/notifications"], - markThreadAsRead: ["PATCH /notifications/threads/{thread_id}"], - setRepoSubscription: ["PUT /repos/{owner}/{repo}/subscription"], - setThreadSubscription: ["PUT /notifications/threads/{thread_id}/subscription"], - starRepoForAuthenticatedUser: ["PUT /user/starred/{owner}/{repo}"], - unstarRepoForAuthenticatedUser: ["DELETE /user/starred/{owner}/{repo}"] - }, - apps: { - addRepoToInstallation: ["PUT /user/installations/{installation_id}/repositories/{repository_id}", {}, { - renamed: ["apps", "addRepoToInstallationForAuthenticatedUser"] - }], - addRepoToInstallationForAuthenticatedUser: ["PUT /user/installations/{installation_id}/repositories/{repository_id}"], - checkToken: ["POST /applications/{client_id}/token"], - createFromManifest: ["POST /app-manifests/{code}/conversions"], - createInstallationAccessToken: ["POST /app/installations/{installation_id}/access_tokens"], - deleteAuthorization: ["DELETE /applications/{client_id}/grant"], - deleteInstallation: ["DELETE /app/installations/{installation_id}"], - deleteToken: ["DELETE /applications/{client_id}/token"], - getAuthenticated: ["GET /app"], - getBySlug: ["GET /apps/{app_slug}"], - getInstallation: ["GET /app/installations/{installation_id}"], - getOrgInstallation: ["GET /orgs/{org}/installation"], - getRepoInstallation: ["GET /repos/{owner}/{repo}/installation"], - getSubscriptionPlanForAccount: ["GET /marketplace_listing/accounts/{account_id}"], - getSubscriptionPlanForAccountStubbed: ["GET /marketplace_listing/stubbed/accounts/{account_id}"], - getUserInstallation: ["GET /users/{username}/installation"], - getWebhookConfigForApp: ["GET /app/hook/config"], - getWebhookDelivery: ["GET /app/hook/deliveries/{delivery_id}"], - listAccountsForPlan: ["GET /marketplace_listing/plans/{plan_id}/accounts"], - listAccountsForPlanStubbed: ["GET /marketplace_listing/stubbed/plans/{plan_id}/accounts"], - listInstallationReposForAuthenticatedUser: ["GET /user/installations/{installation_id}/repositories"], - listInstallations: ["GET /app/installations"], - listInstallationsForAuthenticatedUser: ["GET /user/installations"], - listPlans: ["GET /marketplace_listing/plans"], - listPlansStubbed: ["GET /marketplace_listing/stubbed/plans"], - listReposAccessibleToInstallation: ["GET /installation/repositories"], - listSubscriptionsForAuthenticatedUser: ["GET /user/marketplace_purchases"], - listSubscriptionsForAuthenticatedUserStubbed: ["GET /user/marketplace_purchases/stubbed"], - listWebhookDeliveries: ["GET /app/hook/deliveries"], - redeliverWebhookDelivery: ["POST /app/hook/deliveries/{delivery_id}/attempts"], - removeRepoFromInstallation: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}", {}, { - renamed: ["apps", "removeRepoFromInstallationForAuthenticatedUser"] - }], - removeRepoFromInstallationForAuthenticatedUser: ["DELETE /user/installations/{installation_id}/repositories/{repository_id}"], - resetToken: ["PATCH /applications/{client_id}/token"], - revokeInstallationAccessToken: ["DELETE /installation/token"], - scopeToken: ["POST /applications/{client_id}/token/scoped"], - suspendInstallation: ["PUT /app/installations/{installation_id}/suspended"], - unsuspendInstallation: ["DELETE /app/installations/{installation_id}/suspended"], - updateWebhookConfigForApp: ["PATCH /app/hook/config"] - }, - billing: { - getGithubActionsBillingOrg: ["GET /orgs/{org}/settings/billing/actions"], - getGithubActionsBillingUser: ["GET /users/{username}/settings/billing/actions"], - getGithubAdvancedSecurityBillingGhe: ["GET /enterprises/{enterprise}/settings/billing/advanced-security"], - getGithubAdvancedSecurityBillingOrg: ["GET /orgs/{org}/settings/billing/advanced-security"], - getGithubPackagesBillingOrg: ["GET /orgs/{org}/settings/billing/packages"], - getGithubPackagesBillingUser: ["GET /users/{username}/settings/billing/packages"], - getSharedStorageBillingOrg: ["GET /orgs/{org}/settings/billing/shared-storage"], - getSharedStorageBillingUser: ["GET /users/{username}/settings/billing/shared-storage"] - }, - checks: { - create: ["POST /repos/{owner}/{repo}/check-runs"], - createSuite: ["POST /repos/{owner}/{repo}/check-suites"], - get: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}"], - getSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}"], - listAnnotations: ["GET /repos/{owner}/{repo}/check-runs/{check_run_id}/annotations"], - listForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-runs"], - listForSuite: ["GET /repos/{owner}/{repo}/check-suites/{check_suite_id}/check-runs"], - listSuitesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/check-suites"], - rerequestRun: ["POST /repos/{owner}/{repo}/check-runs/{check_run_id}/rerequest"], - rerequestSuite: ["POST /repos/{owner}/{repo}/check-suites/{check_suite_id}/rerequest"], - setSuitesPreferences: ["PATCH /repos/{owner}/{repo}/check-suites/preferences"], - update: ["PATCH /repos/{owner}/{repo}/check-runs/{check_run_id}"] - }, - codeScanning: { - deleteAnalysis: ["DELETE /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}{?confirm_delete}"], - getAlert: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}", {}, { - renamedParameters: { - alert_id: "alert_number" - } - }], - getAnalysis: ["GET /repos/{owner}/{repo}/code-scanning/analyses/{analysis_id}"], - getSarif: ["GET /repos/{owner}/{repo}/code-scanning/sarifs/{sarif_id}"], - listAlertInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances"], - listAlertsForOrg: ["GET /orgs/{org}/code-scanning/alerts"], - listAlertsForRepo: ["GET /repos/{owner}/{repo}/code-scanning/alerts"], - listAlertsInstances: ["GET /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}/instances", {}, { - renamed: ["codeScanning", "listAlertInstances"] - }], - listRecentAnalyses: ["GET /repos/{owner}/{repo}/code-scanning/analyses"], - updateAlert: ["PATCH /repos/{owner}/{repo}/code-scanning/alerts/{alert_number}"], - uploadSarif: ["POST /repos/{owner}/{repo}/code-scanning/sarifs"] - }, - codesOfConduct: { - getAllCodesOfConduct: ["GET /codes_of_conduct"], - getConductCode: ["GET /codes_of_conduct/{key}"] - }, - codespaces: { - addRepositoryForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"], - codespaceMachinesForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/machines"], - createForAuthenticatedUser: ["POST /user/codespaces"], - createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], - createOrUpdateSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}"], - createWithPrForAuthenticatedUser: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/codespaces"], - createWithRepoForAuthenticatedUser: ["POST /repos/{owner}/{repo}/codespaces"], - deleteForAuthenticatedUser: ["DELETE /user/codespaces/{codespace_name}"], - deleteFromOrganization: ["DELETE /orgs/{org}/members/{username}/codespaces/{codespace_name}"], - deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], - deleteSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}"], - exportForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/exports"], - getExportDetailsForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}/exports/{export_id}"], - getForAuthenticatedUser: ["GET /user/codespaces/{codespace_name}"], - getPublicKeyForAuthenticatedUser: ["GET /user/codespaces/secrets/public-key"], - getRepoPublicKey: ["GET /repos/{owner}/{repo}/codespaces/secrets/public-key"], - getRepoSecret: ["GET /repos/{owner}/{repo}/codespaces/secrets/{secret_name}"], - getSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}"], - listDevcontainersInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/devcontainers"], - listForAuthenticatedUser: ["GET /user/codespaces"], - listInOrganization: ["GET /orgs/{org}/codespaces", {}, { - renamedParameters: { - org_id: "org" - } - }], - listInRepositoryForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces"], - listRepoSecrets: ["GET /repos/{owner}/{repo}/codespaces/secrets"], - listRepositoriesForSecretForAuthenticatedUser: ["GET /user/codespaces/secrets/{secret_name}/repositories"], - listSecretsForAuthenticatedUser: ["GET /user/codespaces/secrets"], - removeRepositoryForSecretForAuthenticatedUser: ["DELETE /user/codespaces/secrets/{secret_name}/repositories/{repository_id}"], - repoMachinesForAuthenticatedUser: ["GET /repos/{owner}/{repo}/codespaces/machines"], - setRepositoriesForSecretForAuthenticatedUser: ["PUT /user/codespaces/secrets/{secret_name}/repositories"], - startForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/start"], - stopForAuthenticatedUser: ["POST /user/codespaces/{codespace_name}/stop"], - stopInOrganization: ["POST /orgs/{org}/members/{username}/codespaces/{codespace_name}/stop"], - updateForAuthenticatedUser: ["PATCH /user/codespaces/{codespace_name}"] - }, - dependabot: { - addSelectedRepoToOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"], - createOrUpdateOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}"], - createOrUpdateRepoSecret: ["PUT /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], - deleteOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}"], - deleteRepoSecret: ["DELETE /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], - getOrgPublicKey: ["GET /orgs/{org}/dependabot/secrets/public-key"], - getOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}"], - getRepoPublicKey: ["GET /repos/{owner}/{repo}/dependabot/secrets/public-key"], - getRepoSecret: ["GET /repos/{owner}/{repo}/dependabot/secrets/{secret_name}"], - listOrgSecrets: ["GET /orgs/{org}/dependabot/secrets"], - listRepoSecrets: ["GET /repos/{owner}/{repo}/dependabot/secrets"], - listSelectedReposForOrgSecret: ["GET /orgs/{org}/dependabot/secrets/{secret_name}/repositories"], - removeSelectedRepoFromOrgSecret: ["DELETE /orgs/{org}/dependabot/secrets/{secret_name}/repositories/{repository_id}"], - setSelectedReposForOrgSecret: ["PUT /orgs/{org}/dependabot/secrets/{secret_name}/repositories"] - }, - dependencyGraph: { - createRepositorySnapshot: ["POST /repos/{owner}/{repo}/dependency-graph/snapshots"], - diffRange: ["GET /repos/{owner}/{repo}/dependency-graph/compare/{basehead}"] - }, - emojis: { - get: ["GET /emojis"] - }, - enterpriseAdmin: { - addCustomLabelsToSelfHostedRunnerForEnterprise: ["POST /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], - disableSelectedOrganizationGithubActionsEnterprise: ["DELETE /enterprises/{enterprise}/actions/permissions/organizations/{org_id}"], - enableSelectedOrganizationGithubActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/organizations/{org_id}"], - getAllowedActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/selected-actions"], - getGithubActionsPermissionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions"], - getServerStatistics: ["GET /enterprise-installation/{enterprise_or_org}/server-statistics"], - listLabelsForSelfHostedRunnerForEnterprise: ["GET /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], - listSelectedOrganizationsEnabledGithubActionsEnterprise: ["GET /enterprises/{enterprise}/actions/permissions/organizations"], - removeAllCustomLabelsFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], - removeCustomLabelFromSelfHostedRunnerForEnterprise: ["DELETE /enterprises/{enterprise}/actions/runners/{runner_id}/labels/{name}"], - setAllowedActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/selected-actions"], - setCustomLabelsForSelfHostedRunnerForEnterprise: ["PUT /enterprises/{enterprise}/actions/runners/{runner_id}/labels"], - setGithubActionsPermissionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions"], - setSelectedOrganizationsEnabledGithubActionsEnterprise: ["PUT /enterprises/{enterprise}/actions/permissions/organizations"] - }, - gists: { - checkIsStarred: ["GET /gists/{gist_id}/star"], - create: ["POST /gists"], - createComment: ["POST /gists/{gist_id}/comments"], - delete: ["DELETE /gists/{gist_id}"], - deleteComment: ["DELETE /gists/{gist_id}/comments/{comment_id}"], - fork: ["POST /gists/{gist_id}/forks"], - get: ["GET /gists/{gist_id}"], - getComment: ["GET /gists/{gist_id}/comments/{comment_id}"], - getRevision: ["GET /gists/{gist_id}/{sha}"], - list: ["GET /gists"], - listComments: ["GET /gists/{gist_id}/comments"], - listCommits: ["GET /gists/{gist_id}/commits"], - listForUser: ["GET /users/{username}/gists"], - listForks: ["GET /gists/{gist_id}/forks"], - listPublic: ["GET /gists/public"], - listStarred: ["GET /gists/starred"], - star: ["PUT /gists/{gist_id}/star"], - unstar: ["DELETE /gists/{gist_id}/star"], - update: ["PATCH /gists/{gist_id}"], - updateComment: ["PATCH /gists/{gist_id}/comments/{comment_id}"] - }, - git: { - createBlob: ["POST /repos/{owner}/{repo}/git/blobs"], - createCommit: ["POST /repos/{owner}/{repo}/git/commits"], - createRef: ["POST /repos/{owner}/{repo}/git/refs"], - createTag: ["POST /repos/{owner}/{repo}/git/tags"], - createTree: ["POST /repos/{owner}/{repo}/git/trees"], - deleteRef: ["DELETE /repos/{owner}/{repo}/git/refs/{ref}"], - getBlob: ["GET /repos/{owner}/{repo}/git/blobs/{file_sha}"], - getCommit: ["GET /repos/{owner}/{repo}/git/commits/{commit_sha}"], - getRef: ["GET /repos/{owner}/{repo}/git/ref/{ref}"], - getTag: ["GET /repos/{owner}/{repo}/git/tags/{tag_sha}"], - getTree: ["GET /repos/{owner}/{repo}/git/trees/{tree_sha}"], - listMatchingRefs: ["GET /repos/{owner}/{repo}/git/matching-refs/{ref}"], - updateRef: ["PATCH /repos/{owner}/{repo}/git/refs/{ref}"] - }, - gitignore: { - getAllTemplates: ["GET /gitignore/templates"], - getTemplate: ["GET /gitignore/templates/{name}"] - }, - interactions: { - getRestrictionsForAuthenticatedUser: ["GET /user/interaction-limits"], - getRestrictionsForOrg: ["GET /orgs/{org}/interaction-limits"], - getRestrictionsForRepo: ["GET /repos/{owner}/{repo}/interaction-limits"], - getRestrictionsForYourPublicRepos: ["GET /user/interaction-limits", {}, { - renamed: ["interactions", "getRestrictionsForAuthenticatedUser"] - }], - removeRestrictionsForAuthenticatedUser: ["DELETE /user/interaction-limits"], - removeRestrictionsForOrg: ["DELETE /orgs/{org}/interaction-limits"], - removeRestrictionsForRepo: ["DELETE /repos/{owner}/{repo}/interaction-limits"], - removeRestrictionsForYourPublicRepos: ["DELETE /user/interaction-limits", {}, { - renamed: ["interactions", "removeRestrictionsForAuthenticatedUser"] - }], - setRestrictionsForAuthenticatedUser: ["PUT /user/interaction-limits"], - setRestrictionsForOrg: ["PUT /orgs/{org}/interaction-limits"], - setRestrictionsForRepo: ["PUT /repos/{owner}/{repo}/interaction-limits"], - setRestrictionsForYourPublicRepos: ["PUT /user/interaction-limits", {}, { - renamed: ["interactions", "setRestrictionsForAuthenticatedUser"] - }] - }, - issues: { - addAssignees: ["POST /repos/{owner}/{repo}/issues/{issue_number}/assignees"], - addLabels: ["POST /repos/{owner}/{repo}/issues/{issue_number}/labels"], - checkUserCanBeAssigned: ["GET /repos/{owner}/{repo}/assignees/{assignee}"], - create: ["POST /repos/{owner}/{repo}/issues"], - createComment: ["POST /repos/{owner}/{repo}/issues/{issue_number}/comments"], - createLabel: ["POST /repos/{owner}/{repo}/labels"], - createMilestone: ["POST /repos/{owner}/{repo}/milestones"], - deleteComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}"], - deleteLabel: ["DELETE /repos/{owner}/{repo}/labels/{name}"], - deleteMilestone: ["DELETE /repos/{owner}/{repo}/milestones/{milestone_number}"], - get: ["GET /repos/{owner}/{repo}/issues/{issue_number}"], - getComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}"], - getEvent: ["GET /repos/{owner}/{repo}/issues/events/{event_id}"], - getLabel: ["GET /repos/{owner}/{repo}/labels/{name}"], - getMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}"], - list: ["GET /issues"], - listAssignees: ["GET /repos/{owner}/{repo}/assignees"], - listComments: ["GET /repos/{owner}/{repo}/issues/{issue_number}/comments"], - listCommentsForRepo: ["GET /repos/{owner}/{repo}/issues/comments"], - listEvents: ["GET /repos/{owner}/{repo}/issues/{issue_number}/events"], - listEventsForRepo: ["GET /repos/{owner}/{repo}/issues/events"], - listEventsForTimeline: ["GET /repos/{owner}/{repo}/issues/{issue_number}/timeline"], - listForAuthenticatedUser: ["GET /user/issues"], - listForOrg: ["GET /orgs/{org}/issues"], - listForRepo: ["GET /repos/{owner}/{repo}/issues"], - listLabelsForMilestone: ["GET /repos/{owner}/{repo}/milestones/{milestone_number}/labels"], - listLabelsForRepo: ["GET /repos/{owner}/{repo}/labels"], - listLabelsOnIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/labels"], - listMilestones: ["GET /repos/{owner}/{repo}/milestones"], - lock: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/lock"], - removeAllLabels: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels"], - removeAssignees: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/assignees"], - removeLabel: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/labels/{name}"], - setLabels: ["PUT /repos/{owner}/{repo}/issues/{issue_number}/labels"], - unlock: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/lock"], - update: ["PATCH /repos/{owner}/{repo}/issues/{issue_number}"], - updateComment: ["PATCH /repos/{owner}/{repo}/issues/comments/{comment_id}"], - updateLabel: ["PATCH /repos/{owner}/{repo}/labels/{name}"], - updateMilestone: ["PATCH /repos/{owner}/{repo}/milestones/{milestone_number}"] - }, - licenses: { - get: ["GET /licenses/{license}"], - getAllCommonlyUsed: ["GET /licenses"], - getForRepo: ["GET /repos/{owner}/{repo}/license"] - }, - markdown: { - render: ["POST /markdown"], - renderRaw: ["POST /markdown/raw", { - headers: { - "content-type": "text/plain; charset=utf-8" - } - }] - }, - meta: { - get: ["GET /meta"], - getOctocat: ["GET /octocat"], - getZen: ["GET /zen"], - root: ["GET /"] - }, - migrations: { - cancelImport: ["DELETE /repos/{owner}/{repo}/import"], - deleteArchiveForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/archive"], - deleteArchiveForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/archive"], - downloadArchiveForOrg: ["GET /orgs/{org}/migrations/{migration_id}/archive"], - getArchiveForAuthenticatedUser: ["GET /user/migrations/{migration_id}/archive"], - getCommitAuthors: ["GET /repos/{owner}/{repo}/import/authors"], - getImportStatus: ["GET /repos/{owner}/{repo}/import"], - getLargeFiles: ["GET /repos/{owner}/{repo}/import/large_files"], - getStatusForAuthenticatedUser: ["GET /user/migrations/{migration_id}"], - getStatusForOrg: ["GET /orgs/{org}/migrations/{migration_id}"], - listForAuthenticatedUser: ["GET /user/migrations"], - listForOrg: ["GET /orgs/{org}/migrations"], - listReposForAuthenticatedUser: ["GET /user/migrations/{migration_id}/repositories"], - listReposForOrg: ["GET /orgs/{org}/migrations/{migration_id}/repositories"], - listReposForUser: ["GET /user/migrations/{migration_id}/repositories", {}, { - renamed: ["migrations", "listReposForAuthenticatedUser"] - }], - mapCommitAuthor: ["PATCH /repos/{owner}/{repo}/import/authors/{author_id}"], - setLfsPreference: ["PATCH /repos/{owner}/{repo}/import/lfs"], - startForAuthenticatedUser: ["POST /user/migrations"], - startForOrg: ["POST /orgs/{org}/migrations"], - startImport: ["PUT /repos/{owner}/{repo}/import"], - unlockRepoForAuthenticatedUser: ["DELETE /user/migrations/{migration_id}/repos/{repo_name}/lock"], - unlockRepoForOrg: ["DELETE /orgs/{org}/migrations/{migration_id}/repos/{repo_name}/lock"], - updateImport: ["PATCH /repos/{owner}/{repo}/import"] - }, - orgs: { - blockUser: ["PUT /orgs/{org}/blocks/{username}"], - cancelInvitation: ["DELETE /orgs/{org}/invitations/{invitation_id}"], - checkBlockedUser: ["GET /orgs/{org}/blocks/{username}"], - checkMembershipForUser: ["GET /orgs/{org}/members/{username}"], - checkPublicMembershipForUser: ["GET /orgs/{org}/public_members/{username}"], - convertMemberToOutsideCollaborator: ["PUT /orgs/{org}/outside_collaborators/{username}"], - createInvitation: ["POST /orgs/{org}/invitations"], - createWebhook: ["POST /orgs/{org}/hooks"], - deleteWebhook: ["DELETE /orgs/{org}/hooks/{hook_id}"], - get: ["GET /orgs/{org}"], - getMembershipForAuthenticatedUser: ["GET /user/memberships/orgs/{org}"], - getMembershipForUser: ["GET /orgs/{org}/memberships/{username}"], - getWebhook: ["GET /orgs/{org}/hooks/{hook_id}"], - getWebhookConfigForOrg: ["GET /orgs/{org}/hooks/{hook_id}/config"], - getWebhookDelivery: ["GET /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}"], - list: ["GET /organizations"], - listAppInstallations: ["GET /orgs/{org}/installations"], - listBlockedUsers: ["GET /orgs/{org}/blocks"], - listCustomRoles: ["GET /organizations/{organization_id}/custom_roles"], - listFailedInvitations: ["GET /orgs/{org}/failed_invitations"], - listForAuthenticatedUser: ["GET /user/orgs"], - listForUser: ["GET /users/{username}/orgs"], - listInvitationTeams: ["GET /orgs/{org}/invitations/{invitation_id}/teams"], - listMembers: ["GET /orgs/{org}/members"], - listMembershipsForAuthenticatedUser: ["GET /user/memberships/orgs"], - listOutsideCollaborators: ["GET /orgs/{org}/outside_collaborators"], - listPendingInvitations: ["GET /orgs/{org}/invitations"], - listPublicMembers: ["GET /orgs/{org}/public_members"], - listWebhookDeliveries: ["GET /orgs/{org}/hooks/{hook_id}/deliveries"], - listWebhooks: ["GET /orgs/{org}/hooks"], - pingWebhook: ["POST /orgs/{org}/hooks/{hook_id}/pings"], - redeliverWebhookDelivery: ["POST /orgs/{org}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"], - removeMember: ["DELETE /orgs/{org}/members/{username}"], - removeMembershipForUser: ["DELETE /orgs/{org}/memberships/{username}"], - removeOutsideCollaborator: ["DELETE /orgs/{org}/outside_collaborators/{username}"], - removePublicMembershipForAuthenticatedUser: ["DELETE /orgs/{org}/public_members/{username}"], - setMembershipForUser: ["PUT /orgs/{org}/memberships/{username}"], - setPublicMembershipForAuthenticatedUser: ["PUT /orgs/{org}/public_members/{username}"], - unblockUser: ["DELETE /orgs/{org}/blocks/{username}"], - update: ["PATCH /orgs/{org}"], - updateMembershipForAuthenticatedUser: ["PATCH /user/memberships/orgs/{org}"], - updateWebhook: ["PATCH /orgs/{org}/hooks/{hook_id}"], - updateWebhookConfigForOrg: ["PATCH /orgs/{org}/hooks/{hook_id}/config"] - }, - packages: { - deletePackageForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}"], - deletePackageForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}"], - deletePackageForUser: ["DELETE /users/{username}/packages/{package_type}/{package_name}"], - deletePackageVersionForAuthenticatedUser: ["DELETE /user/packages/{package_type}/{package_name}/versions/{package_version_id}"], - deletePackageVersionForOrg: ["DELETE /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"], - deletePackageVersionForUser: ["DELETE /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"], - getAllPackageVersionsForAPackageOwnedByAnOrg: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions", {}, { - renamed: ["packages", "getAllPackageVersionsForPackageOwnedByOrg"] - }], - getAllPackageVersionsForAPackageOwnedByTheAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions", {}, { - renamed: ["packages", "getAllPackageVersionsForPackageOwnedByAuthenticatedUser"] - }], - getAllPackageVersionsForPackageOwnedByAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions"], - getAllPackageVersionsForPackageOwnedByOrg: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions"], - getAllPackageVersionsForPackageOwnedByUser: ["GET /users/{username}/packages/{package_type}/{package_name}/versions"], - getPackageForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}"], - getPackageForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}"], - getPackageForUser: ["GET /users/{username}/packages/{package_type}/{package_name}"], - getPackageVersionForAuthenticatedUser: ["GET /user/packages/{package_type}/{package_name}/versions/{package_version_id}"], - getPackageVersionForOrganization: ["GET /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}"], - getPackageVersionForUser: ["GET /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}"], - listPackagesForAuthenticatedUser: ["GET /user/packages"], - listPackagesForOrganization: ["GET /orgs/{org}/packages"], - listPackagesForUser: ["GET /users/{username}/packages"], - restorePackageForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/restore{?token}"], - restorePackageForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/restore{?token}"], - restorePackageForUser: ["POST /users/{username}/packages/{package_type}/{package_name}/restore{?token}"], - restorePackageVersionForAuthenticatedUser: ["POST /user/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"], - restorePackageVersionForOrg: ["POST /orgs/{org}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"], - restorePackageVersionForUser: ["POST /users/{username}/packages/{package_type}/{package_name}/versions/{package_version_id}/restore"] - }, - projects: { - addCollaborator: ["PUT /projects/{project_id}/collaborators/{username}"], - createCard: ["POST /projects/columns/{column_id}/cards"], - createColumn: ["POST /projects/{project_id}/columns"], - createForAuthenticatedUser: ["POST /user/projects"], - createForOrg: ["POST /orgs/{org}/projects"], - createForRepo: ["POST /repos/{owner}/{repo}/projects"], - delete: ["DELETE /projects/{project_id}"], - deleteCard: ["DELETE /projects/columns/cards/{card_id}"], - deleteColumn: ["DELETE /projects/columns/{column_id}"], - get: ["GET /projects/{project_id}"], - getCard: ["GET /projects/columns/cards/{card_id}"], - getColumn: ["GET /projects/columns/{column_id}"], - getPermissionForUser: ["GET /projects/{project_id}/collaborators/{username}/permission"], - listCards: ["GET /projects/columns/{column_id}/cards"], - listCollaborators: ["GET /projects/{project_id}/collaborators"], - listColumns: ["GET /projects/{project_id}/columns"], - listForOrg: ["GET /orgs/{org}/projects"], - listForRepo: ["GET /repos/{owner}/{repo}/projects"], - listForUser: ["GET /users/{username}/projects"], - moveCard: ["POST /projects/columns/cards/{card_id}/moves"], - moveColumn: ["POST /projects/columns/{column_id}/moves"], - removeCollaborator: ["DELETE /projects/{project_id}/collaborators/{username}"], - update: ["PATCH /projects/{project_id}"], - updateCard: ["PATCH /projects/columns/cards/{card_id}"], - updateColumn: ["PATCH /projects/columns/{column_id}"] - }, - pulls: { - checkIfMerged: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/merge"], - create: ["POST /repos/{owner}/{repo}/pulls"], - createReplyForReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments/{comment_id}/replies"], - createReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], - createReviewComment: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/comments"], - deletePendingReview: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], - deleteReviewComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}"], - dismissReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/dismissals"], - get: ["GET /repos/{owner}/{repo}/pulls/{pull_number}"], - getReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], - getReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}"], - list: ["GET /repos/{owner}/{repo}/pulls"], - listCommentsForReview: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/comments"], - listCommits: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/commits"], - listFiles: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/files"], - listRequestedReviewers: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], - listReviewComments: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/comments"], - listReviewCommentsForRepo: ["GET /repos/{owner}/{repo}/pulls/comments"], - listReviews: ["GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews"], - merge: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/merge"], - removeRequestedReviewers: ["DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], - requestReviewers: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers"], - submitReview: ["POST /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}/events"], - update: ["PATCH /repos/{owner}/{repo}/pulls/{pull_number}"], - updateBranch: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/update-branch"], - updateReview: ["PUT /repos/{owner}/{repo}/pulls/{pull_number}/reviews/{review_id}"], - updateReviewComment: ["PATCH /repos/{owner}/{repo}/pulls/comments/{comment_id}"] - }, - rateLimit: { - get: ["GET /rate_limit"] - }, - reactions: { - createForCommitComment: ["POST /repos/{owner}/{repo}/comments/{comment_id}/reactions"], - createForIssue: ["POST /repos/{owner}/{repo}/issues/{issue_number}/reactions"], - createForIssueComment: ["POST /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"], - createForPullRequestReviewComment: ["POST /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"], - createForRelease: ["POST /repos/{owner}/{repo}/releases/{release_id}/reactions"], - createForTeamDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"], - createForTeamDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"], - deleteForCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}/reactions/{reaction_id}"], - deleteForIssue: ["DELETE /repos/{owner}/{repo}/issues/{issue_number}/reactions/{reaction_id}"], - deleteForIssueComment: ["DELETE /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions/{reaction_id}"], - deleteForPullRequestComment: ["DELETE /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions/{reaction_id}"], - deleteForRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}/reactions/{reaction_id}"], - deleteForTeamDiscussion: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions/{reaction_id}"], - deleteForTeamDiscussionComment: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions/{reaction_id}"], - listForCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}/reactions"], - listForIssue: ["GET /repos/{owner}/{repo}/issues/{issue_number}/reactions"], - listForIssueComment: ["GET /repos/{owner}/{repo}/issues/comments/{comment_id}/reactions"], - listForPullRequestReviewComment: ["GET /repos/{owner}/{repo}/pulls/comments/{comment_id}/reactions"], - listForRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}/reactions"], - listForTeamDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}/reactions"], - listForTeamDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/reactions"] - }, - repos: { - acceptInvitation: ["PATCH /user/repository_invitations/{invitation_id}", {}, { - renamed: ["repos", "acceptInvitationForAuthenticatedUser"] - }], - acceptInvitationForAuthenticatedUser: ["PATCH /user/repository_invitations/{invitation_id}"], - addAppAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { - mapToData: "apps" - }], - addCollaborator: ["PUT /repos/{owner}/{repo}/collaborators/{username}"], - addStatusCheckContexts: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { - mapToData: "contexts" - }], - addTeamAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { - mapToData: "teams" - }], - addUserAccessRestrictions: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { - mapToData: "users" - }], - checkCollaborator: ["GET /repos/{owner}/{repo}/collaborators/{username}"], - checkVulnerabilityAlerts: ["GET /repos/{owner}/{repo}/vulnerability-alerts"], - codeownersErrors: ["GET /repos/{owner}/{repo}/codeowners/errors"], - compareCommits: ["GET /repos/{owner}/{repo}/compare/{base}...{head}"], - compareCommitsWithBasehead: ["GET /repos/{owner}/{repo}/compare/{basehead}"], - createAutolink: ["POST /repos/{owner}/{repo}/autolinks"], - createCommitComment: ["POST /repos/{owner}/{repo}/commits/{commit_sha}/comments"], - createCommitSignatureProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], - createCommitStatus: ["POST /repos/{owner}/{repo}/statuses/{sha}"], - createDeployKey: ["POST /repos/{owner}/{repo}/keys"], - createDeployment: ["POST /repos/{owner}/{repo}/deployments"], - createDeploymentStatus: ["POST /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], - createDispatchEvent: ["POST /repos/{owner}/{repo}/dispatches"], - createForAuthenticatedUser: ["POST /user/repos"], - createFork: ["POST /repos/{owner}/{repo}/forks"], - createInOrg: ["POST /orgs/{org}/repos"], - createOrUpdateEnvironment: ["PUT /repos/{owner}/{repo}/environments/{environment_name}"], - createOrUpdateFileContents: ["PUT /repos/{owner}/{repo}/contents/{path}"], - createPagesSite: ["POST /repos/{owner}/{repo}/pages"], - createRelease: ["POST /repos/{owner}/{repo}/releases"], - createTagProtection: ["POST /repos/{owner}/{repo}/tags/protection"], - createUsingTemplate: ["POST /repos/{template_owner}/{template_repo}/generate"], - createWebhook: ["POST /repos/{owner}/{repo}/hooks"], - declineInvitation: ["DELETE /user/repository_invitations/{invitation_id}", {}, { - renamed: ["repos", "declineInvitationForAuthenticatedUser"] - }], - declineInvitationForAuthenticatedUser: ["DELETE /user/repository_invitations/{invitation_id}"], - delete: ["DELETE /repos/{owner}/{repo}"], - deleteAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], - deleteAdminBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], - deleteAnEnvironment: ["DELETE /repos/{owner}/{repo}/environments/{environment_name}"], - deleteAutolink: ["DELETE /repos/{owner}/{repo}/autolinks/{autolink_id}"], - deleteBranchProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection"], - deleteCommitComment: ["DELETE /repos/{owner}/{repo}/comments/{comment_id}"], - deleteCommitSignatureProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], - deleteDeployKey: ["DELETE /repos/{owner}/{repo}/keys/{key_id}"], - deleteDeployment: ["DELETE /repos/{owner}/{repo}/deployments/{deployment_id}"], - deleteFile: ["DELETE /repos/{owner}/{repo}/contents/{path}"], - deleteInvitation: ["DELETE /repos/{owner}/{repo}/invitations/{invitation_id}"], - deletePagesSite: ["DELETE /repos/{owner}/{repo}/pages"], - deletePullRequestReviewProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], - deleteRelease: ["DELETE /repos/{owner}/{repo}/releases/{release_id}"], - deleteReleaseAsset: ["DELETE /repos/{owner}/{repo}/releases/assets/{asset_id}"], - deleteTagProtection: ["DELETE /repos/{owner}/{repo}/tags/protection/{tag_protection_id}"], - deleteWebhook: ["DELETE /repos/{owner}/{repo}/hooks/{hook_id}"], - disableAutomatedSecurityFixes: ["DELETE /repos/{owner}/{repo}/automated-security-fixes"], - disableLfsForRepo: ["DELETE /repos/{owner}/{repo}/lfs"], - disableVulnerabilityAlerts: ["DELETE /repos/{owner}/{repo}/vulnerability-alerts"], - downloadArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}", {}, { - renamed: ["repos", "downloadZipballArchive"] - }], - downloadTarballArchive: ["GET /repos/{owner}/{repo}/tarball/{ref}"], - downloadZipballArchive: ["GET /repos/{owner}/{repo}/zipball/{ref}"], - enableAutomatedSecurityFixes: ["PUT /repos/{owner}/{repo}/automated-security-fixes"], - enableLfsForRepo: ["PUT /repos/{owner}/{repo}/lfs"], - enableVulnerabilityAlerts: ["PUT /repos/{owner}/{repo}/vulnerability-alerts"], - generateReleaseNotes: ["POST /repos/{owner}/{repo}/releases/generate-notes"], - get: ["GET /repos/{owner}/{repo}"], - getAccessRestrictions: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions"], - getAdminBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], - getAllEnvironments: ["GET /repos/{owner}/{repo}/environments"], - getAllStatusCheckContexts: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts"], - getAllTopics: ["GET /repos/{owner}/{repo}/topics"], - getAppsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps"], - getAutolink: ["GET /repos/{owner}/{repo}/autolinks/{autolink_id}"], - getBranch: ["GET /repos/{owner}/{repo}/branches/{branch}"], - getBranchProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection"], - getClones: ["GET /repos/{owner}/{repo}/traffic/clones"], - getCodeFrequencyStats: ["GET /repos/{owner}/{repo}/stats/code_frequency"], - getCollaboratorPermissionLevel: ["GET /repos/{owner}/{repo}/collaborators/{username}/permission"], - getCombinedStatusForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/status"], - getCommit: ["GET /repos/{owner}/{repo}/commits/{ref}"], - getCommitActivityStats: ["GET /repos/{owner}/{repo}/stats/commit_activity"], - getCommitComment: ["GET /repos/{owner}/{repo}/comments/{comment_id}"], - getCommitSignatureProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_signatures"], - getCommunityProfileMetrics: ["GET /repos/{owner}/{repo}/community/profile"], - getContent: ["GET /repos/{owner}/{repo}/contents/{path}"], - getContributorsStats: ["GET /repos/{owner}/{repo}/stats/contributors"], - getDeployKey: ["GET /repos/{owner}/{repo}/keys/{key_id}"], - getDeployment: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}"], - getDeploymentStatus: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses/{status_id}"], - getEnvironment: ["GET /repos/{owner}/{repo}/environments/{environment_name}"], - getLatestPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/latest"], - getLatestRelease: ["GET /repos/{owner}/{repo}/releases/latest"], - getPages: ["GET /repos/{owner}/{repo}/pages"], - getPagesBuild: ["GET /repos/{owner}/{repo}/pages/builds/{build_id}"], - getPagesHealthCheck: ["GET /repos/{owner}/{repo}/pages/health"], - getParticipationStats: ["GET /repos/{owner}/{repo}/stats/participation"], - getPullRequestReviewProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], - getPunchCardStats: ["GET /repos/{owner}/{repo}/stats/punch_card"], - getReadme: ["GET /repos/{owner}/{repo}/readme"], - getReadmeInDirectory: ["GET /repos/{owner}/{repo}/readme/{dir}"], - getRelease: ["GET /repos/{owner}/{repo}/releases/{release_id}"], - getReleaseAsset: ["GET /repos/{owner}/{repo}/releases/assets/{asset_id}"], - getReleaseByTag: ["GET /repos/{owner}/{repo}/releases/tags/{tag}"], - getStatusChecksProtection: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], - getTeamsWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams"], - getTopPaths: ["GET /repos/{owner}/{repo}/traffic/popular/paths"], - getTopReferrers: ["GET /repos/{owner}/{repo}/traffic/popular/referrers"], - getUsersWithAccessToProtectedBranch: ["GET /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users"], - getViews: ["GET /repos/{owner}/{repo}/traffic/views"], - getWebhook: ["GET /repos/{owner}/{repo}/hooks/{hook_id}"], - getWebhookConfigForRepo: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/config"], - getWebhookDelivery: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}"], - listAutolinks: ["GET /repos/{owner}/{repo}/autolinks"], - listBranches: ["GET /repos/{owner}/{repo}/branches"], - listBranchesForHeadCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/branches-where-head"], - listCollaborators: ["GET /repos/{owner}/{repo}/collaborators"], - listCommentsForCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/comments"], - listCommitCommentsForRepo: ["GET /repos/{owner}/{repo}/comments"], - listCommitStatusesForRef: ["GET /repos/{owner}/{repo}/commits/{ref}/statuses"], - listCommits: ["GET /repos/{owner}/{repo}/commits"], - listContributors: ["GET /repos/{owner}/{repo}/contributors"], - listDeployKeys: ["GET /repos/{owner}/{repo}/keys"], - listDeploymentStatuses: ["GET /repos/{owner}/{repo}/deployments/{deployment_id}/statuses"], - listDeployments: ["GET /repos/{owner}/{repo}/deployments"], - listForAuthenticatedUser: ["GET /user/repos"], - listForOrg: ["GET /orgs/{org}/repos"], - listForUser: ["GET /users/{username}/repos"], - listForks: ["GET /repos/{owner}/{repo}/forks"], - listInvitations: ["GET /repos/{owner}/{repo}/invitations"], - listInvitationsForAuthenticatedUser: ["GET /user/repository_invitations"], - listLanguages: ["GET /repos/{owner}/{repo}/languages"], - listPagesBuilds: ["GET /repos/{owner}/{repo}/pages/builds"], - listPublic: ["GET /repositories"], - listPullRequestsAssociatedWithCommit: ["GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls"], - listReleaseAssets: ["GET /repos/{owner}/{repo}/releases/{release_id}/assets"], - listReleases: ["GET /repos/{owner}/{repo}/releases"], - listTagProtection: ["GET /repos/{owner}/{repo}/tags/protection"], - listTags: ["GET /repos/{owner}/{repo}/tags"], - listTeams: ["GET /repos/{owner}/{repo}/teams"], - listWebhookDeliveries: ["GET /repos/{owner}/{repo}/hooks/{hook_id}/deliveries"], - listWebhooks: ["GET /repos/{owner}/{repo}/hooks"], - merge: ["POST /repos/{owner}/{repo}/merges"], - mergeUpstream: ["POST /repos/{owner}/{repo}/merge-upstream"], - pingWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/pings"], - redeliverWebhookDelivery: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/deliveries/{delivery_id}/attempts"], - removeAppAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { - mapToData: "apps" - }], - removeCollaborator: ["DELETE /repos/{owner}/{repo}/collaborators/{username}"], - removeStatusCheckContexts: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { - mapToData: "contexts" - }], - removeStatusCheckProtection: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], - removeTeamAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { - mapToData: "teams" - }], - removeUserAccessRestrictions: ["DELETE /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { - mapToData: "users" - }], - renameBranch: ["POST /repos/{owner}/{repo}/branches/{branch}/rename"], - replaceAllTopics: ["PUT /repos/{owner}/{repo}/topics"], - requestPagesBuild: ["POST /repos/{owner}/{repo}/pages/builds"], - setAdminBranchProtection: ["POST /repos/{owner}/{repo}/branches/{branch}/protection/enforce_admins"], - setAppAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/apps", {}, { - mapToData: "apps" - }], - setStatusCheckContexts: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks/contexts", {}, { - mapToData: "contexts" - }], - setTeamAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/teams", {}, { - mapToData: "teams" - }], - setUserAccessRestrictions: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection/restrictions/users", {}, { - mapToData: "users" - }], - testPushWebhook: ["POST /repos/{owner}/{repo}/hooks/{hook_id}/tests"], - transfer: ["POST /repos/{owner}/{repo}/transfer"], - update: ["PATCH /repos/{owner}/{repo}"], - updateBranchProtection: ["PUT /repos/{owner}/{repo}/branches/{branch}/protection"], - updateCommitComment: ["PATCH /repos/{owner}/{repo}/comments/{comment_id}"], - updateInformationAboutPagesSite: ["PUT /repos/{owner}/{repo}/pages"], - updateInvitation: ["PATCH /repos/{owner}/{repo}/invitations/{invitation_id}"], - updatePullRequestReviewProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_pull_request_reviews"], - updateRelease: ["PATCH /repos/{owner}/{repo}/releases/{release_id}"], - updateReleaseAsset: ["PATCH /repos/{owner}/{repo}/releases/assets/{asset_id}"], - updateStatusCheckPotection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks", {}, { - renamed: ["repos", "updateStatusCheckProtection"] - }], - updateStatusCheckProtection: ["PATCH /repos/{owner}/{repo}/branches/{branch}/protection/required_status_checks"], - updateWebhook: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}"], - updateWebhookConfigForRepo: ["PATCH /repos/{owner}/{repo}/hooks/{hook_id}/config"], - uploadReleaseAsset: ["POST /repos/{owner}/{repo}/releases/{release_id}/assets{?name,label}", { - baseUrl: "https://uploads.github.com" - }] - }, - search: { - code: ["GET /search/code"], - commits: ["GET /search/commits"], - issuesAndPullRequests: ["GET /search/issues"], - labels: ["GET /search/labels"], - repos: ["GET /search/repositories"], - topics: ["GET /search/topics"], - users: ["GET /search/users"] - }, - secretScanning: { - getAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"], - listAlertsForEnterprise: ["GET /enterprises/{enterprise}/secret-scanning/alerts"], - listAlertsForOrg: ["GET /orgs/{org}/secret-scanning/alerts"], - listAlertsForRepo: ["GET /repos/{owner}/{repo}/secret-scanning/alerts"], - listLocationsForAlert: ["GET /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}/locations"], - updateAlert: ["PATCH /repos/{owner}/{repo}/secret-scanning/alerts/{alert_number}"] - }, - teams: { - addOrUpdateMembershipForUserInOrg: ["PUT /orgs/{org}/teams/{team_slug}/memberships/{username}"], - addOrUpdateProjectPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/projects/{project_id}"], - addOrUpdateRepoPermissionsInOrg: ["PUT /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], - checkPermissionsForProjectInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects/{project_id}"], - checkPermissionsForRepoInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], - create: ["POST /orgs/{org}/teams"], - createDiscussionCommentInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], - createDiscussionInOrg: ["POST /orgs/{org}/teams/{team_slug}/discussions"], - deleteDiscussionCommentInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], - deleteDiscussionInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], - deleteInOrg: ["DELETE /orgs/{org}/teams/{team_slug}"], - getByName: ["GET /orgs/{org}/teams/{team_slug}"], - getDiscussionCommentInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], - getDiscussionInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], - getMembershipForUserInOrg: ["GET /orgs/{org}/teams/{team_slug}/memberships/{username}"], - list: ["GET /orgs/{org}/teams"], - listChildInOrg: ["GET /orgs/{org}/teams/{team_slug}/teams"], - listDiscussionCommentsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments"], - listDiscussionsInOrg: ["GET /orgs/{org}/teams/{team_slug}/discussions"], - listForAuthenticatedUser: ["GET /user/teams"], - listMembersInOrg: ["GET /orgs/{org}/teams/{team_slug}/members"], - listPendingInvitationsInOrg: ["GET /orgs/{org}/teams/{team_slug}/invitations"], - listProjectsInOrg: ["GET /orgs/{org}/teams/{team_slug}/projects"], - listReposInOrg: ["GET /orgs/{org}/teams/{team_slug}/repos"], - removeMembershipForUserInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/memberships/{username}"], - removeProjectInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/projects/{project_id}"], - removeRepoInOrg: ["DELETE /orgs/{org}/teams/{team_slug}/repos/{owner}/{repo}"], - updateDiscussionCommentInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}/comments/{comment_number}"], - updateDiscussionInOrg: ["PATCH /orgs/{org}/teams/{team_slug}/discussions/{discussion_number}"], - updateInOrg: ["PATCH /orgs/{org}/teams/{team_slug}"] - }, - users: { - addEmailForAuthenticated: ["POST /user/emails", {}, { - renamed: ["users", "addEmailForAuthenticatedUser"] - }], - addEmailForAuthenticatedUser: ["POST /user/emails"], - block: ["PUT /user/blocks/{username}"], - checkBlocked: ["GET /user/blocks/{username}"], - checkFollowingForUser: ["GET /users/{username}/following/{target_user}"], - checkPersonIsFollowedByAuthenticated: ["GET /user/following/{username}"], - createGpgKeyForAuthenticated: ["POST /user/gpg_keys", {}, { - renamed: ["users", "createGpgKeyForAuthenticatedUser"] - }], - createGpgKeyForAuthenticatedUser: ["POST /user/gpg_keys"], - createPublicSshKeyForAuthenticated: ["POST /user/keys", {}, { - renamed: ["users", "createPublicSshKeyForAuthenticatedUser"] - }], - createPublicSshKeyForAuthenticatedUser: ["POST /user/keys"], - deleteEmailForAuthenticated: ["DELETE /user/emails", {}, { - renamed: ["users", "deleteEmailForAuthenticatedUser"] - }], - deleteEmailForAuthenticatedUser: ["DELETE /user/emails"], - deleteGpgKeyForAuthenticated: ["DELETE /user/gpg_keys/{gpg_key_id}", {}, { - renamed: ["users", "deleteGpgKeyForAuthenticatedUser"] - }], - deleteGpgKeyForAuthenticatedUser: ["DELETE /user/gpg_keys/{gpg_key_id}"], - deletePublicSshKeyForAuthenticated: ["DELETE /user/keys/{key_id}", {}, { - renamed: ["users", "deletePublicSshKeyForAuthenticatedUser"] - }], - deletePublicSshKeyForAuthenticatedUser: ["DELETE /user/keys/{key_id}"], - follow: ["PUT /user/following/{username}"], - getAuthenticated: ["GET /user"], - getByUsername: ["GET /users/{username}"], - getContextForUser: ["GET /users/{username}/hovercard"], - getGpgKeyForAuthenticated: ["GET /user/gpg_keys/{gpg_key_id}", {}, { - renamed: ["users", "getGpgKeyForAuthenticatedUser"] - }], - getGpgKeyForAuthenticatedUser: ["GET /user/gpg_keys/{gpg_key_id}"], - getPublicSshKeyForAuthenticated: ["GET /user/keys/{key_id}", {}, { - renamed: ["users", "getPublicSshKeyForAuthenticatedUser"] - }], - getPublicSshKeyForAuthenticatedUser: ["GET /user/keys/{key_id}"], - list: ["GET /users"], - listBlockedByAuthenticated: ["GET /user/blocks", {}, { - renamed: ["users", "listBlockedByAuthenticatedUser"] - }], - listBlockedByAuthenticatedUser: ["GET /user/blocks"], - listEmailsForAuthenticated: ["GET /user/emails", {}, { - renamed: ["users", "listEmailsForAuthenticatedUser"] - }], - listEmailsForAuthenticatedUser: ["GET /user/emails"], - listFollowedByAuthenticated: ["GET /user/following", {}, { - renamed: ["users", "listFollowedByAuthenticatedUser"] - }], - listFollowedByAuthenticatedUser: ["GET /user/following"], - listFollowersForAuthenticatedUser: ["GET /user/followers"], - listFollowersForUser: ["GET /users/{username}/followers"], - listFollowingForUser: ["GET /users/{username}/following"], - listGpgKeysForAuthenticated: ["GET /user/gpg_keys", {}, { - renamed: ["users", "listGpgKeysForAuthenticatedUser"] - }], - listGpgKeysForAuthenticatedUser: ["GET /user/gpg_keys"], - listGpgKeysForUser: ["GET /users/{username}/gpg_keys"], - listPublicEmailsForAuthenticated: ["GET /user/public_emails", {}, { - renamed: ["users", "listPublicEmailsForAuthenticatedUser"] - }], - listPublicEmailsForAuthenticatedUser: ["GET /user/public_emails"], - listPublicKeysForUser: ["GET /users/{username}/keys"], - listPublicSshKeysForAuthenticated: ["GET /user/keys", {}, { - renamed: ["users", "listPublicSshKeysForAuthenticatedUser"] - }], - listPublicSshKeysForAuthenticatedUser: ["GET /user/keys"], - setPrimaryEmailVisibilityForAuthenticated: ["PATCH /user/email/visibility", {}, { - renamed: ["users", "setPrimaryEmailVisibilityForAuthenticatedUser"] - }], - setPrimaryEmailVisibilityForAuthenticatedUser: ["PATCH /user/email/visibility"], - unblock: ["DELETE /user/blocks/{username}"], - unfollow: ["DELETE /user/following/{username}"], - updateAuthenticated: ["PATCH /user"] - } -}; - -const VERSION = "5.16.2"; - -function endpointsToMethods(octokit, endpointsMap) { - const newMethods = {}; - - for (const [scope, endpoints] of Object.entries(endpointsMap)) { - for (const [methodName, endpoint] of Object.entries(endpoints)) { - const [route, defaults, decorations] = endpoint; - const [method, url] = route.split(/ /); - const endpointDefaults = Object.assign({ - method, - url - }, defaults); - - if (!newMethods[scope]) { - newMethods[scope] = {}; - } - - const scopeMethods = newMethods[scope]; - - if (decorations) { - scopeMethods[methodName] = decorate(octokit, scope, methodName, endpointDefaults, decorations); - continue; - } - - scopeMethods[methodName] = octokit.request.defaults(endpointDefaults); - } - } - - return newMethods; -} - -function decorate(octokit, scope, methodName, defaults, decorations) { - const requestWithDefaults = octokit.request.defaults(defaults); - /* istanbul ignore next */ - - function withDecorations(...args) { - // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 - let options = requestWithDefaults.endpoint.merge(...args); // There are currently no other decorations than `.mapToData` - - if (decorations.mapToData) { - options = Object.assign({}, options, { - data: options[decorations.mapToData], - [decorations.mapToData]: undefined - }); - return requestWithDefaults(options); - } - - if (decorations.renamed) { - const [newScope, newMethodName] = decorations.renamed; - octokit.log.warn(`octokit.${scope}.${methodName}() has been renamed to octokit.${newScope}.${newMethodName}()`); - } - - if (decorations.deprecated) { - octokit.log.warn(decorations.deprecated); - } - - if (decorations.renamedParameters) { - // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 - const options = requestWithDefaults.endpoint.merge(...args); - - for (const [name, alias] of Object.entries(decorations.renamedParameters)) { - if (name in options) { - octokit.log.warn(`"${name}" parameter is deprecated for "octokit.${scope}.${methodName}()". Use "${alias}" instead`); - - if (!(alias in options)) { - options[alias] = options[name]; - } - - delete options[name]; - } - } - - return requestWithDefaults(options); - } // @ts-ignore https://github.com/microsoft/TypeScript/issues/25488 - - - return requestWithDefaults(...args); - } - - return Object.assign(withDecorations, requestWithDefaults); -} - -function restEndpointMethods(octokit) { - const api = endpointsToMethods(octokit, Endpoints); - return { - rest: api - }; -} -restEndpointMethods.VERSION = VERSION; -function legacyRestEndpointMethods(octokit) { - const api = endpointsToMethods(octokit, Endpoints); - return _objectSpread2(_objectSpread2({}, api), {}, { - rest: api - }); -} -legacyRestEndpointMethods.VERSION = VERSION; - -exports.legacyRestEndpointMethods = legacyRestEndpointMethods; -exports.restEndpointMethods = restEndpointMethods; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 1659: -/***/ ((module, exports, __nccwpck_require__) => { - -"use strict"; -/** - * @author Toru Nagashima - * See LICENSE file in root directory for full license. - */ - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -var eventTargetShim = __nccwpck_require__(4697); - -/** - * The signal class. - * @see https://dom.spec.whatwg.org/#abortsignal - */ -class AbortSignal extends eventTargetShim.EventTarget { - /** - * AbortSignal cannot be constructed directly. - */ - constructor() { - super(); - throw new TypeError("AbortSignal cannot be constructed directly"); - } - /** - * Returns `true` if this `AbortSignal`'s `AbortController` has signaled to abort, and `false` otherwise. - */ - get aborted() { - const aborted = abortedFlags.get(this); - if (typeof aborted !== "boolean") { - throw new TypeError(`Expected 'this' to be an 'AbortSignal' object, but got ${this === null ? "null" : typeof this}`); - } - return aborted; - } -} -eventTargetShim.defineEventAttribute(AbortSignal.prototype, "abort"); -/** - * Create an AbortSignal object. - */ -function createAbortSignal() { - const signal = Object.create(AbortSignal.prototype); - eventTargetShim.EventTarget.call(signal); - abortedFlags.set(signal, false); - return signal; -} -/** - * Abort a given signal. - */ -function abortSignal(signal) { - if (abortedFlags.get(signal) !== false) { - return; - } - abortedFlags.set(signal, true); - signal.dispatchEvent({ type: "abort" }); -} -/** - * Aborted flag for each instances. - */ -const abortedFlags = new WeakMap(); -// Properties should be enumerable. -Object.defineProperties(AbortSignal.prototype, { - aborted: { enumerable: true }, -}); -// `toString()` should return `"[object AbortSignal]"` -if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { - Object.defineProperty(AbortSignal.prototype, Symbol.toStringTag, { - configurable: true, - value: "AbortSignal", - }); -} - -/** - * The AbortController. - * @see https://dom.spec.whatwg.org/#abortcontroller - */ -class AbortController { - /** - * Initialize this controller. - */ - constructor() { - signals.set(this, createAbortSignal()); - } - /** - * Returns the `AbortSignal` object associated with this object. - */ - get signal() { - return getSignal(this); - } - /** - * Abort and signal to any observers that the associated activity is to be aborted. - */ - abort() { - abortSignal(getSignal(this)); - } -} -/** - * Associated signals. - */ -const signals = new WeakMap(); -/** - * Get the associated signal of a given controller. - */ -function getSignal(controller) { - const signal = signals.get(controller); - if (signal == null) { - throw new TypeError(`Expected 'this' to be an 'AbortController' object, but got ${controller === null ? "null" : typeof controller}`); - } - return signal; -} -// Properties should be enumerable. -Object.defineProperties(AbortController.prototype, { - signal: { enumerable: true }, - abort: { enumerable: true }, -}); -if (typeof Symbol === "function" && typeof Symbol.toStringTag === "symbol") { - Object.defineProperty(AbortController.prototype, Symbol.toStringTag, { - configurable: true, - value: "AbortController", - }); -} - -exports.AbortController = AbortController; -exports.AbortSignal = AbortSignal; -exports["default"] = AbortController; - -module.exports = AbortController -module.exports.AbortController = module.exports["default"] = AbortController -module.exports.AbortSignal = AbortSignal -//# sourceMappingURL=abort-controller.js.map - - -/***/ }), - -/***/ 4623: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -module.exports = __nccwpck_require__(5006); -module.exports.HttpsAgent = __nccwpck_require__(5500); -module.exports.constants = __nccwpck_require__(7757); - - -/***/ }), - -/***/ 5006: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -const OriginalAgent = (__nccwpck_require__(3685).Agent); -const ms = __nccwpck_require__(845); -const debug = (__nccwpck_require__(3837).debuglog)('agentkeepalive'); -const { - INIT_SOCKET, - CURRENT_ID, - CREATE_ID, - SOCKET_CREATED_TIME, - SOCKET_NAME, - SOCKET_REQUEST_COUNT, - SOCKET_REQUEST_FINISHED_COUNT, -} = __nccwpck_require__(7757); - -// OriginalAgent come from -// - https://github.com/nodejs/node/blob/v8.12.0/lib/_http_agent.js -// - https://github.com/nodejs/node/blob/v10.12.0/lib/_http_agent.js - -// node <= 10 -let defaultTimeoutListenerCount = 1; -const majorVersion = parseInt(process.version.split('.', 1)[0].substring(1)); -if (majorVersion >= 11 && majorVersion <= 12) { - defaultTimeoutListenerCount = 2; -} else if (majorVersion >= 13) { - defaultTimeoutListenerCount = 3; -} - -function deprecate(message) { - console.log('[agentkeepalive:deprecated] %s', message); -} - -class Agent extends OriginalAgent { - constructor(options) { - options = options || {}; - options.keepAlive = options.keepAlive !== false; - // default is keep-alive and 4s free socket timeout - // see https://medium.com/ssense-tech/reduce-networking-errors-in-nodejs-23b4eb9f2d83 - if (options.freeSocketTimeout === undefined) { - options.freeSocketTimeout = 4000; - } - // Legacy API: keepAliveTimeout should be rename to `freeSocketTimeout` - if (options.keepAliveTimeout) { - deprecate('options.keepAliveTimeout is deprecated, please use options.freeSocketTimeout instead'); - options.freeSocketTimeout = options.keepAliveTimeout; - delete options.keepAliveTimeout; - } - // Legacy API: freeSocketKeepAliveTimeout should be rename to `freeSocketTimeout` - if (options.freeSocketKeepAliveTimeout) { - deprecate('options.freeSocketKeepAliveTimeout is deprecated, please use options.freeSocketTimeout instead'); - options.freeSocketTimeout = options.freeSocketKeepAliveTimeout; - delete options.freeSocketKeepAliveTimeout; - } - - // Sets the socket to timeout after timeout milliseconds of inactivity on the socket. - // By default is double free socket timeout. - if (options.timeout === undefined) { - // make sure socket default inactivity timeout >= 8s - options.timeout = Math.max(options.freeSocketTimeout * 2, 8000); - } - - // support humanize format - options.timeout = ms(options.timeout); - options.freeSocketTimeout = ms(options.freeSocketTimeout); - options.socketActiveTTL = options.socketActiveTTL ? ms(options.socketActiveTTL) : 0; - - super(options); - - this[CURRENT_ID] = 0; - - // create socket success counter - this.createSocketCount = 0; - this.createSocketCountLastCheck = 0; - - this.createSocketErrorCount = 0; - this.createSocketErrorCountLastCheck = 0; - - this.closeSocketCount = 0; - this.closeSocketCountLastCheck = 0; - - // socket error event count - this.errorSocketCount = 0; - this.errorSocketCountLastCheck = 0; - - // request finished counter - this.requestCount = 0; - this.requestCountLastCheck = 0; - - // including free socket timeout counter - this.timeoutSocketCount = 0; - this.timeoutSocketCountLastCheck = 0; - - this.on('free', socket => { - // https://github.com/nodejs/node/pull/32000 - // Node.js native agent will check socket timeout eqs agent.options.timeout. - // Use the ttl or freeSocketTimeout to overwrite. - const timeout = this.calcSocketTimeout(socket); - if (timeout > 0 && socket.timeout !== timeout) { - socket.setTimeout(timeout); - } - }); - } - - get freeSocketKeepAliveTimeout() { - deprecate('agent.freeSocketKeepAliveTimeout is deprecated, please use agent.options.freeSocketTimeout instead'); - return this.options.freeSocketTimeout; - } - - get timeout() { - deprecate('agent.timeout is deprecated, please use agent.options.timeout instead'); - return this.options.timeout; - } - - get socketActiveTTL() { - deprecate('agent.socketActiveTTL is deprecated, please use agent.options.socketActiveTTL instead'); - return this.options.socketActiveTTL; - } - - calcSocketTimeout(socket) { - /** - * return <= 0: should free socket - * return > 0: should update socket timeout - * return undefined: not find custom timeout - */ - let freeSocketTimeout = this.options.freeSocketTimeout; - const socketActiveTTL = this.options.socketActiveTTL; - if (socketActiveTTL) { - // check socketActiveTTL - const aliveTime = Date.now() - socket[SOCKET_CREATED_TIME]; - const diff = socketActiveTTL - aliveTime; - if (diff <= 0) { - return diff; - } - if (freeSocketTimeout && diff < freeSocketTimeout) { - freeSocketTimeout = diff; - } - } - // set freeSocketTimeout - if (freeSocketTimeout) { - // set free keepalive timer - // try to use socket custom freeSocketTimeout first, support headers['keep-alive'] - // https://github.com/node-modules/urllib/blob/b76053020923f4d99a1c93cf2e16e0c5ba10bacf/lib/urllib.js#L498 - const customFreeSocketTimeout = socket.freeSocketTimeout || socket.freeSocketKeepAliveTimeout; - return customFreeSocketTimeout || freeSocketTimeout; - } - } - - keepSocketAlive(socket) { - const result = super.keepSocketAlive(socket); - // should not keepAlive, do nothing - if (!result) return result; - - const customTimeout = this.calcSocketTimeout(socket); - if (typeof customTimeout === 'undefined') { - return true; - } - if (customTimeout <= 0) { - debug('%s(requests: %s, finished: %s) free but need to destroy by TTL, request count %s, diff is %s', - socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], customTimeout); - return false; - } - if (socket.timeout !== customTimeout) { - socket.setTimeout(customTimeout); - } - return true; - } - - // only call on addRequest - reuseSocket(...args) { - // reuseSocket(socket, req) - super.reuseSocket(...args); - const socket = args[0]; - const req = args[1]; - req.reusedSocket = true; - const agentTimeout = this.options.timeout; - if (getSocketTimeout(socket) !== agentTimeout) { - // reset timeout before use - socket.setTimeout(agentTimeout); - debug('%s reset timeout to %sms', socket[SOCKET_NAME], agentTimeout); - } - socket[SOCKET_REQUEST_COUNT]++; - debug('%s(requests: %s, finished: %s) reuse on addRequest, timeout %sms', - socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], - getSocketTimeout(socket)); - } - - [CREATE_ID]() { - const id = this[CURRENT_ID]++; - if (this[CURRENT_ID] === Number.MAX_SAFE_INTEGER) this[CURRENT_ID] = 0; - return id; - } - - [INIT_SOCKET](socket, options) { - // bugfix here. - // https on node 8, 10 won't set agent.options.timeout by default - // TODO: need to fix on node itself - if (options.timeout) { - const timeout = getSocketTimeout(socket); - if (!timeout) { - socket.setTimeout(options.timeout); - } - } - - if (this.options.keepAlive) { - // Disable Nagle's algorithm: http://blog.caustik.com/2012/04/08/scaling-node-js-to-100k-concurrent-connections/ - // https://fengmk2.com/benchmark/nagle-algorithm-delayed-ack-mock.html - socket.setNoDelay(true); - } - this.createSocketCount++; - if (this.options.socketActiveTTL) { - socket[SOCKET_CREATED_TIME] = Date.now(); - } - // don't show the hole '-----BEGIN CERTIFICATE----' key string - socket[SOCKET_NAME] = `sock[${this[CREATE_ID]()}#${options._agentKey}]`.split('-----BEGIN', 1)[0]; - socket[SOCKET_REQUEST_COUNT] = 1; - socket[SOCKET_REQUEST_FINISHED_COUNT] = 0; - installListeners(this, socket, options); - } - - createConnection(options, oncreate) { - let called = false; - const onNewCreate = (err, socket) => { - if (called) return; - called = true; - - if (err) { - this.createSocketErrorCount++; - return oncreate(err); - } - this[INIT_SOCKET](socket, options); - oncreate(err, socket); - }; - - const newSocket = super.createConnection(options, onNewCreate); - if (newSocket) onNewCreate(null, newSocket); - return newSocket; - } - - get statusChanged() { - const changed = this.createSocketCount !== this.createSocketCountLastCheck || - this.createSocketErrorCount !== this.createSocketErrorCountLastCheck || - this.closeSocketCount !== this.closeSocketCountLastCheck || - this.errorSocketCount !== this.errorSocketCountLastCheck || - this.timeoutSocketCount !== this.timeoutSocketCountLastCheck || - this.requestCount !== this.requestCountLastCheck; - if (changed) { - this.createSocketCountLastCheck = this.createSocketCount; - this.createSocketErrorCountLastCheck = this.createSocketErrorCount; - this.closeSocketCountLastCheck = this.closeSocketCount; - this.errorSocketCountLastCheck = this.errorSocketCount; - this.timeoutSocketCountLastCheck = this.timeoutSocketCount; - this.requestCountLastCheck = this.requestCount; - } - return changed; - } - - getCurrentStatus() { - return { - createSocketCount: this.createSocketCount, - createSocketErrorCount: this.createSocketErrorCount, - closeSocketCount: this.closeSocketCount, - errorSocketCount: this.errorSocketCount, - timeoutSocketCount: this.timeoutSocketCount, - requestCount: this.requestCount, - freeSockets: inspect(this.freeSockets), - sockets: inspect(this.sockets), - requests: inspect(this.requests), - }; - } -} - -// node 8 don't has timeout attribute on socket -// https://github.com/nodejs/node/pull/21204/files#diff-e6ef024c3775d787c38487a6309e491dR408 -function getSocketTimeout(socket) { - return socket.timeout || socket._idleTimeout; -} - -function installListeners(agent, socket, options) { - debug('%s create, timeout %sms', socket[SOCKET_NAME], getSocketTimeout(socket)); - - // listener socket events: close, timeout, error, free - function onFree() { - // create and socket.emit('free') logic - // https://github.com/nodejs/node/blob/master/lib/_http_agent.js#L311 - // no req on the socket, it should be the new socket - if (!socket._httpMessage && socket[SOCKET_REQUEST_COUNT] === 1) return; - - socket[SOCKET_REQUEST_FINISHED_COUNT]++; - agent.requestCount++; - debug('%s(requests: %s, finished: %s) free', - socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]); - - // should reuse on pedding requests? - const name = agent.getName(options); - if (socket.writable && agent.requests[name] && agent.requests[name].length) { - // will be reuse on agent free listener - socket[SOCKET_REQUEST_COUNT]++; - debug('%s(requests: %s, finished: %s) will be reuse on agent free event', - socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]); - } - } - socket.on('free', onFree); - - function onClose(isError) { - debug('%s(requests: %s, finished: %s) close, isError: %s', - socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], isError); - agent.closeSocketCount++; - } - socket.on('close', onClose); - - // start socket timeout handler - function onTimeout() { - // onTimeout and emitRequestTimeout(_http_client.js) - // https://github.com/nodejs/node/blob/v12.x/lib/_http_client.js#L711 - const listenerCount = socket.listeners('timeout').length; - // node <= 10, default listenerCount is 1, onTimeout - // 11 < node <= 12, default listenerCount is 2, onTimeout and emitRequestTimeout - // node >= 13, default listenerCount is 3, onTimeout, - // onTimeout(https://github.com/nodejs/node/pull/32000/files#diff-5f7fb0850412c6be189faeddea6c5359R333) - // and emitRequestTimeout - const timeout = getSocketTimeout(socket); - const req = socket._httpMessage; - const reqTimeoutListenerCount = req && req.listeners('timeout').length || 0; - debug('%s(requests: %s, finished: %s) timeout after %sms, listeners %s, defaultTimeoutListenerCount %s, hasHttpRequest %s, HttpRequest timeoutListenerCount %s', - socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], - timeout, listenerCount, defaultTimeoutListenerCount, !!req, reqTimeoutListenerCount); - if (debug.enabled) { - debug('timeout listeners: %s', socket.listeners('timeout').map(f => f.name).join(', ')); - } - agent.timeoutSocketCount++; - const name = agent.getName(options); - if (agent.freeSockets[name] && agent.freeSockets[name].indexOf(socket) !== -1) { - // free socket timeout, destroy quietly - socket.destroy(); - // Remove it from freeSockets list immediately to prevent new requests - // from being sent through this socket. - agent.removeSocket(socket, options); - debug('%s is free, destroy quietly', socket[SOCKET_NAME]); - } else { - // if there is no any request socket timeout handler, - // agent need to handle socket timeout itself. - // - // custom request socket timeout handle logic must follow these rules: - // 1. Destroy socket first - // 2. Must emit socket 'agentRemove' event tell agent remove socket - // from freeSockets list immediately. - // Otherise you may be get 'socket hang up' error when reuse - // free socket and timeout happen in the same time. - if (reqTimeoutListenerCount === 0) { - const error = new Error('Socket timeout'); - error.code = 'ERR_SOCKET_TIMEOUT'; - error.timeout = timeout; - // must manually call socket.end() or socket.destroy() to end the connection. - // https://nodejs.org/dist/latest-v10.x/docs/api/net.html#net_socket_settimeout_timeout_callback - socket.destroy(error); - agent.removeSocket(socket, options); - debug('%s destroy with timeout error', socket[SOCKET_NAME]); - } - } - } - socket.on('timeout', onTimeout); - - function onError(err) { - const listenerCount = socket.listeners('error').length; - debug('%s(requests: %s, finished: %s) error: %s, listenerCount: %s', - socket[SOCKET_NAME], socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT], - err, listenerCount); - agent.errorSocketCount++; - if (listenerCount === 1) { - // if socket don't contain error event handler, don't catch it, emit it again - debug('%s emit uncaught error event', socket[SOCKET_NAME]); - socket.removeListener('error', onError); - socket.emit('error', err); - } - } - socket.on('error', onError); - - function onRemove() { - debug('%s(requests: %s, finished: %s) agentRemove', - socket[SOCKET_NAME], - socket[SOCKET_REQUEST_COUNT], socket[SOCKET_REQUEST_FINISHED_COUNT]); - // We need this function for cases like HTTP 'upgrade' - // (defined by WebSockets) where we need to remove a socket from the - // pool because it'll be locked up indefinitely - socket.removeListener('close', onClose); - socket.removeListener('error', onError); - socket.removeListener('free', onFree); - socket.removeListener('timeout', onTimeout); - socket.removeListener('agentRemove', onRemove); - } - socket.on('agentRemove', onRemove); -} - -module.exports = Agent; - -function inspect(obj) { - const res = {}; - for (const key in obj) { - res[key] = obj[key].length; - } - return res; -} - - -/***/ }), - -/***/ 7757: -/***/ ((module) => { - -"use strict"; - - -module.exports = { - // agent - CURRENT_ID: Symbol('agentkeepalive#currentId'), - CREATE_ID: Symbol('agentkeepalive#createId'), - INIT_SOCKET: Symbol('agentkeepalive#initSocket'), - CREATE_HTTPS_CONNECTION: Symbol('agentkeepalive#createHttpsConnection'), - // socket - SOCKET_CREATED_TIME: Symbol('agentkeepalive#socketCreatedTime'), - SOCKET_NAME: Symbol('agentkeepalive#socketName'), - SOCKET_REQUEST_COUNT: Symbol('agentkeepalive#socketRequestCount'), - SOCKET_REQUEST_FINISHED_COUNT: Symbol('agentkeepalive#socketRequestFinishedCount'), -}; - - -/***/ }), - -/***/ 5500: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -const OriginalHttpsAgent = (__nccwpck_require__(5687).Agent); -const HttpAgent = __nccwpck_require__(5006); -const { - INIT_SOCKET, - CREATE_HTTPS_CONNECTION, -} = __nccwpck_require__(7757); - -class HttpsAgent extends HttpAgent { - constructor(options) { - super(options); - - this.defaultPort = 443; - this.protocol = 'https:'; - this.maxCachedSessions = this.options.maxCachedSessions; - /* istanbul ignore next */ - if (this.maxCachedSessions === undefined) { - this.maxCachedSessions = 100; - } - - this._sessionCache = { - map: {}, - list: [], - }; - } - - createConnection(options, oncreate) { - const socket = this[CREATE_HTTPS_CONNECTION](options, oncreate); - this[INIT_SOCKET](socket, options); - return socket; - } -} - -// https://github.com/nodejs/node/blob/master/lib/https.js#L89 -HttpsAgent.prototype[CREATE_HTTPS_CONNECTION] = OriginalHttpsAgent.prototype.createConnection; - -[ - 'getName', - '_getSession', - '_cacheSession', - // https://github.com/nodejs/node/pull/4982 - '_evictSession', -].forEach(function(method) { - /* istanbul ignore next */ - if (typeof OriginalHttpsAgent.prototype[method] === 'function') { - HttpsAgent.prototype[method] = OriginalHttpsAgent.prototype[method]; - } -}); - -module.exports = HttpsAgent; - - -/***/ }), - -/***/ 3682: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -var register = __nccwpck_require__(4670) -var addHook = __nccwpck_require__(5549) -var removeHook = __nccwpck_require__(6819) - -// bind with array of arguments: https://stackoverflow.com/a/21792913 -var bind = Function.bind -var bindable = bind.bind(bind) - -function bindApi (hook, state, name) { - var removeHookRef = bindable(removeHook, null).apply(null, name ? [state, name] : [state]) - hook.api = { remove: removeHookRef } - hook.remove = removeHookRef - - ;['before', 'error', 'after', 'wrap'].forEach(function (kind) { - var args = name ? [state, kind, name] : [state, kind] - hook[kind] = hook.api[kind] = bindable(addHook, null).apply(null, args) - }) -} - -function HookSingular () { - var singularHookName = 'h' - var singularHookState = { - registry: {} - } - var singularHook = register.bind(null, singularHookState, singularHookName) - bindApi(singularHook, singularHookState, singularHookName) - return singularHook -} - -function HookCollection () { - var state = { - registry: {} - } - - var hook = register.bind(null, state) - bindApi(hook, state) - - return hook -} - -var collectionHookDeprecationMessageDisplayed = false -function Hook () { - if (!collectionHookDeprecationMessageDisplayed) { - console.warn('[before-after-hook]: "Hook()" repurposing warning, use "Hook.Collection()". Read more: https://git.io/upgrade-before-after-hook-to-1.4') - collectionHookDeprecationMessageDisplayed = true - } - return HookCollection() -} - -Hook.Singular = HookSingular.bind() -Hook.Collection = HookCollection.bind() - -module.exports = Hook -// expose constructors as a named property for TypeScript -module.exports.Hook = Hook -module.exports.Singular = Hook.Singular -module.exports.Collection = Hook.Collection - - -/***/ }), - -/***/ 5549: -/***/ ((module) => { - -module.exports = addHook; - -function addHook(state, kind, name, hook) { - var orig = hook; - if (!state.registry[name]) { - state.registry[name] = []; - } - - if (kind === "before") { - hook = function (method, options) { - return Promise.resolve() - .then(orig.bind(null, options)) - .then(method.bind(null, options)); - }; - } - - if (kind === "after") { - hook = function (method, options) { - var result; - return Promise.resolve() - .then(method.bind(null, options)) - .then(function (result_) { - result = result_; - return orig(result, options); - }) - .then(function () { - return result; - }); - }; - } - - if (kind === "error") { - hook = function (method, options) { - return Promise.resolve() - .then(method.bind(null, options)) - .catch(function (error) { - return orig(error, options); - }); - }; - } - - state.registry[name].push({ - hook: hook, - orig: orig, - }); -} - - -/***/ }), - -/***/ 4670: -/***/ ((module) => { - -module.exports = register; - -function register(state, name, method, options) { - if (typeof method !== "function") { - throw new Error("method for before hook must be a function"); - } - - if (!options) { - options = {}; - } - - if (Array.isArray(name)) { - return name.reverse().reduce(function (callback, name) { - return register.bind(null, state, name, callback, options); - }, method)(); - } - - return Promise.resolve().then(function () { - if (!state.registry[name]) { - return method(options); - } - - return state.registry[name].reduce(function (method, registered) { - return registered.hook.bind(null, method, options); - }, method)(); - }); -} - - -/***/ }), - -/***/ 6819: -/***/ ((module) => { - -module.exports = removeHook; - -function removeHook(state, name, method) { - if (!state.registry[name]) { - return; - } - - var index = state.registry[name] - .map(function (registered) { - return registered.orig; - }) - .indexOf(method); - - if (index === -1) { - return; - } - - state.registry[name].splice(index, 1); -} - - -/***/ }), - -/***/ 8932: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -class Deprecation extends Error { - constructor(message) { - super(message); // Maintains proper stack trace (only available on V8) - - /* istanbul ignore next */ - - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - - this.name = 'Deprecation'; - } - -} - -exports.Deprecation = Deprecation; - - -/***/ }), - -/***/ 4697: -/***/ ((module, exports) => { - -"use strict"; -/** - * @author Toru Nagashima - * @copyright 2015 Toru Nagashima. All rights reserved. - * See LICENSE file in root directory for full license. - */ - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -/** - * @typedef {object} PrivateData - * @property {EventTarget} eventTarget The event target. - * @property {{type:string}} event The original event object. - * @property {number} eventPhase The current event phase. - * @property {EventTarget|null} currentTarget The current event target. - * @property {boolean} canceled The flag to prevent default. - * @property {boolean} stopped The flag to stop propagation. - * @property {boolean} immediateStopped The flag to stop propagation immediately. - * @property {Function|null} passiveListener The listener if the current listener is passive. Otherwise this is null. - * @property {number} timeStamp The unix time. - * @private - */ - -/** - * Private data for event wrappers. - * @type {WeakMap} - * @private - */ -const privateData = new WeakMap(); - -/** - * Cache for wrapper classes. - * @type {WeakMap} - * @private - */ -const wrappers = new WeakMap(); - -/** - * Get private data. - * @param {Event} event The event object to get private data. - * @returns {PrivateData} The private data of the event. - * @private - */ -function pd(event) { - const retv = privateData.get(event); - console.assert( - retv != null, - "'this' is expected an Event object, but got", - event - ); - return retv -} - -/** - * https://dom.spec.whatwg.org/#set-the-canceled-flag - * @param data {PrivateData} private data. - */ -function setCancelFlag(data) { - if (data.passiveListener != null) { - if ( - typeof console !== "undefined" && - typeof console.error === "function" - ) { - console.error( - "Unable to preventDefault inside passive event listener invocation.", - data.passiveListener - ); - } - return - } - if (!data.event.cancelable) { - return - } - - data.canceled = true; - if (typeof data.event.preventDefault === "function") { - data.event.preventDefault(); - } -} - -/** - * @see https://dom.spec.whatwg.org/#interface-event - * @private - */ -/** - * The event wrapper. - * @constructor - * @param {EventTarget} eventTarget The event target of this dispatching. - * @param {Event|{type:string}} event The original event to wrap. - */ -function Event(eventTarget, event) { - privateData.set(this, { - eventTarget, - event, - eventPhase: 2, - currentTarget: eventTarget, - canceled: false, - stopped: false, - immediateStopped: false, - passiveListener: null, - timeStamp: event.timeStamp || Date.now(), - }); - - // https://heycam.github.io/webidl/#Unforgeable - Object.defineProperty(this, "isTrusted", { value: false, enumerable: true }); - - // Define accessors - const keys = Object.keys(event); - for (let i = 0; i < keys.length; ++i) { - const key = keys[i]; - if (!(key in this)) { - Object.defineProperty(this, key, defineRedirectDescriptor(key)); - } - } -} - -// Should be enumerable, but class methods are not enumerable. -Event.prototype = { - /** - * The type of this event. - * @type {string} - */ - get type() { - return pd(this).event.type - }, - - /** - * The target of this event. - * @type {EventTarget} - */ - get target() { - return pd(this).eventTarget - }, - - /** - * The target of this event. - * @type {EventTarget} - */ - get currentTarget() { - return pd(this).currentTarget - }, - - /** - * @returns {EventTarget[]} The composed path of this event. - */ - composedPath() { - const currentTarget = pd(this).currentTarget; - if (currentTarget == null) { - return [] - } - return [currentTarget] - }, - - /** - * Constant of NONE. - * @type {number} - */ - get NONE() { - return 0 - }, - - /** - * Constant of CAPTURING_PHASE. - * @type {number} - */ - get CAPTURING_PHASE() { - return 1 - }, - - /** - * Constant of AT_TARGET. - * @type {number} - */ - get AT_TARGET() { - return 2 - }, - - /** - * Constant of BUBBLING_PHASE. - * @type {number} - */ - get BUBBLING_PHASE() { - return 3 - }, - - /** - * The target of this event. - * @type {number} - */ - get eventPhase() { - return pd(this).eventPhase - }, - - /** - * Stop event bubbling. - * @returns {void} - */ - stopPropagation() { - const data = pd(this); - - data.stopped = true; - if (typeof data.event.stopPropagation === "function") { - data.event.stopPropagation(); - } - }, - - /** - * Stop event bubbling. - * @returns {void} - */ - stopImmediatePropagation() { - const data = pd(this); - - data.stopped = true; - data.immediateStopped = true; - if (typeof data.event.stopImmediatePropagation === "function") { - data.event.stopImmediatePropagation(); - } - }, - - /** - * The flag to be bubbling. - * @type {boolean} - */ - get bubbles() { - return Boolean(pd(this).event.bubbles) - }, - - /** - * The flag to be cancelable. - * @type {boolean} - */ - get cancelable() { - return Boolean(pd(this).event.cancelable) - }, - - /** - * Cancel this event. - * @returns {void} - */ - preventDefault() { - setCancelFlag(pd(this)); - }, - - /** - * The flag to indicate cancellation state. - * @type {boolean} - */ - get defaultPrevented() { - return pd(this).canceled - }, - - /** - * The flag to be composed. - * @type {boolean} - */ - get composed() { - return Boolean(pd(this).event.composed) - }, - - /** - * The unix time of this event. - * @type {number} - */ - get timeStamp() { - return pd(this).timeStamp - }, - - /** - * The target of this event. - * @type {EventTarget} - * @deprecated - */ - get srcElement() { - return pd(this).eventTarget - }, - - /** - * The flag to stop event bubbling. - * @type {boolean} - * @deprecated - */ - get cancelBubble() { - return pd(this).stopped - }, - set cancelBubble(value) { - if (!value) { - return - } - const data = pd(this); - - data.stopped = true; - if (typeof data.event.cancelBubble === "boolean") { - data.event.cancelBubble = true; - } - }, - - /** - * The flag to indicate cancellation state. - * @type {boolean} - * @deprecated - */ - get returnValue() { - return !pd(this).canceled - }, - set returnValue(value) { - if (!value) { - setCancelFlag(pd(this)); - } - }, - - /** - * Initialize this event object. But do nothing under event dispatching. - * @param {string} type The event type. - * @param {boolean} [bubbles=false] The flag to be possible to bubble up. - * @param {boolean} [cancelable=false] The flag to be possible to cancel. - * @deprecated - */ - initEvent() { - // Do nothing. - }, -}; - -// `constructor` is not enumerable. -Object.defineProperty(Event.prototype, "constructor", { - value: Event, - configurable: true, - writable: true, -}); - -// Ensure `event instanceof window.Event` is `true`. -if (typeof window !== "undefined" && typeof window.Event !== "undefined") { - Object.setPrototypeOf(Event.prototype, window.Event.prototype); - - // Make association for wrappers. - wrappers.set(window.Event.prototype, Event); -} - -/** - * Get the property descriptor to redirect a given property. - * @param {string} key Property name to define property descriptor. - * @returns {PropertyDescriptor} The property descriptor to redirect the property. - * @private - */ -function defineRedirectDescriptor(key) { - return { - get() { - return pd(this).event[key] - }, - set(value) { - pd(this).event[key] = value; - }, - configurable: true, - enumerable: true, - } -} - -/** - * Get the property descriptor to call a given method property. - * @param {string} key Property name to define property descriptor. - * @returns {PropertyDescriptor} The property descriptor to call the method property. - * @private - */ -function defineCallDescriptor(key) { - return { - value() { - const event = pd(this).event; - return event[key].apply(event, arguments) - }, - configurable: true, - enumerable: true, - } -} - -/** - * Define new wrapper class. - * @param {Function} BaseEvent The base wrapper class. - * @param {Object} proto The prototype of the original event. - * @returns {Function} The defined wrapper class. - * @private - */ -function defineWrapper(BaseEvent, proto) { - const keys = Object.keys(proto); - if (keys.length === 0) { - return BaseEvent - } - - /** CustomEvent */ - function CustomEvent(eventTarget, event) { - BaseEvent.call(this, eventTarget, event); - } - - CustomEvent.prototype = Object.create(BaseEvent.prototype, { - constructor: { value: CustomEvent, configurable: true, writable: true }, - }); - - // Define accessors. - for (let i = 0; i < keys.length; ++i) { - const key = keys[i]; - if (!(key in BaseEvent.prototype)) { - const descriptor = Object.getOwnPropertyDescriptor(proto, key); - const isFunc = typeof descriptor.value === "function"; - Object.defineProperty( - CustomEvent.prototype, - key, - isFunc - ? defineCallDescriptor(key) - : defineRedirectDescriptor(key) - ); - } - } - - return CustomEvent -} - -/** - * Get the wrapper class of a given prototype. - * @param {Object} proto The prototype of the original event to get its wrapper. - * @returns {Function} The wrapper class. - * @private - */ -function getWrapper(proto) { - if (proto == null || proto === Object.prototype) { - return Event - } - - let wrapper = wrappers.get(proto); - if (wrapper == null) { - wrapper = defineWrapper(getWrapper(Object.getPrototypeOf(proto)), proto); - wrappers.set(proto, wrapper); - } - return wrapper -} - -/** - * Wrap a given event to management a dispatching. - * @param {EventTarget} eventTarget The event target of this dispatching. - * @param {Object} event The event to wrap. - * @returns {Event} The wrapper instance. - * @private - */ -function wrapEvent(eventTarget, event) { - const Wrapper = getWrapper(Object.getPrototypeOf(event)); - return new Wrapper(eventTarget, event) -} - -/** - * Get the immediateStopped flag of a given event. - * @param {Event} event The event to get. - * @returns {boolean} The flag to stop propagation immediately. - * @private - */ -function isStopped(event) { - return pd(event).immediateStopped -} - -/** - * Set the current event phase of a given event. - * @param {Event} event The event to set current target. - * @param {number} eventPhase New event phase. - * @returns {void} - * @private - */ -function setEventPhase(event, eventPhase) { - pd(event).eventPhase = eventPhase; -} - -/** - * Set the current target of a given event. - * @param {Event} event The event to set current target. - * @param {EventTarget|null} currentTarget New current target. - * @returns {void} - * @private - */ -function setCurrentTarget(event, currentTarget) { - pd(event).currentTarget = currentTarget; -} - -/** - * Set a passive listener of a given event. - * @param {Event} event The event to set current target. - * @param {Function|null} passiveListener New passive listener. - * @returns {void} - * @private - */ -function setPassiveListener(event, passiveListener) { - pd(event).passiveListener = passiveListener; -} - -/** - * @typedef {object} ListenerNode - * @property {Function} listener - * @property {1|2|3} listenerType - * @property {boolean} passive - * @property {boolean} once - * @property {ListenerNode|null} next - * @private - */ - -/** - * @type {WeakMap>} - * @private - */ -const listenersMap = new WeakMap(); - -// Listener types -const CAPTURE = 1; -const BUBBLE = 2; -const ATTRIBUTE = 3; - -/** - * Check whether a given value is an object or not. - * @param {any} x The value to check. - * @returns {boolean} `true` if the value is an object. - */ -function isObject(x) { - return x !== null && typeof x === "object" //eslint-disable-line no-restricted-syntax -} - -/** - * Get listeners. - * @param {EventTarget} eventTarget The event target to get. - * @returns {Map} The listeners. - * @private - */ -function getListeners(eventTarget) { - const listeners = listenersMap.get(eventTarget); - if (listeners == null) { - throw new TypeError( - "'this' is expected an EventTarget object, but got another value." - ) - } - return listeners -} - -/** - * Get the property descriptor for the event attribute of a given event. - * @param {string} eventName The event name to get property descriptor. - * @returns {PropertyDescriptor} The property descriptor. - * @private - */ -function defineEventAttributeDescriptor(eventName) { - return { - get() { - const listeners = getListeners(this); - let node = listeners.get(eventName); - while (node != null) { - if (node.listenerType === ATTRIBUTE) { - return node.listener - } - node = node.next; - } - return null - }, - - set(listener) { - if (typeof listener !== "function" && !isObject(listener)) { - listener = null; // eslint-disable-line no-param-reassign - } - const listeners = getListeners(this); - - // Traverse to the tail while removing old value. - let prev = null; - let node = listeners.get(eventName); - while (node != null) { - if (node.listenerType === ATTRIBUTE) { - // Remove old value. - if (prev !== null) { - prev.next = node.next; - } else if (node.next !== null) { - listeners.set(eventName, node.next); - } else { - listeners.delete(eventName); - } - } else { - prev = node; - } - - node = node.next; - } - - // Add new value. - if (listener !== null) { - const newNode = { - listener, - listenerType: ATTRIBUTE, - passive: false, - once: false, - next: null, - }; - if (prev === null) { - listeners.set(eventName, newNode); - } else { - prev.next = newNode; - } - } - }, - configurable: true, - enumerable: true, - } -} - -/** - * Define an event attribute (e.g. `eventTarget.onclick`). - * @param {Object} eventTargetPrototype The event target prototype to define an event attrbite. - * @param {string} eventName The event name to define. - * @returns {void} - */ -function defineEventAttribute(eventTargetPrototype, eventName) { - Object.defineProperty( - eventTargetPrototype, - `on${eventName}`, - defineEventAttributeDescriptor(eventName) - ); -} - -/** - * Define a custom EventTarget with event attributes. - * @param {string[]} eventNames Event names for event attributes. - * @returns {EventTarget} The custom EventTarget. - * @private - */ -function defineCustomEventTarget(eventNames) { - /** CustomEventTarget */ - function CustomEventTarget() { - EventTarget.call(this); - } - - CustomEventTarget.prototype = Object.create(EventTarget.prototype, { - constructor: { - value: CustomEventTarget, - configurable: true, - writable: true, - }, - }); - - for (let i = 0; i < eventNames.length; ++i) { - defineEventAttribute(CustomEventTarget.prototype, eventNames[i]); - } - - return CustomEventTarget -} - -/** - * EventTarget. - * - * - This is constructor if no arguments. - * - This is a function which returns a CustomEventTarget constructor if there are arguments. - * - * For example: - * - * class A extends EventTarget {} - * class B extends EventTarget("message") {} - * class C extends EventTarget("message", "error") {} - * class D extends EventTarget(["message", "error"]) {} - */ -function EventTarget() { - /*eslint-disable consistent-return */ - if (this instanceof EventTarget) { - listenersMap.set(this, new Map()); - return - } - if (arguments.length === 1 && Array.isArray(arguments[0])) { - return defineCustomEventTarget(arguments[0]) - } - if (arguments.length > 0) { - const types = new Array(arguments.length); - for (let i = 0; i < arguments.length; ++i) { - types[i] = arguments[i]; - } - return defineCustomEventTarget(types) - } - throw new TypeError("Cannot call a class as a function") - /*eslint-enable consistent-return */ -} - -// Should be enumerable, but class methods are not enumerable. -EventTarget.prototype = { - /** - * Add a given listener to this event target. - * @param {string} eventName The event name to add. - * @param {Function} listener The listener to add. - * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener. - * @returns {void} - */ - addEventListener(eventName, listener, options) { - if (listener == null) { - return - } - if (typeof listener !== "function" && !isObject(listener)) { - throw new TypeError("'listener' should be a function or an object.") - } - - const listeners = getListeners(this); - const optionsIsObj = isObject(options); - const capture = optionsIsObj - ? Boolean(options.capture) - : Boolean(options); - const listenerType = capture ? CAPTURE : BUBBLE; - const newNode = { - listener, - listenerType, - passive: optionsIsObj && Boolean(options.passive), - once: optionsIsObj && Boolean(options.once), - next: null, - }; - - // Set it as the first node if the first node is null. - let node = listeners.get(eventName); - if (node === undefined) { - listeners.set(eventName, newNode); - return - } - - // Traverse to the tail while checking duplication.. - let prev = null; - while (node != null) { - if ( - node.listener === listener && - node.listenerType === listenerType - ) { - // Should ignore duplication. - return - } - prev = node; - node = node.next; - } - - // Add it. - prev.next = newNode; - }, - - /** - * Remove a given listener from this event target. - * @param {string} eventName The event name to remove. - * @param {Function} listener The listener to remove. - * @param {boolean|{capture?:boolean,passive?:boolean,once?:boolean}} [options] The options for this listener. - * @returns {void} - */ - removeEventListener(eventName, listener, options) { - if (listener == null) { - return - } - - const listeners = getListeners(this); - const capture = isObject(options) - ? Boolean(options.capture) - : Boolean(options); - const listenerType = capture ? CAPTURE : BUBBLE; - - let prev = null; - let node = listeners.get(eventName); - while (node != null) { - if ( - node.listener === listener && - node.listenerType === listenerType - ) { - if (prev !== null) { - prev.next = node.next; - } else if (node.next !== null) { - listeners.set(eventName, node.next); - } else { - listeners.delete(eventName); - } - return - } - - prev = node; - node = node.next; - } - }, - - /** - * Dispatch a given event. - * @param {Event|{type:string}} event The event to dispatch. - * @returns {boolean} `false` if canceled. - */ - dispatchEvent(event) { - if (event == null || typeof event.type !== "string") { - throw new TypeError('"event.type" should be a string.') - } - - // If listeners aren't registered, terminate. - const listeners = getListeners(this); - const eventName = event.type; - let node = listeners.get(eventName); - if (node == null) { - return true - } - - // Since we cannot rewrite several properties, so wrap object. - const wrappedEvent = wrapEvent(this, event); - - // This doesn't process capturing phase and bubbling phase. - // This isn't participating in a tree. - let prev = null; - while (node != null) { - // Remove this listener if it's once - if (node.once) { - if (prev !== null) { - prev.next = node.next; - } else if (node.next !== null) { - listeners.set(eventName, node.next); - } else { - listeners.delete(eventName); - } - } else { - prev = node; - } - - // Call this listener - setPassiveListener( - wrappedEvent, - node.passive ? node.listener : null - ); - if (typeof node.listener === "function") { - try { - node.listener.call(this, wrappedEvent); - } catch (err) { - if ( - typeof console !== "undefined" && - typeof console.error === "function" - ) { - console.error(err); - } - } - } else if ( - node.listenerType !== ATTRIBUTE && - typeof node.listener.handleEvent === "function" - ) { - node.listener.handleEvent(wrappedEvent); - } - - // Break if `event.stopImmediatePropagation` was called. - if (isStopped(wrappedEvent)) { - break - } - - node = node.next; - } - setPassiveListener(wrappedEvent, null); - setEventPhase(wrappedEvent, 0); - setCurrentTarget(wrappedEvent, null); - - return !wrappedEvent.defaultPrevented - }, -}; - -// `constructor` is not enumerable. -Object.defineProperty(EventTarget.prototype, "constructor", { - value: EventTarget, - configurable: true, - writable: true, -}); - -// Ensure `eventTarget instanceof window.EventTarget` is `true`. -if ( - typeof window !== "undefined" && - typeof window.EventTarget !== "undefined" -) { - Object.setPrototypeOf(EventTarget.prototype, window.EventTarget.prototype); -} - -exports.defineEventAttribute = defineEventAttribute; -exports.EventTarget = EventTarget; -exports["default"] = EventTarget; - -module.exports = EventTarget -module.exports.EventTarget = module.exports["default"] = EventTarget -module.exports.defineEventAttribute = defineEventAttribute -//# sourceMappingURL=event-target-shim.js.map - - -/***/ }), - -/***/ 6993: -/***/ (function(__unused_webpack_module, exports) { - -/** - * @license - * web-streams-polyfill v4.0.0-beta.3 - * Copyright 2021 Mattias Buelens, Diwank Singh Tomer and other contributors. - * This code is released under the MIT license. - * SPDX-License-Identifier: MIT - */ -!function(e,t){ true?t(exports):0}(this,(function(e){"use strict";const t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?Symbol:e=>`Symbol(${e})`;function r(){}function o(e){return"object"==typeof e&&null!==e||"function"==typeof e}const n=r;function a(e,t){try{Object.defineProperty(e,"name",{value:t,configurable:!0})}catch(e){}}const i=Promise,l=Promise.prototype.then,s=Promise.resolve.bind(i),u=Promise.reject.bind(i);function c(e){return new i(e)}function d(e){return s(e)}function f(e){return u(e)}function b(e,t,r){return l.call(e,t,r)}function h(e,t,r){b(b(e,t,r),void 0,n)}function _(e,t){h(e,t)}function p(e,t){h(e,void 0,t)}function m(e,t,r){return b(e,t,r)}function y(e){b(e,void 0,n)}let g=e=>{if("function"==typeof queueMicrotask)g=queueMicrotask;else{const e=d(void 0);g=t=>b(e,t)}return g(e)};function S(e,t,r){if("function"!=typeof e)throw new TypeError("Argument is not a function");return Function.prototype.apply.call(e,t,r)}function w(e,t,r){try{return d(S(e,t,r))}catch(e){return f(e)}}class v{constructor(){this._cursor=0,this._size=0,this._front={_elements:[],_next:void 0},this._back=this._front,this._cursor=0,this._size=0}get length(){return this._size}push(e){const t=this._back;let r=t;16383===t._elements.length&&(r={_elements:[],_next:void 0}),t._elements.push(e),r!==t&&(this._back=r,t._next=r),++this._size}shift(){const e=this._front;let t=e;const r=this._cursor;let o=r+1;const n=e._elements,a=n[r];return 16384===o&&(t=e._next,o=0),--this._size,this._cursor=o,e!==t&&(this._front=t),n[r]=void 0,a}forEach(e){let t=this._cursor,r=this._front,o=r._elements;for(;!(t===o.length&&void 0===r._next||t===o.length&&(r=r._next,o=r._elements,t=0,0===o.length));)e(o[t]),++t}peek(){const e=this._front,t=this._cursor;return e._elements[t]}}const R=t("[[AbortSteps]]"),T=t("[[ErrorSteps]]"),q=t("[[CancelSteps]]"),C=t("[[PullSteps]]"),P=t("[[ReleaseSteps]]");function E(e,t){e._ownerReadableStream=t,t._reader=e,"readable"===t._state?B(e):"closed"===t._state?function(e){B(e),z(e)}(e):A(e,t._storedError)}function W(e,t){return Xt(e._ownerReadableStream,t)}function O(e){const t=e._ownerReadableStream;"readable"===t._state?j(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")):function(e,t){A(e,t)}(e,new TypeError("Reader was released and can no longer be used to monitor the stream's closedness")),t._readableStreamController[P](),t._reader=void 0,e._ownerReadableStream=void 0}function k(e){return new TypeError("Cannot "+e+" a stream using a released reader")}function B(e){e._closedPromise=c(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r}))}function A(e,t){B(e),j(e,t)}function j(e,t){void 0!==e._closedPromise_reject&&(y(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}function z(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0)}const L=Number.isFinite||function(e){return"number"==typeof e&&isFinite(e)},F=Math.trunc||function(e){return e<0?Math.ceil(e):Math.floor(e)};function D(e,t){if(void 0!==e&&("object"!=typeof(r=e)&&"function"!=typeof r))throw new TypeError(`${t} is not an object.`);var r}function I(e,t){if("function"!=typeof e)throw new TypeError(`${t} is not a function.`)}function $(e,t){if(!function(e){return"object"==typeof e&&null!==e||"function"==typeof e}(e))throw new TypeError(`${t} is not an object.`)}function M(e,t,r){if(void 0===e)throw new TypeError(`Parameter ${t} is required in '${r}'.`)}function Y(e,t,r){if(void 0===e)throw new TypeError(`${t} is required in '${r}'.`)}function Q(e){return Number(e)}function N(e){return 0===e?0:e}function x(e,t){const r=Number.MAX_SAFE_INTEGER;let o=Number(e);if(o=N(o),!L(o))throw new TypeError(`${t} is not a finite number`);if(o=function(e){return N(F(e))}(o),o<0||o>r)throw new TypeError(`${t} is outside the accepted range of 0 to ${r}, inclusive`);return L(o)&&0!==o?o:0}function H(e){if(!o(e))return!1;if("function"!=typeof e.getReader)return!1;try{return"boolean"==typeof e.locked}catch(e){return!1}}function V(e){if(!o(e))return!1;if("function"!=typeof e.getWriter)return!1;try{return"boolean"==typeof e.locked}catch(e){return!1}}function U(e,t){if(!Ut(e))throw new TypeError(`${t} is not a ReadableStream.`)}function G(e,t){e._reader._readRequests.push(t)}function X(e,t,r){const o=e._reader._readRequests.shift();r?o._closeSteps():o._chunkSteps(t)}function J(e){return e._reader._readRequests.length}function K(e){const t=e._reader;return void 0!==t&&!!Z(t)}class ReadableStreamDefaultReader{constructor(e){if(M(e,1,"ReadableStreamDefaultReader"),U(e,"First parameter"),Gt(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");E(this,e),this._readRequests=new v}get closed(){return Z(this)?this._closedPromise:f(te("closed"))}cancel(e){return Z(this)?void 0===this._ownerReadableStream?f(k("cancel")):W(this,e):f(te("cancel"))}read(){if(!Z(this))return f(te("read"));if(void 0===this._ownerReadableStream)return f(k("read from"));let e,t;const r=c(((r,o)=>{e=r,t=o}));return function(e,t){const r=e._ownerReadableStream;r._disturbed=!0,"closed"===r._state?t._closeSteps():"errored"===r._state?t._errorSteps(r._storedError):r._readableStreamController[C](t)}(this,{_chunkSteps:t=>e({value:t,done:!1}),_closeSteps:()=>e({value:void 0,done:!0}),_errorSteps:e=>t(e)}),r}releaseLock(){if(!Z(this))throw te("releaseLock");void 0!==this._ownerReadableStream&&function(e){O(e);const t=new TypeError("Reader was released");ee(e,t)}(this)}}function Z(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readRequests")&&e instanceof ReadableStreamDefaultReader)}function ee(e,t){const r=e._readRequests;e._readRequests=new v,r.forEach((e=>{e._errorSteps(t)}))}function te(e){return new TypeError(`ReadableStreamDefaultReader.prototype.${e} can only be used on a ReadableStreamDefaultReader`)}Object.defineProperties(ReadableStreamDefaultReader.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),a(ReadableStreamDefaultReader.prototype.cancel,"cancel"),a(ReadableStreamDefaultReader.prototype.read,"read"),a(ReadableStreamDefaultReader.prototype.releaseLock,"releaseLock"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStreamDefaultReader.prototype,t.toStringTag,{value:"ReadableStreamDefaultReader",configurable:!0});class re{constructor(e,t){this._ongoingPromise=void 0,this._isFinished=!1,this._reader=e,this._preventCancel=t}next(){const e=()=>this._nextSteps();return this._ongoingPromise=this._ongoingPromise?m(this._ongoingPromise,e,e):e(),this._ongoingPromise}return(e){const t=()=>this._returnSteps(e);return this._ongoingPromise?m(this._ongoingPromise,t,t):t()}_nextSteps(){if(this._isFinished)return Promise.resolve({value:void 0,done:!0});const e=this._reader;return void 0===e?f(k("iterate")):b(e.read(),(e=>{var t;return this._ongoingPromise=void 0,e.done&&(this._isFinished=!0,null===(t=this._reader)||void 0===t||t.releaseLock(),this._reader=void 0),e}),(e=>{var t;throw this._ongoingPromise=void 0,this._isFinished=!0,null===(t=this._reader)||void 0===t||t.releaseLock(),this._reader=void 0,e}))}_returnSteps(e){if(this._isFinished)return Promise.resolve({value:e,done:!0});this._isFinished=!0;const t=this._reader;if(void 0===t)return f(k("finish iterating"));if(this._reader=void 0,!this._preventCancel){const r=t.cancel(e);return t.releaseLock(),m(r,(()=>({value:e,done:!0})))}return t.releaseLock(),d({value:e,done:!0})}}const oe={next(){return ne(this)?this._asyncIteratorImpl.next():f(ae("next"))},return(e){return ne(this)?this._asyncIteratorImpl.return(e):f(ae("return"))}};function ne(e){if(!o(e))return!1;if(!Object.prototype.hasOwnProperty.call(e,"_asyncIteratorImpl"))return!1;try{return e._asyncIteratorImpl instanceof re}catch(e){return!1}}function ae(e){return new TypeError(`ReadableStreamAsyncIterator.${e} can only be used on a ReadableSteamAsyncIterator`)}"symbol"==typeof t.asyncIterator&&Object.defineProperty(oe,t.asyncIterator,{value(){return this},writable:!0,configurable:!0});const ie=Number.isNaN||function(e){return e!=e};function le(e,t,r,o,n){new Uint8Array(e).set(new Uint8Array(r,o,n),t)}function se(e){const t=function(e,t,r){if(e.slice)return e.slice(t,r);const o=r-t,n=new ArrayBuffer(o);return le(n,0,e,t,o),n}(e.buffer,e.byteOffset,e.byteOffset+e.byteLength);return new Uint8Array(t)}function ue(e){const t=e._queue.shift();return e._queueTotalSize-=t.size,e._queueTotalSize<0&&(e._queueTotalSize=0),t.value}function ce(e,t,r){if("number"!=typeof(o=r)||ie(o)||o<0||r===1/0)throw new RangeError("Size must be a finite, non-NaN, non-negative number.");var o;e._queue.push({value:t,size:r}),e._queueTotalSize+=r}function de(e){e._queue=new v,e._queueTotalSize=0}class ReadableStreamBYOBRequest{constructor(){throw new TypeError("Illegal constructor")}get view(){if(!be(this))throw Ae("view");return this._view}respond(e){if(!be(this))throw Ae("respond");if(M(e,1,"respond"),e=x(e,"First parameter"),void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");this._view.buffer,function(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t)throw new TypeError("bytesWritten must be 0 when calling respond() on a closed stream")}else{if(0===t)throw new TypeError("bytesWritten must be greater than 0 when calling respond() on a readable stream");if(r.bytesFilled+t>r.byteLength)throw new RangeError("bytesWritten out of range")}r.buffer=r.buffer,Ce(e,t)}(this._associatedReadableByteStreamController,e)}respondWithNewView(e){if(!be(this))throw Ae("respondWithNewView");if(M(e,1,"respondWithNewView"),!ArrayBuffer.isView(e))throw new TypeError("You can only respond with array buffer views");if(void 0===this._associatedReadableByteStreamController)throw new TypeError("This BYOB request has been invalidated");e.buffer,function(e,t){const r=e._pendingPullIntos.peek();if("closed"===e._controlledReadableByteStream._state){if(0!==t.byteLength)throw new TypeError("The view's length must be 0 when calling respondWithNewView() on a closed stream")}else if(0===t.byteLength)throw new TypeError("The view's length must be greater than 0 when calling respondWithNewView() on a readable stream");if(r.byteOffset+r.bytesFilled!==t.byteOffset)throw new RangeError("The region specified by view does not match byobRequest");if(r.bufferByteLength!==t.buffer.byteLength)throw new RangeError("The buffer of view has different capacity than byobRequest");if(r.bytesFilled+t.byteLength>r.byteLength)throw new RangeError("The region specified by view is larger than byobRequest");const o=t.byteLength;r.buffer=t.buffer,Ce(e,o)}(this._associatedReadableByteStreamController,e)}}Object.defineProperties(ReadableStreamBYOBRequest.prototype,{respond:{enumerable:!0},respondWithNewView:{enumerable:!0},view:{enumerable:!0}}),a(ReadableStreamBYOBRequest.prototype.respond,"respond"),a(ReadableStreamBYOBRequest.prototype.respondWithNewView,"respondWithNewView"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStreamBYOBRequest.prototype,t.toStringTag,{value:"ReadableStreamBYOBRequest",configurable:!0});class ReadableByteStreamController{constructor(){throw new TypeError("Illegal constructor")}get byobRequest(){if(!fe(this))throw je("byobRequest");return function(e){if(null===e._byobRequest&&e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek(),r=new Uint8Array(t.buffer,t.byteOffset+t.bytesFilled,t.byteLength-t.bytesFilled),o=Object.create(ReadableStreamBYOBRequest.prototype);!function(e,t,r){e._associatedReadableByteStreamController=t,e._view=r}(o,e,r),e._byobRequest=o}return e._byobRequest}(this)}get desiredSize(){if(!fe(this))throw je("desiredSize");return ke(this)}close(){if(!fe(this))throw je("close");if(this._closeRequested)throw new TypeError("The stream has already been closed; do not close it again!");const e=this._controlledReadableByteStream._state;if("readable"!==e)throw new TypeError(`The stream (in ${e} state) is not in the readable state and cannot be closed`);!function(e){const t=e._controlledReadableByteStream;if(e._closeRequested||"readable"!==t._state)return;if(e._queueTotalSize>0)return void(e._closeRequested=!0);if(e._pendingPullIntos.length>0){if(e._pendingPullIntos.peek().bytesFilled>0){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");throw We(e,t),t}}Ee(e),Jt(t)}(this)}enqueue(e){if(!fe(this))throw je("enqueue");if(M(e,1,"enqueue"),!ArrayBuffer.isView(e))throw new TypeError("chunk must be an array buffer view");if(0===e.byteLength)throw new TypeError("chunk must have non-zero byteLength");if(0===e.buffer.byteLength)throw new TypeError("chunk's buffer must have non-zero byteLength");if(this._closeRequested)throw new TypeError("stream is closed or draining");const t=this._controlledReadableByteStream._state;if("readable"!==t)throw new TypeError(`The stream (in ${t} state) is not in the readable state and cannot be enqueued to`);!function(e,t){const r=e._controlledReadableByteStream;if(e._closeRequested||"readable"!==r._state)return;const o=t.buffer,n=t.byteOffset,a=t.byteLength,i=o;if(e._pendingPullIntos.length>0){const t=e._pendingPullIntos.peek();t.buffer,0,Te(e),t.buffer=t.buffer,"none"===t.readerType&&Se(e,t)}if(K(r))if(function(e){const t=e._controlledReadableByteStream._reader;for(;t._readRequests.length>0;){if(0===e._queueTotalSize)return;Oe(e,t._readRequests.shift())}}(e),0===J(r))ye(e,i,n,a);else{e._pendingPullIntos.length>0&&Pe(e);X(r,new Uint8Array(i,n,a),!1)}else Fe(r)?(ye(e,i,n,a),qe(e)):ye(e,i,n,a);he(e)}(this,e)}error(e){if(!fe(this))throw je("error");We(this,e)}[q](e){_e(this),de(this);const t=this._cancelAlgorithm(e);return Ee(this),t}[C](e){const t=this._controlledReadableByteStream;if(this._queueTotalSize>0)return void Oe(this,e);const r=this._autoAllocateChunkSize;if(void 0!==r){let t;try{t=new ArrayBuffer(r)}catch(t){return void e._errorSteps(t)}const o={buffer:t,bufferByteLength:r,byteOffset:0,byteLength:r,bytesFilled:0,elementSize:1,viewConstructor:Uint8Array,readerType:"default"};this._pendingPullIntos.push(o)}G(t,e),he(this)}[P](){if(this._pendingPullIntos.length>0){const e=this._pendingPullIntos.peek();e.readerType="none",this._pendingPullIntos=new v,this._pendingPullIntos.push(e)}}}function fe(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableByteStream")&&e instanceof ReadableByteStreamController)}function be(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_associatedReadableByteStreamController")&&e instanceof ReadableStreamBYOBRequest)}function he(e){const t=function(e){const t=e._controlledReadableByteStream;if("readable"!==t._state)return!1;if(e._closeRequested)return!1;if(!e._started)return!1;if(K(t)&&J(t)>0)return!0;if(Fe(t)&&Le(t)>0)return!0;if(ke(e)>0)return!0;return!1}(e);if(!t)return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;h(e._pullAlgorithm(),(()=>(e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,he(e)),null)),(t=>(We(e,t),null)))}function _e(e){Te(e),e._pendingPullIntos=new v}function pe(e,t){let r=!1;"closed"===e._state&&(r=!0);const o=me(t);"default"===t.readerType?X(e,o,r):function(e,t,r){const o=e._reader._readIntoRequests.shift();r?o._closeSteps(t):o._chunkSteps(t)}(e,o,r)}function me(e){const t=e.bytesFilled,r=e.elementSize;return new e.viewConstructor(e.buffer,e.byteOffset,t/r)}function ye(e,t,r,o){e._queue.push({buffer:t,byteOffset:r,byteLength:o}),e._queueTotalSize+=o}function ge(e,t,r,o){let n;try{n=t.slice(r,r+o)}catch(t){throw We(e,t),t}ye(e,n,0,o)}function Se(e,t){t.bytesFilled>0&&ge(e,t.buffer,t.byteOffset,t.bytesFilled),Pe(e)}function we(e,t){const r=t.elementSize,o=t.bytesFilled-t.bytesFilled%r,n=Math.min(e._queueTotalSize,t.byteLength-t.bytesFilled),a=t.bytesFilled+n,i=a-a%r;let l=n,s=!1;i>o&&(l=i-t.bytesFilled,s=!0);const u=e._queue;for(;l>0;){const r=u.peek(),o=Math.min(l,r.byteLength),n=t.byteOffset+t.bytesFilled;le(t.buffer,n,r.buffer,r.byteOffset,o),r.byteLength===o?u.shift():(r.byteOffset+=o,r.byteLength-=o),e._queueTotalSize-=o,ve(e,o,t),l-=o}return s}function ve(e,t,r){r.bytesFilled+=t}function Re(e){0===e._queueTotalSize&&e._closeRequested?(Ee(e),Jt(e._controlledReadableByteStream)):he(e)}function Te(e){null!==e._byobRequest&&(e._byobRequest._associatedReadableByteStreamController=void 0,e._byobRequest._view=null,e._byobRequest=null)}function qe(e){for(;e._pendingPullIntos.length>0;){if(0===e._queueTotalSize)return;const t=e._pendingPullIntos.peek();we(e,t)&&(Pe(e),pe(e._controlledReadableByteStream,t))}}function Ce(e,t){const r=e._pendingPullIntos.peek();Te(e);"closed"===e._controlledReadableByteStream._state?function(e,t){"none"===t.readerType&&Pe(e);const r=e._controlledReadableByteStream;if(Fe(r))for(;Le(r)>0;)pe(r,Pe(e))}(e,r):function(e,t,r){if(ve(0,t,r),"none"===r.readerType)return Se(e,r),void qe(e);if(r.bytesFilled0){const t=r.byteOffset+r.bytesFilled;ge(e,r.buffer,t-o,o)}r.bytesFilled-=o,pe(e._controlledReadableByteStream,r),qe(e)}(e,t,r),he(e)}function Pe(e){return e._pendingPullIntos.shift()}function Ee(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0}function We(e,t){const r=e._controlledReadableByteStream;"readable"===r._state&&(_e(e),de(e),Ee(e),Kt(r,t))}function Oe(e,t){const r=e._queue.shift();e._queueTotalSize-=r.byteLength,Re(e);const o=new Uint8Array(r.buffer,r.byteOffset,r.byteLength);t._chunkSteps(o)}function ke(e){const t=e._controlledReadableByteStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Be(e,t,r){const o=Object.create(ReadableByteStreamController.prototype);let n,a,i;n=void 0!==t.start?()=>t.start(o):()=>{},a=void 0!==t.pull?()=>t.pull(o):()=>d(void 0),i=void 0!==t.cancel?e=>t.cancel(e):()=>d(void 0);const l=t.autoAllocateChunkSize;if(0===l)throw new TypeError("autoAllocateChunkSize must be greater than 0");!function(e,t,r,o,n,a,i){t._controlledReadableByteStream=e,t._pullAgain=!1,t._pulling=!1,t._byobRequest=null,t._queue=t._queueTotalSize=void 0,de(t),t._closeRequested=!1,t._started=!1,t._strategyHWM=a,t._pullAlgorithm=o,t._cancelAlgorithm=n,t._autoAllocateChunkSize=i,t._pendingPullIntos=new v,e._readableStreamController=t,h(d(r()),(()=>(t._started=!0,he(t),null)),(e=>(We(t,e),null)))}(e,o,n,a,i,r,l)}function Ae(e){return new TypeError(`ReadableStreamBYOBRequest.prototype.${e} can only be used on a ReadableStreamBYOBRequest`)}function je(e){return new TypeError(`ReadableByteStreamController.prototype.${e} can only be used on a ReadableByteStreamController`)}function ze(e,t){e._reader._readIntoRequests.push(t)}function Le(e){return e._reader._readIntoRequests.length}function Fe(e){const t=e._reader;return void 0!==t&&!!De(t)}Object.defineProperties(ReadableByteStreamController.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},byobRequest:{enumerable:!0},desiredSize:{enumerable:!0}}),a(ReadableByteStreamController.prototype.close,"close"),a(ReadableByteStreamController.prototype.enqueue,"enqueue"),a(ReadableByteStreamController.prototype.error,"error"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableByteStreamController.prototype,t.toStringTag,{value:"ReadableByteStreamController",configurable:!0});class ReadableStreamBYOBReader{constructor(e){if(M(e,1,"ReadableStreamBYOBReader"),U(e,"First parameter"),Gt(e))throw new TypeError("This stream has already been locked for exclusive reading by another reader");if(!fe(e._readableStreamController))throw new TypeError("Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte source");E(this,e),this._readIntoRequests=new v}get closed(){return De(this)?this._closedPromise:f($e("closed"))}cancel(e){return De(this)?void 0===this._ownerReadableStream?f(k("cancel")):W(this,e):f($e("cancel"))}read(e){if(!De(this))return f($e("read"));if(!ArrayBuffer.isView(e))return f(new TypeError("view must be an array buffer view"));if(0===e.byteLength)return f(new TypeError("view must have non-zero byteLength"));if(0===e.buffer.byteLength)return f(new TypeError("view's buffer must have non-zero byteLength"));if(e.buffer,void 0===this._ownerReadableStream)return f(k("read from"));let t,r;const o=c(((e,o)=>{t=e,r=o}));return function(e,t,r){const o=e._ownerReadableStream;o._disturbed=!0,"errored"===o._state?r._errorSteps(o._storedError):function(e,t,r){const o=e._controlledReadableByteStream;let n=1;t.constructor!==DataView&&(n=t.constructor.BYTES_PER_ELEMENT);const a=t.constructor,i=t.buffer,l={buffer:i,bufferByteLength:i.byteLength,byteOffset:t.byteOffset,byteLength:t.byteLength,bytesFilled:0,elementSize:n,viewConstructor:a,readerType:"byob"};if(e._pendingPullIntos.length>0)return e._pendingPullIntos.push(l),void ze(o,r);if("closed"!==o._state){if(e._queueTotalSize>0){if(we(e,l)){const t=me(l);return Re(e),void r._chunkSteps(t)}if(e._closeRequested){const t=new TypeError("Insufficient bytes to fill elements in the given buffer");return We(e,t),void r._errorSteps(t)}}e._pendingPullIntos.push(l),ze(o,r),he(e)}else{const e=new a(l.buffer,l.byteOffset,0);r._closeSteps(e)}}(o._readableStreamController,t,r)}(this,e,{_chunkSteps:e=>t({value:e,done:!1}),_closeSteps:e=>t({value:e,done:!0}),_errorSteps:e=>r(e)}),o}releaseLock(){if(!De(this))throw $e("releaseLock");void 0!==this._ownerReadableStream&&function(e){O(e);const t=new TypeError("Reader was released");Ie(e,t)}(this)}}function De(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readIntoRequests")&&e instanceof ReadableStreamBYOBReader)}function Ie(e,t){const r=e._readIntoRequests;e._readIntoRequests=new v,r.forEach((e=>{e._errorSteps(t)}))}function $e(e){return new TypeError(`ReadableStreamBYOBReader.prototype.${e} can only be used on a ReadableStreamBYOBReader`)}function Me(e,t){const{highWaterMark:r}=e;if(void 0===r)return t;if(ie(r)||r<0)throw new RangeError("Invalid highWaterMark");return r}function Ye(e){const{size:t}=e;return t||(()=>1)}function Qe(e,t){D(e,t);const r=null==e?void 0:e.highWaterMark,o=null==e?void 0:e.size;return{highWaterMark:void 0===r?void 0:Q(r),size:void 0===o?void 0:Ne(o,`${t} has member 'size' that`)}}function Ne(e,t){return I(e,t),t=>Q(e(t))}function xe(e,t,r){return I(e,r),r=>w(e,t,[r])}function He(e,t,r){return I(e,r),()=>w(e,t,[])}function Ve(e,t,r){return I(e,r),r=>S(e,t,[r])}function Ue(e,t,r){return I(e,r),(r,o)=>w(e,t,[r,o])}Object.defineProperties(ReadableStreamBYOBReader.prototype,{cancel:{enumerable:!0},read:{enumerable:!0},releaseLock:{enumerable:!0},closed:{enumerable:!0}}),a(ReadableStreamBYOBReader.prototype.cancel,"cancel"),a(ReadableStreamBYOBReader.prototype.read,"read"),a(ReadableStreamBYOBReader.prototype.releaseLock,"releaseLock"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStreamBYOBReader.prototype,t.toStringTag,{value:"ReadableStreamBYOBReader",configurable:!0});const Ge="function"==typeof AbortController;class WritableStream{constructor(e={},t={}){void 0===e?e=null:$(e,"First parameter");const r=Qe(t,"Second parameter"),o=function(e,t){D(e,t);const r=null==e?void 0:e.abort,o=null==e?void 0:e.close,n=null==e?void 0:e.start,a=null==e?void 0:e.type,i=null==e?void 0:e.write;return{abort:void 0===r?void 0:xe(r,e,`${t} has member 'abort' that`),close:void 0===o?void 0:He(o,e,`${t} has member 'close' that`),start:void 0===n?void 0:Ve(n,e,`${t} has member 'start' that`),write:void 0===i?void 0:Ue(i,e,`${t} has member 'write' that`),type:a}}(e,"First parameter");var n;(n=this)._state="writable",n._storedError=void 0,n._writer=void 0,n._writableStreamController=void 0,n._writeRequests=new v,n._inFlightWriteRequest=void 0,n._closeRequest=void 0,n._inFlightCloseRequest=void 0,n._pendingAbortRequest=void 0,n._backpressure=!1;if(void 0!==o.type)throw new RangeError("Invalid type is specified");const a=Ye(r);!function(e,t,r,o){const n=Object.create(WritableStreamDefaultController.prototype);let a,i,l,s;a=void 0!==t.start?()=>t.start(n):()=>{};i=void 0!==t.write?e=>t.write(e,n):()=>d(void 0);l=void 0!==t.close?()=>t.close():()=>d(void 0);s=void 0!==t.abort?e=>t.abort(e):()=>d(void 0);!function(e,t,r,o,n,a,i,l){t._controlledWritableStream=e,e._writableStreamController=t,t._queue=void 0,t._queueTotalSize=void 0,de(t),t._abortReason=void 0,t._abortController=function(){if(Ge)return new AbortController}(),t._started=!1,t._strategySizeAlgorithm=l,t._strategyHWM=i,t._writeAlgorithm=o,t._closeAlgorithm=n,t._abortAlgorithm=a;const s=ht(t);at(e,s);const u=r();h(d(u),(()=>(t._started=!0,ft(t),null)),(r=>(t._started=!0,et(e,r),null)))}(e,n,a,i,l,s,r,o)}(this,o,Me(r,1),a)}get locked(){if(!Xe(this))throw pt("locked");return Je(this)}abort(e){return Xe(this)?Je(this)?f(new TypeError("Cannot abort a stream that already has a writer")):Ke(this,e):f(pt("abort"))}close(){return Xe(this)?Je(this)?f(new TypeError("Cannot close a stream that already has a writer")):ot(this)?f(new TypeError("Cannot close an already-closing stream")):Ze(this):f(pt("close"))}getWriter(){if(!Xe(this))throw pt("getWriter");return new WritableStreamDefaultWriter(this)}}function Xe(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_writableStreamController")&&e instanceof WritableStream)}function Je(e){return void 0!==e._writer}function Ke(e,t){var r;if("closed"===e._state||"errored"===e._state)return d(void 0);e._writableStreamController._abortReason=t,null===(r=e._writableStreamController._abortController)||void 0===r||r.abort(t);const o=e._state;if("closed"===o||"errored"===o)return d(void 0);if(void 0!==e._pendingAbortRequest)return e._pendingAbortRequest._promise;let n=!1;"erroring"===o&&(n=!0,t=void 0);const a=c(((r,o)=>{e._pendingAbortRequest={_promise:void 0,_resolve:r,_reject:o,_reason:t,_wasAlreadyErroring:n}}));return e._pendingAbortRequest._promise=a,n||tt(e,t),a}function Ze(e){const t=e._state;if("closed"===t||"errored"===t)return f(new TypeError(`The stream (in ${t} state) is not in the writable state and cannot be closed`));const r=c(((t,r)=>{const o={_resolve:t,_reject:r};e._closeRequest=o})),o=e._writer;var n;return void 0!==o&&e._backpressure&&"writable"===t&&Et(o),ce(n=e._writableStreamController,st,0),ft(n),r}function et(e,t){"writable"!==e._state?rt(e):tt(e,t)}function tt(e,t){const r=e._writableStreamController;e._state="erroring",e._storedError=t;const o=e._writer;void 0!==o&<(o,t),!function(e){if(void 0===e._inFlightWriteRequest&&void 0===e._inFlightCloseRequest)return!1;return!0}(e)&&r._started&&rt(e)}function rt(e){e._state="errored",e._writableStreamController[T]();const t=e._storedError;if(e._writeRequests.forEach((e=>{e._reject(t)})),e._writeRequests=new v,void 0===e._pendingAbortRequest)return void nt(e);const r=e._pendingAbortRequest;if(e._pendingAbortRequest=void 0,r._wasAlreadyErroring)return r._reject(t),void nt(e);h(e._writableStreamController[R](r._reason),(()=>(r._resolve(),nt(e),null)),(t=>(r._reject(t),nt(e),null)))}function ot(e){return void 0!==e._closeRequest||void 0!==e._inFlightCloseRequest}function nt(e){void 0!==e._closeRequest&&(e._closeRequest._reject(e._storedError),e._closeRequest=void 0);const t=e._writer;void 0!==t&&vt(t,e._storedError)}function at(e,t){const r=e._writer;void 0!==r&&t!==e._backpressure&&(t?function(e){Tt(e)}(r):Et(r)),e._backpressure=t}Object.defineProperties(WritableStream.prototype,{abort:{enumerable:!0},close:{enumerable:!0},getWriter:{enumerable:!0},locked:{enumerable:!0}}),a(WritableStream.prototype.abort,"abort"),a(WritableStream.prototype.close,"close"),a(WritableStream.prototype.getWriter,"getWriter"),"symbol"==typeof t.toStringTag&&Object.defineProperty(WritableStream.prototype,t.toStringTag,{value:"WritableStream",configurable:!0});class WritableStreamDefaultWriter{constructor(e){if(M(e,1,"WritableStreamDefaultWriter"),function(e,t){if(!Xe(e))throw new TypeError(`${t} is not a WritableStream.`)}(e,"First parameter"),Je(e))throw new TypeError("This stream has already been locked for exclusive writing by another writer");this._ownerWritableStream=e,e._writer=this;const t=e._state;if("writable"===t)!ot(e)&&e._backpressure?Tt(this):Ct(this),St(this);else if("erroring"===t)qt(this,e._storedError),St(this);else if("closed"===t)Ct(this),St(r=this),Rt(r);else{const t=e._storedError;qt(this,t),wt(this,t)}var r}get closed(){return it(this)?this._closedPromise:f(yt("closed"))}get desiredSize(){if(!it(this))throw yt("desiredSize");if(void 0===this._ownerWritableStream)throw gt("desiredSize");return function(e){const t=e._ownerWritableStream,r=t._state;if("errored"===r||"erroring"===r)return null;if("closed"===r)return 0;return dt(t._writableStreamController)}(this)}get ready(){return it(this)?this._readyPromise:f(yt("ready"))}abort(e){return it(this)?void 0===this._ownerWritableStream?f(gt("abort")):function(e,t){return Ke(e._ownerWritableStream,t)}(this,e):f(yt("abort"))}close(){if(!it(this))return f(yt("close"));const e=this._ownerWritableStream;return void 0===e?f(gt("close")):ot(e)?f(new TypeError("Cannot close an already-closing stream")):Ze(this._ownerWritableStream)}releaseLock(){if(!it(this))throw yt("releaseLock");void 0!==this._ownerWritableStream&&function(e){const t=e._ownerWritableStream,r=new TypeError("Writer was released and can no longer be used to monitor the stream's closedness");lt(e,r),function(e,t){"pending"===e._closedPromiseState?vt(e,t):function(e,t){wt(e,t)}(e,t)}(e,r),t._writer=void 0,e._ownerWritableStream=void 0}(this)}write(e){return it(this)?void 0===this._ownerWritableStream?f(gt("write to")):function(e,t){const r=e._ownerWritableStream,o=r._writableStreamController,n=function(e,t){try{return e._strategySizeAlgorithm(t)}catch(t){return bt(e,t),1}}(o,t);if(r!==e._ownerWritableStream)return f(gt("write to"));const a=r._state;if("errored"===a)return f(r._storedError);if(ot(r)||"closed"===a)return f(new TypeError("The stream is closing or closed and cannot be written to"));if("erroring"===a)return f(r._storedError);const i=function(e){return c(((t,r)=>{const o={_resolve:t,_reject:r};e._writeRequests.push(o)}))}(r);return function(e,t,r){try{ce(e,t,r)}catch(t){return void bt(e,t)}const o=e._controlledWritableStream;if(!ot(o)&&"writable"===o._state){at(o,ht(e))}ft(e)}(o,t,n),i}(this,e):f(yt("write"))}}function it(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_ownerWritableStream")&&e instanceof WritableStreamDefaultWriter)}function lt(e,t){"pending"===e._readyPromiseState?Pt(e,t):function(e,t){qt(e,t)}(e,t)}Object.defineProperties(WritableStreamDefaultWriter.prototype,{abort:{enumerable:!0},close:{enumerable:!0},releaseLock:{enumerable:!0},write:{enumerable:!0},closed:{enumerable:!0},desiredSize:{enumerable:!0},ready:{enumerable:!0}}),a(WritableStreamDefaultWriter.prototype.abort,"abort"),a(WritableStreamDefaultWriter.prototype.close,"close"),a(WritableStreamDefaultWriter.prototype.releaseLock,"releaseLock"),a(WritableStreamDefaultWriter.prototype.write,"write"),"symbol"==typeof t.toStringTag&&Object.defineProperty(WritableStreamDefaultWriter.prototype,t.toStringTag,{value:"WritableStreamDefaultWriter",configurable:!0});const st={};class WritableStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get abortReason(){if(!ut(this))throw mt("abortReason");return this._abortReason}get signal(){if(!ut(this))throw mt("signal");if(void 0===this._abortController)throw new TypeError("WritableStreamDefaultController.prototype.signal is not supported");return this._abortController.signal}error(e){if(!ut(this))throw mt("error");"writable"===this._controlledWritableStream._state&&_t(this,e)}[R](e){const t=this._abortAlgorithm(e);return ct(this),t}[T](){de(this)}}function ut(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledWritableStream")&&e instanceof WritableStreamDefaultController)}function ct(e){e._writeAlgorithm=void 0,e._closeAlgorithm=void 0,e._abortAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function dt(e){return e._strategyHWM-e._queueTotalSize}function ft(e){const t=e._controlledWritableStream;if(!e._started)return;if(void 0!==t._inFlightWriteRequest)return;if("erroring"===t._state)return void rt(t);if(0===e._queue.length)return;const r=e._queue.peek().value;r===st?function(e){const t=e._controlledWritableStream;(function(e){e._inFlightCloseRequest=e._closeRequest,e._closeRequest=void 0})(t),ue(e);const r=e._closeAlgorithm();ct(e),h(r,(()=>(function(e){e._inFlightCloseRequest._resolve(void 0),e._inFlightCloseRequest=void 0,"erroring"===e._state&&(e._storedError=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._resolve(),e._pendingAbortRequest=void 0)),e._state="closed";const t=e._writer;void 0!==t&&Rt(t)}(t),null)),(e=>(function(e,t){e._inFlightCloseRequest._reject(t),e._inFlightCloseRequest=void 0,void 0!==e._pendingAbortRequest&&(e._pendingAbortRequest._reject(t),e._pendingAbortRequest=void 0),et(e,t)}(t,e),null)))}(e):function(e,t){const r=e._controlledWritableStream;!function(e){e._inFlightWriteRequest=e._writeRequests.shift()}(r);h(e._writeAlgorithm(t),(()=>{!function(e){e._inFlightWriteRequest._resolve(void 0),e._inFlightWriteRequest=void 0}(r);const t=r._state;if(ue(e),!ot(r)&&"writable"===t){const t=ht(e);at(r,t)}return ft(e),null}),(t=>("writable"===r._state&&ct(e),function(e,t){e._inFlightWriteRequest._reject(t),e._inFlightWriteRequest=void 0,et(e,t)}(r,t),null)))}(e,r)}function bt(e,t){"writable"===e._controlledWritableStream._state&&_t(e,t)}function ht(e){return dt(e)<=0}function _t(e,t){const r=e._controlledWritableStream;ct(e),tt(r,t)}function pt(e){return new TypeError(`WritableStream.prototype.${e} can only be used on a WritableStream`)}function mt(e){return new TypeError(`WritableStreamDefaultController.prototype.${e} can only be used on a WritableStreamDefaultController`)}function yt(e){return new TypeError(`WritableStreamDefaultWriter.prototype.${e} can only be used on a WritableStreamDefaultWriter`)}function gt(e){return new TypeError("Cannot "+e+" a stream using a released writer")}function St(e){e._closedPromise=c(((t,r)=>{e._closedPromise_resolve=t,e._closedPromise_reject=r,e._closedPromiseState="pending"}))}function wt(e,t){St(e),vt(e,t)}function vt(e,t){void 0!==e._closedPromise_reject&&(y(e._closedPromise),e._closedPromise_reject(t),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="rejected")}function Rt(e){void 0!==e._closedPromise_resolve&&(e._closedPromise_resolve(void 0),e._closedPromise_resolve=void 0,e._closedPromise_reject=void 0,e._closedPromiseState="resolved")}function Tt(e){e._readyPromise=c(((t,r)=>{e._readyPromise_resolve=t,e._readyPromise_reject=r})),e._readyPromiseState="pending"}function qt(e,t){Tt(e),Pt(e,t)}function Ct(e){Tt(e),Et(e)}function Pt(e,t){void 0!==e._readyPromise_reject&&(y(e._readyPromise),e._readyPromise_reject(t),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="rejected")}function Et(e){void 0!==e._readyPromise_resolve&&(e._readyPromise_resolve(void 0),e._readyPromise_resolve=void 0,e._readyPromise_reject=void 0,e._readyPromiseState="fulfilled")}Object.defineProperties(WritableStreamDefaultController.prototype,{abortReason:{enumerable:!0},signal:{enumerable:!0},error:{enumerable:!0}}),"symbol"==typeof t.toStringTag&&Object.defineProperty(WritableStreamDefaultController.prototype,t.toStringTag,{value:"WritableStreamDefaultController",configurable:!0});const Wt="undefined"!=typeof DOMException?DOMException:void 0;const Ot=function(e){if("function"!=typeof e&&"object"!=typeof e)return!1;try{return new e,!0}catch(e){return!1}}(Wt)?Wt:function(){const e=function(e,t){this.message=e||"",this.name=t||"Error",Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)};return e.prototype=Object.create(Error.prototype),Object.defineProperty(e.prototype,"constructor",{value:e,writable:!0,configurable:!0}),e}();function kt(e,t,r,o,n,a){const i=e.getReader(),l=t.getWriter();Ut(e)&&(e._disturbed=!0);let s,u,p,S=!1,w=!1,v="readable",R="writable",T=!1,q=!1;const C=c((e=>{p=e}));let P=Promise.resolve(void 0);return c(((E,W)=>{let O;function k(){if(S)return;const e=c(((e,t)=>{!function r(o){o?e():b(function(){if(S)return d(!0);return b(l.ready,(()=>b(i.read(),(e=>!!e.done||(P=l.write(e.value),y(P),!1)))))}(),r,t)}(!1)}));y(e)}function B(){return v="closed",r?L():z((()=>(Xe(t)&&(T=ot(t),R=t._state),T||"closed"===R?d(void 0):"erroring"===R||"errored"===R?f(u):(T=!0,l.close()))),!1,void 0),null}function A(e){return S||(v="errored",s=e,o?L(!0,e):z((()=>l.abort(e)),!0,e)),null}function j(e){return w||(R="errored",u=e,n?L(!0,e):z((()=>i.cancel(e)),!0,e)),null}if(void 0!==a&&(O=()=>{const e=void 0!==a.reason?a.reason:new Ot("Aborted","AbortError"),t=[];o||t.push((()=>"writable"===R?l.abort(e):d(void 0))),n||t.push((()=>"readable"===v?i.cancel(e):d(void 0))),z((()=>Promise.all(t.map((e=>e())))),!0,e)},a.aborted?O():a.addEventListener("abort",O)),Ut(e)&&(v=e._state,s=e._storedError),Xe(t)&&(R=t._state,u=t._storedError,T=ot(t)),Ut(e)&&Xe(t)&&(q=!0,p()),"errored"===v)A(s);else if("erroring"===R||"errored"===R)j(u);else if("closed"===v)B();else if(T||"closed"===R){const e=new TypeError("the destination writable stream closed before all data could be piped to it");n?L(!0,e):z((()=>i.cancel(e)),!0,e)}function z(e,t,r){function o(){return"writable"!==R||T?n():_(function(){let e;return d(function t(){if(e!==P)return e=P,m(P,t,t)}())}(),n),null}function n(){return e?h(e(),(()=>F(t,r)),(e=>F(!0,e))):F(t,r),null}S||(S=!0,q?o():_(C,o))}function L(e,t){z(void 0,e,t)}function F(e,t){return w=!0,l.releaseLock(),i.releaseLock(),void 0!==a&&a.removeEventListener("abort",O),e?W(t):E(void 0),null}S||(h(i.closed,B,A),h(l.closed,(function(){return w||(R="closed"),null}),j)),q?k():g((()=>{q=!0,p(),k()}))}))}function Bt(e,t){return function(e){try{return e.getReader({mode:"byob"}).releaseLock(),!0}catch(e){return!1}}(e)?function(e){let t,r,o,n,a,i=e.getReader(),l=!1,s=!1,u=!1,f=!1,b=!1,_=!1;const m=c((e=>{a=e}));function y(e){p(e.closed,(t=>(e!==i||(o.error(t),n.error(t),b&&_||a(void 0)),null)))}function g(){l&&(i.releaseLock(),i=e.getReader(),y(i),l=!1),h(i.read(),(e=>{var t,r;if(u=!1,f=!1,e.done)return b||o.close(),_||n.close(),null===(t=o.byobRequest)||void 0===t||t.respond(0),null===(r=n.byobRequest)||void 0===r||r.respond(0),b&&_||a(void 0),null;const l=e.value,c=l;let d=l;if(!b&&!_)try{d=se(l)}catch(e){return o.error(e),n.error(e),a(i.cancel(e)),null}return b||o.enqueue(c),_||n.enqueue(d),s=!1,u?w():f&&v(),null}),(()=>(s=!1,null)))}function S(t,r){l||(i.releaseLock(),i=e.getReader({mode:"byob"}),y(i),l=!0);const c=r?n:o,d=r?o:n;h(i.read(t),(e=>{var t;u=!1,f=!1;const o=r?_:b,n=r?b:_;if(e.done){o||c.close(),n||d.close();const r=e.value;return void 0!==r&&(o||c.byobRequest.respondWithNewView(r),n||null===(t=d.byobRequest)||void 0===t||t.respond(0)),o&&n||a(void 0),null}const l=e.value;if(n)o||c.byobRequest.respondWithNewView(l);else{let e;try{e=se(l)}catch(e){return c.error(e),d.error(e),a(i.cancel(e)),null}o||c.byobRequest.respondWithNewView(l),d.enqueue(e)}return s=!1,u?w():f&&v(),null}),(()=>(s=!1,null)))}function w(){if(s)return u=!0,d(void 0);s=!0;const e=o.byobRequest;return null===e?g():S(e.view,!1),d(void 0)}function v(){if(s)return f=!0,d(void 0);s=!0;const e=n.byobRequest;return null===e?g():S(e.view,!0),d(void 0)}function R(e){if(b=!0,t=e,_){const e=[t,r],o=i.cancel(e);a(o)}return m}function T(e){if(_=!0,r=e,b){const e=[t,r],o=i.cancel(e);a(o)}return m}const q=new ReadableStream({type:"bytes",start(e){o=e},pull:w,cancel:R}),C=new ReadableStream({type:"bytes",start(e){n=e},pull:v,cancel:T});return y(i),[q,C]}(e):function(e,t){const r=e.getReader();let o,n,a,i,l,s=!1,u=!1,f=!1,b=!1;const _=c((e=>{l=e}));function m(){return s?(u=!0,d(void 0)):(s=!0,h(r.read(),(e=>{if(u=!1,e.done)return f||a.close(),b||i.close(),f&&b||l(void 0),null;const t=e.value,r=t,o=t;return f||a.enqueue(r),b||i.enqueue(o),s=!1,u&&m(),null}),(()=>(s=!1,null))),d(void 0))}function y(e){if(f=!0,o=e,b){const e=[o,n],t=r.cancel(e);l(t)}return _}function g(e){if(b=!0,n=e,f){const e=[o,n],t=r.cancel(e);l(t)}return _}const S=new ReadableStream({start(e){a=e},pull:m,cancel:y}),w=new ReadableStream({start(e){i=e},pull:m,cancel:g});return p(r.closed,(e=>(a.error(e),i.error(e),f&&b||l(void 0),null))),[S,w]}(e)}class ReadableStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!At(this))throw $t("desiredSize");return Ft(this)}close(){if(!At(this))throw $t("close");if(!Dt(this))throw new TypeError("The stream is not in a state that permits close");!function(e){if(!Dt(e))return;const t=e._controlledReadableStream;e._closeRequested=!0,0===e._queue.length&&(zt(e),Jt(t))}(this)}enqueue(e){if(!At(this))throw $t("enqueue");if(!Dt(this))throw new TypeError("The stream is not in a state that permits enqueue");return function(e,t){if(!Dt(e))return;const r=e._controlledReadableStream;if(Gt(r)&&J(r)>0)X(r,t,!1);else{let r;try{r=e._strategySizeAlgorithm(t)}catch(t){throw Lt(e,t),t}try{ce(e,t,r)}catch(t){throw Lt(e,t),t}}jt(e)}(this,e)}error(e){if(!At(this))throw $t("error");Lt(this,e)}[q](e){de(this);const t=this._cancelAlgorithm(e);return zt(this),t}[C](e){const t=this._controlledReadableStream;if(this._queue.length>0){const r=ue(this);this._closeRequested&&0===this._queue.length?(zt(this),Jt(t)):jt(this),e._chunkSteps(r)}else G(t,e),jt(this)}[P](){}}function At(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledReadableStream")&&e instanceof ReadableStreamDefaultController)}function jt(e){const t=function(e){const t=e._controlledReadableStream;if(!Dt(e))return!1;if(!e._started)return!1;if(Gt(t)&&J(t)>0)return!0;if(Ft(e)>0)return!0;return!1}(e);if(!t)return;if(e._pulling)return void(e._pullAgain=!0);e._pulling=!0;h(e._pullAlgorithm(),(()=>(e._pulling=!1,e._pullAgain&&(e._pullAgain=!1,jt(e)),null)),(t=>(Lt(e,t),null)))}function zt(e){e._pullAlgorithm=void 0,e._cancelAlgorithm=void 0,e._strategySizeAlgorithm=void 0}function Lt(e,t){const r=e._controlledReadableStream;"readable"===r._state&&(de(e),zt(e),Kt(r,t))}function Ft(e){const t=e._controlledReadableStream._state;return"errored"===t?null:"closed"===t?0:e._strategyHWM-e._queueTotalSize}function Dt(e){return!e._closeRequested&&"readable"===e._controlledReadableStream._state}function It(e,t,r,o){const n=Object.create(ReadableStreamDefaultController.prototype);let a,i,l;a=void 0!==t.start?()=>t.start(n):()=>{},i=void 0!==t.pull?()=>t.pull(n):()=>d(void 0),l=void 0!==t.cancel?e=>t.cancel(e):()=>d(void 0),function(e,t,r,o,n,a,i){t._controlledReadableStream=e,t._queue=void 0,t._queueTotalSize=void 0,de(t),t._started=!1,t._closeRequested=!1,t._pullAgain=!1,t._pulling=!1,t._strategySizeAlgorithm=i,t._strategyHWM=a,t._pullAlgorithm=o,t._cancelAlgorithm=n,e._readableStreamController=t,h(d(r()),(()=>(t._started=!0,jt(t),null)),(e=>(Lt(t,e),null)))}(e,n,a,i,l,r,o)}function $t(e){return new TypeError(`ReadableStreamDefaultController.prototype.${e} can only be used on a ReadableStreamDefaultController`)}function Mt(e,t,r){return I(e,r),r=>w(e,t,[r])}function Yt(e,t,r){return I(e,r),r=>w(e,t,[r])}function Qt(e,t,r){return I(e,r),r=>S(e,t,[r])}function Nt(e,t){if("bytes"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamType`);return e}function xt(e,t){if("byob"!==(e=`${e}`))throw new TypeError(`${t} '${e}' is not a valid enumeration value for ReadableStreamReaderMode`);return e}function Ht(e,t){D(e,t);const r=null==e?void 0:e.preventAbort,o=null==e?void 0:e.preventCancel,n=null==e?void 0:e.preventClose,a=null==e?void 0:e.signal;return void 0!==a&&function(e,t){if(!function(e){if("object"!=typeof e||null===e)return!1;try{return"boolean"==typeof e.aborted}catch(e){return!1}}(e))throw new TypeError(`${t} is not an AbortSignal.`)}(a,`${t} has member 'signal' that`),{preventAbort:Boolean(r),preventCancel:Boolean(o),preventClose:Boolean(n),signal:a}}function Vt(e,t){D(e,t);const r=null==e?void 0:e.readable;Y(r,"readable","ReadableWritablePair"),function(e,t){if(!H(e))throw new TypeError(`${t} is not a ReadableStream.`)}(r,`${t} has member 'readable' that`);const o=null==e?void 0:e.writable;return Y(o,"writable","ReadableWritablePair"),function(e,t){if(!V(e))throw new TypeError(`${t} is not a WritableStream.`)}(o,`${t} has member 'writable' that`),{readable:r,writable:o}}Object.defineProperties(ReadableStreamDefaultController.prototype,{close:{enumerable:!0},enqueue:{enumerable:!0},error:{enumerable:!0},desiredSize:{enumerable:!0}}),a(ReadableStreamDefaultController.prototype.close,"close"),a(ReadableStreamDefaultController.prototype.enqueue,"enqueue"),a(ReadableStreamDefaultController.prototype.error,"error"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStreamDefaultController.prototype,t.toStringTag,{value:"ReadableStreamDefaultController",configurable:!0});class ReadableStream{constructor(e={},t={}){void 0===e?e=null:$(e,"First parameter");const r=Qe(t,"Second parameter"),o=function(e,t){D(e,t);const r=e,o=null==r?void 0:r.autoAllocateChunkSize,n=null==r?void 0:r.cancel,a=null==r?void 0:r.pull,i=null==r?void 0:r.start,l=null==r?void 0:r.type;return{autoAllocateChunkSize:void 0===o?void 0:x(o,`${t} has member 'autoAllocateChunkSize' that`),cancel:void 0===n?void 0:Mt(n,r,`${t} has member 'cancel' that`),pull:void 0===a?void 0:Yt(a,r,`${t} has member 'pull' that`),start:void 0===i?void 0:Qt(i,r,`${t} has member 'start' that`),type:void 0===l?void 0:Nt(l,`${t} has member 'type' that`)}}(e,"First parameter");var n;if((n=this)._state="readable",n._reader=void 0,n._storedError=void 0,n._disturbed=!1,"bytes"===o.type){if(void 0!==r.size)throw new RangeError("The strategy for a byte stream cannot have a size function");Be(this,o,Me(r,0))}else{const e=Ye(r);It(this,o,Me(r,1),e)}}get locked(){if(!Ut(this))throw Zt("locked");return Gt(this)}cancel(e){return Ut(this)?Gt(this)?f(new TypeError("Cannot cancel a stream that already has a reader")):Xt(this,e):f(Zt("cancel"))}getReader(e){if(!Ut(this))throw Zt("getReader");return void 0===function(e,t){D(e,t);const r=null==e?void 0:e.mode;return{mode:void 0===r?void 0:xt(r,`${t} has member 'mode' that`)}}(e,"First parameter").mode?new ReadableStreamDefaultReader(this):function(e){return new ReadableStreamBYOBReader(e)}(this)}pipeThrough(e,t={}){if(!H(this))throw Zt("pipeThrough");M(e,1,"pipeThrough");const r=Vt(e,"First parameter"),o=Ht(t,"Second parameter");if(this.locked)throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream");if(r.writable.locked)throw new TypeError("ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream");return y(kt(this,r.writable,o.preventClose,o.preventAbort,o.preventCancel,o.signal)),r.readable}pipeTo(e,t={}){if(!H(this))return f(Zt("pipeTo"));if(void 0===e)return f("Parameter 1 is required in 'pipeTo'.");if(!V(e))return f(new TypeError("ReadableStream.prototype.pipeTo's first argument must be a WritableStream"));let r;try{r=Ht(t,"Second parameter")}catch(e){return f(e)}return this.locked?f(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream")):e.locked?f(new TypeError("ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream")):kt(this,e,r.preventClose,r.preventAbort,r.preventCancel,r.signal)}tee(){if(!H(this))throw Zt("tee");if(this.locked)throw new TypeError("Cannot tee a stream that already has a reader");return Bt(this)}values(e){if(!H(this))throw Zt("values");return function(e,t){const r=e.getReader(),o=new re(r,t),n=Object.create(oe);return n._asyncIteratorImpl=o,n}(this,function(e,t){D(e,t);const r=null==e?void 0:e.preventCancel;return{preventCancel:Boolean(r)}}(e,"First parameter").preventCancel)}}function Ut(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_readableStreamController")&&e instanceof ReadableStream)}function Gt(e){return void 0!==e._reader}function Xt(e,t){if(e._disturbed=!0,"closed"===e._state)return d(void 0);if("errored"===e._state)return f(e._storedError);Jt(e);const o=e._reader;if(void 0!==o&&De(o)){const e=o._readIntoRequests;o._readIntoRequests=new v,e.forEach((e=>{e._closeSteps(void 0)}))}return m(e._readableStreamController[q](t),r)}function Jt(e){e._state="closed";const t=e._reader;if(void 0!==t&&(z(t),Z(t))){const e=t._readRequests;t._readRequests=new v,e.forEach((e=>{e._closeSteps()}))}}function Kt(e,t){e._state="errored",e._storedError=t;const r=e._reader;void 0!==r&&(j(r,t),Z(r)?ee(r,t):Ie(r,t))}function Zt(e){return new TypeError(`ReadableStream.prototype.${e} can only be used on a ReadableStream`)}function er(e,t){D(e,t);const r=null==e?void 0:e.highWaterMark;return Y(r,"highWaterMark","QueuingStrategyInit"),{highWaterMark:Q(r)}}Object.defineProperties(ReadableStream.prototype,{cancel:{enumerable:!0},getReader:{enumerable:!0},pipeThrough:{enumerable:!0},pipeTo:{enumerable:!0},tee:{enumerable:!0},values:{enumerable:!0},locked:{enumerable:!0}}),a(ReadableStream.prototype.cancel,"cancel"),a(ReadableStream.prototype.getReader,"getReader"),a(ReadableStream.prototype.pipeThrough,"pipeThrough"),a(ReadableStream.prototype.pipeTo,"pipeTo"),a(ReadableStream.prototype.tee,"tee"),a(ReadableStream.prototype.values,"values"),"symbol"==typeof t.toStringTag&&Object.defineProperty(ReadableStream.prototype,t.toStringTag,{value:"ReadableStream",configurable:!0}),"symbol"==typeof t.asyncIterator&&Object.defineProperty(ReadableStream.prototype,t.asyncIterator,{value:ReadableStream.prototype.values,writable:!0,configurable:!0});const tr=e=>e.byteLength;a(tr,"size");class ByteLengthQueuingStrategy{constructor(e){M(e,1,"ByteLengthQueuingStrategy"),e=er(e,"First parameter"),this._byteLengthQueuingStrategyHighWaterMark=e.highWaterMark}get highWaterMark(){if(!or(this))throw rr("highWaterMark");return this._byteLengthQueuingStrategyHighWaterMark}get size(){if(!or(this))throw rr("size");return tr}}function rr(e){return new TypeError(`ByteLengthQueuingStrategy.prototype.${e} can only be used on a ByteLengthQueuingStrategy`)}function or(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_byteLengthQueuingStrategyHighWaterMark")&&e instanceof ByteLengthQueuingStrategy)}Object.defineProperties(ByteLengthQueuingStrategy.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof t.toStringTag&&Object.defineProperty(ByteLengthQueuingStrategy.prototype,t.toStringTag,{value:"ByteLengthQueuingStrategy",configurable:!0});const nr=()=>1;a(nr,"size");class CountQueuingStrategy{constructor(e){M(e,1,"CountQueuingStrategy"),e=er(e,"First parameter"),this._countQueuingStrategyHighWaterMark=e.highWaterMark}get highWaterMark(){if(!ir(this))throw ar("highWaterMark");return this._countQueuingStrategyHighWaterMark}get size(){if(!ir(this))throw ar("size");return nr}}function ar(e){return new TypeError(`CountQueuingStrategy.prototype.${e} can only be used on a CountQueuingStrategy`)}function ir(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_countQueuingStrategyHighWaterMark")&&e instanceof CountQueuingStrategy)}function lr(e,t,r){return I(e,r),r=>w(e,t,[r])}function sr(e,t,r){return I(e,r),r=>S(e,t,[r])}function ur(e,t,r){return I(e,r),(r,o)=>w(e,t,[r,o])}Object.defineProperties(CountQueuingStrategy.prototype,{highWaterMark:{enumerable:!0},size:{enumerable:!0}}),"symbol"==typeof t.toStringTag&&Object.defineProperty(CountQueuingStrategy.prototype,t.toStringTag,{value:"CountQueuingStrategy",configurable:!0});class TransformStream{constructor(e={},t={},r={}){void 0===e&&(e=null);const o=Qe(t,"Second parameter"),n=Qe(r,"Third parameter"),a=function(e,t){D(e,t);const r=null==e?void 0:e.flush,o=null==e?void 0:e.readableType,n=null==e?void 0:e.start,a=null==e?void 0:e.transform,i=null==e?void 0:e.writableType;return{flush:void 0===r?void 0:lr(r,e,`${t} has member 'flush' that`),readableType:o,start:void 0===n?void 0:sr(n,e,`${t} has member 'start' that`),transform:void 0===a?void 0:ur(a,e,`${t} has member 'transform' that`),writableType:i}}(e,"First parameter");if(void 0!==a.readableType)throw new RangeError("Invalid readableType specified");if(void 0!==a.writableType)throw new RangeError("Invalid writableType specified");const i=Me(n,0),l=Ye(n),s=Me(o,1),u=Ye(o);let b;!function(e,t,r,o,n,a){function i(){return t}function l(t){return function(e,t){const r=e._transformStreamController;if(e._backpressure){return m(e._backpressureChangePromise,(()=>{if("erroring"===(Xe(e._writable)?e._writable._state:e._writableState))throw Xe(e._writable)?e._writable._storedError:e._writableStoredError;return mr(r,t)}))}return mr(r,t)}(e,t)}function s(t){return function(e,t){return dr(e,t),d(void 0)}(e,t)}function u(){return function(e){const t=e._transformStreamController,r=t._flushAlgorithm();return _r(t),m(r,(()=>{if("errored"===e._readableState)throw e._readableStoredError;Sr(e)&&wr(e)}),(t=>{throw dr(e,t),e._readableStoredError}))}(e)}function c(){return function(e){return br(e,!1),e._backpressureChangePromise}(e)}function f(t){return fr(e,t),d(void 0)}e._writableState="writable",e._writableStoredError=void 0,e._writableHasInFlightOperation=!1,e._writableStarted=!1,e._writable=function(e,t,r,o,n,a,i){return new WritableStream({start(r){e._writableController=r;try{const t=r.signal;void 0!==t&&t.addEventListener("abort",(()=>{"writable"===e._writableState&&(e._writableState="erroring",t.reason&&(e._writableStoredError=t.reason))}))}catch(e){}return m(t(),(()=>(e._writableStarted=!0,Pr(e),null)),(t=>{throw e._writableStarted=!0,Tr(e,t),t}))},write:t=>(function(e){e._writableHasInFlightOperation=!0}(e),m(r(t),(()=>(function(e){e._writableHasInFlightOperation=!1}(e),Pr(e),null)),(t=>{throw function(e,t){e._writableHasInFlightOperation=!1,Tr(e,t)}(e,t),t}))),close:()=>(function(e){e._writableHasInFlightOperation=!0}(e),m(o(),(()=>(function(e){e._writableHasInFlightOperation=!1;"erroring"===e._writableState&&(e._writableStoredError=void 0);e._writableState="closed"}(e),null)),(t=>{throw function(e,t){e._writableHasInFlightOperation=!1,e._writableState,Tr(e,t)}(e,t),t}))),abort:t=>(e._writableState="errored",e._writableStoredError=t,n(t))},{highWaterMark:a,size:i})}(e,i,l,u,s,r,o),e._readableState="readable",e._readableStoredError=void 0,e._readableCloseRequested=!1,e._readablePulling=!1,e._readable=function(e,t,r,o,n,a){return new ReadableStream({start:r=>(e._readableController=r,t().catch((t=>{vr(e,t)}))),pull:()=>(e._readablePulling=!0,r().catch((t=>{vr(e,t)}))),cancel:t=>(e._readableState="closed",o(t))},{highWaterMark:n,size:a})}(e,i,c,f,n,a),e._backpressure=void 0,e._backpressureChangePromise=void 0,e._backpressureChangePromise_resolve=void 0,br(e,!0),e._transformStreamController=void 0}(this,c((e=>{b=e})),s,u,i,l),function(e,t){const r=Object.create(TransformStreamDefaultController.prototype);let o,n;o=void 0!==t.transform?e=>t.transform(e,r):e=>{try{return pr(r,e),d(void 0)}catch(e){return f(e)}};n=void 0!==t.flush?()=>t.flush(r):()=>d(void 0);!function(e,t,r,o){t._controlledTransformStream=e,e._transformStreamController=t,t._transformAlgorithm=r,t._flushAlgorithm=o}(e,r,o,n)}(this,a),void 0!==a.start?b(a.start(this._transformStreamController)):b(void 0)}get readable(){if(!cr(this))throw gr("readable");return this._readable}get writable(){if(!cr(this))throw gr("writable");return this._writable}}function cr(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_transformStreamController")&&e instanceof TransformStream)}function dr(e,t){vr(e,t),fr(e,t)}function fr(e,t){_r(e._transformStreamController),function(e,t){e._writableController.error(t);"writable"===e._writableState&&qr(e,t)}(e,t),e._backpressure&&br(e,!1)}function br(e,t){void 0!==e._backpressureChangePromise&&e._backpressureChangePromise_resolve(),e._backpressureChangePromise=c((t=>{e._backpressureChangePromise_resolve=t})),e._backpressure=t}Object.defineProperties(TransformStream.prototype,{readable:{enumerable:!0},writable:{enumerable:!0}}),"symbol"==typeof t.toStringTag&&Object.defineProperty(TransformStream.prototype,t.toStringTag,{value:"TransformStream",configurable:!0});class TransformStreamDefaultController{constructor(){throw new TypeError("Illegal constructor")}get desiredSize(){if(!hr(this))throw yr("desiredSize");return Rr(this._controlledTransformStream)}enqueue(e){if(!hr(this))throw yr("enqueue");pr(this,e)}error(e){if(!hr(this))throw yr("error");var t;t=e,dr(this._controlledTransformStream,t)}terminate(){if(!hr(this))throw yr("terminate");!function(e){const t=e._controlledTransformStream;Sr(t)&&wr(t);const r=new TypeError("TransformStream terminated");fr(t,r)}(this)}}function hr(e){return!!o(e)&&(!!Object.prototype.hasOwnProperty.call(e,"_controlledTransformStream")&&e instanceof TransformStreamDefaultController)}function _r(e){e._transformAlgorithm=void 0,e._flushAlgorithm=void 0}function pr(e,t){const r=e._controlledTransformStream;if(!Sr(r))throw new TypeError("Readable side is not in a state that permits enqueue");try{!function(e,t){e._readablePulling=!1;try{e._readableController.enqueue(t)}catch(t){throw vr(e,t),t}}(r,t)}catch(e){throw fr(r,e),r._readableStoredError}const o=function(e){return!function(e){if(!Sr(e))return!1;if(e._readablePulling)return!0;if(Rr(e)>0)return!0;return!1}(e)}(r);o!==r._backpressure&&br(r,!0)}function mr(e,t){return m(e._transformAlgorithm(t),void 0,(t=>{throw dr(e._controlledTransformStream,t),t}))}function yr(e){return new TypeError(`TransformStreamDefaultController.prototype.${e} can only be used on a TransformStreamDefaultController`)}function gr(e){return new TypeError(`TransformStream.prototype.${e} can only be used on a TransformStream`)}function Sr(e){return!e._readableCloseRequested&&"readable"===e._readableState}function wr(e){e._readableState="closed",e._readableCloseRequested=!0,e._readableController.close()}function vr(e,t){"readable"===e._readableState&&(e._readableState="errored",e._readableStoredError=t),e._readableController.error(t)}function Rr(e){return e._readableController.desiredSize}function Tr(e,t){"writable"!==e._writableState?Cr(e):qr(e,t)}function qr(e,t){e._writableState="erroring",e._writableStoredError=t,!function(e){return e._writableHasInFlightOperation}(e)&&e._writableStarted&&Cr(e)}function Cr(e){e._writableState="errored"}function Pr(e){"erroring"===e._writableState&&Cr(e)}Object.defineProperties(TransformStreamDefaultController.prototype,{enqueue:{enumerable:!0},error:{enumerable:!0},terminate:{enumerable:!0},desiredSize:{enumerable:!0}}),a(TransformStreamDefaultController.prototype.enqueue,"enqueue"),a(TransformStreamDefaultController.prototype.error,"error"),a(TransformStreamDefaultController.prototype.terminate,"terminate"),"symbol"==typeof t.toStringTag&&Object.defineProperty(TransformStreamDefaultController.prototype,t.toStringTag,{value:"TransformStreamDefaultController",configurable:!0}),e.ByteLengthQueuingStrategy=ByteLengthQueuingStrategy,e.CountQueuingStrategy=CountQueuingStrategy,e.ReadableByteStreamController=ReadableByteStreamController,e.ReadableStream=ReadableStream,e.ReadableStreamBYOBReader=ReadableStreamBYOBReader,e.ReadableStreamBYOBRequest=ReadableStreamBYOBRequest,e.ReadableStreamDefaultController=ReadableStreamDefaultController,e.ReadableStreamDefaultReader=ReadableStreamDefaultReader,e.TransformStream=TransformStream,e.TransformStreamDefaultController=TransformStreamDefaultController,e.WritableStream=WritableStream,e.WritableStreamDefaultController=WritableStreamDefaultController,e.WritableStreamDefaultWriter=WritableStreamDefaultWriter,Object.defineProperty(e,"__esModule",{value:!0})})); - - -/***/ }), - -/***/ 845: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; -/*! - * humanize-ms - index.js - * Copyright(c) 2014 dead_horse - * MIT Licensed - */ - - - -/** - * Module dependencies. - */ - -var util = __nccwpck_require__(3837); -var ms = __nccwpck_require__(900); - -module.exports = function (t) { - if (typeof t === 'number') return t; - var r = ms(t); - if (r === undefined) { - var err = new Error(util.format('humanize-ms(%j) result undefined', t)); - console.warn(err.stack); - } - return r; -}; - - -/***/ }), - -/***/ 3287: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -/*! - * is-plain-object - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ - -function isObject(o) { - return Object.prototype.toString.call(o) === '[object Object]'; -} - -function isPlainObject(o) { - var ctor,prot; - - if (isObject(o) === false) return false; - - // If has modified constructor - ctor = o.constructor; - if (ctor === undefined) return true; - - // If has modified prototype - prot = ctor.prototype; - if (isObject(prot) === false) return false; - - // If constructor does not have an Object-specific method - if (prot.hasOwnProperty('isPrototypeOf') === false) { - return false; - } - - // Most likely a plain Object - return true; -} - -exports.isPlainObject = isPlainObject; - - -/***/ }), - -/***/ 900: -/***/ ((module) => { - -/** - * Helpers. - */ - -var s = 1000; -var m = s * 60; -var h = m * 60; -var d = h * 24; -var w = d * 7; -var y = d * 365.25; - -/** - * Parse or format the given `val`. - * - * Options: - * - * - `long` verbose formatting [false] - * - * @param {String|Number} val - * @param {Object} [options] - * @throws {Error} throw an error if val is not a non-empty string or a number - * @return {String|Number} - * @api public - */ - -module.exports = function(val, options) { - options = options || {}; - var type = typeof val; - if (type === 'string' && val.length > 0) { - return parse(val); - } else if (type === 'number' && isFinite(val)) { - return options.long ? fmtLong(val) : fmtShort(val); - } - throw new Error( - 'val is not a non-empty string or a valid number. val=' + - JSON.stringify(val) - ); -}; - -/** - * Parse the given `str` and return milliseconds. - * - * @param {String} str - * @return {Number} - * @api private - */ - -function parse(str) { - str = String(str); - if (str.length > 100) { - return; - } - var match = /^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec( - str - ); - if (!match) { - return; - } - var n = parseFloat(match[1]); - var type = (match[2] || 'ms').toLowerCase(); - switch (type) { - case 'years': - case 'year': - case 'yrs': - case 'yr': - case 'y': - return n * y; - case 'weeks': - case 'week': - case 'w': - return n * w; - case 'days': - case 'day': - case 'd': - return n * d; - case 'hours': - case 'hour': - case 'hrs': - case 'hr': - case 'h': - return n * h; - case 'minutes': - case 'minute': - case 'mins': - case 'min': - case 'm': - return n * m; - case 'seconds': - case 'second': - case 'secs': - case 'sec': - case 's': - return n * s; - case 'milliseconds': - case 'millisecond': - case 'msecs': - case 'msec': - case 'ms': - return n; - default: - return undefined; - } -} - -/** - * Short format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtShort(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return Math.round(ms / d) + 'd'; - } - if (msAbs >= h) { - return Math.round(ms / h) + 'h'; - } - if (msAbs >= m) { - return Math.round(ms / m) + 'm'; - } - if (msAbs >= s) { - return Math.round(ms / s) + 's'; - } - return ms + 'ms'; -} - -/** - * Long format for `ms`. - * - * @param {Number} ms - * @return {String} - * @api private - */ - -function fmtLong(ms) { - var msAbs = Math.abs(ms); - if (msAbs >= d) { - return plural(ms, msAbs, d, 'day'); - } - if (msAbs >= h) { - return plural(ms, msAbs, h, 'hour'); - } - if (msAbs >= m) { - return plural(ms, msAbs, m, 'minute'); - } - if (msAbs >= s) { - return plural(ms, msAbs, s, 'second'); - } - return ms + ' ms'; -} - -/** - * Pluralization helper. - */ - -function plural(ms, msAbs, n, name) { - var isPlural = msAbs >= n * 1.5; - return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : ''); -} - - -/***/ }), - -/***/ 7760: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -/*! node-domexception. MIT License. Jimmy Wärting */ - -if (!globalThis.DOMException) { - try { - const { MessageChannel } = __nccwpck_require__(1267), - port = new MessageChannel().port1, - ab = new ArrayBuffer() - port.postMessage(ab, [ab, ab]) - } catch (err) { - err.constructor.name === 'DOMException' && ( - globalThis.DOMException = err.constructor - ) - } -} - -module.exports = globalThis.DOMException - - -/***/ }), - -/***/ 467: -/***/ ((module, exports, __nccwpck_require__) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } - -var Stream = _interopDefault(__nccwpck_require__(2781)); -var http = _interopDefault(__nccwpck_require__(3685)); -var Url = _interopDefault(__nccwpck_require__(7310)); -var whatwgUrl = _interopDefault(__nccwpck_require__(3323)); -var https = _interopDefault(__nccwpck_require__(5687)); -var zlib = _interopDefault(__nccwpck_require__(9796)); - -// Based on https://github.com/tmpvar/jsdom/blob/aa85b2abf07766ff7bf5c1f6daafb3726f2f2db5/lib/jsdom/living/blob.js - -// fix for "Readable" isn't a named export issue -const Readable = Stream.Readable; - -const BUFFER = Symbol('buffer'); -const TYPE = Symbol('type'); - -class Blob { - constructor() { - this[TYPE] = ''; - - const blobParts = arguments[0]; - const options = arguments[1]; - - const buffers = []; - let size = 0; - - if (blobParts) { - const a = blobParts; - const length = Number(a.length); - for (let i = 0; i < length; i++) { - const element = a[i]; - let buffer; - if (element instanceof Buffer) { - buffer = element; - } else if (ArrayBuffer.isView(element)) { - buffer = Buffer.from(element.buffer, element.byteOffset, element.byteLength); - } else if (element instanceof ArrayBuffer) { - buffer = Buffer.from(element); - } else if (element instanceof Blob) { - buffer = element[BUFFER]; - } else { - buffer = Buffer.from(typeof element === 'string' ? element : String(element)); - } - size += buffer.length; - buffers.push(buffer); - } - } - - this[BUFFER] = Buffer.concat(buffers); - - let type = options && options.type !== undefined && String(options.type).toLowerCase(); - if (type && !/[^\u0020-\u007E]/.test(type)) { - this[TYPE] = type; - } - } - get size() { - return this[BUFFER].length; - } - get type() { - return this[TYPE]; - } - text() { - return Promise.resolve(this[BUFFER].toString()); - } - arrayBuffer() { - const buf = this[BUFFER]; - const ab = buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); - return Promise.resolve(ab); - } - stream() { - const readable = new Readable(); - readable._read = function () {}; - readable.push(this[BUFFER]); - readable.push(null); - return readable; - } - toString() { - return '[object Blob]'; - } - slice() { - const size = this.size; - - const start = arguments[0]; - const end = arguments[1]; - let relativeStart, relativeEnd; - if (start === undefined) { - relativeStart = 0; - } else if (start < 0) { - relativeStart = Math.max(size + start, 0); - } else { - relativeStart = Math.min(start, size); - } - if (end === undefined) { - relativeEnd = size; - } else if (end < 0) { - relativeEnd = Math.max(size + end, 0); - } else { - relativeEnd = Math.min(end, size); - } - const span = Math.max(relativeEnd - relativeStart, 0); - - const buffer = this[BUFFER]; - const slicedBuffer = buffer.slice(relativeStart, relativeStart + span); - const blob = new Blob([], { type: arguments[2] }); - blob[BUFFER] = slicedBuffer; - return blob; - } -} - -Object.defineProperties(Blob.prototype, { - size: { enumerable: true }, - type: { enumerable: true }, - slice: { enumerable: true } -}); - -Object.defineProperty(Blob.prototype, Symbol.toStringTag, { - value: 'Blob', - writable: false, - enumerable: false, - configurable: true -}); - -/** - * fetch-error.js - * - * FetchError interface for operational errors - */ - -/** - * Create FetchError instance - * - * @param String message Error message for human - * @param String type Error type for machine - * @param String systemError For Node.js system error - * @return FetchError - */ -function FetchError(message, type, systemError) { - Error.call(this, message); - - this.message = message; - this.type = type; - - // when err.type is `system`, err.code contains system error code - if (systemError) { - this.code = this.errno = systemError.code; - } - - // hide custom error implementation details from end-users - Error.captureStackTrace(this, this.constructor); -} - -FetchError.prototype = Object.create(Error.prototype); -FetchError.prototype.constructor = FetchError; -FetchError.prototype.name = 'FetchError'; - -let convert; -try { - convert = (__nccwpck_require__(2877).convert); -} catch (e) {} - -const INTERNALS = Symbol('Body internals'); - -// fix an issue where "PassThrough" isn't a named export for node <10 -const PassThrough = Stream.PassThrough; - -/** - * Body mixin - * - * Ref: https://fetch.spec.whatwg.org/#body - * - * @param Stream body Readable stream - * @param Object opts Response options - * @return Void - */ -function Body(body) { - var _this = this; - - var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref$size = _ref.size; - - let size = _ref$size === undefined ? 0 : _ref$size; - var _ref$timeout = _ref.timeout; - let timeout = _ref$timeout === undefined ? 0 : _ref$timeout; - - if (body == null) { - // body is undefined or null - body = null; - } else if (isURLSearchParams(body)) { - // body is a URLSearchParams - body = Buffer.from(body.toString()); - } else if (isBlob(body)) ; else if (Buffer.isBuffer(body)) ; else if (Object.prototype.toString.call(body) === '[object ArrayBuffer]') { - // body is ArrayBuffer - body = Buffer.from(body); - } else if (ArrayBuffer.isView(body)) { - // body is ArrayBufferView - body = Buffer.from(body.buffer, body.byteOffset, body.byteLength); - } else if (body instanceof Stream) ; else { - // none of the above - // coerce to string then buffer - body = Buffer.from(String(body)); - } - this[INTERNALS] = { - body, - disturbed: false, - error: null - }; - this.size = size; - this.timeout = timeout; - - if (body instanceof Stream) { - body.on('error', function (err) { - const error = err.name === 'AbortError' ? err : new FetchError(`Invalid response body while trying to fetch ${_this.url}: ${err.message}`, 'system', err); - _this[INTERNALS].error = error; - }); - } -} - -Body.prototype = { - get body() { - return this[INTERNALS].body; - }, - - get bodyUsed() { - return this[INTERNALS].disturbed; - }, - - /** - * Decode response as ArrayBuffer - * - * @return Promise - */ - arrayBuffer() { - return consumeBody.call(this).then(function (buf) { - return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength); - }); - }, - - /** - * Return raw response as Blob - * - * @return Promise - */ - blob() { - let ct = this.headers && this.headers.get('content-type') || ''; - return consumeBody.call(this).then(function (buf) { - return Object.assign( - // Prevent copying - new Blob([], { - type: ct.toLowerCase() - }), { - [BUFFER]: buf - }); - }); - }, - - /** - * Decode response as json - * - * @return Promise - */ - json() { - var _this2 = this; - - return consumeBody.call(this).then(function (buffer) { - try { - return JSON.parse(buffer.toString()); - } catch (err) { - return Body.Promise.reject(new FetchError(`invalid json response body at ${_this2.url} reason: ${err.message}`, 'invalid-json')); - } - }); - }, - - /** - * Decode response as text - * - * @return Promise - */ - text() { - return consumeBody.call(this).then(function (buffer) { - return buffer.toString(); - }); - }, - - /** - * Decode response as buffer (non-spec api) - * - * @return Promise - */ - buffer() { - return consumeBody.call(this); - }, - - /** - * Decode response as text, while automatically detecting the encoding and - * trying to decode to UTF-8 (non-spec api) - * - * @return Promise - */ - textConverted() { - var _this3 = this; - - return consumeBody.call(this).then(function (buffer) { - return convertBody(buffer, _this3.headers); - }); - } -}; - -// In browsers, all properties are enumerable. -Object.defineProperties(Body.prototype, { - body: { enumerable: true }, - bodyUsed: { enumerable: true }, - arrayBuffer: { enumerable: true }, - blob: { enumerable: true }, - json: { enumerable: true }, - text: { enumerable: true } -}); - -Body.mixIn = function (proto) { - for (const name of Object.getOwnPropertyNames(Body.prototype)) { - // istanbul ignore else: future proof - if (!(name in proto)) { - const desc = Object.getOwnPropertyDescriptor(Body.prototype, name); - Object.defineProperty(proto, name, desc); - } - } -}; - -/** - * Consume and convert an entire Body to a Buffer. - * - * Ref: https://fetch.spec.whatwg.org/#concept-body-consume-body - * - * @return Promise - */ -function consumeBody() { - var _this4 = this; - - if (this[INTERNALS].disturbed) { - return Body.Promise.reject(new TypeError(`body used already for: ${this.url}`)); - } - - this[INTERNALS].disturbed = true; - - if (this[INTERNALS].error) { - return Body.Promise.reject(this[INTERNALS].error); - } - - let body = this.body; - - // body is null - if (body === null) { - return Body.Promise.resolve(Buffer.alloc(0)); - } - - // body is blob - if (isBlob(body)) { - body = body.stream(); - } - - // body is buffer - if (Buffer.isBuffer(body)) { - return Body.Promise.resolve(body); - } - - // istanbul ignore if: should never happen - if (!(body instanceof Stream)) { - return Body.Promise.resolve(Buffer.alloc(0)); - } - - // body is stream - // get ready to actually consume the body - let accum = []; - let accumBytes = 0; - let abort = false; - - return new Body.Promise(function (resolve, reject) { - let resTimeout; - - // allow timeout on slow response body - if (_this4.timeout) { - resTimeout = setTimeout(function () { - abort = true; - reject(new FetchError(`Response timeout while trying to fetch ${_this4.url} (over ${_this4.timeout}ms)`, 'body-timeout')); - }, _this4.timeout); - } - - // handle stream errors - body.on('error', function (err) { - if (err.name === 'AbortError') { - // if the request was aborted, reject with this Error - abort = true; - reject(err); - } else { - // other errors, such as incorrect content-encoding - reject(new FetchError(`Invalid response body while trying to fetch ${_this4.url}: ${err.message}`, 'system', err)); - } - }); - - body.on('data', function (chunk) { - if (abort || chunk === null) { - return; - } - - if (_this4.size && accumBytes + chunk.length > _this4.size) { - abort = true; - reject(new FetchError(`content size at ${_this4.url} over limit: ${_this4.size}`, 'max-size')); - return; - } - - accumBytes += chunk.length; - accum.push(chunk); - }); - - body.on('end', function () { - if (abort) { - return; - } - - clearTimeout(resTimeout); - - try { - resolve(Buffer.concat(accum, accumBytes)); - } catch (err) { - // handle streams that have accumulated too much data (issue #414) - reject(new FetchError(`Could not create Buffer from response body for ${_this4.url}: ${err.message}`, 'system', err)); - } - }); - }); -} - -/** - * Detect buffer encoding and convert to target encoding - * ref: http://www.w3.org/TR/2011/WD-html5-20110113/parsing.html#determining-the-character-encoding - * - * @param Buffer buffer Incoming buffer - * @param String encoding Target encoding - * @return String - */ -function convertBody(buffer, headers) { - if (typeof convert !== 'function') { - throw new Error('The package `encoding` must be installed to use the textConverted() function'); - } - - const ct = headers.get('content-type'); - let charset = 'utf-8'; - let res, str; - - // header - if (ct) { - res = /charset=([^;]*)/i.exec(ct); - } - - // no charset in content type, peek at response body for at most 1024 bytes - str = buffer.slice(0, 1024).toString(); - - // html5 - if (!res && str) { - res = / 0 && arguments[0] !== undefined ? arguments[0] : undefined; - - this[MAP] = Object.create(null); - - if (init instanceof Headers) { - const rawHeaders = init.raw(); - const headerNames = Object.keys(rawHeaders); - - for (const headerName of headerNames) { - for (const value of rawHeaders[headerName]) { - this.append(headerName, value); - } - } - - return; - } - - // We don't worry about converting prop to ByteString here as append() - // will handle it. - if (init == null) ; else if (typeof init === 'object') { - const method = init[Symbol.iterator]; - if (method != null) { - if (typeof method !== 'function') { - throw new TypeError('Header pairs must be iterable'); - } - - // sequence> - // Note: per spec we have to first exhaust the lists then process them - const pairs = []; - for (const pair of init) { - if (typeof pair !== 'object' || typeof pair[Symbol.iterator] !== 'function') { - throw new TypeError('Each header pair must be iterable'); - } - pairs.push(Array.from(pair)); - } - - for (const pair of pairs) { - if (pair.length !== 2) { - throw new TypeError('Each header pair must be a name/value tuple'); - } - this.append(pair[0], pair[1]); - } - } else { - // record - for (const key of Object.keys(init)) { - const value = init[key]; - this.append(key, value); - } - } - } else { - throw new TypeError('Provided initializer must be an object'); - } - } - - /** - * Return combined header value given name - * - * @param String name Header name - * @return Mixed - */ - get(name) { - name = `${name}`; - validateName(name); - const key = find(this[MAP], name); - if (key === undefined) { - return null; - } - - return this[MAP][key].join(', '); - } - - /** - * Iterate over all headers - * - * @param Function callback Executed for each item with parameters (value, name, thisArg) - * @param Boolean thisArg `this` context for callback function - * @return Void - */ - forEach(callback) { - let thisArg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; - - let pairs = getHeaders(this); - let i = 0; - while (i < pairs.length) { - var _pairs$i = pairs[i]; - const name = _pairs$i[0], - value = _pairs$i[1]; - - callback.call(thisArg, value, name, this); - pairs = getHeaders(this); - i++; - } - } - - /** - * Overwrite header values given name - * - * @param String name Header name - * @param String value Header value - * @return Void - */ - set(name, value) { - name = `${name}`; - value = `${value}`; - validateName(name); - validateValue(value); - const key = find(this[MAP], name); - this[MAP][key !== undefined ? key : name] = [value]; - } - - /** - * Append a value onto existing header - * - * @param String name Header name - * @param String value Header value - * @return Void - */ - append(name, value) { - name = `${name}`; - value = `${value}`; - validateName(name); - validateValue(value); - const key = find(this[MAP], name); - if (key !== undefined) { - this[MAP][key].push(value); - } else { - this[MAP][name] = [value]; - } - } - - /** - * Check for header name existence - * - * @param String name Header name - * @return Boolean - */ - has(name) { - name = `${name}`; - validateName(name); - return find(this[MAP], name) !== undefined; - } - - /** - * Delete all header values given name - * - * @param String name Header name - * @return Void - */ - delete(name) { - name = `${name}`; - validateName(name); - const key = find(this[MAP], name); - if (key !== undefined) { - delete this[MAP][key]; - } - } - - /** - * Return raw headers (non-spec api) - * - * @return Object - */ - raw() { - return this[MAP]; - } - - /** - * Get an iterator on keys. - * - * @return Iterator - */ - keys() { - return createHeadersIterator(this, 'key'); - } - - /** - * Get an iterator on values. - * - * @return Iterator - */ - values() { - return createHeadersIterator(this, 'value'); - } - - /** - * Get an iterator on entries. - * - * This is the default iterator of the Headers object. - * - * @return Iterator - */ - [Symbol.iterator]() { - return createHeadersIterator(this, 'key+value'); - } -} -Headers.prototype.entries = Headers.prototype[Symbol.iterator]; - -Object.defineProperty(Headers.prototype, Symbol.toStringTag, { - value: 'Headers', - writable: false, - enumerable: false, - configurable: true -}); - -Object.defineProperties(Headers.prototype, { - get: { enumerable: true }, - forEach: { enumerable: true }, - set: { enumerable: true }, - append: { enumerable: true }, - has: { enumerable: true }, - delete: { enumerable: true }, - keys: { enumerable: true }, - values: { enumerable: true }, - entries: { enumerable: true } -}); - -function getHeaders(headers) { - let kind = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'key+value'; - - const keys = Object.keys(headers[MAP]).sort(); - return keys.map(kind === 'key' ? function (k) { - return k.toLowerCase(); - } : kind === 'value' ? function (k) { - return headers[MAP][k].join(', '); - } : function (k) { - return [k.toLowerCase(), headers[MAP][k].join(', ')]; - }); -} - -const INTERNAL = Symbol('internal'); - -function createHeadersIterator(target, kind) { - const iterator = Object.create(HeadersIteratorPrototype); - iterator[INTERNAL] = { - target, - kind, - index: 0 - }; - return iterator; -} - -const HeadersIteratorPrototype = Object.setPrototypeOf({ - next() { - // istanbul ignore if - if (!this || Object.getPrototypeOf(this) !== HeadersIteratorPrototype) { - throw new TypeError('Value of `this` is not a HeadersIterator'); - } - - var _INTERNAL = this[INTERNAL]; - const target = _INTERNAL.target, - kind = _INTERNAL.kind, - index = _INTERNAL.index; - - const values = getHeaders(target, kind); - const len = values.length; - if (index >= len) { - return { - value: undefined, - done: true - }; - } - - this[INTERNAL].index = index + 1; - - return { - value: values[index], - done: false - }; - } -}, Object.getPrototypeOf(Object.getPrototypeOf([][Symbol.iterator]()))); - -Object.defineProperty(HeadersIteratorPrototype, Symbol.toStringTag, { - value: 'HeadersIterator', - writable: false, - enumerable: false, - configurable: true -}); - -/** - * Export the Headers object in a form that Node.js can consume. - * - * @param Headers headers - * @return Object - */ -function exportNodeCompatibleHeaders(headers) { - const obj = Object.assign({ __proto__: null }, headers[MAP]); - - // http.request() only supports string as Host header. This hack makes - // specifying custom Host header possible. - const hostHeaderKey = find(headers[MAP], 'Host'); - if (hostHeaderKey !== undefined) { - obj[hostHeaderKey] = obj[hostHeaderKey][0]; - } - - return obj; -} - -/** - * Create a Headers object from an object of headers, ignoring those that do - * not conform to HTTP grammar productions. - * - * @param Object obj Object of headers - * @return Headers - */ -function createHeadersLenient(obj) { - const headers = new Headers(); - for (const name of Object.keys(obj)) { - if (invalidTokenRegex.test(name)) { - continue; - } - if (Array.isArray(obj[name])) { - for (const val of obj[name]) { - if (invalidHeaderCharRegex.test(val)) { - continue; - } - if (headers[MAP][name] === undefined) { - headers[MAP][name] = [val]; - } else { - headers[MAP][name].push(val); - } - } - } else if (!invalidHeaderCharRegex.test(obj[name])) { - headers[MAP][name] = [obj[name]]; - } - } - return headers; -} - -const INTERNALS$1 = Symbol('Response internals'); - -// fix an issue where "STATUS_CODES" aren't a named export for node <10 -const STATUS_CODES = http.STATUS_CODES; - -/** - * Response class - * - * @param Stream body Readable stream - * @param Object opts Response options - * @return Void - */ -class Response { - constructor() { - let body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null; - let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - Body.call(this, body, opts); - - const status = opts.status || 200; - const headers = new Headers(opts.headers); - - if (body != null && !headers.has('Content-Type')) { - const contentType = extractContentType(body); - if (contentType) { - headers.append('Content-Type', contentType); - } - } - - this[INTERNALS$1] = { - url: opts.url, - status, - statusText: opts.statusText || STATUS_CODES[status], - headers, - counter: opts.counter - }; - } - - get url() { - return this[INTERNALS$1].url || ''; - } - - get status() { - return this[INTERNALS$1].status; - } - - /** - * Convenience property representing if the request ended normally - */ - get ok() { - return this[INTERNALS$1].status >= 200 && this[INTERNALS$1].status < 300; - } - - get redirected() { - return this[INTERNALS$1].counter > 0; - } - - get statusText() { - return this[INTERNALS$1].statusText; - } - - get headers() { - return this[INTERNALS$1].headers; - } - - /** - * Clone this response - * - * @return Response - */ - clone() { - return new Response(clone(this), { - url: this.url, - status: this.status, - statusText: this.statusText, - headers: this.headers, - ok: this.ok, - redirected: this.redirected - }); - } -} - -Body.mixIn(Response.prototype); - -Object.defineProperties(Response.prototype, { - url: { enumerable: true }, - status: { enumerable: true }, - ok: { enumerable: true }, - redirected: { enumerable: true }, - statusText: { enumerable: true }, - headers: { enumerable: true }, - clone: { enumerable: true } -}); - -Object.defineProperty(Response.prototype, Symbol.toStringTag, { - value: 'Response', - writable: false, - enumerable: false, - configurable: true -}); - -const INTERNALS$2 = Symbol('Request internals'); -const URL = Url.URL || whatwgUrl.URL; - -// fix an issue where "format", "parse" aren't a named export for node <10 -const parse_url = Url.parse; -const format_url = Url.format; - -/** - * Wrapper around `new URL` to handle arbitrary URLs - * - * @param {string} urlStr - * @return {void} - */ -function parseURL(urlStr) { - /* - Check whether the URL is absolute or not - Scheme: https://tools.ietf.org/html/rfc3986#section-3.1 - Absolute URL: https://tools.ietf.org/html/rfc3986#section-4.3 - */ - if (/^[a-zA-Z][a-zA-Z\d+\-.]*:/.exec(urlStr)) { - urlStr = new URL(urlStr).toString(); - } - - // Fallback to old implementation for arbitrary URLs - return parse_url(urlStr); -} - -const streamDestructionSupported = 'destroy' in Stream.Readable.prototype; - -/** - * Check if a value is an instance of Request. - * - * @param Mixed input - * @return Boolean - */ -function isRequest(input) { - return typeof input === 'object' && typeof input[INTERNALS$2] === 'object'; -} - -function isAbortSignal(signal) { - const proto = signal && typeof signal === 'object' && Object.getPrototypeOf(signal); - return !!(proto && proto.constructor.name === 'AbortSignal'); -} - -/** - * Request class - * - * @param Mixed input Url or Request instance - * @param Object init Custom options - * @return Void - */ -class Request { - constructor(input) { - let init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - - let parsedURL; - - // normalize input - if (!isRequest(input)) { - if (input && input.href) { - // in order to support Node.js' Url objects; though WHATWG's URL objects - // will fall into this branch also (since their `toString()` will return - // `href` property anyway) - parsedURL = parseURL(input.href); - } else { - // coerce input to a string before attempting to parse - parsedURL = parseURL(`${input}`); - } - input = {}; - } else { - parsedURL = parseURL(input.url); - } - - let method = init.method || input.method || 'GET'; - method = method.toUpperCase(); - - if ((init.body != null || isRequest(input) && input.body !== null) && (method === 'GET' || method === 'HEAD')) { - throw new TypeError('Request with GET/HEAD method cannot have body'); - } - - let inputBody = init.body != null ? init.body : isRequest(input) && input.body !== null ? clone(input) : null; - - Body.call(this, inputBody, { - timeout: init.timeout || input.timeout || 0, - size: init.size || input.size || 0 - }); - - const headers = new Headers(init.headers || input.headers || {}); - - if (inputBody != null && !headers.has('Content-Type')) { - const contentType = extractContentType(inputBody); - if (contentType) { - headers.append('Content-Type', contentType); - } - } - - let signal = isRequest(input) ? input.signal : null; - if ('signal' in init) signal = init.signal; - - if (signal != null && !isAbortSignal(signal)) { - throw new TypeError('Expected signal to be an instanceof AbortSignal'); - } - - this[INTERNALS$2] = { - method, - redirect: init.redirect || input.redirect || 'follow', - headers, - parsedURL, - signal - }; - - // node-fetch-only options - this.follow = init.follow !== undefined ? init.follow : input.follow !== undefined ? input.follow : 20; - this.compress = init.compress !== undefined ? init.compress : input.compress !== undefined ? input.compress : true; - this.counter = init.counter || input.counter || 0; - this.agent = init.agent || input.agent; - } - - get method() { - return this[INTERNALS$2].method; - } - - get url() { - return format_url(this[INTERNALS$2].parsedURL); - } - - get headers() { - return this[INTERNALS$2].headers; - } - - get redirect() { - return this[INTERNALS$2].redirect; - } - - get signal() { - return this[INTERNALS$2].signal; - } - - /** - * Clone this request - * - * @return Request - */ - clone() { - return new Request(this); - } -} - -Body.mixIn(Request.prototype); - -Object.defineProperty(Request.prototype, Symbol.toStringTag, { - value: 'Request', - writable: false, - enumerable: false, - configurable: true -}); - -Object.defineProperties(Request.prototype, { - method: { enumerable: true }, - url: { enumerable: true }, - headers: { enumerable: true }, - redirect: { enumerable: true }, - clone: { enumerable: true }, - signal: { enumerable: true } -}); - -/** - * Convert a Request to Node.js http request options. - * - * @param Request A Request instance - * @return Object The options object to be passed to http.request - */ -function getNodeRequestOptions(request) { - const parsedURL = request[INTERNALS$2].parsedURL; - const headers = new Headers(request[INTERNALS$2].headers); - - // fetch step 1.3 - if (!headers.has('Accept')) { - headers.set('Accept', '*/*'); - } - - // Basic fetch - if (!parsedURL.protocol || !parsedURL.hostname) { - throw new TypeError('Only absolute URLs are supported'); - } - - if (!/^https?:$/.test(parsedURL.protocol)) { - throw new TypeError('Only HTTP(S) protocols are supported'); - } - - if (request.signal && request.body instanceof Stream.Readable && !streamDestructionSupported) { - throw new Error('Cancellation of streamed requests with AbortSignal is not supported in node < 8'); - } - - // HTTP-network-or-cache fetch steps 2.4-2.7 - let contentLengthValue = null; - if (request.body == null && /^(POST|PUT)$/i.test(request.method)) { - contentLengthValue = '0'; - } - if (request.body != null) { - const totalBytes = getTotalBytes(request); - if (typeof totalBytes === 'number') { - contentLengthValue = String(totalBytes); - } - } - if (contentLengthValue) { - headers.set('Content-Length', contentLengthValue); - } - - // HTTP-network-or-cache fetch step 2.11 - if (!headers.has('User-Agent')) { - headers.set('User-Agent', 'node-fetch/1.0 (+https://github.com/bitinn/node-fetch)'); - } - - // HTTP-network-or-cache fetch step 2.15 - if (request.compress && !headers.has('Accept-Encoding')) { - headers.set('Accept-Encoding', 'gzip,deflate'); - } - - let agent = request.agent; - if (typeof agent === 'function') { - agent = agent(parsedURL); - } - - if (!headers.has('Connection') && !agent) { - headers.set('Connection', 'close'); - } - - // HTTP-network fetch step 4.2 - // chunked encoding is handled by Node.js - - return Object.assign({}, parsedURL, { - method: request.method, - headers: exportNodeCompatibleHeaders(headers), - agent - }); -} - -/** - * abort-error.js - * - * AbortError interface for cancelled requests - */ - -/** - * Create AbortError instance - * - * @param String message Error message for human - * @return AbortError - */ -function AbortError(message) { - Error.call(this, message); - - this.type = 'aborted'; - this.message = message; - - // hide custom error implementation details from end-users - Error.captureStackTrace(this, this.constructor); -} - -AbortError.prototype = Object.create(Error.prototype); -AbortError.prototype.constructor = AbortError; -AbortError.prototype.name = 'AbortError'; - -const URL$1 = Url.URL || whatwgUrl.URL; - -// fix an issue where "PassThrough", "resolve" aren't a named export for node <10 -const PassThrough$1 = Stream.PassThrough; - -const isDomainOrSubdomain = function isDomainOrSubdomain(destination, original) { - const orig = new URL$1(original).hostname; - const dest = new URL$1(destination).hostname; - - return orig === dest || orig[orig.length - dest.length - 1] === '.' && orig.endsWith(dest); -}; - -/** - * Fetch function - * - * @param Mixed url Absolute url or Request instance - * @param Object opts Fetch options - * @return Promise - */ -function fetch(url, opts) { - - // allow custom promise - if (!fetch.Promise) { - throw new Error('native promise missing, set fetch.Promise to your favorite alternative'); - } - - Body.Promise = fetch.Promise; - - // wrap http.request into fetch - return new fetch.Promise(function (resolve, reject) { - // build request object - const request = new Request(url, opts); - const options = getNodeRequestOptions(request); - - const send = (options.protocol === 'https:' ? https : http).request; - const signal = request.signal; - - let response = null; - - const abort = function abort() { - let error = new AbortError('The user aborted a request.'); - reject(error); - if (request.body && request.body instanceof Stream.Readable) { - request.body.destroy(error); - } - if (!response || !response.body) return; - response.body.emit('error', error); - }; - - if (signal && signal.aborted) { - abort(); - return; - } - - const abortAndFinalize = function abortAndFinalize() { - abort(); - finalize(); - }; - - // send request - const req = send(options); - let reqTimeout; - - if (signal) { - signal.addEventListener('abort', abortAndFinalize); - } - - function finalize() { - req.abort(); - if (signal) signal.removeEventListener('abort', abortAndFinalize); - clearTimeout(reqTimeout); - } - - if (request.timeout) { - req.once('socket', function (socket) { - reqTimeout = setTimeout(function () { - reject(new FetchError(`network timeout at: ${request.url}`, 'request-timeout')); - finalize(); - }, request.timeout); - }); - } - - req.on('error', function (err) { - reject(new FetchError(`request to ${request.url} failed, reason: ${err.message}`, 'system', err)); - finalize(); - }); - - req.on('response', function (res) { - clearTimeout(reqTimeout); - - const headers = createHeadersLenient(res.headers); - - // HTTP fetch step 5 - if (fetch.isRedirect(res.statusCode)) { - // HTTP fetch step 5.2 - const location = headers.get('Location'); - - // HTTP fetch step 5.3 - let locationURL = null; - try { - locationURL = location === null ? null : new URL$1(location, request.url).toString(); - } catch (err) { - // error here can only be invalid URL in Location: header - // do not throw when options.redirect == manual - // let the user extract the errorneous redirect URL - if (request.redirect !== 'manual') { - reject(new FetchError(`uri requested responds with an invalid redirect URL: ${location}`, 'invalid-redirect')); - finalize(); - return; - } - } - - // HTTP fetch step 5.5 - switch (request.redirect) { - case 'error': - reject(new FetchError(`uri requested responds with a redirect, redirect mode is set to error: ${request.url}`, 'no-redirect')); - finalize(); - return; - case 'manual': - // node-fetch-specific step: make manual redirect a bit easier to use by setting the Location header value to the resolved URL. - if (locationURL !== null) { - // handle corrupted header - try { - headers.set('Location', locationURL); - } catch (err) { - // istanbul ignore next: nodejs server prevent invalid response headers, we can't test this through normal request - reject(err); - } - } - break; - case 'follow': - // HTTP-redirect fetch step 2 - if (locationURL === null) { - break; - } - - // HTTP-redirect fetch step 5 - if (request.counter >= request.follow) { - reject(new FetchError(`maximum redirect reached at: ${request.url}`, 'max-redirect')); - finalize(); - return; - } - - // HTTP-redirect fetch step 6 (counter increment) - // Create a new Request object. - const requestOpts = { - headers: new Headers(request.headers), - follow: request.follow, - counter: request.counter + 1, - agent: request.agent, - compress: request.compress, - method: request.method, - body: request.body, - signal: request.signal, - timeout: request.timeout, - size: request.size - }; - - if (!isDomainOrSubdomain(request.url, locationURL)) { - for (const name of ['authorization', 'www-authenticate', 'cookie', 'cookie2']) { - requestOpts.headers.delete(name); - } - } - - // HTTP-redirect fetch step 9 - if (res.statusCode !== 303 && request.body && getTotalBytes(request) === null) { - reject(new FetchError('Cannot follow redirect with body being a readable stream', 'unsupported-redirect')); - finalize(); - return; - } - - // HTTP-redirect fetch step 11 - if (res.statusCode === 303 || (res.statusCode === 301 || res.statusCode === 302) && request.method === 'POST') { - requestOpts.method = 'GET'; - requestOpts.body = undefined; - requestOpts.headers.delete('content-length'); - } - - // HTTP-redirect fetch step 15 - resolve(fetch(new Request(locationURL, requestOpts))); - finalize(); - return; - } - } - - // prepare response - res.once('end', function () { - if (signal) signal.removeEventListener('abort', abortAndFinalize); - }); - let body = res.pipe(new PassThrough$1()); - - const response_options = { - url: request.url, - status: res.statusCode, - statusText: res.statusMessage, - headers: headers, - size: request.size, - timeout: request.timeout, - counter: request.counter - }; - - // HTTP-network fetch step 12.1.1.3 - const codings = headers.get('Content-Encoding'); - - // HTTP-network fetch step 12.1.1.4: handle content codings - - // in following scenarios we ignore compression support - // 1. compression support is disabled - // 2. HEAD request - // 3. no Content-Encoding header - // 4. no content response (204) - // 5. content not modified response (304) - if (!request.compress || request.method === 'HEAD' || codings === null || res.statusCode === 204 || res.statusCode === 304) { - response = new Response(body, response_options); - resolve(response); - return; - } - - // For Node v6+ - // Be less strict when decoding compressed responses, since sometimes - // servers send slightly invalid responses that are still accepted - // by common browsers. - // Always using Z_SYNC_FLUSH is what cURL does. - const zlibOptions = { - flush: zlib.Z_SYNC_FLUSH, - finishFlush: zlib.Z_SYNC_FLUSH - }; - - // for gzip - if (codings == 'gzip' || codings == 'x-gzip') { - body = body.pipe(zlib.createGunzip(zlibOptions)); - response = new Response(body, response_options); - resolve(response); - return; - } - - // for deflate - if (codings == 'deflate' || codings == 'x-deflate') { - // handle the infamous raw deflate response from old servers - // a hack for old IIS and Apache servers - const raw = res.pipe(new PassThrough$1()); - raw.once('data', function (chunk) { - // see http://stackoverflow.com/questions/37519828 - if ((chunk[0] & 0x0F) === 0x08) { - body = body.pipe(zlib.createInflate()); - } else { - body = body.pipe(zlib.createInflateRaw()); - } - response = new Response(body, response_options); - resolve(response); - }); - return; - } - - // for br - if (codings == 'br' && typeof zlib.createBrotliDecompress === 'function') { - body = body.pipe(zlib.createBrotliDecompress()); - response = new Response(body, response_options); - resolve(response); - return; - } - - // otherwise, use response as-is - response = new Response(body, response_options); - resolve(response); - }); - - writeToStream(req, request); - }); -} -/** - * Redirect code matching - * - * @param Number code Status code - * @return Boolean - */ -fetch.isRedirect = function (code) { - return code === 301 || code === 302 || code === 303 || code === 307 || code === 308; -}; - -// expose Promise -fetch.Promise = global.Promise; - -module.exports = exports = fetch; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports["default"] = exports; -exports.Headers = Headers; -exports.Request = Request; -exports.Response = Response; -exports.FetchError = FetchError; - - -/***/ }), - -/***/ 2299: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -var punycode = __nccwpck_require__(5477); -var mappingTable = __nccwpck_require__(1907); - -var PROCESSING_OPTIONS = { - TRANSITIONAL: 0, - NONTRANSITIONAL: 1 -}; - -function normalize(str) { // fix bug in v8 - return str.split('\u0000').map(function (s) { return s.normalize('NFC'); }).join('\u0000'); -} - -function findStatus(val) { - var start = 0; - var end = mappingTable.length - 1; - - while (start <= end) { - var mid = Math.floor((start + end) / 2); - - var target = mappingTable[mid]; - if (target[0][0] <= val && target[0][1] >= val) { - return target; - } else if (target[0][0] > val) { - end = mid - 1; - } else { - start = mid + 1; - } - } - - return null; -} - -var regexAstralSymbols = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g; - -function countSymbols(string) { - return string - // replace every surrogate pair with a BMP symbol - .replace(regexAstralSymbols, '_') - // then get the length - .length; -} - -function mapChars(domain_name, useSTD3, processing_option) { - var hasError = false; - var processed = ""; - - var len = countSymbols(domain_name); - for (var i = 0; i < len; ++i) { - var codePoint = domain_name.codePointAt(i); - var status = findStatus(codePoint); - - switch (status[1]) { - case "disallowed": - hasError = true; - processed += String.fromCodePoint(codePoint); - break; - case "ignored": - break; - case "mapped": - processed += String.fromCodePoint.apply(String, status[2]); - break; - case "deviation": - if (processing_option === PROCESSING_OPTIONS.TRANSITIONAL) { - processed += String.fromCodePoint.apply(String, status[2]); - } else { - processed += String.fromCodePoint(codePoint); - } - break; - case "valid": - processed += String.fromCodePoint(codePoint); - break; - case "disallowed_STD3_mapped": - if (useSTD3) { - hasError = true; - processed += String.fromCodePoint(codePoint); - } else { - processed += String.fromCodePoint.apply(String, status[2]); - } - break; - case "disallowed_STD3_valid": - if (useSTD3) { - hasError = true; - } - - processed += String.fromCodePoint(codePoint); - break; - } - } - - return { - string: processed, - error: hasError - }; -} - -var combiningMarksRegex = /[\u0300-\u036F\u0483-\u0489\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED\u0711\u0730-\u074A\u07A6-\u07B0\u07EB-\u07F3\u0816-\u0819\u081B-\u0823\u0825-\u0827\u0829-\u082D\u0859-\u085B\u08E4-\u0903\u093A-\u093C\u093E-\u094F\u0951-\u0957\u0962\u0963\u0981-\u0983\u09BC\u09BE-\u09C4\u09C7\u09C8\u09CB-\u09CD\u09D7\u09E2\u09E3\u0A01-\u0A03\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A70\u0A71\u0A75\u0A81-\u0A83\u0ABC\u0ABE-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AE2\u0AE3\u0B01-\u0B03\u0B3C\u0B3E-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B62\u0B63\u0B82\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD7\u0C00-\u0C03\u0C3E-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C62\u0C63\u0C81-\u0C83\u0CBC\u0CBE-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CE2\u0CE3\u0D01-\u0D03\u0D3E-\u0D44\u0D46-\u0D48\u0D4A-\u0D4D\u0D57\u0D62\u0D63\u0D82\u0D83\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DF2\u0DF3\u0E31\u0E34-\u0E3A\u0E47-\u0E4E\u0EB1\u0EB4-\u0EB9\u0EBB\u0EBC\u0EC8-\u0ECD\u0F18\u0F19\u0F35\u0F37\u0F39\u0F3E\u0F3F\u0F71-\u0F84\u0F86\u0F87\u0F8D-\u0F97\u0F99-\u0FBC\u0FC6\u102B-\u103E\u1056-\u1059\u105E-\u1060\u1062-\u1064\u1067-\u106D\u1071-\u1074\u1082-\u108D\u108F\u109A-\u109D\u135D-\u135F\u1712-\u1714\u1732-\u1734\u1752\u1753\u1772\u1773\u17B4-\u17D3\u17DD\u180B-\u180D\u18A9\u1920-\u192B\u1930-\u193B\u19B0-\u19C0\u19C8\u19C9\u1A17-\u1A1B\u1A55-\u1A5E\u1A60-\u1A7C\u1A7F\u1AB0-\u1ABE\u1B00-\u1B04\u1B34-\u1B44\u1B6B-\u1B73\u1B80-\u1B82\u1BA1-\u1BAD\u1BE6-\u1BF3\u1C24-\u1C37\u1CD0-\u1CD2\u1CD4-\u1CE8\u1CED\u1CF2-\u1CF4\u1CF8\u1CF9\u1DC0-\u1DF5\u1DFC-\u1DFF\u20D0-\u20F0\u2CEF-\u2CF1\u2D7F\u2DE0-\u2DFF\u302A-\u302F\u3099\u309A\uA66F-\uA672\uA674-\uA67D\uA69F\uA6F0\uA6F1\uA802\uA806\uA80B\uA823-\uA827\uA880\uA881\uA8B4-\uA8C4\uA8E0-\uA8F1\uA926-\uA92D\uA947-\uA953\uA980-\uA983\uA9B3-\uA9C0\uA9E5\uAA29-\uAA36\uAA43\uAA4C\uAA4D\uAA7B-\uAA7D\uAAB0\uAAB2-\uAAB4\uAAB7\uAAB8\uAABE\uAABF\uAAC1\uAAEB-\uAAEF\uAAF5\uAAF6\uABE3-\uABEA\uABEC\uABED\uFB1E\uFE00-\uFE0F\uFE20-\uFE2D]|\uD800[\uDDFD\uDEE0\uDF76-\uDF7A]|\uD802[\uDE01-\uDE03\uDE05\uDE06\uDE0C-\uDE0F\uDE38-\uDE3A\uDE3F\uDEE5\uDEE6]|\uD804[\uDC00-\uDC02\uDC38-\uDC46\uDC7F-\uDC82\uDCB0-\uDCBA\uDD00-\uDD02\uDD27-\uDD34\uDD73\uDD80-\uDD82\uDDB3-\uDDC0\uDE2C-\uDE37\uDEDF-\uDEEA\uDF01-\uDF03\uDF3C\uDF3E-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF57\uDF62\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDCB0-\uDCC3\uDDAF-\uDDB5\uDDB8-\uDDC0\uDE30-\uDE40\uDEAB-\uDEB7]|\uD81A[\uDEF0-\uDEF4\uDF30-\uDF36]|\uD81B[\uDF51-\uDF7E\uDF8F-\uDF92]|\uD82F[\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD83A[\uDCD0-\uDCD6]|\uDB40[\uDD00-\uDDEF]/; - -function validateLabel(label, processing_option) { - if (label.substr(0, 4) === "xn--") { - label = punycode.toUnicode(label); - processing_option = PROCESSING_OPTIONS.NONTRANSITIONAL; - } - - var error = false; - - if (normalize(label) !== label || - (label[3] === "-" && label[4] === "-") || - label[0] === "-" || label[label.length - 1] === "-" || - label.indexOf(".") !== -1 || - label.search(combiningMarksRegex) === 0) { - error = true; - } - - var len = countSymbols(label); - for (var i = 0; i < len; ++i) { - var status = findStatus(label.codePointAt(i)); - if ((processing === PROCESSING_OPTIONS.TRANSITIONAL && status[1] !== "valid") || - (processing === PROCESSING_OPTIONS.NONTRANSITIONAL && - status[1] !== "valid" && status[1] !== "deviation")) { - error = true; - break; - } - } - - return { - label: label, - error: error - }; -} - -function processing(domain_name, useSTD3, processing_option) { - var result = mapChars(domain_name, useSTD3, processing_option); - result.string = normalize(result.string); - - var labels = result.string.split("."); - for (var i = 0; i < labels.length; ++i) { - try { - var validation = validateLabel(labels[i]); - labels[i] = validation.label; - result.error = result.error || validation.error; - } catch(e) { - result.error = true; - } - } - - return { - string: labels.join("."), - error: result.error - }; -} - -module.exports.toASCII = function(domain_name, useSTD3, processing_option, verifyDnsLength) { - var result = processing(domain_name, useSTD3, processing_option); - var labels = result.string.split("."); - labels = labels.map(function(l) { - try { - return punycode.toASCII(l); - } catch(e) { - result.error = true; - return l; - } - }); - - if (verifyDnsLength) { - var total = labels.slice(0, labels.length - 1).join(".").length; - if (total.length > 253 || total.length === 0) { - result.error = true; - } - - for (var i=0; i < labels.length; ++i) { - if (labels.length > 63 || labels.length === 0) { - result.error = true; - break; - } - } - } - - if (result.error) return null; - return labels.join("."); -}; - -module.exports.toUnicode = function(domain_name, useSTD3) { - var result = processing(domain_name, useSTD3, PROCESSING_OPTIONS.NONTRANSITIONAL); - - return { - domain: result.string, - error: result.error - }; -}; - -module.exports.PROCESSING_OPTIONS = PROCESSING_OPTIONS; - - -/***/ }), - -/***/ 5871: -/***/ ((module) => { - -"use strict"; - - -var conversions = {}; -module.exports = conversions; - -function sign(x) { - return x < 0 ? -1 : 1; -} - -function evenRound(x) { - // Round x to the nearest integer, choosing the even integer if it lies halfway between two. - if ((x % 1) === 0.5 && (x & 1) === 0) { // [even number].5; round down (i.e. floor) - return Math.floor(x); - } else { - return Math.round(x); - } -} - -function createNumberConversion(bitLength, typeOpts) { - if (!typeOpts.unsigned) { - --bitLength; - } - const lowerBound = typeOpts.unsigned ? 0 : -Math.pow(2, bitLength); - const upperBound = Math.pow(2, bitLength) - 1; - - const moduloVal = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength) : Math.pow(2, bitLength); - const moduloBound = typeOpts.moduloBitLength ? Math.pow(2, typeOpts.moduloBitLength - 1) : Math.pow(2, bitLength - 1); - - return function(V, opts) { - if (!opts) opts = {}; - - let x = +V; - - if (opts.enforceRange) { - if (!Number.isFinite(x)) { - throw new TypeError("Argument is not a finite number"); - } - - x = sign(x) * Math.floor(Math.abs(x)); - if (x < lowerBound || x > upperBound) { - throw new TypeError("Argument is not in byte range"); - } - - return x; - } - - if (!isNaN(x) && opts.clamp) { - x = evenRound(x); - - if (x < lowerBound) x = lowerBound; - if (x > upperBound) x = upperBound; - return x; - } - - if (!Number.isFinite(x) || x === 0) { - return 0; - } - - x = sign(x) * Math.floor(Math.abs(x)); - x = x % moduloVal; - - if (!typeOpts.unsigned && x >= moduloBound) { - return x - moduloVal; - } else if (typeOpts.unsigned) { - if (x < 0) { - x += moduloVal; - } else if (x === -0) { // don't return negative zero - return 0; - } - } - - return x; - } -} - -conversions["void"] = function () { - return undefined; -}; - -conversions["boolean"] = function (val) { - return !!val; -}; - -conversions["byte"] = createNumberConversion(8, { unsigned: false }); -conversions["octet"] = createNumberConversion(8, { unsigned: true }); - -conversions["short"] = createNumberConversion(16, { unsigned: false }); -conversions["unsigned short"] = createNumberConversion(16, { unsigned: true }); - -conversions["long"] = createNumberConversion(32, { unsigned: false }); -conversions["unsigned long"] = createNumberConversion(32, { unsigned: true }); - -conversions["long long"] = createNumberConversion(32, { unsigned: false, moduloBitLength: 64 }); -conversions["unsigned long long"] = createNumberConversion(32, { unsigned: true, moduloBitLength: 64 }); - -conversions["double"] = function (V) { - const x = +V; - - if (!Number.isFinite(x)) { - throw new TypeError("Argument is not a finite floating-point value"); - } - - return x; -}; - -conversions["unrestricted double"] = function (V) { - const x = +V; - - if (isNaN(x)) { - throw new TypeError("Argument is NaN"); - } - - return x; -}; - -// not quite valid, but good enough for JS -conversions["float"] = conversions["double"]; -conversions["unrestricted float"] = conversions["unrestricted double"]; - -conversions["DOMString"] = function (V, opts) { - if (!opts) opts = {}; - - if (opts.treatNullAsEmptyString && V === null) { - return ""; - } - - return String(V); -}; - -conversions["ByteString"] = function (V, opts) { - const x = String(V); - let c = undefined; - for (let i = 0; (c = x.codePointAt(i)) !== undefined; ++i) { - if (c > 255) { - throw new TypeError("Argument is not a valid bytestring"); - } - } - - return x; -}; - -conversions["USVString"] = function (V) { - const S = String(V); - const n = S.length; - const U = []; - for (let i = 0; i < n; ++i) { - const c = S.charCodeAt(i); - if (c < 0xD800 || c > 0xDFFF) { - U.push(String.fromCodePoint(c)); - } else if (0xDC00 <= c && c <= 0xDFFF) { - U.push(String.fromCodePoint(0xFFFD)); - } else { - if (i === n - 1) { - U.push(String.fromCodePoint(0xFFFD)); - } else { - const d = S.charCodeAt(i + 1); - if (0xDC00 <= d && d <= 0xDFFF) { - const a = c & 0x3FF; - const b = d & 0x3FF; - U.push(String.fromCodePoint((2 << 15) + (2 << 9) * a + b)); - ++i; - } else { - U.push(String.fromCodePoint(0xFFFD)); - } - } - } - } - - return U.join(''); -}; - -conversions["Date"] = function (V, opts) { - if (!(V instanceof Date)) { - throw new TypeError("Argument is not a Date object"); - } - if (isNaN(V)) { - return undefined; - } - - return V; -}; - -conversions["RegExp"] = function (V, opts) { - if (!(V instanceof RegExp)) { - V = new RegExp(V); - } - - return V; -}; - - -/***/ }), - -/***/ 8262: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -const usm = __nccwpck_require__(33); - -exports.implementation = class URLImpl { - constructor(constructorArgs) { - const url = constructorArgs[0]; - const base = constructorArgs[1]; - - let parsedBase = null; - if (base !== undefined) { - parsedBase = usm.basicURLParse(base); - if (parsedBase === "failure") { - throw new TypeError("Invalid base URL"); - } - } - - const parsedURL = usm.basicURLParse(url, { baseURL: parsedBase }); - if (parsedURL === "failure") { - throw new TypeError("Invalid URL"); - } - - this._url = parsedURL; - - // TODO: query stuff - } - - get href() { - return usm.serializeURL(this._url); - } - - set href(v) { - const parsedURL = usm.basicURLParse(v); - if (parsedURL === "failure") { - throw new TypeError("Invalid URL"); - } - - this._url = parsedURL; - } - - get origin() { - return usm.serializeURLOrigin(this._url); - } - - get protocol() { - return this._url.scheme + ":"; - } - - set protocol(v) { - usm.basicURLParse(v + ":", { url: this._url, stateOverride: "scheme start" }); - } - - get username() { - return this._url.username; - } - - set username(v) { - if (usm.cannotHaveAUsernamePasswordPort(this._url)) { - return; - } - - usm.setTheUsername(this._url, v); - } - - get password() { - return this._url.password; - } - - set password(v) { - if (usm.cannotHaveAUsernamePasswordPort(this._url)) { - return; - } - - usm.setThePassword(this._url, v); - } - - get host() { - const url = this._url; - - if (url.host === null) { - return ""; - } - - if (url.port === null) { - return usm.serializeHost(url.host); - } - - return usm.serializeHost(url.host) + ":" + usm.serializeInteger(url.port); - } - - set host(v) { - if (this._url.cannotBeABaseURL) { - return; - } - - usm.basicURLParse(v, { url: this._url, stateOverride: "host" }); - } - - get hostname() { - if (this._url.host === null) { - return ""; - } - - return usm.serializeHost(this._url.host); - } - - set hostname(v) { - if (this._url.cannotBeABaseURL) { - return; - } - - usm.basicURLParse(v, { url: this._url, stateOverride: "hostname" }); - } - - get port() { - if (this._url.port === null) { - return ""; - } - - return usm.serializeInteger(this._url.port); - } - - set port(v) { - if (usm.cannotHaveAUsernamePasswordPort(this._url)) { - return; - } - - if (v === "") { - this._url.port = null; - } else { - usm.basicURLParse(v, { url: this._url, stateOverride: "port" }); - } - } - - get pathname() { - if (this._url.cannotBeABaseURL) { - return this._url.path[0]; - } - - if (this._url.path.length === 0) { - return ""; - } - - return "/" + this._url.path.join("/"); - } - - set pathname(v) { - if (this._url.cannotBeABaseURL) { - return; - } - - this._url.path = []; - usm.basicURLParse(v, { url: this._url, stateOverride: "path start" }); - } - - get search() { - if (this._url.query === null || this._url.query === "") { - return ""; - } - - return "?" + this._url.query; - } - - set search(v) { - // TODO: query stuff - - const url = this._url; - - if (v === "") { - url.query = null; - return; - } - - const input = v[0] === "?" ? v.substring(1) : v; - url.query = ""; - usm.basicURLParse(input, { url, stateOverride: "query" }); - } - - get hash() { - if (this._url.fragment === null || this._url.fragment === "") { - return ""; - } - - return "#" + this._url.fragment; - } - - set hash(v) { - if (v === "") { - this._url.fragment = null; - return; - } - - const input = v[0] === "#" ? v.substring(1) : v; - this._url.fragment = ""; - usm.basicURLParse(input, { url: this._url, stateOverride: "fragment" }); - } - - toJSON() { - return this.href; - } -}; - - -/***/ }), - -/***/ 653: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - - -const conversions = __nccwpck_require__(5871); -const utils = __nccwpck_require__(276); -const Impl = __nccwpck_require__(8262); - -const impl = utils.implSymbol; - -function URL(url) { - if (!this || this[impl] || !(this instanceof URL)) { - throw new TypeError("Failed to construct 'URL': Please use the 'new' operator, this DOM object constructor cannot be called as a function."); - } - if (arguments.length < 1) { - throw new TypeError("Failed to construct 'URL': 1 argument required, but only " + arguments.length + " present."); - } - const args = []; - for (let i = 0; i < arguments.length && i < 2; ++i) { - args[i] = arguments[i]; - } - args[0] = conversions["USVString"](args[0]); - if (args[1] !== undefined) { - args[1] = conversions["USVString"](args[1]); - } - - module.exports.setup(this, args); -} - -URL.prototype.toJSON = function toJSON() { - if (!this || !module.exports.is(this)) { - throw new TypeError("Illegal invocation"); - } - const args = []; - for (let i = 0; i < arguments.length && i < 0; ++i) { - args[i] = arguments[i]; - } - return this[impl].toJSON.apply(this[impl], args); -}; -Object.defineProperty(URL.prototype, "href", { - get() { - return this[impl].href; - }, - set(V) { - V = conversions["USVString"](V); - this[impl].href = V; - }, - enumerable: true, - configurable: true -}); - -URL.prototype.toString = function () { - if (!this || !module.exports.is(this)) { - throw new TypeError("Illegal invocation"); - } - return this.href; -}; - -Object.defineProperty(URL.prototype, "origin", { - get() { - return this[impl].origin; - }, - enumerable: true, - configurable: true -}); - -Object.defineProperty(URL.prototype, "protocol", { - get() { - return this[impl].protocol; - }, - set(V) { - V = conversions["USVString"](V); - this[impl].protocol = V; - }, - enumerable: true, - configurable: true -}); - -Object.defineProperty(URL.prototype, "username", { - get() { - return this[impl].username; - }, - set(V) { - V = conversions["USVString"](V); - this[impl].username = V; - }, - enumerable: true, - configurable: true -}); - -Object.defineProperty(URL.prototype, "password", { - get() { - return this[impl].password; - }, - set(V) { - V = conversions["USVString"](V); - this[impl].password = V; - }, - enumerable: true, - configurable: true -}); - -Object.defineProperty(URL.prototype, "host", { - get() { - return this[impl].host; - }, - set(V) { - V = conversions["USVString"](V); - this[impl].host = V; - }, - enumerable: true, - configurable: true -}); - -Object.defineProperty(URL.prototype, "hostname", { - get() { - return this[impl].hostname; - }, - set(V) { - V = conversions["USVString"](V); - this[impl].hostname = V; - }, - enumerable: true, - configurable: true -}); - -Object.defineProperty(URL.prototype, "port", { - get() { - return this[impl].port; - }, - set(V) { - V = conversions["USVString"](V); - this[impl].port = V; - }, - enumerable: true, - configurable: true -}); - -Object.defineProperty(URL.prototype, "pathname", { - get() { - return this[impl].pathname; - }, - set(V) { - V = conversions["USVString"](V); - this[impl].pathname = V; - }, - enumerable: true, - configurable: true -}); - -Object.defineProperty(URL.prototype, "search", { - get() { - return this[impl].search; - }, - set(V) { - V = conversions["USVString"](V); - this[impl].search = V; - }, - enumerable: true, - configurable: true -}); - -Object.defineProperty(URL.prototype, "hash", { - get() { - return this[impl].hash; - }, - set(V) { - V = conversions["USVString"](V); - this[impl].hash = V; - }, - enumerable: true, - configurable: true -}); - - -module.exports = { - is(obj) { - return !!obj && obj[impl] instanceof Impl.implementation; - }, - create(constructorArgs, privateData) { - let obj = Object.create(URL.prototype); - this.setup(obj, constructorArgs, privateData); - return obj; - }, - setup(obj, constructorArgs, privateData) { - if (!privateData) privateData = {}; - privateData.wrapper = obj; - - obj[impl] = new Impl.implementation(constructorArgs, privateData); - obj[impl][utils.wrapperSymbol] = obj; - }, - interface: URL, - expose: { - Window: { URL: URL }, - Worker: { URL: URL } - } -}; - - - -/***/ }), - -/***/ 3323: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -exports.URL = __nccwpck_require__(653)["interface"]; -exports.serializeURL = __nccwpck_require__(33).serializeURL; -exports.serializeURLOrigin = __nccwpck_require__(33).serializeURLOrigin; -exports.basicURLParse = __nccwpck_require__(33).basicURLParse; -exports.setTheUsername = __nccwpck_require__(33).setTheUsername; -exports.setThePassword = __nccwpck_require__(33).setThePassword; -exports.serializeHost = __nccwpck_require__(33).serializeHost; -exports.serializeInteger = __nccwpck_require__(33).serializeInteger; -exports.parseURL = __nccwpck_require__(33).parseURL; - - -/***/ }), - -/***/ 33: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -"use strict"; - -const punycode = __nccwpck_require__(5477); -const tr46 = __nccwpck_require__(2299); - -const specialSchemes = { - ftp: 21, - file: null, - gopher: 70, - http: 80, - https: 443, - ws: 80, - wss: 443 -}; - -const failure = Symbol("failure"); - -function countSymbols(str) { - return punycode.ucs2.decode(str).length; -} - -function at(input, idx) { - const c = input[idx]; - return isNaN(c) ? undefined : String.fromCodePoint(c); -} - -function isASCIIDigit(c) { - return c >= 0x30 && c <= 0x39; -} - -function isASCIIAlpha(c) { - return (c >= 0x41 && c <= 0x5A) || (c >= 0x61 && c <= 0x7A); -} - -function isASCIIAlphanumeric(c) { - return isASCIIAlpha(c) || isASCIIDigit(c); -} - -function isASCIIHex(c) { - return isASCIIDigit(c) || (c >= 0x41 && c <= 0x46) || (c >= 0x61 && c <= 0x66); -} - -function isSingleDot(buffer) { - return buffer === "." || buffer.toLowerCase() === "%2e"; -} - -function isDoubleDot(buffer) { - buffer = buffer.toLowerCase(); - return buffer === ".." || buffer === "%2e." || buffer === ".%2e" || buffer === "%2e%2e"; -} - -function isWindowsDriveLetterCodePoints(cp1, cp2) { - return isASCIIAlpha(cp1) && (cp2 === 58 || cp2 === 124); -} - -function isWindowsDriveLetterString(string) { - return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && (string[1] === ":" || string[1] === "|"); -} - -function isNormalizedWindowsDriveLetterString(string) { - return string.length === 2 && isASCIIAlpha(string.codePointAt(0)) && string[1] === ":"; -} - -function containsForbiddenHostCodePoint(string) { - return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|%|\/|:|\?|@|\[|\\|\]/) !== -1; -} - -function containsForbiddenHostCodePointExcludingPercent(string) { - return string.search(/\u0000|\u0009|\u000A|\u000D|\u0020|#|\/|:|\?|@|\[|\\|\]/) !== -1; -} - -function isSpecialScheme(scheme) { - return specialSchemes[scheme] !== undefined; -} - -function isSpecial(url) { - return isSpecialScheme(url.scheme); -} - -function defaultPort(scheme) { - return specialSchemes[scheme]; -} - -function percentEncode(c) { - let hex = c.toString(16).toUpperCase(); - if (hex.length === 1) { - hex = "0" + hex; - } - - return "%" + hex; -} - -function utf8PercentEncode(c) { - const buf = new Buffer(c); - - let str = ""; - - for (let i = 0; i < buf.length; ++i) { - str += percentEncode(buf[i]); - } - - return str; -} - -function utf8PercentDecode(str) { - const input = new Buffer(str); - const output = []; - for (let i = 0; i < input.length; ++i) { - if (input[i] !== 37) { - output.push(input[i]); - } else if (input[i] === 37 && isASCIIHex(input[i + 1]) && isASCIIHex(input[i + 2])) { - output.push(parseInt(input.slice(i + 1, i + 3).toString(), 16)); - i += 2; - } else { - output.push(input[i]); - } - } - return new Buffer(output).toString(); -} - -function isC0ControlPercentEncode(c) { - return c <= 0x1F || c > 0x7E; -} - -const extraPathPercentEncodeSet = new Set([32, 34, 35, 60, 62, 63, 96, 123, 125]); -function isPathPercentEncode(c) { - return isC0ControlPercentEncode(c) || extraPathPercentEncodeSet.has(c); -} - -const extraUserinfoPercentEncodeSet = - new Set([47, 58, 59, 61, 64, 91, 92, 93, 94, 124]); -function isUserinfoPercentEncode(c) { - return isPathPercentEncode(c) || extraUserinfoPercentEncodeSet.has(c); -} - -function percentEncodeChar(c, encodeSetPredicate) { - const cStr = String.fromCodePoint(c); - - if (encodeSetPredicate(c)) { - return utf8PercentEncode(cStr); - } - - return cStr; -} - -function parseIPv4Number(input) { - let R = 10; - - if (input.length >= 2 && input.charAt(0) === "0" && input.charAt(1).toLowerCase() === "x") { - input = input.substring(2); - R = 16; - } else if (input.length >= 2 && input.charAt(0) === "0") { - input = input.substring(1); - R = 8; - } - - if (input === "") { - return 0; - } - - const regex = R === 10 ? /[^0-9]/ : (R === 16 ? /[^0-9A-Fa-f]/ : /[^0-7]/); - if (regex.test(input)) { - return failure; - } - - return parseInt(input, R); -} - -function parseIPv4(input) { - const parts = input.split("."); - if (parts[parts.length - 1] === "") { - if (parts.length > 1) { - parts.pop(); - } - } - - if (parts.length > 4) { - return input; - } - - const numbers = []; - for (const part of parts) { - if (part === "") { - return input; - } - const n = parseIPv4Number(part); - if (n === failure) { - return input; - } - - numbers.push(n); - } - - for (let i = 0; i < numbers.length - 1; ++i) { - if (numbers[i] > 255) { - return failure; - } - } - if (numbers[numbers.length - 1] >= Math.pow(256, 5 - numbers.length)) { - return failure; - } - - let ipv4 = numbers.pop(); - let counter = 0; - - for (const n of numbers) { - ipv4 += n * Math.pow(256, 3 - counter); - ++counter; - } - - return ipv4; -} - -function serializeIPv4(address) { - let output = ""; - let n = address; - - for (let i = 1; i <= 4; ++i) { - output = String(n % 256) + output; - if (i !== 4) { - output = "." + output; - } - n = Math.floor(n / 256); - } - - return output; -} - -function parseIPv6(input) { - const address = [0, 0, 0, 0, 0, 0, 0, 0]; - let pieceIndex = 0; - let compress = null; - let pointer = 0; - - input = punycode.ucs2.decode(input); - - if (input[pointer] === 58) { - if (input[pointer + 1] !== 58) { - return failure; - } - - pointer += 2; - ++pieceIndex; - compress = pieceIndex; - } - - while (pointer < input.length) { - if (pieceIndex === 8) { - return failure; - } - - if (input[pointer] === 58) { - if (compress !== null) { - return failure; - } - ++pointer; - ++pieceIndex; - compress = pieceIndex; - continue; - } - - let value = 0; - let length = 0; - - while (length < 4 && isASCIIHex(input[pointer])) { - value = value * 0x10 + parseInt(at(input, pointer), 16); - ++pointer; - ++length; - } - - if (input[pointer] === 46) { - if (length === 0) { - return failure; - } - - pointer -= length; - - if (pieceIndex > 6) { - return failure; - } - - let numbersSeen = 0; - - while (input[pointer] !== undefined) { - let ipv4Piece = null; - - if (numbersSeen > 0) { - if (input[pointer] === 46 && numbersSeen < 4) { - ++pointer; - } else { - return failure; - } - } - - if (!isASCIIDigit(input[pointer])) { - return failure; - } - - while (isASCIIDigit(input[pointer])) { - const number = parseInt(at(input, pointer)); - if (ipv4Piece === null) { - ipv4Piece = number; - } else if (ipv4Piece === 0) { - return failure; - } else { - ipv4Piece = ipv4Piece * 10 + number; - } - if (ipv4Piece > 255) { - return failure; - } - ++pointer; - } - - address[pieceIndex] = address[pieceIndex] * 0x100 + ipv4Piece; - - ++numbersSeen; - - if (numbersSeen === 2 || numbersSeen === 4) { - ++pieceIndex; - } - } - - if (numbersSeen !== 4) { - return failure; - } - - break; - } else if (input[pointer] === 58) { - ++pointer; - if (input[pointer] === undefined) { - return failure; - } - } else if (input[pointer] !== undefined) { - return failure; - } - - address[pieceIndex] = value; - ++pieceIndex; - } - - if (compress !== null) { - let swaps = pieceIndex - compress; - pieceIndex = 7; - while (pieceIndex !== 0 && swaps > 0) { - const temp = address[compress + swaps - 1]; - address[compress + swaps - 1] = address[pieceIndex]; - address[pieceIndex] = temp; - --pieceIndex; - --swaps; - } - } else if (compress === null && pieceIndex !== 8) { - return failure; - } - - return address; -} - -function serializeIPv6(address) { - let output = ""; - const seqResult = findLongestZeroSequence(address); - const compress = seqResult.idx; - let ignore0 = false; - - for (let pieceIndex = 0; pieceIndex <= 7; ++pieceIndex) { - if (ignore0 && address[pieceIndex] === 0) { - continue; - } else if (ignore0) { - ignore0 = false; - } - - if (compress === pieceIndex) { - const separator = pieceIndex === 0 ? "::" : ":"; - output += separator; - ignore0 = true; - continue; - } - - output += address[pieceIndex].toString(16); - - if (pieceIndex !== 7) { - output += ":"; - } - } - - return output; -} - -function parseHost(input, isSpecialArg) { - if (input[0] === "[") { - if (input[input.length - 1] !== "]") { - return failure; - } - - return parseIPv6(input.substring(1, input.length - 1)); - } - - if (!isSpecialArg) { - return parseOpaqueHost(input); - } - - const domain = utf8PercentDecode(input); - const asciiDomain = tr46.toASCII(domain, false, tr46.PROCESSING_OPTIONS.NONTRANSITIONAL, false); - if (asciiDomain === null) { - return failure; - } - - if (containsForbiddenHostCodePoint(asciiDomain)) { - return failure; - } - - const ipv4Host = parseIPv4(asciiDomain); - if (typeof ipv4Host === "number" || ipv4Host === failure) { - return ipv4Host; - } - - return asciiDomain; -} - -function parseOpaqueHost(input) { - if (containsForbiddenHostCodePointExcludingPercent(input)) { - return failure; - } - - let output = ""; - const decoded = punycode.ucs2.decode(input); - for (let i = 0; i < decoded.length; ++i) { - output += percentEncodeChar(decoded[i], isC0ControlPercentEncode); - } - return output; -} - -function findLongestZeroSequence(arr) { - let maxIdx = null; - let maxLen = 1; // only find elements > 1 - let currStart = null; - let currLen = 0; - - for (let i = 0; i < arr.length; ++i) { - if (arr[i] !== 0) { - if (currLen > maxLen) { - maxIdx = currStart; - maxLen = currLen; - } - - currStart = null; - currLen = 0; - } else { - if (currStart === null) { - currStart = i; - } - ++currLen; - } - } - - // if trailing zeros - if (currLen > maxLen) { - maxIdx = currStart; - maxLen = currLen; - } - - return { - idx: maxIdx, - len: maxLen - }; -} - -function serializeHost(host) { - if (typeof host === "number") { - return serializeIPv4(host); - } - - // IPv6 serializer - if (host instanceof Array) { - return "[" + serializeIPv6(host) + "]"; - } - - return host; -} - -function trimControlChars(url) { - return url.replace(/^[\u0000-\u001F\u0020]+|[\u0000-\u001F\u0020]+$/g, ""); -} - -function trimTabAndNewline(url) { - return url.replace(/\u0009|\u000A|\u000D/g, ""); -} - -function shortenPath(url) { - const path = url.path; - if (path.length === 0) { - return; - } - if (url.scheme === "file" && path.length === 1 && isNormalizedWindowsDriveLetter(path[0])) { - return; - } - - path.pop(); -} - -function includesCredentials(url) { - return url.username !== "" || url.password !== ""; -} - -function cannotHaveAUsernamePasswordPort(url) { - return url.host === null || url.host === "" || url.cannotBeABaseURL || url.scheme === "file"; -} - -function isNormalizedWindowsDriveLetter(string) { - return /^[A-Za-z]:$/.test(string); -} - -function URLStateMachine(input, base, encodingOverride, url, stateOverride) { - this.pointer = 0; - this.input = input; - this.base = base || null; - this.encodingOverride = encodingOverride || "utf-8"; - this.stateOverride = stateOverride; - this.url = url; - this.failure = false; - this.parseError = false; - - if (!this.url) { - this.url = { - scheme: "", - username: "", - password: "", - host: null, - port: null, - path: [], - query: null, - fragment: null, - - cannotBeABaseURL: false - }; - - const res = trimControlChars(this.input); - if (res !== this.input) { - this.parseError = true; - } - this.input = res; - } - - const res = trimTabAndNewline(this.input); - if (res !== this.input) { - this.parseError = true; - } - this.input = res; - - this.state = stateOverride || "scheme start"; - - this.buffer = ""; - this.atFlag = false; - this.arrFlag = false; - this.passwordTokenSeenFlag = false; - - this.input = punycode.ucs2.decode(this.input); - - for (; this.pointer <= this.input.length; ++this.pointer) { - const c = this.input[this.pointer]; - const cStr = isNaN(c) ? undefined : String.fromCodePoint(c); - - // exec state machine - const ret = this["parse " + this.state](c, cStr); - if (!ret) { - break; // terminate algorithm - } else if (ret === failure) { - this.failure = true; - break; - } - } -} - -URLStateMachine.prototype["parse scheme start"] = function parseSchemeStart(c, cStr) { - if (isASCIIAlpha(c)) { - this.buffer += cStr.toLowerCase(); - this.state = "scheme"; - } else if (!this.stateOverride) { - this.state = "no scheme"; - --this.pointer; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -URLStateMachine.prototype["parse scheme"] = function parseScheme(c, cStr) { - if (isASCIIAlphanumeric(c) || c === 43 || c === 45 || c === 46) { - this.buffer += cStr.toLowerCase(); - } else if (c === 58) { - if (this.stateOverride) { - if (isSpecial(this.url) && !isSpecialScheme(this.buffer)) { - return false; - } - - if (!isSpecial(this.url) && isSpecialScheme(this.buffer)) { - return false; - } - - if ((includesCredentials(this.url) || this.url.port !== null) && this.buffer === "file") { - return false; - } - - if (this.url.scheme === "file" && (this.url.host === "" || this.url.host === null)) { - return false; - } - } - this.url.scheme = this.buffer; - this.buffer = ""; - if (this.stateOverride) { - return false; - } - if (this.url.scheme === "file") { - if (this.input[this.pointer + 1] !== 47 || this.input[this.pointer + 2] !== 47) { - this.parseError = true; - } - this.state = "file"; - } else if (isSpecial(this.url) && this.base !== null && this.base.scheme === this.url.scheme) { - this.state = "special relative or authority"; - } else if (isSpecial(this.url)) { - this.state = "special authority slashes"; - } else if (this.input[this.pointer + 1] === 47) { - this.state = "path or authority"; - ++this.pointer; - } else { - this.url.cannotBeABaseURL = true; - this.url.path.push(""); - this.state = "cannot-be-a-base-URL path"; - } - } else if (!this.stateOverride) { - this.buffer = ""; - this.state = "no scheme"; - this.pointer = -1; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -URLStateMachine.prototype["parse no scheme"] = function parseNoScheme(c) { - if (this.base === null || (this.base.cannotBeABaseURL && c !== 35)) { - return failure; - } else if (this.base.cannotBeABaseURL && c === 35) { - this.url.scheme = this.base.scheme; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.url.cannotBeABaseURL = true; - this.state = "fragment"; - } else if (this.base.scheme === "file") { - this.state = "file"; - --this.pointer; - } else { - this.state = "relative"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special relative or authority"] = function parseSpecialRelativeOrAuthority(c) { - if (c === 47 && this.input[this.pointer + 1] === 47) { - this.state = "special authority ignore slashes"; - ++this.pointer; - } else { - this.parseError = true; - this.state = "relative"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse path or authority"] = function parsePathOrAuthority(c) { - if (c === 47) { - this.state = "authority"; - } else { - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse relative"] = function parseRelative(c) { - this.url.scheme = this.base.scheme; - if (isNaN(c)) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - } else if (c === 47) { - this.state = "relative slash"; - } else if (c === 63) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.state = "fragment"; - } else if (isSpecial(this.url) && c === 92) { - this.parseError = true; - this.state = "relative slash"; - } else { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.url.path = this.base.path.slice(0, this.base.path.length - 1); - - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse relative slash"] = function parseRelativeSlash(c) { - if (isSpecial(this.url) && (c === 47 || c === 92)) { - if (c === 92) { - this.parseError = true; - } - this.state = "special authority ignore slashes"; - } else if (c === 47) { - this.state = "authority"; - } else { - this.url.username = this.base.username; - this.url.password = this.base.password; - this.url.host = this.base.host; - this.url.port = this.base.port; - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special authority slashes"] = function parseSpecialAuthoritySlashes(c) { - if (c === 47 && this.input[this.pointer + 1] === 47) { - this.state = "special authority ignore slashes"; - ++this.pointer; - } else { - this.parseError = true; - this.state = "special authority ignore slashes"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse special authority ignore slashes"] = function parseSpecialAuthorityIgnoreSlashes(c) { - if (c !== 47 && c !== 92) { - this.state = "authority"; - --this.pointer; - } else { - this.parseError = true; - } - - return true; -}; - -URLStateMachine.prototype["parse authority"] = function parseAuthority(c, cStr) { - if (c === 64) { - this.parseError = true; - if (this.atFlag) { - this.buffer = "%40" + this.buffer; - } - this.atFlag = true; - - // careful, this is based on buffer and has its own pointer (this.pointer != pointer) and inner chars - const len = countSymbols(this.buffer); - for (let pointer = 0; pointer < len; ++pointer) { - const codePoint = this.buffer.codePointAt(pointer); - - if (codePoint === 58 && !this.passwordTokenSeenFlag) { - this.passwordTokenSeenFlag = true; - continue; - } - const encodedCodePoints = percentEncodeChar(codePoint, isUserinfoPercentEncode); - if (this.passwordTokenSeenFlag) { - this.url.password += encodedCodePoints; - } else { - this.url.username += encodedCodePoints; - } - } - this.buffer = ""; - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92)) { - if (this.atFlag && this.buffer === "") { - this.parseError = true; - return failure; - } - this.pointer -= countSymbols(this.buffer) + 1; - this.buffer = ""; - this.state = "host"; - } else { - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse hostname"] = -URLStateMachine.prototype["parse host"] = function parseHostName(c, cStr) { - if (this.stateOverride && this.url.scheme === "file") { - --this.pointer; - this.state = "file host"; - } else if (c === 58 && !this.arrFlag) { - if (this.buffer === "") { - this.parseError = true; - return failure; - } - - const host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - - this.url.host = host; - this.buffer = ""; - this.state = "port"; - if (this.stateOverride === "hostname") { - return false; - } - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92)) { - --this.pointer; - if (isSpecial(this.url) && this.buffer === "") { - this.parseError = true; - return failure; - } else if (this.stateOverride && this.buffer === "" && - (includesCredentials(this.url) || this.url.port !== null)) { - this.parseError = true; - return false; - } - - const host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - - this.url.host = host; - this.buffer = ""; - this.state = "path start"; - if (this.stateOverride) { - return false; - } - } else { - if (c === 91) { - this.arrFlag = true; - } else if (c === 93) { - this.arrFlag = false; - } - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse port"] = function parsePort(c, cStr) { - if (isASCIIDigit(c)) { - this.buffer += cStr; - } else if (isNaN(c) || c === 47 || c === 63 || c === 35 || - (isSpecial(this.url) && c === 92) || - this.stateOverride) { - if (this.buffer !== "") { - const port = parseInt(this.buffer); - if (port > Math.pow(2, 16) - 1) { - this.parseError = true; - return failure; - } - this.url.port = port === defaultPort(this.url.scheme) ? null : port; - this.buffer = ""; - } - if (this.stateOverride) { - return false; - } - this.state = "path start"; - --this.pointer; - } else { - this.parseError = true; - return failure; - } - - return true; -}; - -const fileOtherwiseCodePoints = new Set([47, 92, 63, 35]); - -URLStateMachine.prototype["parse file"] = function parseFile(c) { - this.url.scheme = "file"; - - if (c === 47 || c === 92) { - if (c === 92) { - this.parseError = true; - } - this.state = "file slash"; - } else if (this.base !== null && this.base.scheme === "file") { - if (isNaN(c)) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - } else if (c === 63) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - this.url.query = this.base.query; - this.url.fragment = ""; - this.state = "fragment"; - } else { - if (this.input.length - this.pointer - 1 === 0 || // remaining consists of 0 code points - !isWindowsDriveLetterCodePoints(c, this.input[this.pointer + 1]) || - (this.input.length - this.pointer - 1 >= 2 && // remaining has at least 2 code points - !fileOtherwiseCodePoints.has(this.input[this.pointer + 2]))) { - this.url.host = this.base.host; - this.url.path = this.base.path.slice(); - shortenPath(this.url); - } else { - this.parseError = true; - } - - this.state = "path"; - --this.pointer; - } - } else { - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse file slash"] = function parseFileSlash(c) { - if (c === 47 || c === 92) { - if (c === 92) { - this.parseError = true; - } - this.state = "file host"; - } else { - if (this.base !== null && this.base.scheme === "file") { - if (isNormalizedWindowsDriveLetterString(this.base.path[0])) { - this.url.path.push(this.base.path[0]); - } else { - this.url.host = this.base.host; - } - } - this.state = "path"; - --this.pointer; - } - - return true; -}; - -URLStateMachine.prototype["parse file host"] = function parseFileHost(c, cStr) { - if (isNaN(c) || c === 47 || c === 92 || c === 63 || c === 35) { - --this.pointer; - if (!this.stateOverride && isWindowsDriveLetterString(this.buffer)) { - this.parseError = true; - this.state = "path"; - } else if (this.buffer === "") { - this.url.host = ""; - if (this.stateOverride) { - return false; - } - this.state = "path start"; - } else { - let host = parseHost(this.buffer, isSpecial(this.url)); - if (host === failure) { - return failure; - } - if (host === "localhost") { - host = ""; - } - this.url.host = host; - - if (this.stateOverride) { - return false; - } - - this.buffer = ""; - this.state = "path start"; - } - } else { - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse path start"] = function parsePathStart(c) { - if (isSpecial(this.url)) { - if (c === 92) { - this.parseError = true; - } - this.state = "path"; - - if (c !== 47 && c !== 92) { - --this.pointer; - } - } else if (!this.stateOverride && c === 63) { - this.url.query = ""; - this.state = "query"; - } else if (!this.stateOverride && c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } else if (c !== undefined) { - this.state = "path"; - if (c !== 47) { - --this.pointer; - } - } - - return true; -}; - -URLStateMachine.prototype["parse path"] = function parsePath(c) { - if (isNaN(c) || c === 47 || (isSpecial(this.url) && c === 92) || - (!this.stateOverride && (c === 63 || c === 35))) { - if (isSpecial(this.url) && c === 92) { - this.parseError = true; - } - - if (isDoubleDot(this.buffer)) { - shortenPath(this.url); - if (c !== 47 && !(isSpecial(this.url) && c === 92)) { - this.url.path.push(""); - } - } else if (isSingleDot(this.buffer) && c !== 47 && - !(isSpecial(this.url) && c === 92)) { - this.url.path.push(""); - } else if (!isSingleDot(this.buffer)) { - if (this.url.scheme === "file" && this.url.path.length === 0 && isWindowsDriveLetterString(this.buffer)) { - if (this.url.host !== "" && this.url.host !== null) { - this.parseError = true; - this.url.host = ""; - } - this.buffer = this.buffer[0] + ":"; - } - this.url.path.push(this.buffer); - } - this.buffer = ""; - if (this.url.scheme === "file" && (c === undefined || c === 63 || c === 35)) { - while (this.url.path.length > 1 && this.url.path[0] === "") { - this.parseError = true; - this.url.path.shift(); - } - } - if (c === 63) { - this.url.query = ""; - this.state = "query"; - } - if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } - } else { - // TODO: If c is not a URL code point and not "%", parse error. - - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.buffer += percentEncodeChar(c, isPathPercentEncode); - } - - return true; -}; - -URLStateMachine.prototype["parse cannot-be-a-base-URL path"] = function parseCannotBeABaseURLPath(c) { - if (c === 63) { - this.url.query = ""; - this.state = "query"; - } else if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } else { - // TODO: Add: not a URL code point - if (!isNaN(c) && c !== 37) { - this.parseError = true; - } - - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - if (!isNaN(c)) { - this.url.path[0] = this.url.path[0] + percentEncodeChar(c, isC0ControlPercentEncode); - } - } - - return true; -}; - -URLStateMachine.prototype["parse query"] = function parseQuery(c, cStr) { - if (isNaN(c) || (!this.stateOverride && c === 35)) { - if (!isSpecial(this.url) || this.url.scheme === "ws" || this.url.scheme === "wss") { - this.encodingOverride = "utf-8"; - } - - const buffer = new Buffer(this.buffer); // TODO: Use encoding override instead - for (let i = 0; i < buffer.length; ++i) { - if (buffer[i] < 0x21 || buffer[i] > 0x7E || buffer[i] === 0x22 || buffer[i] === 0x23 || - buffer[i] === 0x3C || buffer[i] === 0x3E) { - this.url.query += percentEncode(buffer[i]); - } else { - this.url.query += String.fromCodePoint(buffer[i]); - } - } - - this.buffer = ""; - if (c === 35) { - this.url.fragment = ""; - this.state = "fragment"; - } - } else { - // TODO: If c is not a URL code point and not "%", parse error. - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.buffer += cStr; - } - - return true; -}; - -URLStateMachine.prototype["parse fragment"] = function parseFragment(c) { - if (isNaN(c)) { // do nothing - } else if (c === 0x0) { - this.parseError = true; - } else { - // TODO: If c is not a URL code point and not "%", parse error. - if (c === 37 && - (!isASCIIHex(this.input[this.pointer + 1]) || - !isASCIIHex(this.input[this.pointer + 2]))) { - this.parseError = true; - } - - this.url.fragment += percentEncodeChar(c, isC0ControlPercentEncode); - } - - return true; -}; - -function serializeURL(url, excludeFragment) { - let output = url.scheme + ":"; - if (url.host !== null) { - output += "//"; - - if (url.username !== "" || url.password !== "") { - output += url.username; - if (url.password !== "") { - output += ":" + url.password; - } - output += "@"; - } - - output += serializeHost(url.host); - - if (url.port !== null) { - output += ":" + url.port; - } - } else if (url.host === null && url.scheme === "file") { - output += "//"; - } - - if (url.cannotBeABaseURL) { - output += url.path[0]; - } else { - for (const string of url.path) { - output += "/" + string; - } - } - - if (url.query !== null) { - output += "?" + url.query; - } - - if (!excludeFragment && url.fragment !== null) { - output += "#" + url.fragment; - } - - return output; -} - -function serializeOrigin(tuple) { - let result = tuple.scheme + "://"; - result += serializeHost(tuple.host); - - if (tuple.port !== null) { - result += ":" + tuple.port; - } - - return result; -} - -module.exports.serializeURL = serializeURL; - -module.exports.serializeURLOrigin = function (url) { - // https://url.spec.whatwg.org/#concept-url-origin - switch (url.scheme) { - case "blob": - try { - return module.exports.serializeURLOrigin(module.exports.parseURL(url.path[0])); - } catch (e) { - // serializing an opaque origin returns "null" - return "null"; - } - case "ftp": - case "gopher": - case "http": - case "https": - case "ws": - case "wss": - return serializeOrigin({ - scheme: url.scheme, - host: url.host, - port: url.port - }); - case "file": - // spec says "exercise to the reader", chrome says "file://" - return "file://"; - default: - // serializing an opaque origin returns "null" - return "null"; - } -}; - -module.exports.basicURLParse = function (input, options) { - if (options === undefined) { - options = {}; - } - - const usm = new URLStateMachine(input, options.baseURL, options.encodingOverride, options.url, options.stateOverride); - if (usm.failure) { - return "failure"; - } - - return usm.url; -}; - -module.exports.setTheUsername = function (url, username) { - url.username = ""; - const decoded = punycode.ucs2.decode(username); - for (let i = 0; i < decoded.length; ++i) { - url.username += percentEncodeChar(decoded[i], isUserinfoPercentEncode); - } -}; - -module.exports.setThePassword = function (url, password) { - url.password = ""; - const decoded = punycode.ucs2.decode(password); - for (let i = 0; i < decoded.length; ++i) { - url.password += percentEncodeChar(decoded[i], isUserinfoPercentEncode); - } -}; - -module.exports.serializeHost = serializeHost; - -module.exports.cannotHaveAUsernamePasswordPort = cannotHaveAUsernamePasswordPort; - -module.exports.serializeInteger = function (integer) { - return String(integer); -}; - -module.exports.parseURL = function (input, options) { - if (options === undefined) { - options = {}; - } - - // We don't handle blobs, so this just delegates: - return module.exports.basicURLParse(input, { baseURL: options.baseURL, encodingOverride: options.encodingOverride }); -}; - - -/***/ }), - -/***/ 276: -/***/ ((module) => { - -"use strict"; - - -module.exports.mixin = function mixin(target, source) { - const keys = Object.getOwnPropertyNames(source); - for (let i = 0; i < keys.length; ++i) { - Object.defineProperty(target, keys[i], Object.getOwnPropertyDescriptor(source, keys[i])); - } -}; - -module.exports.wrapperSymbol = Symbol("wrapper"); -module.exports.implSymbol = Symbol("impl"); - -module.exports.wrapperForImpl = function (impl) { - return impl[module.exports.wrapperSymbol]; -}; - -module.exports.implForWrapper = function (wrapper) { - return wrapper[module.exports.implSymbol]; -}; - - - -/***/ }), - -/***/ 1223: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -var wrappy = __nccwpck_require__(2940) -module.exports = wrappy(once) -module.exports.strict = wrappy(onceStrict) - -once.proto = once(function () { - Object.defineProperty(Function.prototype, 'once', { - value: function () { - return once(this) - }, - configurable: true - }) - - Object.defineProperty(Function.prototype, 'onceStrict', { - value: function () { - return onceStrict(this) - }, - configurable: true - }) -}) - -function once (fn) { - var f = function () { - if (f.called) return f.value - f.called = true - return f.value = fn.apply(this, arguments) - } - f.called = false - return f -} - -function onceStrict (fn) { - var f = function () { - if (f.called) - throw new Error(f.onceError) - f.called = true - return f.value = fn.apply(this, arguments) - } - var name = fn.name || 'Function wrapped with `once`' - f.onceError = name + " shouldn't be called more than once" - f.called = false - return f -} - - -/***/ }), - -/***/ 4294: -/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { - -module.exports = __nccwpck_require__(4219); - - -/***/ }), - -/***/ 4219: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - - -var net = __nccwpck_require__(1808); -var tls = __nccwpck_require__(4404); -var http = __nccwpck_require__(3685); -var https = __nccwpck_require__(5687); -var events = __nccwpck_require__(2361); -var assert = __nccwpck_require__(9491); -var util = __nccwpck_require__(3837); - - -exports.httpOverHttp = httpOverHttp; -exports.httpsOverHttp = httpsOverHttp; -exports.httpOverHttps = httpOverHttps; -exports.httpsOverHttps = httpsOverHttps; - - -function httpOverHttp(options) { - var agent = new TunnelingAgent(options); - agent.request = http.request; - return agent; -} - -function httpsOverHttp(options) { - var agent = new TunnelingAgent(options); - agent.request = http.request; - agent.createSocket = createSecureSocket; - agent.defaultPort = 443; - return agent; -} - -function httpOverHttps(options) { - var agent = new TunnelingAgent(options); - agent.request = https.request; - return agent; -} - -function httpsOverHttps(options) { - var agent = new TunnelingAgent(options); - agent.request = https.request; - agent.createSocket = createSecureSocket; - agent.defaultPort = 443; - return agent; -} - - -function TunnelingAgent(options) { - var self = this; - self.options = options || {}; - self.proxyOptions = self.options.proxy || {}; - self.maxSockets = self.options.maxSockets || http.Agent.defaultMaxSockets; - self.requests = []; - self.sockets = []; - - self.on('free', function onFree(socket, host, port, localAddress) { - var options = toOptions(host, port, localAddress); - for (var i = 0, len = self.requests.length; i < len; ++i) { - var pending = self.requests[i]; - if (pending.host === options.host && pending.port === options.port) { - // Detect the request to connect same origin server, - // reuse the connection. - self.requests.splice(i, 1); - pending.request.onSocket(socket); - return; - } - } - socket.destroy(); - self.removeSocket(socket); - }); -} -util.inherits(TunnelingAgent, events.EventEmitter); - -TunnelingAgent.prototype.addRequest = function addRequest(req, host, port, localAddress) { - var self = this; - var options = mergeOptions({request: req}, self.options, toOptions(host, port, localAddress)); - - if (self.sockets.length >= this.maxSockets) { - // We are over limit so we'll add it to the queue. - self.requests.push(options); - return; - } - - // If we are under maxSockets create a new one. - self.createSocket(options, function(socket) { - socket.on('free', onFree); - socket.on('close', onCloseOrRemove); - socket.on('agentRemove', onCloseOrRemove); - req.onSocket(socket); - - function onFree() { - self.emit('free', socket, options); - } - - function onCloseOrRemove(err) { - self.removeSocket(socket); - socket.removeListener('free', onFree); - socket.removeListener('close', onCloseOrRemove); - socket.removeListener('agentRemove', onCloseOrRemove); - } - }); -}; - -TunnelingAgent.prototype.createSocket = function createSocket(options, cb) { - var self = this; - var placeholder = {}; - self.sockets.push(placeholder); - - var connectOptions = mergeOptions({}, self.proxyOptions, { - method: 'CONNECT', - path: options.host + ':' + options.port, - agent: false, - headers: { - host: options.host + ':' + options.port - } - }); - if (options.localAddress) { - connectOptions.localAddress = options.localAddress; - } - if (connectOptions.proxyAuth) { - connectOptions.headers = connectOptions.headers || {}; - connectOptions.headers['Proxy-Authorization'] = 'Basic ' + - new Buffer(connectOptions.proxyAuth).toString('base64'); - } - - debug('making CONNECT request'); - var connectReq = self.request(connectOptions); - connectReq.useChunkedEncodingByDefault = false; // for v0.6 - connectReq.once('response', onResponse); // for v0.6 - connectReq.once('upgrade', onUpgrade); // for v0.6 - connectReq.once('connect', onConnect); // for v0.7 or later - connectReq.once('error', onError); - connectReq.end(); - - function onResponse(res) { - // Very hacky. This is necessary to avoid http-parser leaks. - res.upgrade = true; - } - - function onUpgrade(res, socket, head) { - // Hacky. - process.nextTick(function() { - onConnect(res, socket, head); - }); - } - - function onConnect(res, socket, head) { - connectReq.removeAllListeners(); - socket.removeAllListeners(); - - if (res.statusCode !== 200) { - debug('tunneling socket could not be established, statusCode=%d', - res.statusCode); - socket.destroy(); - var error = new Error('tunneling socket could not be established, ' + - 'statusCode=' + res.statusCode); - error.code = 'ECONNRESET'; - options.request.emit('error', error); - self.removeSocket(placeholder); - return; - } - if (head.length > 0) { - debug('got illegal response body from proxy'); - socket.destroy(); - var error = new Error('got illegal response body from proxy'); - error.code = 'ECONNRESET'; - options.request.emit('error', error); - self.removeSocket(placeholder); - return; - } - debug('tunneling connection has established'); - self.sockets[self.sockets.indexOf(placeholder)] = socket; - return cb(socket); - } - - function onError(cause) { - connectReq.removeAllListeners(); - - debug('tunneling socket could not be established, cause=%s\n', - cause.message, cause.stack); - var error = new Error('tunneling socket could not be established, ' + - 'cause=' + cause.message); - error.code = 'ECONNRESET'; - options.request.emit('error', error); - self.removeSocket(placeholder); - } -}; - -TunnelingAgent.prototype.removeSocket = function removeSocket(socket) { - var pos = this.sockets.indexOf(socket) - if (pos === -1) { - return; - } - this.sockets.splice(pos, 1); - - var pending = this.requests.shift(); - if (pending) { - // If we have pending requests and a socket gets closed a new one - // needs to be created to take over in the pool for the one that closed. - this.createSocket(pending, function(socket) { - pending.request.onSocket(socket); - }); - } -}; - -function createSecureSocket(options, cb) { - var self = this; - TunnelingAgent.prototype.createSocket.call(self, options, function(socket) { - var hostHeader = options.request.getHeader('host'); - var tlsOptions = mergeOptions({}, self.options, { - socket: socket, - servername: hostHeader ? hostHeader.replace(/:.*$/, '') : options.host - }); - - // 0 is dummy port for v0.6 - var secureSocket = tls.connect(0, tlsOptions); - self.sockets[self.sockets.indexOf(socket)] = secureSocket; - cb(secureSocket); - }); -} - - -function toOptions(host, port, localAddress) { - if (typeof host === 'string') { // since v0.10 - return { - host: host, - port: port, - localAddress: localAddress - }; - } - return host; // for v0.11 or later -} - -function mergeOptions(target) { - for (var i = 1, len = arguments.length; i < len; ++i) { - var overrides = arguments[i]; - if (typeof overrides === 'object') { - var keys = Object.keys(overrides); - for (var j = 0, keyLen = keys.length; j < keyLen; ++j) { - var k = keys[j]; - if (overrides[k] !== undefined) { - target[k] = overrides[k]; - } - } - } - } - return target; -} - - -var debug; -if (process.env.NODE_DEBUG && /\btunnel\b/.test(process.env.NODE_DEBUG)) { - debug = function() { - var args = Array.prototype.slice.call(arguments); - if (typeof args[0] === 'string') { - args[0] = 'TUNNEL: ' + args[0]; - } else { - args.unshift('TUNNEL:'); - } - console.error.apply(console, args); - } -} else { - debug = function() {}; -} -exports.debug = debug; // for test - - -/***/ }), - -/***/ 5030: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - - -Object.defineProperty(exports, "__esModule", ({ value: true })); - -function getUserAgent() { - if (typeof navigator === "object" && "userAgent" in navigator) { - return navigator.userAgent; - } - - if (typeof process === "object" && "version" in process) { - return `Node.js/${process.version.substr(1)} (${process.platform}; ${process.arch})`; - } - - return ""; -} - -exports.getUserAgent = getUserAgent; -//# sourceMappingURL=index.js.map - - -/***/ }), - -/***/ 1452: -/***/ (function(__unused_webpack_module, exports) { - -/** - * @license - * web-streams-polyfill v3.3.3 - * Copyright 2024 Mattias Buelens, Diwank Singh Tomer and other contributors. - * This code is released under the MIT license. - * SPDX-License-Identifier: MIT - */ -(function (global, factory) { - true ? factory(exports) : - 0; -})(this, (function (exports) { 'use strict'; - - function noop() { - return undefined; - } - - function typeIsObject(x) { - return (typeof x === 'object' && x !== null) || typeof x === 'function'; - } - const rethrowAssertionErrorRejection = noop; - function setFunctionName(fn, name) { - try { - Object.defineProperty(fn, 'name', { - value: name, - configurable: true - }); - } - catch (_a) { - // This property is non-configurable in older browsers, so ignore if this throws. - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#browser_compatibility - } - } - - const originalPromise = Promise; - const originalPromiseThen = Promise.prototype.then; - const originalPromiseReject = Promise.reject.bind(originalPromise); - // https://webidl.spec.whatwg.org/#a-new-promise - function newPromise(executor) { - return new originalPromise(executor); - } - // https://webidl.spec.whatwg.org/#a-promise-resolved-with - function promiseResolvedWith(value) { - return newPromise(resolve => resolve(value)); - } - // https://webidl.spec.whatwg.org/#a-promise-rejected-with - function promiseRejectedWith(reason) { - return originalPromiseReject(reason); - } - function PerformPromiseThen(promise, onFulfilled, onRejected) { - // There doesn't appear to be any way to correctly emulate the behaviour from JavaScript, so this is just an - // approximation. - return originalPromiseThen.call(promise, onFulfilled, onRejected); - } - // Bluebird logs a warning when a promise is created within a fulfillment handler, but then isn't returned - // from that handler. To prevent this, return null instead of void from all handlers. - // http://bluebirdjs.com/docs/warning-explanations.html#warning-a-promise-was-created-in-a-handler-but-was-not-returned-from-it - function uponPromise(promise, onFulfilled, onRejected) { - PerformPromiseThen(PerformPromiseThen(promise, onFulfilled, onRejected), undefined, rethrowAssertionErrorRejection); - } - function uponFulfillment(promise, onFulfilled) { - uponPromise(promise, onFulfilled); - } - function uponRejection(promise, onRejected) { - uponPromise(promise, undefined, onRejected); - } - function transformPromiseWith(promise, fulfillmentHandler, rejectionHandler) { - return PerformPromiseThen(promise, fulfillmentHandler, rejectionHandler); - } - function setPromiseIsHandledToTrue(promise) { - PerformPromiseThen(promise, undefined, rethrowAssertionErrorRejection); - } - let _queueMicrotask = callback => { - if (typeof queueMicrotask === 'function') { - _queueMicrotask = queueMicrotask; - } - else { - const resolvedPromise = promiseResolvedWith(undefined); - _queueMicrotask = cb => PerformPromiseThen(resolvedPromise, cb); - } - return _queueMicrotask(callback); - }; - function reflectCall(F, V, args) { - if (typeof F !== 'function') { - throw new TypeError('Argument is not a function'); - } - return Function.prototype.apply.call(F, V, args); - } - function promiseCall(F, V, args) { - try { - return promiseResolvedWith(reflectCall(F, V, args)); - } - catch (value) { - return promiseRejectedWith(value); - } - } - - // Original from Chromium - // https://chromium.googlesource.com/chromium/src/+/0aee4434a4dba42a42abaea9bfbc0cd196a63bc1/third_party/blink/renderer/core/streams/SimpleQueue.js - const QUEUE_MAX_ARRAY_SIZE = 16384; - /** - * Simple queue structure. - * - * Avoids scalability issues with using a packed array directly by using - * multiple arrays in a linked list and keeping the array size bounded. - */ - class SimpleQueue { - constructor() { - this._cursor = 0; - this._size = 0; - // _front and _back are always defined. - this._front = { - _elements: [], - _next: undefined - }; - this._back = this._front; - // The cursor is used to avoid calling Array.shift(). - // It contains the index of the front element of the array inside the - // front-most node. It is always in the range [0, QUEUE_MAX_ARRAY_SIZE). - this._cursor = 0; - // When there is only one node, size === elements.length - cursor. - this._size = 0; - } - get length() { - return this._size; - } - // For exception safety, this method is structured in order: - // 1. Read state - // 2. Calculate required state mutations - // 3. Perform state mutations - push(element) { - const oldBack = this._back; - let newBack = oldBack; - if (oldBack._elements.length === QUEUE_MAX_ARRAY_SIZE - 1) { - newBack = { - _elements: [], - _next: undefined - }; - } - // push() is the mutation most likely to throw an exception, so it - // goes first. - oldBack._elements.push(element); - if (newBack !== oldBack) { - this._back = newBack; - oldBack._next = newBack; - } - ++this._size; - } - // Like push(), shift() follows the read -> calculate -> mutate pattern for - // exception safety. - shift() { // must not be called on an empty queue - const oldFront = this._front; - let newFront = oldFront; - const oldCursor = this._cursor; - let newCursor = oldCursor + 1; - const elements = oldFront._elements; - const element = elements[oldCursor]; - if (newCursor === QUEUE_MAX_ARRAY_SIZE) { - newFront = oldFront._next; - newCursor = 0; - } - // No mutations before this point. - --this._size; - this._cursor = newCursor; - if (oldFront !== newFront) { - this._front = newFront; - } - // Permit shifted element to be garbage collected. - elements[oldCursor] = undefined; - return element; - } - // The tricky thing about forEach() is that it can be called - // re-entrantly. The queue may be mutated inside the callback. It is easy to - // see that push() within the callback has no negative effects since the end - // of the queue is checked for on every iteration. If shift() is called - // repeatedly within the callback then the next iteration may return an - // element that has been removed. In this case the callback will be called - // with undefined values until we either "catch up" with elements that still - // exist or reach the back of the queue. - forEach(callback) { - let i = this._cursor; - let node = this._front; - let elements = node._elements; - while (i !== elements.length || node._next !== undefined) { - if (i === elements.length) { - node = node._next; - elements = node._elements; - i = 0; - if (elements.length === 0) { - break; - } - } - callback(elements[i]); - ++i; - } - } - // Return the element that would be returned if shift() was called now, - // without modifying the queue. - peek() { // must not be called on an empty queue - const front = this._front; - const cursor = this._cursor; - return front._elements[cursor]; - } - } - - const AbortSteps = Symbol('[[AbortSteps]]'); - const ErrorSteps = Symbol('[[ErrorSteps]]'); - const CancelSteps = Symbol('[[CancelSteps]]'); - const PullSteps = Symbol('[[PullSteps]]'); - const ReleaseSteps = Symbol('[[ReleaseSteps]]'); - - function ReadableStreamReaderGenericInitialize(reader, stream) { - reader._ownerReadableStream = stream; - stream._reader = reader; - if (stream._state === 'readable') { - defaultReaderClosedPromiseInitialize(reader); - } - else if (stream._state === 'closed') { - defaultReaderClosedPromiseInitializeAsResolved(reader); - } - else { - defaultReaderClosedPromiseInitializeAsRejected(reader, stream._storedError); - } - } - // A client of ReadableStreamDefaultReader and ReadableStreamBYOBReader may use these functions directly to bypass state - // check. - function ReadableStreamReaderGenericCancel(reader, reason) { - const stream = reader._ownerReadableStream; - return ReadableStreamCancel(stream, reason); - } - function ReadableStreamReaderGenericRelease(reader) { - const stream = reader._ownerReadableStream; - if (stream._state === 'readable') { - defaultReaderClosedPromiseReject(reader, new TypeError(`Reader was released and can no longer be used to monitor the stream's closedness`)); - } - else { - defaultReaderClosedPromiseResetToRejected(reader, new TypeError(`Reader was released and can no longer be used to monitor the stream's closedness`)); - } - stream._readableStreamController[ReleaseSteps](); - stream._reader = undefined; - reader._ownerReadableStream = undefined; - } - // Helper functions for the readers. - function readerLockException(name) { - return new TypeError('Cannot ' + name + ' a stream using a released reader'); - } - // Helper functions for the ReadableStreamDefaultReader. - function defaultReaderClosedPromiseInitialize(reader) { - reader._closedPromise = newPromise((resolve, reject) => { - reader._closedPromise_resolve = resolve; - reader._closedPromise_reject = reject; - }); - } - function defaultReaderClosedPromiseInitializeAsRejected(reader, reason) { - defaultReaderClosedPromiseInitialize(reader); - defaultReaderClosedPromiseReject(reader, reason); - } - function defaultReaderClosedPromiseInitializeAsResolved(reader) { - defaultReaderClosedPromiseInitialize(reader); - defaultReaderClosedPromiseResolve(reader); - } - function defaultReaderClosedPromiseReject(reader, reason) { - if (reader._closedPromise_reject === undefined) { - return; - } - setPromiseIsHandledToTrue(reader._closedPromise); - reader._closedPromise_reject(reason); - reader._closedPromise_resolve = undefined; - reader._closedPromise_reject = undefined; - } - function defaultReaderClosedPromiseResetToRejected(reader, reason) { - defaultReaderClosedPromiseInitializeAsRejected(reader, reason); - } - function defaultReaderClosedPromiseResolve(reader) { - if (reader._closedPromise_resolve === undefined) { - return; - } - reader._closedPromise_resolve(undefined); - reader._closedPromise_resolve = undefined; - reader._closedPromise_reject = undefined; - } - - /// - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isFinite#Polyfill - const NumberIsFinite = Number.isFinite || function (x) { - return typeof x === 'number' && isFinite(x); - }; - - /// - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc#Polyfill - const MathTrunc = Math.trunc || function (v) { - return v < 0 ? Math.ceil(v) : Math.floor(v); - }; - - // https://heycam.github.io/webidl/#idl-dictionaries - function isDictionary(x) { - return typeof x === 'object' || typeof x === 'function'; - } - function assertDictionary(obj, context) { - if (obj !== undefined && !isDictionary(obj)) { - throw new TypeError(`${context} is not an object.`); - } - } - // https://heycam.github.io/webidl/#idl-callback-functions - function assertFunction(x, context) { - if (typeof x !== 'function') { - throw new TypeError(`${context} is not a function.`); - } - } - // https://heycam.github.io/webidl/#idl-object - function isObject(x) { - return (typeof x === 'object' && x !== null) || typeof x === 'function'; - } - function assertObject(x, context) { - if (!isObject(x)) { - throw new TypeError(`${context} is not an object.`); - } - } - function assertRequiredArgument(x, position, context) { - if (x === undefined) { - throw new TypeError(`Parameter ${position} is required in '${context}'.`); - } - } - function assertRequiredField(x, field, context) { - if (x === undefined) { - throw new TypeError(`${field} is required in '${context}'.`); - } - } - // https://heycam.github.io/webidl/#idl-unrestricted-double - function convertUnrestrictedDouble(value) { - return Number(value); - } - function censorNegativeZero(x) { - return x === 0 ? 0 : x; - } - function integerPart(x) { - return censorNegativeZero(MathTrunc(x)); - } - // https://heycam.github.io/webidl/#idl-unsigned-long-long - function convertUnsignedLongLongWithEnforceRange(value, context) { - const lowerBound = 0; - const upperBound = Number.MAX_SAFE_INTEGER; - let x = Number(value); - x = censorNegativeZero(x); - if (!NumberIsFinite(x)) { - throw new TypeError(`${context} is not a finite number`); - } - x = integerPart(x); - if (x < lowerBound || x > upperBound) { - throw new TypeError(`${context} is outside the accepted range of ${lowerBound} to ${upperBound}, inclusive`); - } - if (!NumberIsFinite(x) || x === 0) { - return 0; - } - // TODO Use BigInt if supported? - // let xBigInt = BigInt(integerPart(x)); - // xBigInt = BigInt.asUintN(64, xBigInt); - // return Number(xBigInt); - return x; - } - - function assertReadableStream(x, context) { - if (!IsReadableStream(x)) { - throw new TypeError(`${context} is not a ReadableStream.`); - } - } - - // Abstract operations for the ReadableStream. - function AcquireReadableStreamDefaultReader(stream) { - return new ReadableStreamDefaultReader(stream); - } - // ReadableStream API exposed for controllers. - function ReadableStreamAddReadRequest(stream, readRequest) { - stream._reader._readRequests.push(readRequest); - } - function ReadableStreamFulfillReadRequest(stream, chunk, done) { - const reader = stream._reader; - const readRequest = reader._readRequests.shift(); - if (done) { - readRequest._closeSteps(); - } - else { - readRequest._chunkSteps(chunk); - } - } - function ReadableStreamGetNumReadRequests(stream) { - return stream._reader._readRequests.length; - } - function ReadableStreamHasDefaultReader(stream) { - const reader = stream._reader; - if (reader === undefined) { - return false; - } - if (!IsReadableStreamDefaultReader(reader)) { - return false; - } - return true; - } - /** - * A default reader vended by a {@link ReadableStream}. - * - * @public - */ - class ReadableStreamDefaultReader { - constructor(stream) { - assertRequiredArgument(stream, 1, 'ReadableStreamDefaultReader'); - assertReadableStream(stream, 'First parameter'); - if (IsReadableStreamLocked(stream)) { - throw new TypeError('This stream has already been locked for exclusive reading by another reader'); - } - ReadableStreamReaderGenericInitialize(this, stream); - this._readRequests = new SimpleQueue(); - } - /** - * Returns a promise that will be fulfilled when the stream becomes closed, - * or rejected if the stream ever errors or the reader's lock is released before the stream finishes closing. - */ - get closed() { - if (!IsReadableStreamDefaultReader(this)) { - return promiseRejectedWith(defaultReaderBrandCheckException('closed')); - } - return this._closedPromise; - } - /** - * If the reader is active, behaves the same as {@link ReadableStream.cancel | stream.cancel(reason)}. - */ - cancel(reason = undefined) { - if (!IsReadableStreamDefaultReader(this)) { - return promiseRejectedWith(defaultReaderBrandCheckException('cancel')); - } - if (this._ownerReadableStream === undefined) { - return promiseRejectedWith(readerLockException('cancel')); - } - return ReadableStreamReaderGenericCancel(this, reason); - } - /** - * Returns a promise that allows access to the next chunk from the stream's internal queue, if available. - * - * If reading a chunk causes the queue to become empty, more data will be pulled from the underlying source. - */ - read() { - if (!IsReadableStreamDefaultReader(this)) { - return promiseRejectedWith(defaultReaderBrandCheckException('read')); - } - if (this._ownerReadableStream === undefined) { - return promiseRejectedWith(readerLockException('read from')); - } - let resolvePromise; - let rejectPromise; - const promise = newPromise((resolve, reject) => { - resolvePromise = resolve; - rejectPromise = reject; - }); - const readRequest = { - _chunkSteps: chunk => resolvePromise({ value: chunk, done: false }), - _closeSteps: () => resolvePromise({ value: undefined, done: true }), - _errorSteps: e => rejectPromise(e) - }; - ReadableStreamDefaultReaderRead(this, readRequest); - return promise; - } - /** - * Releases the reader's lock on the corresponding stream. After the lock is released, the reader is no longer active. - * If the associated stream is errored when the lock is released, the reader will appear errored in the same way - * from now on; otherwise, the reader will appear closed. - * - * A reader's lock cannot be released while it still has a pending read request, i.e., if a promise returned by - * the reader's {@link ReadableStreamDefaultReader.read | read()} method has not yet been settled. Attempting to - * do so will throw a `TypeError` and leave the reader locked to the stream. - */ - releaseLock() { - if (!IsReadableStreamDefaultReader(this)) { - throw defaultReaderBrandCheckException('releaseLock'); - } - if (this._ownerReadableStream === undefined) { - return; - } - ReadableStreamDefaultReaderRelease(this); - } - } - Object.defineProperties(ReadableStreamDefaultReader.prototype, { - cancel: { enumerable: true }, - read: { enumerable: true }, - releaseLock: { enumerable: true }, - closed: { enumerable: true } - }); - setFunctionName(ReadableStreamDefaultReader.prototype.cancel, 'cancel'); - setFunctionName(ReadableStreamDefaultReader.prototype.read, 'read'); - setFunctionName(ReadableStreamDefaultReader.prototype.releaseLock, 'releaseLock'); - if (typeof Symbol.toStringTag === 'symbol') { - Object.defineProperty(ReadableStreamDefaultReader.prototype, Symbol.toStringTag, { - value: 'ReadableStreamDefaultReader', - configurable: true - }); - } - // Abstract operations for the readers. - function IsReadableStreamDefaultReader(x) { - if (!typeIsObject(x)) { - return false; - } - if (!Object.prototype.hasOwnProperty.call(x, '_readRequests')) { - return false; - } - return x instanceof ReadableStreamDefaultReader; - } - function ReadableStreamDefaultReaderRead(reader, readRequest) { - const stream = reader._ownerReadableStream; - stream._disturbed = true; - if (stream._state === 'closed') { - readRequest._closeSteps(); - } - else if (stream._state === 'errored') { - readRequest._errorSteps(stream._storedError); - } - else { - stream._readableStreamController[PullSteps](readRequest); - } - } - function ReadableStreamDefaultReaderRelease(reader) { - ReadableStreamReaderGenericRelease(reader); - const e = new TypeError('Reader was released'); - ReadableStreamDefaultReaderErrorReadRequests(reader, e); - } - function ReadableStreamDefaultReaderErrorReadRequests(reader, e) { - const readRequests = reader._readRequests; - reader._readRequests = new SimpleQueue(); - readRequests.forEach(readRequest => { - readRequest._errorSteps(e); - }); - } - // Helper functions for the ReadableStreamDefaultReader. - function defaultReaderBrandCheckException(name) { - return new TypeError(`ReadableStreamDefaultReader.prototype.${name} can only be used on a ReadableStreamDefaultReader`); - } - - /// - /* eslint-disable @typescript-eslint/no-empty-function */ - const AsyncIteratorPrototype = Object.getPrototypeOf(Object.getPrototypeOf(async function* () { }).prototype); - - /// - class ReadableStreamAsyncIteratorImpl { - constructor(reader, preventCancel) { - this._ongoingPromise = undefined; - this._isFinished = false; - this._reader = reader; - this._preventCancel = preventCancel; - } - next() { - const nextSteps = () => this._nextSteps(); - this._ongoingPromise = this._ongoingPromise ? - transformPromiseWith(this._ongoingPromise, nextSteps, nextSteps) : - nextSteps(); - return this._ongoingPromise; - } - return(value) { - const returnSteps = () => this._returnSteps(value); - return this._ongoingPromise ? - transformPromiseWith(this._ongoingPromise, returnSteps, returnSteps) : - returnSteps(); - } - _nextSteps() { - if (this._isFinished) { - return Promise.resolve({ value: undefined, done: true }); - } - const reader = this._reader; - let resolvePromise; - let rejectPromise; - const promise = newPromise((resolve, reject) => { - resolvePromise = resolve; - rejectPromise = reject; - }); - const readRequest = { - _chunkSteps: chunk => { - this._ongoingPromise = undefined; - // This needs to be delayed by one microtask, otherwise we stop pulling too early which breaks a test. - // FIXME Is this a bug in the specification, or in the test? - _queueMicrotask(() => resolvePromise({ value: chunk, done: false })); - }, - _closeSteps: () => { - this._ongoingPromise = undefined; - this._isFinished = true; - ReadableStreamReaderGenericRelease(reader); - resolvePromise({ value: undefined, done: true }); - }, - _errorSteps: reason => { - this._ongoingPromise = undefined; - this._isFinished = true; - ReadableStreamReaderGenericRelease(reader); - rejectPromise(reason); - } - }; - ReadableStreamDefaultReaderRead(reader, readRequest); - return promise; - } - _returnSteps(value) { - if (this._isFinished) { - return Promise.resolve({ value, done: true }); - } - this._isFinished = true; - const reader = this._reader; - if (!this._preventCancel) { - const result = ReadableStreamReaderGenericCancel(reader, value); - ReadableStreamReaderGenericRelease(reader); - return transformPromiseWith(result, () => ({ value, done: true })); - } - ReadableStreamReaderGenericRelease(reader); - return promiseResolvedWith({ value, done: true }); - } - } - const ReadableStreamAsyncIteratorPrototype = { - next() { - if (!IsReadableStreamAsyncIterator(this)) { - return promiseRejectedWith(streamAsyncIteratorBrandCheckException('next')); - } - return this._asyncIteratorImpl.next(); - }, - return(value) { - if (!IsReadableStreamAsyncIterator(this)) { - return promiseRejectedWith(streamAsyncIteratorBrandCheckException('return')); - } - return this._asyncIteratorImpl.return(value); - } - }; - Object.setPrototypeOf(ReadableStreamAsyncIteratorPrototype, AsyncIteratorPrototype); - // Abstract operations for the ReadableStream. - function AcquireReadableStreamAsyncIterator(stream, preventCancel) { - const reader = AcquireReadableStreamDefaultReader(stream); - const impl = new ReadableStreamAsyncIteratorImpl(reader, preventCancel); - const iterator = Object.create(ReadableStreamAsyncIteratorPrototype); - iterator._asyncIteratorImpl = impl; - return iterator; - } - function IsReadableStreamAsyncIterator(x) { - if (!typeIsObject(x)) { - return false; - } - if (!Object.prototype.hasOwnProperty.call(x, '_asyncIteratorImpl')) { - return false; - } - try { - // noinspection SuspiciousTypeOfGuard - return x._asyncIteratorImpl instanceof - ReadableStreamAsyncIteratorImpl; - } - catch (_a) { - return false; - } - } - // Helper functions for the ReadableStream. - function streamAsyncIteratorBrandCheckException(name) { - return new TypeError(`ReadableStreamAsyncIterator.${name} can only be used on a ReadableSteamAsyncIterator`); - } - - /// - // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/isNaN#Polyfill - const NumberIsNaN = Number.isNaN || function (x) { - // eslint-disable-next-line no-self-compare - return x !== x; - }; - - var _a, _b, _c; - function CreateArrayFromList(elements) { - // We use arrays to represent lists, so this is basically a no-op. - // Do a slice though just in case we happen to depend on the unique-ness. - return elements.slice(); - } - function CopyDataBlockBytes(dest, destOffset, src, srcOffset, n) { - new Uint8Array(dest).set(new Uint8Array(src, srcOffset, n), destOffset); - } - let TransferArrayBuffer = (O) => { - if (typeof O.transfer === 'function') { - TransferArrayBuffer = buffer => buffer.transfer(); - } - else if (typeof structuredClone === 'function') { - TransferArrayBuffer = buffer => structuredClone(buffer, { transfer: [buffer] }); - } - else { - // Not implemented correctly - TransferArrayBuffer = buffer => buffer; - } - return TransferArrayBuffer(O); - }; - let IsDetachedBuffer = (O) => { - if (typeof O.detached === 'boolean') { - IsDetachedBuffer = buffer => buffer.detached; - } - else { - // Not implemented correctly - IsDetachedBuffer = buffer => buffer.byteLength === 0; - } - return IsDetachedBuffer(O); - }; - function ArrayBufferSlice(buffer, begin, end) { - // ArrayBuffer.prototype.slice is not available on IE10 - // https://www.caniuse.com/mdn-javascript_builtins_arraybuffer_slice - if (buffer.slice) { - return buffer.slice(begin, end); - } - const length = end - begin; - const slice = new ArrayBuffer(length); - CopyDataBlockBytes(slice, 0, buffer, begin, length); - return slice; - } - function GetMethod(receiver, prop) { - const func = receiver[prop]; - if (func === undefined || func === null) { - return undefined; - } - if (typeof func !== 'function') { - throw new TypeError(`${String(prop)} is not a function`); - } - return func; - } - function CreateAsyncFromSyncIterator(syncIteratorRecord) { - // Instead of re-implementing CreateAsyncFromSyncIterator and %AsyncFromSyncIteratorPrototype%, - // we use yield* inside an async generator function to achieve the same result. - // Wrap the sync iterator inside a sync iterable, so we can use it with yield*. - const syncIterable = { - [Symbol.iterator]: () => syncIteratorRecord.iterator - }; - // Create an async generator function and immediately invoke it. - const asyncIterator = (async function* () { - return yield* syncIterable; - }()); - // Return as an async iterator record. - const nextMethod = asyncIterator.next; - return { iterator: asyncIterator, nextMethod, done: false }; - } - // Aligns with core-js/modules/es.symbol.async-iterator.js - const SymbolAsyncIterator = (_c = (_a = Symbol.asyncIterator) !== null && _a !== void 0 ? _a : (_b = Symbol.for) === null || _b === void 0 ? void 0 : _b.call(Symbol, 'Symbol.asyncIterator')) !== null && _c !== void 0 ? _c : '@@asyncIterator'; - function GetIterator(obj, hint = 'sync', method) { - if (method === undefined) { - if (hint === 'async') { - method = GetMethod(obj, SymbolAsyncIterator); - if (method === undefined) { - const syncMethod = GetMethod(obj, Symbol.iterator); - const syncIteratorRecord = GetIterator(obj, 'sync', syncMethod); - return CreateAsyncFromSyncIterator(syncIteratorRecord); - } - } - else { - method = GetMethod(obj, Symbol.iterator); - } - } - if (method === undefined) { - throw new TypeError('The object is not iterable'); - } - const iterator = reflectCall(method, obj, []); - if (!typeIsObject(iterator)) { - throw new TypeError('The iterator method must return an object'); - } - const nextMethod = iterator.next; - return { iterator, nextMethod, done: false }; - } - function IteratorNext(iteratorRecord) { - const result = reflectCall(iteratorRecord.nextMethod, iteratorRecord.iterator, []); - if (!typeIsObject(result)) { - throw new TypeError('The iterator.next() method must return an object'); - } - return result; - } - function IteratorComplete(iterResult) { - return Boolean(iterResult.done); - } - function IteratorValue(iterResult) { - return iterResult.value; - } - - function IsNonNegativeNumber(v) { - if (typeof v !== 'number') { - return false; - } - if (NumberIsNaN(v)) { - return false; - } - if (v < 0) { - return false; - } - return true; - } - function CloneAsUint8Array(O) { - const buffer = ArrayBufferSlice(O.buffer, O.byteOffset, O.byteOffset + O.byteLength); - return new Uint8Array(buffer); - } - - function DequeueValue(container) { - const pair = container._queue.shift(); - container._queueTotalSize -= pair.size; - if (container._queueTotalSize < 0) { - container._queueTotalSize = 0; - } - return pair.value; - } - function EnqueueValueWithSize(container, value, size) { - if (!IsNonNegativeNumber(size) || size === Infinity) { - throw new RangeError('Size must be a finite, non-NaN, non-negative number.'); - } - container._queue.push({ value, size }); - container._queueTotalSize += size; - } - function PeekQueueValue(container) { - const pair = container._queue.peek(); - return pair.value; - } - function ResetQueue(container) { - container._queue = new SimpleQueue(); - container._queueTotalSize = 0; - } - - function isDataViewConstructor(ctor) { - return ctor === DataView; - } - function isDataView(view) { - return isDataViewConstructor(view.constructor); - } - function arrayBufferViewElementSize(ctor) { - if (isDataViewConstructor(ctor)) { - return 1; - } - return ctor.BYTES_PER_ELEMENT; - } - - /** - * A pull-into request in a {@link ReadableByteStreamController}. - * - * @public - */ - class ReadableStreamBYOBRequest { - constructor() { - throw new TypeError('Illegal constructor'); - } - /** - * Returns the view for writing in to, or `null` if the BYOB request has already been responded to. - */ - get view() { - if (!IsReadableStreamBYOBRequest(this)) { - throw byobRequestBrandCheckException('view'); - } - return this._view; - } - respond(bytesWritten) { - if (!IsReadableStreamBYOBRequest(this)) { - throw byobRequestBrandCheckException('respond'); - } - assertRequiredArgument(bytesWritten, 1, 'respond'); - bytesWritten = convertUnsignedLongLongWithEnforceRange(bytesWritten, 'First parameter'); - if (this._associatedReadableByteStreamController === undefined) { - throw new TypeError('This BYOB request has been invalidated'); - } - if (IsDetachedBuffer(this._view.buffer)) { - throw new TypeError(`The BYOB request's buffer has been detached and so cannot be used as a response`); - } - ReadableByteStreamControllerRespond(this._associatedReadableByteStreamController, bytesWritten); - } - respondWithNewView(view) { - if (!IsReadableStreamBYOBRequest(this)) { - throw byobRequestBrandCheckException('respondWithNewView'); - } - assertRequiredArgument(view, 1, 'respondWithNewView'); - if (!ArrayBuffer.isView(view)) { - throw new TypeError('You can only respond with array buffer views'); - } - if (this._associatedReadableByteStreamController === undefined) { - throw new TypeError('This BYOB request has been invalidated'); - } - if (IsDetachedBuffer(view.buffer)) { - throw new TypeError('The given view\'s buffer has been detached and so cannot be used as a response'); - } - ReadableByteStreamControllerRespondWithNewView(this._associatedReadableByteStreamController, view); - } - } - Object.defineProperties(ReadableStreamBYOBRequest.prototype, { - respond: { enumerable: true }, - respondWithNewView: { enumerable: true }, - view: { enumerable: true } - }); - setFunctionName(ReadableStreamBYOBRequest.prototype.respond, 'respond'); - setFunctionName(ReadableStreamBYOBRequest.prototype.respondWithNewView, 'respondWithNewView'); - if (typeof Symbol.toStringTag === 'symbol') { - Object.defineProperty(ReadableStreamBYOBRequest.prototype, Symbol.toStringTag, { - value: 'ReadableStreamBYOBRequest', - configurable: true - }); - } - /** - * Allows control of a {@link ReadableStream | readable byte stream}'s state and internal queue. - * - * @public - */ - class ReadableByteStreamController { - constructor() { - throw new TypeError('Illegal constructor'); - } - /** - * Returns the current BYOB pull request, or `null` if there isn't one. - */ - get byobRequest() { - if (!IsReadableByteStreamController(this)) { - throw byteStreamControllerBrandCheckException('byobRequest'); - } - return ReadableByteStreamControllerGetBYOBRequest(this); - } - /** - * Returns the desired size to fill the controlled stream's internal queue. It can be negative, if the queue is - * over-full. An underlying byte source ought to use this information to determine when and how to apply backpressure. - */ - get desiredSize() { - if (!IsReadableByteStreamController(this)) { - throw byteStreamControllerBrandCheckException('desiredSize'); - } - return ReadableByteStreamControllerGetDesiredSize(this); - } - /** - * Closes the controlled readable stream. Consumers will still be able to read any previously-enqueued chunks from - * the stream, but once those are read, the stream will become closed. - */ - close() { - if (!IsReadableByteStreamController(this)) { - throw byteStreamControllerBrandCheckException('close'); - } - if (this._closeRequested) { - throw new TypeError('The stream has already been closed; do not close it again!'); - } - const state = this._controlledReadableByteStream._state; - if (state !== 'readable') { - throw new TypeError(`The stream (in ${state} state) is not in the readable state and cannot be closed`); - } - ReadableByteStreamControllerClose(this); - } - enqueue(chunk) { - if (!IsReadableByteStreamController(this)) { - throw byteStreamControllerBrandCheckException('enqueue'); - } - assertRequiredArgument(chunk, 1, 'enqueue'); - if (!ArrayBuffer.isView(chunk)) { - throw new TypeError('chunk must be an array buffer view'); - } - if (chunk.byteLength === 0) { - throw new TypeError('chunk must have non-zero byteLength'); - } - if (chunk.buffer.byteLength === 0) { - throw new TypeError(`chunk's buffer must have non-zero byteLength`); - } - if (this._closeRequested) { - throw new TypeError('stream is closed or draining'); - } - const state = this._controlledReadableByteStream._state; - if (state !== 'readable') { - throw new TypeError(`The stream (in ${state} state) is not in the readable state and cannot be enqueued to`); - } - ReadableByteStreamControllerEnqueue(this, chunk); - } - /** - * Errors the controlled readable stream, making all future interactions with it fail with the given error `e`. - */ - error(e = undefined) { - if (!IsReadableByteStreamController(this)) { - throw byteStreamControllerBrandCheckException('error'); - } - ReadableByteStreamControllerError(this, e); - } - /** @internal */ - [CancelSteps](reason) { - ReadableByteStreamControllerClearPendingPullIntos(this); - ResetQueue(this); - const result = this._cancelAlgorithm(reason); - ReadableByteStreamControllerClearAlgorithms(this); - return result; - } - /** @internal */ - [PullSteps](readRequest) { - const stream = this._controlledReadableByteStream; - if (this._queueTotalSize > 0) { - ReadableByteStreamControllerFillReadRequestFromQueue(this, readRequest); - return; - } - const autoAllocateChunkSize = this._autoAllocateChunkSize; - if (autoAllocateChunkSize !== undefined) { - let buffer; - try { - buffer = new ArrayBuffer(autoAllocateChunkSize); - } - catch (bufferE) { - readRequest._errorSteps(bufferE); - return; - } - const pullIntoDescriptor = { - buffer, - bufferByteLength: autoAllocateChunkSize, - byteOffset: 0, - byteLength: autoAllocateChunkSize, - bytesFilled: 0, - minimumFill: 1, - elementSize: 1, - viewConstructor: Uint8Array, - readerType: 'default' - }; - this._pendingPullIntos.push(pullIntoDescriptor); - } - ReadableStreamAddReadRequest(stream, readRequest); - ReadableByteStreamControllerCallPullIfNeeded(this); - } - /** @internal */ - [ReleaseSteps]() { - if (this._pendingPullIntos.length > 0) { - const firstPullInto = this._pendingPullIntos.peek(); - firstPullInto.readerType = 'none'; - this._pendingPullIntos = new SimpleQueue(); - this._pendingPullIntos.push(firstPullInto); - } - } - } - Object.defineProperties(ReadableByteStreamController.prototype, { - close: { enumerable: true }, - enqueue: { enumerable: true }, - error: { enumerable: true }, - byobRequest: { enumerable: true }, - desiredSize: { enumerable: true } - }); - setFunctionName(ReadableByteStreamController.prototype.close, 'close'); - setFunctionName(ReadableByteStreamController.prototype.enqueue, 'enqueue'); - setFunctionName(ReadableByteStreamController.prototype.error, 'error'); - if (typeof Symbol.toStringTag === 'symbol') { - Object.defineProperty(ReadableByteStreamController.prototype, Symbol.toStringTag, { - value: 'ReadableByteStreamController', - configurable: true - }); - } - // Abstract operations for the ReadableByteStreamController. - function IsReadableByteStreamController(x) { - if (!typeIsObject(x)) { - return false; - } - if (!Object.prototype.hasOwnProperty.call(x, '_controlledReadableByteStream')) { - return false; - } - return x instanceof ReadableByteStreamController; - } - function IsReadableStreamBYOBRequest(x) { - if (!typeIsObject(x)) { - return false; - } - if (!Object.prototype.hasOwnProperty.call(x, '_associatedReadableByteStreamController')) { - return false; - } - return x instanceof ReadableStreamBYOBRequest; - } - function ReadableByteStreamControllerCallPullIfNeeded(controller) { - const shouldPull = ReadableByteStreamControllerShouldCallPull(controller); - if (!shouldPull) { - return; - } - if (controller._pulling) { - controller._pullAgain = true; - return; - } - controller._pulling = true; - // TODO: Test controller argument - const pullPromise = controller._pullAlgorithm(); - uponPromise(pullPromise, () => { - controller._pulling = false; - if (controller._pullAgain) { - controller._pullAgain = false; - ReadableByteStreamControllerCallPullIfNeeded(controller); - } - return null; - }, e => { - ReadableByteStreamControllerError(controller, e); - return null; - }); - } - function ReadableByteStreamControllerClearPendingPullIntos(controller) { - ReadableByteStreamControllerInvalidateBYOBRequest(controller); - controller._pendingPullIntos = new SimpleQueue(); - } - function ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor) { - let done = false; - if (stream._state === 'closed') { - done = true; - } - const filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor); - if (pullIntoDescriptor.readerType === 'default') { - ReadableStreamFulfillReadRequest(stream, filledView, done); - } - else { - ReadableStreamFulfillReadIntoRequest(stream, filledView, done); - } - } - function ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor) { - const bytesFilled = pullIntoDescriptor.bytesFilled; - const elementSize = pullIntoDescriptor.elementSize; - return new pullIntoDescriptor.viewConstructor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, bytesFilled / elementSize); - } - function ReadableByteStreamControllerEnqueueChunkToQueue(controller, buffer, byteOffset, byteLength) { - controller._queue.push({ buffer, byteOffset, byteLength }); - controller._queueTotalSize += byteLength; - } - function ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, buffer, byteOffset, byteLength) { - let clonedChunk; - try { - clonedChunk = ArrayBufferSlice(buffer, byteOffset, byteOffset + byteLength); - } - catch (cloneE) { - ReadableByteStreamControllerError(controller, cloneE); - throw cloneE; - } - ReadableByteStreamControllerEnqueueChunkToQueue(controller, clonedChunk, 0, byteLength); - } - function ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, firstDescriptor) { - if (firstDescriptor.bytesFilled > 0) { - ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, firstDescriptor.buffer, firstDescriptor.byteOffset, firstDescriptor.bytesFilled); - } - ReadableByteStreamControllerShiftPendingPullInto(controller); - } - function ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor) { - const maxBytesToCopy = Math.min(controller._queueTotalSize, pullIntoDescriptor.byteLength - pullIntoDescriptor.bytesFilled); - const maxBytesFilled = pullIntoDescriptor.bytesFilled + maxBytesToCopy; - let totalBytesToCopyRemaining = maxBytesToCopy; - let ready = false; - const remainderBytes = maxBytesFilled % pullIntoDescriptor.elementSize; - const maxAlignedBytes = maxBytesFilled - remainderBytes; - // A descriptor for a read() request that is not yet filled up to its minimum length will stay at the head - // of the queue, so the underlying source can keep filling it. - if (maxAlignedBytes >= pullIntoDescriptor.minimumFill) { - totalBytesToCopyRemaining = maxAlignedBytes - pullIntoDescriptor.bytesFilled; - ready = true; - } - const queue = controller._queue; - while (totalBytesToCopyRemaining > 0) { - const headOfQueue = queue.peek(); - const bytesToCopy = Math.min(totalBytesToCopyRemaining, headOfQueue.byteLength); - const destStart = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled; - CopyDataBlockBytes(pullIntoDescriptor.buffer, destStart, headOfQueue.buffer, headOfQueue.byteOffset, bytesToCopy); - if (headOfQueue.byteLength === bytesToCopy) { - queue.shift(); - } - else { - headOfQueue.byteOffset += bytesToCopy; - headOfQueue.byteLength -= bytesToCopy; - } - controller._queueTotalSize -= bytesToCopy; - ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesToCopy, pullIntoDescriptor); - totalBytesToCopyRemaining -= bytesToCopy; - } - return ready; - } - function ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, size, pullIntoDescriptor) { - pullIntoDescriptor.bytesFilled += size; - } - function ReadableByteStreamControllerHandleQueueDrain(controller) { - if (controller._queueTotalSize === 0 && controller._closeRequested) { - ReadableByteStreamControllerClearAlgorithms(controller); - ReadableStreamClose(controller._controlledReadableByteStream); - } - else { - ReadableByteStreamControllerCallPullIfNeeded(controller); - } - } - function ReadableByteStreamControllerInvalidateBYOBRequest(controller) { - if (controller._byobRequest === null) { - return; - } - controller._byobRequest._associatedReadableByteStreamController = undefined; - controller._byobRequest._view = null; - controller._byobRequest = null; - } - function ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller) { - while (controller._pendingPullIntos.length > 0) { - if (controller._queueTotalSize === 0) { - return; - } - const pullIntoDescriptor = controller._pendingPullIntos.peek(); - if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor)) { - ReadableByteStreamControllerShiftPendingPullInto(controller); - ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableByteStream, pullIntoDescriptor); - } - } - } - function ReadableByteStreamControllerProcessReadRequestsUsingQueue(controller) { - const reader = controller._controlledReadableByteStream._reader; - while (reader._readRequests.length > 0) { - if (controller._queueTotalSize === 0) { - return; - } - const readRequest = reader._readRequests.shift(); - ReadableByteStreamControllerFillReadRequestFromQueue(controller, readRequest); - } - } - function ReadableByteStreamControllerPullInto(controller, view, min, readIntoRequest) { - const stream = controller._controlledReadableByteStream; - const ctor = view.constructor; - const elementSize = arrayBufferViewElementSize(ctor); - const { byteOffset, byteLength } = view; - const minimumFill = min * elementSize; - let buffer; - try { - buffer = TransferArrayBuffer(view.buffer); - } - catch (e) { - readIntoRequest._errorSteps(e); - return; - } - const pullIntoDescriptor = { - buffer, - bufferByteLength: buffer.byteLength, - byteOffset, - byteLength, - bytesFilled: 0, - minimumFill, - elementSize, - viewConstructor: ctor, - readerType: 'byob' - }; - if (controller._pendingPullIntos.length > 0) { - controller._pendingPullIntos.push(pullIntoDescriptor); - // No ReadableByteStreamControllerCallPullIfNeeded() call since: - // - No change happens on desiredSize - // - The source has already been notified of that there's at least 1 pending read(view) - ReadableStreamAddReadIntoRequest(stream, readIntoRequest); - return; - } - if (stream._state === 'closed') { - const emptyView = new ctor(pullIntoDescriptor.buffer, pullIntoDescriptor.byteOffset, 0); - readIntoRequest._closeSteps(emptyView); - return; - } - if (controller._queueTotalSize > 0) { - if (ReadableByteStreamControllerFillPullIntoDescriptorFromQueue(controller, pullIntoDescriptor)) { - const filledView = ReadableByteStreamControllerConvertPullIntoDescriptor(pullIntoDescriptor); - ReadableByteStreamControllerHandleQueueDrain(controller); - readIntoRequest._chunkSteps(filledView); - return; - } - if (controller._closeRequested) { - const e = new TypeError('Insufficient bytes to fill elements in the given buffer'); - ReadableByteStreamControllerError(controller, e); - readIntoRequest._errorSteps(e); - return; - } - } - controller._pendingPullIntos.push(pullIntoDescriptor); - ReadableStreamAddReadIntoRequest(stream, readIntoRequest); - ReadableByteStreamControllerCallPullIfNeeded(controller); - } - function ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor) { - if (firstDescriptor.readerType === 'none') { - ReadableByteStreamControllerShiftPendingPullInto(controller); - } - const stream = controller._controlledReadableByteStream; - if (ReadableStreamHasBYOBReader(stream)) { - while (ReadableStreamGetNumReadIntoRequests(stream) > 0) { - const pullIntoDescriptor = ReadableByteStreamControllerShiftPendingPullInto(controller); - ReadableByteStreamControllerCommitPullIntoDescriptor(stream, pullIntoDescriptor); - } - } - } - function ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, pullIntoDescriptor) { - ReadableByteStreamControllerFillHeadPullIntoDescriptor(controller, bytesWritten, pullIntoDescriptor); - if (pullIntoDescriptor.readerType === 'none') { - ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, pullIntoDescriptor); - ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); - return; - } - if (pullIntoDescriptor.bytesFilled < pullIntoDescriptor.minimumFill) { - // A descriptor for a read() request that is not yet filled up to its minimum length will stay at the head - // of the queue, so the underlying source can keep filling it. - return; - } - ReadableByteStreamControllerShiftPendingPullInto(controller); - const remainderSize = pullIntoDescriptor.bytesFilled % pullIntoDescriptor.elementSize; - if (remainderSize > 0) { - const end = pullIntoDescriptor.byteOffset + pullIntoDescriptor.bytesFilled; - ReadableByteStreamControllerEnqueueClonedChunkToQueue(controller, pullIntoDescriptor.buffer, end - remainderSize, remainderSize); - } - pullIntoDescriptor.bytesFilled -= remainderSize; - ReadableByteStreamControllerCommitPullIntoDescriptor(controller._controlledReadableByteStream, pullIntoDescriptor); - ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); - } - function ReadableByteStreamControllerRespondInternal(controller, bytesWritten) { - const firstDescriptor = controller._pendingPullIntos.peek(); - ReadableByteStreamControllerInvalidateBYOBRequest(controller); - const state = controller._controlledReadableByteStream._state; - if (state === 'closed') { - ReadableByteStreamControllerRespondInClosedState(controller, firstDescriptor); - } - else { - ReadableByteStreamControllerRespondInReadableState(controller, bytesWritten, firstDescriptor); - } - ReadableByteStreamControllerCallPullIfNeeded(controller); - } - function ReadableByteStreamControllerShiftPendingPullInto(controller) { - const descriptor = controller._pendingPullIntos.shift(); - return descriptor; - } - function ReadableByteStreamControllerShouldCallPull(controller) { - const stream = controller._controlledReadableByteStream; - if (stream._state !== 'readable') { - return false; - } - if (controller._closeRequested) { - return false; - } - if (!controller._started) { - return false; - } - if (ReadableStreamHasDefaultReader(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { - return true; - } - if (ReadableStreamHasBYOBReader(stream) && ReadableStreamGetNumReadIntoRequests(stream) > 0) { - return true; - } - const desiredSize = ReadableByteStreamControllerGetDesiredSize(controller); - if (desiredSize > 0) { - return true; - } - return false; - } - function ReadableByteStreamControllerClearAlgorithms(controller) { - controller._pullAlgorithm = undefined; - controller._cancelAlgorithm = undefined; - } - // A client of ReadableByteStreamController may use these functions directly to bypass state check. - function ReadableByteStreamControllerClose(controller) { - const stream = controller._controlledReadableByteStream; - if (controller._closeRequested || stream._state !== 'readable') { - return; - } - if (controller._queueTotalSize > 0) { - controller._closeRequested = true; - return; - } - if (controller._pendingPullIntos.length > 0) { - const firstPendingPullInto = controller._pendingPullIntos.peek(); - if (firstPendingPullInto.bytesFilled % firstPendingPullInto.elementSize !== 0) { - const e = new TypeError('Insufficient bytes to fill elements in the given buffer'); - ReadableByteStreamControllerError(controller, e); - throw e; - } - } - ReadableByteStreamControllerClearAlgorithms(controller); - ReadableStreamClose(stream); - } - function ReadableByteStreamControllerEnqueue(controller, chunk) { - const stream = controller._controlledReadableByteStream; - if (controller._closeRequested || stream._state !== 'readable') { - return; - } - const { buffer, byteOffset, byteLength } = chunk; - if (IsDetachedBuffer(buffer)) { - throw new TypeError('chunk\'s buffer is detached and so cannot be enqueued'); - } - const transferredBuffer = TransferArrayBuffer(buffer); - if (controller._pendingPullIntos.length > 0) { - const firstPendingPullInto = controller._pendingPullIntos.peek(); - if (IsDetachedBuffer(firstPendingPullInto.buffer)) { - throw new TypeError('The BYOB request\'s buffer has been detached and so cannot be filled with an enqueued chunk'); - } - ReadableByteStreamControllerInvalidateBYOBRequest(controller); - firstPendingPullInto.buffer = TransferArrayBuffer(firstPendingPullInto.buffer); - if (firstPendingPullInto.readerType === 'none') { - ReadableByteStreamControllerEnqueueDetachedPullIntoToQueue(controller, firstPendingPullInto); - } - } - if (ReadableStreamHasDefaultReader(stream)) { - ReadableByteStreamControllerProcessReadRequestsUsingQueue(controller); - if (ReadableStreamGetNumReadRequests(stream) === 0) { - ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); - } - else { - if (controller._pendingPullIntos.length > 0) { - ReadableByteStreamControllerShiftPendingPullInto(controller); - } - const transferredView = new Uint8Array(transferredBuffer, byteOffset, byteLength); - ReadableStreamFulfillReadRequest(stream, transferredView, false); - } - } - else if (ReadableStreamHasBYOBReader(stream)) { - // TODO: Ideally in this branch detaching should happen only if the buffer is not consumed fully. - ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); - ReadableByteStreamControllerProcessPullIntoDescriptorsUsingQueue(controller); - } - else { - ReadableByteStreamControllerEnqueueChunkToQueue(controller, transferredBuffer, byteOffset, byteLength); - } - ReadableByteStreamControllerCallPullIfNeeded(controller); - } - function ReadableByteStreamControllerError(controller, e) { - const stream = controller._controlledReadableByteStream; - if (stream._state !== 'readable') { - return; - } - ReadableByteStreamControllerClearPendingPullIntos(controller); - ResetQueue(controller); - ReadableByteStreamControllerClearAlgorithms(controller); - ReadableStreamError(stream, e); - } - function ReadableByteStreamControllerFillReadRequestFromQueue(controller, readRequest) { - const entry = controller._queue.shift(); - controller._queueTotalSize -= entry.byteLength; - ReadableByteStreamControllerHandleQueueDrain(controller); - const view = new Uint8Array(entry.buffer, entry.byteOffset, entry.byteLength); - readRequest._chunkSteps(view); - } - function ReadableByteStreamControllerGetBYOBRequest(controller) { - if (controller._byobRequest === null && controller._pendingPullIntos.length > 0) { - const firstDescriptor = controller._pendingPullIntos.peek(); - const view = new Uint8Array(firstDescriptor.buffer, firstDescriptor.byteOffset + firstDescriptor.bytesFilled, firstDescriptor.byteLength - firstDescriptor.bytesFilled); - const byobRequest = Object.create(ReadableStreamBYOBRequest.prototype); - SetUpReadableStreamBYOBRequest(byobRequest, controller, view); - controller._byobRequest = byobRequest; - } - return controller._byobRequest; - } - function ReadableByteStreamControllerGetDesiredSize(controller) { - const state = controller._controlledReadableByteStream._state; - if (state === 'errored') { - return null; - } - if (state === 'closed') { - return 0; - } - return controller._strategyHWM - controller._queueTotalSize; - } - function ReadableByteStreamControllerRespond(controller, bytesWritten) { - const firstDescriptor = controller._pendingPullIntos.peek(); - const state = controller._controlledReadableByteStream._state; - if (state === 'closed') { - if (bytesWritten !== 0) { - throw new TypeError('bytesWritten must be 0 when calling respond() on a closed stream'); - } - } - else { - if (bytesWritten === 0) { - throw new TypeError('bytesWritten must be greater than 0 when calling respond() on a readable stream'); - } - if (firstDescriptor.bytesFilled + bytesWritten > firstDescriptor.byteLength) { - throw new RangeError('bytesWritten out of range'); - } - } - firstDescriptor.buffer = TransferArrayBuffer(firstDescriptor.buffer); - ReadableByteStreamControllerRespondInternal(controller, bytesWritten); - } - function ReadableByteStreamControllerRespondWithNewView(controller, view) { - const firstDescriptor = controller._pendingPullIntos.peek(); - const state = controller._controlledReadableByteStream._state; - if (state === 'closed') { - if (view.byteLength !== 0) { - throw new TypeError('The view\'s length must be 0 when calling respondWithNewView() on a closed stream'); - } - } - else { - if (view.byteLength === 0) { - throw new TypeError('The view\'s length must be greater than 0 when calling respondWithNewView() on a readable stream'); - } - } - if (firstDescriptor.byteOffset + firstDescriptor.bytesFilled !== view.byteOffset) { - throw new RangeError('The region specified by view does not match byobRequest'); - } - if (firstDescriptor.bufferByteLength !== view.buffer.byteLength) { - throw new RangeError('The buffer of view has different capacity than byobRequest'); - } - if (firstDescriptor.bytesFilled + view.byteLength > firstDescriptor.byteLength) { - throw new RangeError('The region specified by view is larger than byobRequest'); - } - const viewByteLength = view.byteLength; - firstDescriptor.buffer = TransferArrayBuffer(view.buffer); - ReadableByteStreamControllerRespondInternal(controller, viewByteLength); - } - function SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, autoAllocateChunkSize) { - controller._controlledReadableByteStream = stream; - controller._pullAgain = false; - controller._pulling = false; - controller._byobRequest = null; - // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly. - controller._queue = controller._queueTotalSize = undefined; - ResetQueue(controller); - controller._closeRequested = false; - controller._started = false; - controller._strategyHWM = highWaterMark; - controller._pullAlgorithm = pullAlgorithm; - controller._cancelAlgorithm = cancelAlgorithm; - controller._autoAllocateChunkSize = autoAllocateChunkSize; - controller._pendingPullIntos = new SimpleQueue(); - stream._readableStreamController = controller; - const startResult = startAlgorithm(); - uponPromise(promiseResolvedWith(startResult), () => { - controller._started = true; - ReadableByteStreamControllerCallPullIfNeeded(controller); - return null; - }, r => { - ReadableByteStreamControllerError(controller, r); - return null; - }); - } - function SetUpReadableByteStreamControllerFromUnderlyingSource(stream, underlyingByteSource, highWaterMark) { - const controller = Object.create(ReadableByteStreamController.prototype); - let startAlgorithm; - let pullAlgorithm; - let cancelAlgorithm; - if (underlyingByteSource.start !== undefined) { - startAlgorithm = () => underlyingByteSource.start(controller); - } - else { - startAlgorithm = () => undefined; - } - if (underlyingByteSource.pull !== undefined) { - pullAlgorithm = () => underlyingByteSource.pull(controller); - } - else { - pullAlgorithm = () => promiseResolvedWith(undefined); - } - if (underlyingByteSource.cancel !== undefined) { - cancelAlgorithm = reason => underlyingByteSource.cancel(reason); - } - else { - cancelAlgorithm = () => promiseResolvedWith(undefined); - } - const autoAllocateChunkSize = underlyingByteSource.autoAllocateChunkSize; - if (autoAllocateChunkSize === 0) { - throw new TypeError('autoAllocateChunkSize must be greater than 0'); - } - SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, autoAllocateChunkSize); - } - function SetUpReadableStreamBYOBRequest(request, controller, view) { - request._associatedReadableByteStreamController = controller; - request._view = view; - } - // Helper functions for the ReadableStreamBYOBRequest. - function byobRequestBrandCheckException(name) { - return new TypeError(`ReadableStreamBYOBRequest.prototype.${name} can only be used on a ReadableStreamBYOBRequest`); - } - // Helper functions for the ReadableByteStreamController. - function byteStreamControllerBrandCheckException(name) { - return new TypeError(`ReadableByteStreamController.prototype.${name} can only be used on a ReadableByteStreamController`); - } - - function convertReaderOptions(options, context) { - assertDictionary(options, context); - const mode = options === null || options === void 0 ? void 0 : options.mode; - return { - mode: mode === undefined ? undefined : convertReadableStreamReaderMode(mode, `${context} has member 'mode' that`) - }; - } - function convertReadableStreamReaderMode(mode, context) { - mode = `${mode}`; - if (mode !== 'byob') { - throw new TypeError(`${context} '${mode}' is not a valid enumeration value for ReadableStreamReaderMode`); - } - return mode; - } - function convertByobReadOptions(options, context) { - var _a; - assertDictionary(options, context); - const min = (_a = options === null || options === void 0 ? void 0 : options.min) !== null && _a !== void 0 ? _a : 1; - return { - min: convertUnsignedLongLongWithEnforceRange(min, `${context} has member 'min' that`) - }; - } - - // Abstract operations for the ReadableStream. - function AcquireReadableStreamBYOBReader(stream) { - return new ReadableStreamBYOBReader(stream); - } - // ReadableStream API exposed for controllers. - function ReadableStreamAddReadIntoRequest(stream, readIntoRequest) { - stream._reader._readIntoRequests.push(readIntoRequest); - } - function ReadableStreamFulfillReadIntoRequest(stream, chunk, done) { - const reader = stream._reader; - const readIntoRequest = reader._readIntoRequests.shift(); - if (done) { - readIntoRequest._closeSteps(chunk); - } - else { - readIntoRequest._chunkSteps(chunk); - } - } - function ReadableStreamGetNumReadIntoRequests(stream) { - return stream._reader._readIntoRequests.length; - } - function ReadableStreamHasBYOBReader(stream) { - const reader = stream._reader; - if (reader === undefined) { - return false; - } - if (!IsReadableStreamBYOBReader(reader)) { - return false; - } - return true; - } - /** - * A BYOB reader vended by a {@link ReadableStream}. - * - * @public - */ - class ReadableStreamBYOBReader { - constructor(stream) { - assertRequiredArgument(stream, 1, 'ReadableStreamBYOBReader'); - assertReadableStream(stream, 'First parameter'); - if (IsReadableStreamLocked(stream)) { - throw new TypeError('This stream has already been locked for exclusive reading by another reader'); - } - if (!IsReadableByteStreamController(stream._readableStreamController)) { - throw new TypeError('Cannot construct a ReadableStreamBYOBReader for a stream not constructed with a byte ' + - 'source'); - } - ReadableStreamReaderGenericInitialize(this, stream); - this._readIntoRequests = new SimpleQueue(); - } - /** - * Returns a promise that will be fulfilled when the stream becomes closed, or rejected if the stream ever errors or - * the reader's lock is released before the stream finishes closing. - */ - get closed() { - if (!IsReadableStreamBYOBReader(this)) { - return promiseRejectedWith(byobReaderBrandCheckException('closed')); - } - return this._closedPromise; - } - /** - * If the reader is active, behaves the same as {@link ReadableStream.cancel | stream.cancel(reason)}. - */ - cancel(reason = undefined) { - if (!IsReadableStreamBYOBReader(this)) { - return promiseRejectedWith(byobReaderBrandCheckException('cancel')); - } - if (this._ownerReadableStream === undefined) { - return promiseRejectedWith(readerLockException('cancel')); - } - return ReadableStreamReaderGenericCancel(this, reason); - } - read(view, rawOptions = {}) { - if (!IsReadableStreamBYOBReader(this)) { - return promiseRejectedWith(byobReaderBrandCheckException('read')); - } - if (!ArrayBuffer.isView(view)) { - return promiseRejectedWith(new TypeError('view must be an array buffer view')); - } - if (view.byteLength === 0) { - return promiseRejectedWith(new TypeError('view must have non-zero byteLength')); - } - if (view.buffer.byteLength === 0) { - return promiseRejectedWith(new TypeError(`view's buffer must have non-zero byteLength`)); - } - if (IsDetachedBuffer(view.buffer)) { - return promiseRejectedWith(new TypeError('view\'s buffer has been detached')); - } - let options; - try { - options = convertByobReadOptions(rawOptions, 'options'); - } - catch (e) { - return promiseRejectedWith(e); - } - const min = options.min; - if (min === 0) { - return promiseRejectedWith(new TypeError('options.min must be greater than 0')); - } - if (!isDataView(view)) { - if (min > view.length) { - return promiseRejectedWith(new RangeError('options.min must be less than or equal to view\'s length')); - } - } - else if (min > view.byteLength) { - return promiseRejectedWith(new RangeError('options.min must be less than or equal to view\'s byteLength')); - } - if (this._ownerReadableStream === undefined) { - return promiseRejectedWith(readerLockException('read from')); - } - let resolvePromise; - let rejectPromise; - const promise = newPromise((resolve, reject) => { - resolvePromise = resolve; - rejectPromise = reject; - }); - const readIntoRequest = { - _chunkSteps: chunk => resolvePromise({ value: chunk, done: false }), - _closeSteps: chunk => resolvePromise({ value: chunk, done: true }), - _errorSteps: e => rejectPromise(e) - }; - ReadableStreamBYOBReaderRead(this, view, min, readIntoRequest); - return promise; - } - /** - * Releases the reader's lock on the corresponding stream. After the lock is released, the reader is no longer active. - * If the associated stream is errored when the lock is released, the reader will appear errored in the same way - * from now on; otherwise, the reader will appear closed. - * - * A reader's lock cannot be released while it still has a pending read request, i.e., if a promise returned by - * the reader's {@link ReadableStreamBYOBReader.read | read()} method has not yet been settled. Attempting to - * do so will throw a `TypeError` and leave the reader locked to the stream. - */ - releaseLock() { - if (!IsReadableStreamBYOBReader(this)) { - throw byobReaderBrandCheckException('releaseLock'); - } - if (this._ownerReadableStream === undefined) { - return; - } - ReadableStreamBYOBReaderRelease(this); - } - } - Object.defineProperties(ReadableStreamBYOBReader.prototype, { - cancel: { enumerable: true }, - read: { enumerable: true }, - releaseLock: { enumerable: true }, - closed: { enumerable: true } - }); - setFunctionName(ReadableStreamBYOBReader.prototype.cancel, 'cancel'); - setFunctionName(ReadableStreamBYOBReader.prototype.read, 'read'); - setFunctionName(ReadableStreamBYOBReader.prototype.releaseLock, 'releaseLock'); - if (typeof Symbol.toStringTag === 'symbol') { - Object.defineProperty(ReadableStreamBYOBReader.prototype, Symbol.toStringTag, { - value: 'ReadableStreamBYOBReader', - configurable: true - }); - } - // Abstract operations for the readers. - function IsReadableStreamBYOBReader(x) { - if (!typeIsObject(x)) { - return false; - } - if (!Object.prototype.hasOwnProperty.call(x, '_readIntoRequests')) { - return false; - } - return x instanceof ReadableStreamBYOBReader; - } - function ReadableStreamBYOBReaderRead(reader, view, min, readIntoRequest) { - const stream = reader._ownerReadableStream; - stream._disturbed = true; - if (stream._state === 'errored') { - readIntoRequest._errorSteps(stream._storedError); - } - else { - ReadableByteStreamControllerPullInto(stream._readableStreamController, view, min, readIntoRequest); - } - } - function ReadableStreamBYOBReaderRelease(reader) { - ReadableStreamReaderGenericRelease(reader); - const e = new TypeError('Reader was released'); - ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e); - } - function ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e) { - const readIntoRequests = reader._readIntoRequests; - reader._readIntoRequests = new SimpleQueue(); - readIntoRequests.forEach(readIntoRequest => { - readIntoRequest._errorSteps(e); - }); - } - // Helper functions for the ReadableStreamBYOBReader. - function byobReaderBrandCheckException(name) { - return new TypeError(`ReadableStreamBYOBReader.prototype.${name} can only be used on a ReadableStreamBYOBReader`); - } - - function ExtractHighWaterMark(strategy, defaultHWM) { - const { highWaterMark } = strategy; - if (highWaterMark === undefined) { - return defaultHWM; - } - if (NumberIsNaN(highWaterMark) || highWaterMark < 0) { - throw new RangeError('Invalid highWaterMark'); - } - return highWaterMark; - } - function ExtractSizeAlgorithm(strategy) { - const { size } = strategy; - if (!size) { - return () => 1; - } - return size; - } - - function convertQueuingStrategy(init, context) { - assertDictionary(init, context); - const highWaterMark = init === null || init === void 0 ? void 0 : init.highWaterMark; - const size = init === null || init === void 0 ? void 0 : init.size; - return { - highWaterMark: highWaterMark === undefined ? undefined : convertUnrestrictedDouble(highWaterMark), - size: size === undefined ? undefined : convertQueuingStrategySize(size, `${context} has member 'size' that`) - }; - } - function convertQueuingStrategySize(fn, context) { - assertFunction(fn, context); - return chunk => convertUnrestrictedDouble(fn(chunk)); - } - - function convertUnderlyingSink(original, context) { - assertDictionary(original, context); - const abort = original === null || original === void 0 ? void 0 : original.abort; - const close = original === null || original === void 0 ? void 0 : original.close; - const start = original === null || original === void 0 ? void 0 : original.start; - const type = original === null || original === void 0 ? void 0 : original.type; - const write = original === null || original === void 0 ? void 0 : original.write; - return { - abort: abort === undefined ? - undefined : - convertUnderlyingSinkAbortCallback(abort, original, `${context} has member 'abort' that`), - close: close === undefined ? - undefined : - convertUnderlyingSinkCloseCallback(close, original, `${context} has member 'close' that`), - start: start === undefined ? - undefined : - convertUnderlyingSinkStartCallback(start, original, `${context} has member 'start' that`), - write: write === undefined ? - undefined : - convertUnderlyingSinkWriteCallback(write, original, `${context} has member 'write' that`), - type - }; - } - function convertUnderlyingSinkAbortCallback(fn, original, context) { - assertFunction(fn, context); - return (reason) => promiseCall(fn, original, [reason]); - } - function convertUnderlyingSinkCloseCallback(fn, original, context) { - assertFunction(fn, context); - return () => promiseCall(fn, original, []); - } - function convertUnderlyingSinkStartCallback(fn, original, context) { - assertFunction(fn, context); - return (controller) => reflectCall(fn, original, [controller]); - } - function convertUnderlyingSinkWriteCallback(fn, original, context) { - assertFunction(fn, context); - return (chunk, controller) => promiseCall(fn, original, [chunk, controller]); - } - - function assertWritableStream(x, context) { - if (!IsWritableStream(x)) { - throw new TypeError(`${context} is not a WritableStream.`); - } - } - - function isAbortSignal(value) { - if (typeof value !== 'object' || value === null) { - return false; - } - try { - return typeof value.aborted === 'boolean'; - } - catch (_a) { - // AbortSignal.prototype.aborted throws if its brand check fails - return false; - } - } - const supportsAbortController = typeof AbortController === 'function'; - /** - * Construct a new AbortController, if supported by the platform. - * - * @internal - */ - function createAbortController() { - if (supportsAbortController) { - return new AbortController(); - } - return undefined; - } - - /** - * A writable stream represents a destination for data, into which you can write. - * - * @public - */ - class WritableStream { - constructor(rawUnderlyingSink = {}, rawStrategy = {}) { - if (rawUnderlyingSink === undefined) { - rawUnderlyingSink = null; - } - else { - assertObject(rawUnderlyingSink, 'First parameter'); - } - const strategy = convertQueuingStrategy(rawStrategy, 'Second parameter'); - const underlyingSink = convertUnderlyingSink(rawUnderlyingSink, 'First parameter'); - InitializeWritableStream(this); - const type = underlyingSink.type; - if (type !== undefined) { - throw new RangeError('Invalid type is specified'); - } - const sizeAlgorithm = ExtractSizeAlgorithm(strategy); - const highWaterMark = ExtractHighWaterMark(strategy, 1); - SetUpWritableStreamDefaultControllerFromUnderlyingSink(this, underlyingSink, highWaterMark, sizeAlgorithm); - } - /** - * Returns whether or not the writable stream is locked to a writer. - */ - get locked() { - if (!IsWritableStream(this)) { - throw streamBrandCheckException$2('locked'); - } - return IsWritableStreamLocked(this); - } - /** - * Aborts the stream, signaling that the producer can no longer successfully write to the stream and it is to be - * immediately moved to an errored state, with any queued-up writes discarded. This will also execute any abort - * mechanism of the underlying sink. - * - * The returned promise will fulfill if the stream shuts down successfully, or reject if the underlying sink signaled - * that there was an error doing so. Additionally, it will reject with a `TypeError` (without attempting to cancel - * the stream) if the stream is currently locked. - */ - abort(reason = undefined) { - if (!IsWritableStream(this)) { - return promiseRejectedWith(streamBrandCheckException$2('abort')); - } - if (IsWritableStreamLocked(this)) { - return promiseRejectedWith(new TypeError('Cannot abort a stream that already has a writer')); - } - return WritableStreamAbort(this, reason); - } - /** - * Closes the stream. The underlying sink will finish processing any previously-written chunks, before invoking its - * close behavior. During this time any further attempts to write will fail (without erroring the stream). - * - * The method returns a promise that will fulfill if all remaining chunks are successfully written and the stream - * successfully closes, or rejects if an error is encountered during this process. Additionally, it will reject with - * a `TypeError` (without attempting to cancel the stream) if the stream is currently locked. - */ - close() { - if (!IsWritableStream(this)) { - return promiseRejectedWith(streamBrandCheckException$2('close')); - } - if (IsWritableStreamLocked(this)) { - return promiseRejectedWith(new TypeError('Cannot close a stream that already has a writer')); - } - if (WritableStreamCloseQueuedOrInFlight(this)) { - return promiseRejectedWith(new TypeError('Cannot close an already-closing stream')); - } - return WritableStreamClose(this); - } - /** - * Creates a {@link WritableStreamDefaultWriter | writer} and locks the stream to the new writer. While the stream - * is locked, no other writer can be acquired until this one is released. - * - * This functionality is especially useful for creating abstractions that desire the ability to write to a stream - * without interruption or interleaving. By getting a writer for the stream, you can ensure nobody else can write at - * the same time, which would cause the resulting written data to be unpredictable and probably useless. - */ - getWriter() { - if (!IsWritableStream(this)) { - throw streamBrandCheckException$2('getWriter'); - } - return AcquireWritableStreamDefaultWriter(this); - } - } - Object.defineProperties(WritableStream.prototype, { - abort: { enumerable: true }, - close: { enumerable: true }, - getWriter: { enumerable: true }, - locked: { enumerable: true } - }); - setFunctionName(WritableStream.prototype.abort, 'abort'); - setFunctionName(WritableStream.prototype.close, 'close'); - setFunctionName(WritableStream.prototype.getWriter, 'getWriter'); - if (typeof Symbol.toStringTag === 'symbol') { - Object.defineProperty(WritableStream.prototype, Symbol.toStringTag, { - value: 'WritableStream', - configurable: true - }); - } - // Abstract operations for the WritableStream. - function AcquireWritableStreamDefaultWriter(stream) { - return new WritableStreamDefaultWriter(stream); - } - // Throws if and only if startAlgorithm throws. - function CreateWritableStream(startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark = 1, sizeAlgorithm = () => 1) { - const stream = Object.create(WritableStream.prototype); - InitializeWritableStream(stream); - const controller = Object.create(WritableStreamDefaultController.prototype); - SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm); - return stream; - } - function InitializeWritableStream(stream) { - stream._state = 'writable'; - // The error that will be reported by new method calls once the state becomes errored. Only set when [[state]] is - // 'erroring' or 'errored'. May be set to an undefined value. - stream._storedError = undefined; - stream._writer = undefined; - // Initialize to undefined first because the constructor of the controller checks this - // variable to validate the caller. - stream._writableStreamController = undefined; - // This queue is placed here instead of the writer class in order to allow for passing a writer to the next data - // producer without waiting for the queued writes to finish. - stream._writeRequests = new SimpleQueue(); - // Write requests are removed from _writeRequests when write() is called on the underlying sink. This prevents - // them from being erroneously rejected on error. If a write() call is in-flight, the request is stored here. - stream._inFlightWriteRequest = undefined; - // The promise that was returned from writer.close(). Stored here because it may be fulfilled after the writer - // has been detached. - stream._closeRequest = undefined; - // Close request is removed from _closeRequest when close() is called on the underlying sink. This prevents it - // from being erroneously rejected on error. If a close() call is in-flight, the request is stored here. - stream._inFlightCloseRequest = undefined; - // The promise that was returned from writer.abort(). This may also be fulfilled after the writer has detached. - stream._pendingAbortRequest = undefined; - // The backpressure signal set by the controller. - stream._backpressure = false; - } - function IsWritableStream(x) { - if (!typeIsObject(x)) { - return false; - } - if (!Object.prototype.hasOwnProperty.call(x, '_writableStreamController')) { - return false; - } - return x instanceof WritableStream; - } - function IsWritableStreamLocked(stream) { - if (stream._writer === undefined) { - return false; - } - return true; - } - function WritableStreamAbort(stream, reason) { - var _a; - if (stream._state === 'closed' || stream._state === 'errored') { - return promiseResolvedWith(undefined); - } - stream._writableStreamController._abortReason = reason; - (_a = stream._writableStreamController._abortController) === null || _a === void 0 ? void 0 : _a.abort(reason); - // TypeScript narrows the type of `stream._state` down to 'writable' | 'erroring', - // but it doesn't know that signaling abort runs author code that might have changed the state. - // Widen the type again by casting to WritableStreamState. - const state = stream._state; - if (state === 'closed' || state === 'errored') { - return promiseResolvedWith(undefined); - } - if (stream._pendingAbortRequest !== undefined) { - return stream._pendingAbortRequest._promise; - } - let wasAlreadyErroring = false; - if (state === 'erroring') { - wasAlreadyErroring = true; - // reason will not be used, so don't keep a reference to it. - reason = undefined; - } - const promise = newPromise((resolve, reject) => { - stream._pendingAbortRequest = { - _promise: undefined, - _resolve: resolve, - _reject: reject, - _reason: reason, - _wasAlreadyErroring: wasAlreadyErroring - }; - }); - stream._pendingAbortRequest._promise = promise; - if (!wasAlreadyErroring) { - WritableStreamStartErroring(stream, reason); - } - return promise; - } - function WritableStreamClose(stream) { - const state = stream._state; - if (state === 'closed' || state === 'errored') { - return promiseRejectedWith(new TypeError(`The stream (in ${state} state) is not in the writable state and cannot be closed`)); - } - const promise = newPromise((resolve, reject) => { - const closeRequest = { - _resolve: resolve, - _reject: reject - }; - stream._closeRequest = closeRequest; - }); - const writer = stream._writer; - if (writer !== undefined && stream._backpressure && state === 'writable') { - defaultWriterReadyPromiseResolve(writer); - } - WritableStreamDefaultControllerClose(stream._writableStreamController); - return promise; - } - // WritableStream API exposed for controllers. - function WritableStreamAddWriteRequest(stream) { - const promise = newPromise((resolve, reject) => { - const writeRequest = { - _resolve: resolve, - _reject: reject - }; - stream._writeRequests.push(writeRequest); - }); - return promise; - } - function WritableStreamDealWithRejection(stream, error) { - const state = stream._state; - if (state === 'writable') { - WritableStreamStartErroring(stream, error); - return; - } - WritableStreamFinishErroring(stream); - } - function WritableStreamStartErroring(stream, reason) { - const controller = stream._writableStreamController; - stream._state = 'erroring'; - stream._storedError = reason; - const writer = stream._writer; - if (writer !== undefined) { - WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, reason); - } - if (!WritableStreamHasOperationMarkedInFlight(stream) && controller._started) { - WritableStreamFinishErroring(stream); - } - } - function WritableStreamFinishErroring(stream) { - stream._state = 'errored'; - stream._writableStreamController[ErrorSteps](); - const storedError = stream._storedError; - stream._writeRequests.forEach(writeRequest => { - writeRequest._reject(storedError); - }); - stream._writeRequests = new SimpleQueue(); - if (stream._pendingAbortRequest === undefined) { - WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); - return; - } - const abortRequest = stream._pendingAbortRequest; - stream._pendingAbortRequest = undefined; - if (abortRequest._wasAlreadyErroring) { - abortRequest._reject(storedError); - WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); - return; - } - const promise = stream._writableStreamController[AbortSteps](abortRequest._reason); - uponPromise(promise, () => { - abortRequest._resolve(); - WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); - return null; - }, (reason) => { - abortRequest._reject(reason); - WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream); - return null; - }); - } - function WritableStreamFinishInFlightWrite(stream) { - stream._inFlightWriteRequest._resolve(undefined); - stream._inFlightWriteRequest = undefined; - } - function WritableStreamFinishInFlightWriteWithError(stream, error) { - stream._inFlightWriteRequest._reject(error); - stream._inFlightWriteRequest = undefined; - WritableStreamDealWithRejection(stream, error); - } - function WritableStreamFinishInFlightClose(stream) { - stream._inFlightCloseRequest._resolve(undefined); - stream._inFlightCloseRequest = undefined; - const state = stream._state; - if (state === 'erroring') { - // The error was too late to do anything, so it is ignored. - stream._storedError = undefined; - if (stream._pendingAbortRequest !== undefined) { - stream._pendingAbortRequest._resolve(); - stream._pendingAbortRequest = undefined; - } - } - stream._state = 'closed'; - const writer = stream._writer; - if (writer !== undefined) { - defaultWriterClosedPromiseResolve(writer); - } - } - function WritableStreamFinishInFlightCloseWithError(stream, error) { - stream._inFlightCloseRequest._reject(error); - stream._inFlightCloseRequest = undefined; - // Never execute sink abort() after sink close(). - if (stream._pendingAbortRequest !== undefined) { - stream._pendingAbortRequest._reject(error); - stream._pendingAbortRequest = undefined; - } - WritableStreamDealWithRejection(stream, error); - } - // TODO(ricea): Fix alphabetical order. - function WritableStreamCloseQueuedOrInFlight(stream) { - if (stream._closeRequest === undefined && stream._inFlightCloseRequest === undefined) { - return false; - } - return true; - } - function WritableStreamHasOperationMarkedInFlight(stream) { - if (stream._inFlightWriteRequest === undefined && stream._inFlightCloseRequest === undefined) { - return false; - } - return true; - } - function WritableStreamMarkCloseRequestInFlight(stream) { - stream._inFlightCloseRequest = stream._closeRequest; - stream._closeRequest = undefined; - } - function WritableStreamMarkFirstWriteRequestInFlight(stream) { - stream._inFlightWriteRequest = stream._writeRequests.shift(); - } - function WritableStreamRejectCloseAndClosedPromiseIfNeeded(stream) { - if (stream._closeRequest !== undefined) { - stream._closeRequest._reject(stream._storedError); - stream._closeRequest = undefined; - } - const writer = stream._writer; - if (writer !== undefined) { - defaultWriterClosedPromiseReject(writer, stream._storedError); - } - } - function WritableStreamUpdateBackpressure(stream, backpressure) { - const writer = stream._writer; - if (writer !== undefined && backpressure !== stream._backpressure) { - if (backpressure) { - defaultWriterReadyPromiseReset(writer); - } - else { - defaultWriterReadyPromiseResolve(writer); - } - } - stream._backpressure = backpressure; - } - /** - * A default writer vended by a {@link WritableStream}. - * - * @public - */ - class WritableStreamDefaultWriter { - constructor(stream) { - assertRequiredArgument(stream, 1, 'WritableStreamDefaultWriter'); - assertWritableStream(stream, 'First parameter'); - if (IsWritableStreamLocked(stream)) { - throw new TypeError('This stream has already been locked for exclusive writing by another writer'); - } - this._ownerWritableStream = stream; - stream._writer = this; - const state = stream._state; - if (state === 'writable') { - if (!WritableStreamCloseQueuedOrInFlight(stream) && stream._backpressure) { - defaultWriterReadyPromiseInitialize(this); - } - else { - defaultWriterReadyPromiseInitializeAsResolved(this); - } - defaultWriterClosedPromiseInitialize(this); - } - else if (state === 'erroring') { - defaultWriterReadyPromiseInitializeAsRejected(this, stream._storedError); - defaultWriterClosedPromiseInitialize(this); - } - else if (state === 'closed') { - defaultWriterReadyPromiseInitializeAsResolved(this); - defaultWriterClosedPromiseInitializeAsResolved(this); - } - else { - const storedError = stream._storedError; - defaultWriterReadyPromiseInitializeAsRejected(this, storedError); - defaultWriterClosedPromiseInitializeAsRejected(this, storedError); - } - } - /** - * Returns a promise that will be fulfilled when the stream becomes closed, or rejected if the stream ever errors or - * the writer’s lock is released before the stream finishes closing. - */ - get closed() { - if (!IsWritableStreamDefaultWriter(this)) { - return promiseRejectedWith(defaultWriterBrandCheckException('closed')); - } - return this._closedPromise; - } - /** - * Returns the desired size to fill the stream’s internal queue. It can be negative, if the queue is over-full. - * A producer can use this information to determine the right amount of data to write. - * - * It will be `null` if the stream cannot be successfully written to (due to either being errored, or having an abort - * queued up). It will return zero if the stream is closed. And the getter will throw an exception if invoked when - * the writer’s lock is released. - */ - get desiredSize() { - if (!IsWritableStreamDefaultWriter(this)) { - throw defaultWriterBrandCheckException('desiredSize'); - } - if (this._ownerWritableStream === undefined) { - throw defaultWriterLockException('desiredSize'); - } - return WritableStreamDefaultWriterGetDesiredSize(this); - } - /** - * Returns a promise that will be fulfilled when the desired size to fill the stream’s internal queue transitions - * from non-positive to positive, signaling that it is no longer applying backpressure. Once the desired size dips - * back to zero or below, the getter will return a new promise that stays pending until the next transition. - * - * If the stream becomes errored or aborted, or the writer’s lock is released, the returned promise will become - * rejected. - */ - get ready() { - if (!IsWritableStreamDefaultWriter(this)) { - return promiseRejectedWith(defaultWriterBrandCheckException('ready')); - } - return this._readyPromise; - } - /** - * If the reader is active, behaves the same as {@link WritableStream.abort | stream.abort(reason)}. - */ - abort(reason = undefined) { - if (!IsWritableStreamDefaultWriter(this)) { - return promiseRejectedWith(defaultWriterBrandCheckException('abort')); - } - if (this._ownerWritableStream === undefined) { - return promiseRejectedWith(defaultWriterLockException('abort')); - } - return WritableStreamDefaultWriterAbort(this, reason); - } - /** - * If the reader is active, behaves the same as {@link WritableStream.close | stream.close()}. - */ - close() { - if (!IsWritableStreamDefaultWriter(this)) { - return promiseRejectedWith(defaultWriterBrandCheckException('close')); - } - const stream = this._ownerWritableStream; - if (stream === undefined) { - return promiseRejectedWith(defaultWriterLockException('close')); - } - if (WritableStreamCloseQueuedOrInFlight(stream)) { - return promiseRejectedWith(new TypeError('Cannot close an already-closing stream')); - } - return WritableStreamDefaultWriterClose(this); - } - /** - * Releases the writer’s lock on the corresponding stream. After the lock is released, the writer is no longer active. - * If the associated stream is errored when the lock is released, the writer will appear errored in the same way from - * now on; otherwise, the writer will appear closed. - * - * Note that the lock can still be released even if some ongoing writes have not yet finished (i.e. even if the - * promises returned from previous calls to {@link WritableStreamDefaultWriter.write | write()} have not yet settled). - * It’s not necessary to hold the lock on the writer for the duration of the write; the lock instead simply prevents - * other producers from writing in an interleaved manner. - */ - releaseLock() { - if (!IsWritableStreamDefaultWriter(this)) { - throw defaultWriterBrandCheckException('releaseLock'); - } - const stream = this._ownerWritableStream; - if (stream === undefined) { - return; - } - WritableStreamDefaultWriterRelease(this); - } - write(chunk = undefined) { - if (!IsWritableStreamDefaultWriter(this)) { - return promiseRejectedWith(defaultWriterBrandCheckException('write')); - } - if (this._ownerWritableStream === undefined) { - return promiseRejectedWith(defaultWriterLockException('write to')); - } - return WritableStreamDefaultWriterWrite(this, chunk); - } - } - Object.defineProperties(WritableStreamDefaultWriter.prototype, { - abort: { enumerable: true }, - close: { enumerable: true }, - releaseLock: { enumerable: true }, - write: { enumerable: true }, - closed: { enumerable: true }, - desiredSize: { enumerable: true }, - ready: { enumerable: true } - }); - setFunctionName(WritableStreamDefaultWriter.prototype.abort, 'abort'); - setFunctionName(WritableStreamDefaultWriter.prototype.close, 'close'); - setFunctionName(WritableStreamDefaultWriter.prototype.releaseLock, 'releaseLock'); - setFunctionName(WritableStreamDefaultWriter.prototype.write, 'write'); - if (typeof Symbol.toStringTag === 'symbol') { - Object.defineProperty(WritableStreamDefaultWriter.prototype, Symbol.toStringTag, { - value: 'WritableStreamDefaultWriter', - configurable: true - }); - } - // Abstract operations for the WritableStreamDefaultWriter. - function IsWritableStreamDefaultWriter(x) { - if (!typeIsObject(x)) { - return false; - } - if (!Object.prototype.hasOwnProperty.call(x, '_ownerWritableStream')) { - return false; - } - return x instanceof WritableStreamDefaultWriter; - } - // A client of WritableStreamDefaultWriter may use these functions directly to bypass state check. - function WritableStreamDefaultWriterAbort(writer, reason) { - const stream = writer._ownerWritableStream; - return WritableStreamAbort(stream, reason); - } - function WritableStreamDefaultWriterClose(writer) { - const stream = writer._ownerWritableStream; - return WritableStreamClose(stream); - } - function WritableStreamDefaultWriterCloseWithErrorPropagation(writer) { - const stream = writer._ownerWritableStream; - const state = stream._state; - if (WritableStreamCloseQueuedOrInFlight(stream) || state === 'closed') { - return promiseResolvedWith(undefined); - } - if (state === 'errored') { - return promiseRejectedWith(stream._storedError); - } - return WritableStreamDefaultWriterClose(writer); - } - function WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, error) { - if (writer._closedPromiseState === 'pending') { - defaultWriterClosedPromiseReject(writer, error); - } - else { - defaultWriterClosedPromiseResetToRejected(writer, error); - } - } - function WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, error) { - if (writer._readyPromiseState === 'pending') { - defaultWriterReadyPromiseReject(writer, error); - } - else { - defaultWriterReadyPromiseResetToRejected(writer, error); - } - } - function WritableStreamDefaultWriterGetDesiredSize(writer) { - const stream = writer._ownerWritableStream; - const state = stream._state; - if (state === 'errored' || state === 'erroring') { - return null; - } - if (state === 'closed') { - return 0; - } - return WritableStreamDefaultControllerGetDesiredSize(stream._writableStreamController); - } - function WritableStreamDefaultWriterRelease(writer) { - const stream = writer._ownerWritableStream; - const releasedError = new TypeError(`Writer was released and can no longer be used to monitor the stream's closedness`); - WritableStreamDefaultWriterEnsureReadyPromiseRejected(writer, releasedError); - // The state transitions to "errored" before the sink abort() method runs, but the writer.closed promise is not - // rejected until afterwards. This means that simply testing state will not work. - WritableStreamDefaultWriterEnsureClosedPromiseRejected(writer, releasedError); - stream._writer = undefined; - writer._ownerWritableStream = undefined; - } - function WritableStreamDefaultWriterWrite(writer, chunk) { - const stream = writer._ownerWritableStream; - const controller = stream._writableStreamController; - const chunkSize = WritableStreamDefaultControllerGetChunkSize(controller, chunk); - if (stream !== writer._ownerWritableStream) { - return promiseRejectedWith(defaultWriterLockException('write to')); - } - const state = stream._state; - if (state === 'errored') { - return promiseRejectedWith(stream._storedError); - } - if (WritableStreamCloseQueuedOrInFlight(stream) || state === 'closed') { - return promiseRejectedWith(new TypeError('The stream is closing or closed and cannot be written to')); - } - if (state === 'erroring') { - return promiseRejectedWith(stream._storedError); - } - const promise = WritableStreamAddWriteRequest(stream); - WritableStreamDefaultControllerWrite(controller, chunk, chunkSize); - return promise; - } - const closeSentinel = {}; - /** - * Allows control of a {@link WritableStream | writable stream}'s state and internal queue. - * - * @public - */ - class WritableStreamDefaultController { - constructor() { - throw new TypeError('Illegal constructor'); - } - /** - * The reason which was passed to `WritableStream.abort(reason)` when the stream was aborted. - * - * @deprecated - * This property has been removed from the specification, see https://github.com/whatwg/streams/pull/1177. - * Use {@link WritableStreamDefaultController.signal}'s `reason` instead. - */ - get abortReason() { - if (!IsWritableStreamDefaultController(this)) { - throw defaultControllerBrandCheckException$2('abortReason'); - } - return this._abortReason; - } - /** - * An `AbortSignal` that can be used to abort the pending write or close operation when the stream is aborted. - */ - get signal() { - if (!IsWritableStreamDefaultController(this)) { - throw defaultControllerBrandCheckException$2('signal'); - } - if (this._abortController === undefined) { - // Older browsers or older Node versions may not support `AbortController` or `AbortSignal`. - // We don't want to bundle and ship an `AbortController` polyfill together with our polyfill, - // so instead we only implement support for `signal` if we find a global `AbortController` constructor. - throw new TypeError('WritableStreamDefaultController.prototype.signal is not supported'); - } - return this._abortController.signal; - } - /** - * Closes the controlled writable stream, making all future interactions with it fail with the given error `e`. - * - * This method is rarely used, since usually it suffices to return a rejected promise from one of the underlying - * sink's methods. However, it can be useful for suddenly shutting down a stream in response to an event outside the - * normal lifecycle of interactions with the underlying sink. - */ - error(e = undefined) { - if (!IsWritableStreamDefaultController(this)) { - throw defaultControllerBrandCheckException$2('error'); - } - const state = this._controlledWritableStream._state; - if (state !== 'writable') { - // The stream is closed, errored or will be soon. The sink can't do anything useful if it gets an error here, so - // just treat it as a no-op. - return; - } - WritableStreamDefaultControllerError(this, e); - } - /** @internal */ - [AbortSteps](reason) { - const result = this._abortAlgorithm(reason); - WritableStreamDefaultControllerClearAlgorithms(this); - return result; - } - /** @internal */ - [ErrorSteps]() { - ResetQueue(this); - } - } - Object.defineProperties(WritableStreamDefaultController.prototype, { - abortReason: { enumerable: true }, - signal: { enumerable: true }, - error: { enumerable: true } - }); - if (typeof Symbol.toStringTag === 'symbol') { - Object.defineProperty(WritableStreamDefaultController.prototype, Symbol.toStringTag, { - value: 'WritableStreamDefaultController', - configurable: true - }); - } - // Abstract operations implementing interface required by the WritableStream. - function IsWritableStreamDefaultController(x) { - if (!typeIsObject(x)) { - return false; - } - if (!Object.prototype.hasOwnProperty.call(x, '_controlledWritableStream')) { - return false; - } - return x instanceof WritableStreamDefaultController; - } - function SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm) { - controller._controlledWritableStream = stream; - stream._writableStreamController = controller; - // Need to set the slots so that the assert doesn't fire. In the spec the slots already exist implicitly. - controller._queue = undefined; - controller._queueTotalSize = undefined; - ResetQueue(controller); - controller._abortReason = undefined; - controller._abortController = createAbortController(); - controller._started = false; - controller._strategySizeAlgorithm = sizeAlgorithm; - controller._strategyHWM = highWaterMark; - controller._writeAlgorithm = writeAlgorithm; - controller._closeAlgorithm = closeAlgorithm; - controller._abortAlgorithm = abortAlgorithm; - const backpressure = WritableStreamDefaultControllerGetBackpressure(controller); - WritableStreamUpdateBackpressure(stream, backpressure); - const startResult = startAlgorithm(); - const startPromise = promiseResolvedWith(startResult); - uponPromise(startPromise, () => { - controller._started = true; - WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); - return null; - }, r => { - controller._started = true; - WritableStreamDealWithRejection(stream, r); - return null; - }); - } - function SetUpWritableStreamDefaultControllerFromUnderlyingSink(stream, underlyingSink, highWaterMark, sizeAlgorithm) { - const controller = Object.create(WritableStreamDefaultController.prototype); - let startAlgorithm; - let writeAlgorithm; - let closeAlgorithm; - let abortAlgorithm; - if (underlyingSink.start !== undefined) { - startAlgorithm = () => underlyingSink.start(controller); - } - else { - startAlgorithm = () => undefined; - } - if (underlyingSink.write !== undefined) { - writeAlgorithm = chunk => underlyingSink.write(chunk, controller); - } - else { - writeAlgorithm = () => promiseResolvedWith(undefined); - } - if (underlyingSink.close !== undefined) { - closeAlgorithm = () => underlyingSink.close(); - } - else { - closeAlgorithm = () => promiseResolvedWith(undefined); - } - if (underlyingSink.abort !== undefined) { - abortAlgorithm = reason => underlyingSink.abort(reason); - } - else { - abortAlgorithm = () => promiseResolvedWith(undefined); - } - SetUpWritableStreamDefaultController(stream, controller, startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, highWaterMark, sizeAlgorithm); - } - // ClearAlgorithms may be called twice. Erroring the same stream in multiple ways will often result in redundant calls. - function WritableStreamDefaultControllerClearAlgorithms(controller) { - controller._writeAlgorithm = undefined; - controller._closeAlgorithm = undefined; - controller._abortAlgorithm = undefined; - controller._strategySizeAlgorithm = undefined; - } - function WritableStreamDefaultControllerClose(controller) { - EnqueueValueWithSize(controller, closeSentinel, 0); - WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); - } - function WritableStreamDefaultControllerGetChunkSize(controller, chunk) { - try { - return controller._strategySizeAlgorithm(chunk); - } - catch (chunkSizeE) { - WritableStreamDefaultControllerErrorIfNeeded(controller, chunkSizeE); - return 1; - } - } - function WritableStreamDefaultControllerGetDesiredSize(controller) { - return controller._strategyHWM - controller._queueTotalSize; - } - function WritableStreamDefaultControllerWrite(controller, chunk, chunkSize) { - try { - EnqueueValueWithSize(controller, chunk, chunkSize); - } - catch (enqueueE) { - WritableStreamDefaultControllerErrorIfNeeded(controller, enqueueE); - return; - } - const stream = controller._controlledWritableStream; - if (!WritableStreamCloseQueuedOrInFlight(stream) && stream._state === 'writable') { - const backpressure = WritableStreamDefaultControllerGetBackpressure(controller); - WritableStreamUpdateBackpressure(stream, backpressure); - } - WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); - } - // Abstract operations for the WritableStreamDefaultController. - function WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller) { - const stream = controller._controlledWritableStream; - if (!controller._started) { - return; - } - if (stream._inFlightWriteRequest !== undefined) { - return; - } - const state = stream._state; - if (state === 'erroring') { - WritableStreamFinishErroring(stream); - return; - } - if (controller._queue.length === 0) { - return; - } - const value = PeekQueueValue(controller); - if (value === closeSentinel) { - WritableStreamDefaultControllerProcessClose(controller); - } - else { - WritableStreamDefaultControllerProcessWrite(controller, value); - } - } - function WritableStreamDefaultControllerErrorIfNeeded(controller, error) { - if (controller._controlledWritableStream._state === 'writable') { - WritableStreamDefaultControllerError(controller, error); - } - } - function WritableStreamDefaultControllerProcessClose(controller) { - const stream = controller._controlledWritableStream; - WritableStreamMarkCloseRequestInFlight(stream); - DequeueValue(controller); - const sinkClosePromise = controller._closeAlgorithm(); - WritableStreamDefaultControllerClearAlgorithms(controller); - uponPromise(sinkClosePromise, () => { - WritableStreamFinishInFlightClose(stream); - return null; - }, reason => { - WritableStreamFinishInFlightCloseWithError(stream, reason); - return null; - }); - } - function WritableStreamDefaultControllerProcessWrite(controller, chunk) { - const stream = controller._controlledWritableStream; - WritableStreamMarkFirstWriteRequestInFlight(stream); - const sinkWritePromise = controller._writeAlgorithm(chunk); - uponPromise(sinkWritePromise, () => { - WritableStreamFinishInFlightWrite(stream); - const state = stream._state; - DequeueValue(controller); - if (!WritableStreamCloseQueuedOrInFlight(stream) && state === 'writable') { - const backpressure = WritableStreamDefaultControllerGetBackpressure(controller); - WritableStreamUpdateBackpressure(stream, backpressure); - } - WritableStreamDefaultControllerAdvanceQueueIfNeeded(controller); - return null; - }, reason => { - if (stream._state === 'writable') { - WritableStreamDefaultControllerClearAlgorithms(controller); - } - WritableStreamFinishInFlightWriteWithError(stream, reason); - return null; - }); - } - function WritableStreamDefaultControllerGetBackpressure(controller) { - const desiredSize = WritableStreamDefaultControllerGetDesiredSize(controller); - return desiredSize <= 0; - } - // A client of WritableStreamDefaultController may use these functions directly to bypass state check. - function WritableStreamDefaultControllerError(controller, error) { - const stream = controller._controlledWritableStream; - WritableStreamDefaultControllerClearAlgorithms(controller); - WritableStreamStartErroring(stream, error); - } - // Helper functions for the WritableStream. - function streamBrandCheckException$2(name) { - return new TypeError(`WritableStream.prototype.${name} can only be used on a WritableStream`); - } - // Helper functions for the WritableStreamDefaultController. - function defaultControllerBrandCheckException$2(name) { - return new TypeError(`WritableStreamDefaultController.prototype.${name} can only be used on a WritableStreamDefaultController`); - } - // Helper functions for the WritableStreamDefaultWriter. - function defaultWriterBrandCheckException(name) { - return new TypeError(`WritableStreamDefaultWriter.prototype.${name} can only be used on a WritableStreamDefaultWriter`); - } - function defaultWriterLockException(name) { - return new TypeError('Cannot ' + name + ' a stream using a released writer'); - } - function defaultWriterClosedPromiseInitialize(writer) { - writer._closedPromise = newPromise((resolve, reject) => { - writer._closedPromise_resolve = resolve; - writer._closedPromise_reject = reject; - writer._closedPromiseState = 'pending'; - }); - } - function defaultWriterClosedPromiseInitializeAsRejected(writer, reason) { - defaultWriterClosedPromiseInitialize(writer); - defaultWriterClosedPromiseReject(writer, reason); - } - function defaultWriterClosedPromiseInitializeAsResolved(writer) { - defaultWriterClosedPromiseInitialize(writer); - defaultWriterClosedPromiseResolve(writer); - } - function defaultWriterClosedPromiseReject(writer, reason) { - if (writer._closedPromise_reject === undefined) { - return; - } - setPromiseIsHandledToTrue(writer._closedPromise); - writer._closedPromise_reject(reason); - writer._closedPromise_resolve = undefined; - writer._closedPromise_reject = undefined; - writer._closedPromiseState = 'rejected'; - } - function defaultWriterClosedPromiseResetToRejected(writer, reason) { - defaultWriterClosedPromiseInitializeAsRejected(writer, reason); - } - function defaultWriterClosedPromiseResolve(writer) { - if (writer._closedPromise_resolve === undefined) { - return; - } - writer._closedPromise_resolve(undefined); - writer._closedPromise_resolve = undefined; - writer._closedPromise_reject = undefined; - writer._closedPromiseState = 'resolved'; - } - function defaultWriterReadyPromiseInitialize(writer) { - writer._readyPromise = newPromise((resolve, reject) => { - writer._readyPromise_resolve = resolve; - writer._readyPromise_reject = reject; - }); - writer._readyPromiseState = 'pending'; - } - function defaultWriterReadyPromiseInitializeAsRejected(writer, reason) { - defaultWriterReadyPromiseInitialize(writer); - defaultWriterReadyPromiseReject(writer, reason); - } - function defaultWriterReadyPromiseInitializeAsResolved(writer) { - defaultWriterReadyPromiseInitialize(writer); - defaultWriterReadyPromiseResolve(writer); - } - function defaultWriterReadyPromiseReject(writer, reason) { - if (writer._readyPromise_reject === undefined) { - return; - } - setPromiseIsHandledToTrue(writer._readyPromise); - writer._readyPromise_reject(reason); - writer._readyPromise_resolve = undefined; - writer._readyPromise_reject = undefined; - writer._readyPromiseState = 'rejected'; - } - function defaultWriterReadyPromiseReset(writer) { - defaultWriterReadyPromiseInitialize(writer); - } - function defaultWriterReadyPromiseResetToRejected(writer, reason) { - defaultWriterReadyPromiseInitializeAsRejected(writer, reason); - } - function defaultWriterReadyPromiseResolve(writer) { - if (writer._readyPromise_resolve === undefined) { - return; - } - writer._readyPromise_resolve(undefined); - writer._readyPromise_resolve = undefined; - writer._readyPromise_reject = undefined; - writer._readyPromiseState = 'fulfilled'; - } - - /// - function getGlobals() { - if (typeof globalThis !== 'undefined') { - return globalThis; - } - else if (typeof self !== 'undefined') { - return self; - } - else if (typeof global !== 'undefined') { - return global; - } - return undefined; - } - const globals = getGlobals(); - - /// - function isDOMExceptionConstructor(ctor) { - if (!(typeof ctor === 'function' || typeof ctor === 'object')) { - return false; - } - if (ctor.name !== 'DOMException') { - return false; - } - try { - new ctor(); - return true; - } - catch (_a) { - return false; - } - } - /** - * Support: - * - Web browsers - * - Node 18 and higher (https://github.com/nodejs/node/commit/e4b1fb5e6422c1ff151234bb9de792d45dd88d87) - */ - function getFromGlobal() { - const ctor = globals === null || globals === void 0 ? void 0 : globals.DOMException; - return isDOMExceptionConstructor(ctor) ? ctor : undefined; - } - /** - * Support: - * - All platforms - */ - function createPolyfill() { - // eslint-disable-next-line @typescript-eslint/no-shadow - const ctor = function DOMException(message, name) { - this.message = message || ''; - this.name = name || 'Error'; - if (Error.captureStackTrace) { - Error.captureStackTrace(this, this.constructor); - } - }; - setFunctionName(ctor, 'DOMException'); - ctor.prototype = Object.create(Error.prototype); - Object.defineProperty(ctor.prototype, 'constructor', { value: ctor, writable: true, configurable: true }); - return ctor; - } - // eslint-disable-next-line @typescript-eslint/no-redeclare - const DOMException = getFromGlobal() || createPolyfill(); - - function ReadableStreamPipeTo(source, dest, preventClose, preventAbort, preventCancel, signal) { - const reader = AcquireReadableStreamDefaultReader(source); - const writer = AcquireWritableStreamDefaultWriter(dest); - source._disturbed = true; - let shuttingDown = false; - // This is used to keep track of the spec's requirement that we wait for ongoing writes during shutdown. - let currentWrite = promiseResolvedWith(undefined); - return newPromise((resolve, reject) => { - let abortAlgorithm; - if (signal !== undefined) { - abortAlgorithm = () => { - const error = signal.reason !== undefined ? signal.reason : new DOMException('Aborted', 'AbortError'); - const actions = []; - if (!preventAbort) { - actions.push(() => { - if (dest._state === 'writable') { - return WritableStreamAbort(dest, error); - } - return promiseResolvedWith(undefined); - }); - } - if (!preventCancel) { - actions.push(() => { - if (source._state === 'readable') { - return ReadableStreamCancel(source, error); - } - return promiseResolvedWith(undefined); - }); - } - shutdownWithAction(() => Promise.all(actions.map(action => action())), true, error); - }; - if (signal.aborted) { - abortAlgorithm(); - return; - } - signal.addEventListener('abort', abortAlgorithm); - } - // Using reader and writer, read all chunks from this and write them to dest - // - Backpressure must be enforced - // - Shutdown must stop all activity - function pipeLoop() { - return newPromise((resolveLoop, rejectLoop) => { - function next(done) { - if (done) { - resolveLoop(); - } - else { - // Use `PerformPromiseThen` instead of `uponPromise` to avoid - // adding unnecessary `.catch(rethrowAssertionErrorRejection)` handlers - PerformPromiseThen(pipeStep(), next, rejectLoop); - } - } - next(false); - }); - } - function pipeStep() { - if (shuttingDown) { - return promiseResolvedWith(true); - } - return PerformPromiseThen(writer._readyPromise, () => { - return newPromise((resolveRead, rejectRead) => { - ReadableStreamDefaultReaderRead(reader, { - _chunkSteps: chunk => { - currentWrite = PerformPromiseThen(WritableStreamDefaultWriterWrite(writer, chunk), undefined, noop); - resolveRead(false); - }, - _closeSteps: () => resolveRead(true), - _errorSteps: rejectRead - }); - }); - }); - } - // Errors must be propagated forward - isOrBecomesErrored(source, reader._closedPromise, storedError => { - if (!preventAbort) { - shutdownWithAction(() => WritableStreamAbort(dest, storedError), true, storedError); - } - else { - shutdown(true, storedError); - } - return null; - }); - // Errors must be propagated backward - isOrBecomesErrored(dest, writer._closedPromise, storedError => { - if (!preventCancel) { - shutdownWithAction(() => ReadableStreamCancel(source, storedError), true, storedError); - } - else { - shutdown(true, storedError); - } - return null; - }); - // Closing must be propagated forward - isOrBecomesClosed(source, reader._closedPromise, () => { - if (!preventClose) { - shutdownWithAction(() => WritableStreamDefaultWriterCloseWithErrorPropagation(writer)); - } - else { - shutdown(); - } - return null; - }); - // Closing must be propagated backward - if (WritableStreamCloseQueuedOrInFlight(dest) || dest._state === 'closed') { - const destClosed = new TypeError('the destination writable stream closed before all data could be piped to it'); - if (!preventCancel) { - shutdownWithAction(() => ReadableStreamCancel(source, destClosed), true, destClosed); - } - else { - shutdown(true, destClosed); - } - } - setPromiseIsHandledToTrue(pipeLoop()); - function waitForWritesToFinish() { - // Another write may have started while we were waiting on this currentWrite, so we have to be sure to wait - // for that too. - const oldCurrentWrite = currentWrite; - return PerformPromiseThen(currentWrite, () => oldCurrentWrite !== currentWrite ? waitForWritesToFinish() : undefined); - } - function isOrBecomesErrored(stream, promise, action) { - if (stream._state === 'errored') { - action(stream._storedError); - } - else { - uponRejection(promise, action); - } - } - function isOrBecomesClosed(stream, promise, action) { - if (stream._state === 'closed') { - action(); - } - else { - uponFulfillment(promise, action); - } - } - function shutdownWithAction(action, originalIsError, originalError) { - if (shuttingDown) { - return; - } - shuttingDown = true; - if (dest._state === 'writable' && !WritableStreamCloseQueuedOrInFlight(dest)) { - uponFulfillment(waitForWritesToFinish(), doTheRest); - } - else { - doTheRest(); - } - function doTheRest() { - uponPromise(action(), () => finalize(originalIsError, originalError), newError => finalize(true, newError)); - return null; - } - } - function shutdown(isError, error) { - if (shuttingDown) { - return; - } - shuttingDown = true; - if (dest._state === 'writable' && !WritableStreamCloseQueuedOrInFlight(dest)) { - uponFulfillment(waitForWritesToFinish(), () => finalize(isError, error)); - } - else { - finalize(isError, error); - } - } - function finalize(isError, error) { - WritableStreamDefaultWriterRelease(writer); - ReadableStreamReaderGenericRelease(reader); - if (signal !== undefined) { - signal.removeEventListener('abort', abortAlgorithm); - } - if (isError) { - reject(error); - } - else { - resolve(undefined); - } - return null; - } - }); - } - - /** - * Allows control of a {@link ReadableStream | readable stream}'s state and internal queue. - * - * @public - */ - class ReadableStreamDefaultController { - constructor() { - throw new TypeError('Illegal constructor'); - } - /** - * Returns the desired size to fill the controlled stream's internal queue. It can be negative, if the queue is - * over-full. An underlying source ought to use this information to determine when and how to apply backpressure. - */ - get desiredSize() { - if (!IsReadableStreamDefaultController(this)) { - throw defaultControllerBrandCheckException$1('desiredSize'); - } - return ReadableStreamDefaultControllerGetDesiredSize(this); - } - /** - * Closes the controlled readable stream. Consumers will still be able to read any previously-enqueued chunks from - * the stream, but once those are read, the stream will become closed. - */ - close() { - if (!IsReadableStreamDefaultController(this)) { - throw defaultControllerBrandCheckException$1('close'); - } - if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(this)) { - throw new TypeError('The stream is not in a state that permits close'); - } - ReadableStreamDefaultControllerClose(this); - } - enqueue(chunk = undefined) { - if (!IsReadableStreamDefaultController(this)) { - throw defaultControllerBrandCheckException$1('enqueue'); - } - if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(this)) { - throw new TypeError('The stream is not in a state that permits enqueue'); - } - return ReadableStreamDefaultControllerEnqueue(this, chunk); - } - /** - * Errors the controlled readable stream, making all future interactions with it fail with the given error `e`. - */ - error(e = undefined) { - if (!IsReadableStreamDefaultController(this)) { - throw defaultControllerBrandCheckException$1('error'); - } - ReadableStreamDefaultControllerError(this, e); - } - /** @internal */ - [CancelSteps](reason) { - ResetQueue(this); - const result = this._cancelAlgorithm(reason); - ReadableStreamDefaultControllerClearAlgorithms(this); - return result; - } - /** @internal */ - [PullSteps](readRequest) { - const stream = this._controlledReadableStream; - if (this._queue.length > 0) { - const chunk = DequeueValue(this); - if (this._closeRequested && this._queue.length === 0) { - ReadableStreamDefaultControllerClearAlgorithms(this); - ReadableStreamClose(stream); - } - else { - ReadableStreamDefaultControllerCallPullIfNeeded(this); - } - readRequest._chunkSteps(chunk); - } - else { - ReadableStreamAddReadRequest(stream, readRequest); - ReadableStreamDefaultControllerCallPullIfNeeded(this); - } - } - /** @internal */ - [ReleaseSteps]() { - // Do nothing. - } - } - Object.defineProperties(ReadableStreamDefaultController.prototype, { - close: { enumerable: true }, - enqueue: { enumerable: true }, - error: { enumerable: true }, - desiredSize: { enumerable: true } - }); - setFunctionName(ReadableStreamDefaultController.prototype.close, 'close'); - setFunctionName(ReadableStreamDefaultController.prototype.enqueue, 'enqueue'); - setFunctionName(ReadableStreamDefaultController.prototype.error, 'error'); - if (typeof Symbol.toStringTag === 'symbol') { - Object.defineProperty(ReadableStreamDefaultController.prototype, Symbol.toStringTag, { - value: 'ReadableStreamDefaultController', - configurable: true - }); - } - // Abstract operations for the ReadableStreamDefaultController. - function IsReadableStreamDefaultController(x) { - if (!typeIsObject(x)) { - return false; - } - if (!Object.prototype.hasOwnProperty.call(x, '_controlledReadableStream')) { - return false; - } - return x instanceof ReadableStreamDefaultController; - } - function ReadableStreamDefaultControllerCallPullIfNeeded(controller) { - const shouldPull = ReadableStreamDefaultControllerShouldCallPull(controller); - if (!shouldPull) { - return; - } - if (controller._pulling) { - controller._pullAgain = true; - return; - } - controller._pulling = true; - const pullPromise = controller._pullAlgorithm(); - uponPromise(pullPromise, () => { - controller._pulling = false; - if (controller._pullAgain) { - controller._pullAgain = false; - ReadableStreamDefaultControllerCallPullIfNeeded(controller); - } - return null; - }, e => { - ReadableStreamDefaultControllerError(controller, e); - return null; - }); - } - function ReadableStreamDefaultControllerShouldCallPull(controller) { - const stream = controller._controlledReadableStream; - if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { - return false; - } - if (!controller._started) { - return false; - } - if (IsReadableStreamLocked(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { - return true; - } - const desiredSize = ReadableStreamDefaultControllerGetDesiredSize(controller); - if (desiredSize > 0) { - return true; - } - return false; - } - function ReadableStreamDefaultControllerClearAlgorithms(controller) { - controller._pullAlgorithm = undefined; - controller._cancelAlgorithm = undefined; - controller._strategySizeAlgorithm = undefined; - } - // A client of ReadableStreamDefaultController may use these functions directly to bypass state check. - function ReadableStreamDefaultControllerClose(controller) { - if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { - return; - } - const stream = controller._controlledReadableStream; - controller._closeRequested = true; - if (controller._queue.length === 0) { - ReadableStreamDefaultControllerClearAlgorithms(controller); - ReadableStreamClose(stream); - } - } - function ReadableStreamDefaultControllerEnqueue(controller, chunk) { - if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(controller)) { - return; - } - const stream = controller._controlledReadableStream; - if (IsReadableStreamLocked(stream) && ReadableStreamGetNumReadRequests(stream) > 0) { - ReadableStreamFulfillReadRequest(stream, chunk, false); - } - else { - let chunkSize; - try { - chunkSize = controller._strategySizeAlgorithm(chunk); - } - catch (chunkSizeE) { - ReadableStreamDefaultControllerError(controller, chunkSizeE); - throw chunkSizeE; - } - try { - EnqueueValueWithSize(controller, chunk, chunkSize); - } - catch (enqueueE) { - ReadableStreamDefaultControllerError(controller, enqueueE); - throw enqueueE; - } - } - ReadableStreamDefaultControllerCallPullIfNeeded(controller); - } - function ReadableStreamDefaultControllerError(controller, e) { - const stream = controller._controlledReadableStream; - if (stream._state !== 'readable') { - return; - } - ResetQueue(controller); - ReadableStreamDefaultControllerClearAlgorithms(controller); - ReadableStreamError(stream, e); - } - function ReadableStreamDefaultControllerGetDesiredSize(controller) { - const state = controller._controlledReadableStream._state; - if (state === 'errored') { - return null; - } - if (state === 'closed') { - return 0; - } - return controller._strategyHWM - controller._queueTotalSize; - } - // This is used in the implementation of TransformStream. - function ReadableStreamDefaultControllerHasBackpressure(controller) { - if (ReadableStreamDefaultControllerShouldCallPull(controller)) { - return false; - } - return true; - } - function ReadableStreamDefaultControllerCanCloseOrEnqueue(controller) { - const state = controller._controlledReadableStream._state; - if (!controller._closeRequested && state === 'readable') { - return true; - } - return false; - } - function SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm) { - controller._controlledReadableStream = stream; - controller._queue = undefined; - controller._queueTotalSize = undefined; - ResetQueue(controller); - controller._started = false; - controller._closeRequested = false; - controller._pullAgain = false; - controller._pulling = false; - controller._strategySizeAlgorithm = sizeAlgorithm; - controller._strategyHWM = highWaterMark; - controller._pullAlgorithm = pullAlgorithm; - controller._cancelAlgorithm = cancelAlgorithm; - stream._readableStreamController = controller; - const startResult = startAlgorithm(); - uponPromise(promiseResolvedWith(startResult), () => { - controller._started = true; - ReadableStreamDefaultControllerCallPullIfNeeded(controller); - return null; - }, r => { - ReadableStreamDefaultControllerError(controller, r); - return null; - }); - } - function SetUpReadableStreamDefaultControllerFromUnderlyingSource(stream, underlyingSource, highWaterMark, sizeAlgorithm) { - const controller = Object.create(ReadableStreamDefaultController.prototype); - let startAlgorithm; - let pullAlgorithm; - let cancelAlgorithm; - if (underlyingSource.start !== undefined) { - startAlgorithm = () => underlyingSource.start(controller); - } - else { - startAlgorithm = () => undefined; - } - if (underlyingSource.pull !== undefined) { - pullAlgorithm = () => underlyingSource.pull(controller); - } - else { - pullAlgorithm = () => promiseResolvedWith(undefined); - } - if (underlyingSource.cancel !== undefined) { - cancelAlgorithm = reason => underlyingSource.cancel(reason); - } - else { - cancelAlgorithm = () => promiseResolvedWith(undefined); - } - SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm); - } - // Helper functions for the ReadableStreamDefaultController. - function defaultControllerBrandCheckException$1(name) { - return new TypeError(`ReadableStreamDefaultController.prototype.${name} can only be used on a ReadableStreamDefaultController`); - } - - function ReadableStreamTee(stream, cloneForBranch2) { - if (IsReadableByteStreamController(stream._readableStreamController)) { - return ReadableByteStreamTee(stream); - } - return ReadableStreamDefaultTee(stream); - } - function ReadableStreamDefaultTee(stream, cloneForBranch2) { - const reader = AcquireReadableStreamDefaultReader(stream); - let reading = false; - let readAgain = false; - let canceled1 = false; - let canceled2 = false; - let reason1; - let reason2; - let branch1; - let branch2; - let resolveCancelPromise; - const cancelPromise = newPromise(resolve => { - resolveCancelPromise = resolve; - }); - function pullAlgorithm() { - if (reading) { - readAgain = true; - return promiseResolvedWith(undefined); - } - reading = true; - const readRequest = { - _chunkSteps: chunk => { - // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using - // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let - // successful synchronously-available reads get ahead of asynchronously-available errors. - _queueMicrotask(() => { - readAgain = false; - const chunk1 = chunk; - const chunk2 = chunk; - // There is no way to access the cloning code right now in the reference implementation. - // If we add one then we'll need an implementation for serializable objects. - // if (!canceled2 && cloneForBranch2) { - // chunk2 = StructuredDeserialize(StructuredSerialize(chunk2)); - // } - if (!canceled1) { - ReadableStreamDefaultControllerEnqueue(branch1._readableStreamController, chunk1); - } - if (!canceled2) { - ReadableStreamDefaultControllerEnqueue(branch2._readableStreamController, chunk2); - } - reading = false; - if (readAgain) { - pullAlgorithm(); - } - }); - }, - _closeSteps: () => { - reading = false; - if (!canceled1) { - ReadableStreamDefaultControllerClose(branch1._readableStreamController); - } - if (!canceled2) { - ReadableStreamDefaultControllerClose(branch2._readableStreamController); - } - if (!canceled1 || !canceled2) { - resolveCancelPromise(undefined); - } - }, - _errorSteps: () => { - reading = false; - } - }; - ReadableStreamDefaultReaderRead(reader, readRequest); - return promiseResolvedWith(undefined); - } - function cancel1Algorithm(reason) { - canceled1 = true; - reason1 = reason; - if (canceled2) { - const compositeReason = CreateArrayFromList([reason1, reason2]); - const cancelResult = ReadableStreamCancel(stream, compositeReason); - resolveCancelPromise(cancelResult); - } - return cancelPromise; - } - function cancel2Algorithm(reason) { - canceled2 = true; - reason2 = reason; - if (canceled1) { - const compositeReason = CreateArrayFromList([reason1, reason2]); - const cancelResult = ReadableStreamCancel(stream, compositeReason); - resolveCancelPromise(cancelResult); - } - return cancelPromise; - } - function startAlgorithm() { - // do nothing - } - branch1 = CreateReadableStream(startAlgorithm, pullAlgorithm, cancel1Algorithm); - branch2 = CreateReadableStream(startAlgorithm, pullAlgorithm, cancel2Algorithm); - uponRejection(reader._closedPromise, (r) => { - ReadableStreamDefaultControllerError(branch1._readableStreamController, r); - ReadableStreamDefaultControllerError(branch2._readableStreamController, r); - if (!canceled1 || !canceled2) { - resolveCancelPromise(undefined); - } - return null; - }); - return [branch1, branch2]; - } - function ReadableByteStreamTee(stream) { - let reader = AcquireReadableStreamDefaultReader(stream); - let reading = false; - let readAgainForBranch1 = false; - let readAgainForBranch2 = false; - let canceled1 = false; - let canceled2 = false; - let reason1; - let reason2; - let branch1; - let branch2; - let resolveCancelPromise; - const cancelPromise = newPromise(resolve => { - resolveCancelPromise = resolve; - }); - function forwardReaderError(thisReader) { - uponRejection(thisReader._closedPromise, r => { - if (thisReader !== reader) { - return null; - } - ReadableByteStreamControllerError(branch1._readableStreamController, r); - ReadableByteStreamControllerError(branch2._readableStreamController, r); - if (!canceled1 || !canceled2) { - resolveCancelPromise(undefined); - } - return null; - }); - } - function pullWithDefaultReader() { - if (IsReadableStreamBYOBReader(reader)) { - ReadableStreamReaderGenericRelease(reader); - reader = AcquireReadableStreamDefaultReader(stream); - forwardReaderError(reader); - } - const readRequest = { - _chunkSteps: chunk => { - // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using - // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let - // successful synchronously-available reads get ahead of asynchronously-available errors. - _queueMicrotask(() => { - readAgainForBranch1 = false; - readAgainForBranch2 = false; - const chunk1 = chunk; - let chunk2 = chunk; - if (!canceled1 && !canceled2) { - try { - chunk2 = CloneAsUint8Array(chunk); - } - catch (cloneE) { - ReadableByteStreamControllerError(branch1._readableStreamController, cloneE); - ReadableByteStreamControllerError(branch2._readableStreamController, cloneE); - resolveCancelPromise(ReadableStreamCancel(stream, cloneE)); - return; - } - } - if (!canceled1) { - ReadableByteStreamControllerEnqueue(branch1._readableStreamController, chunk1); - } - if (!canceled2) { - ReadableByteStreamControllerEnqueue(branch2._readableStreamController, chunk2); - } - reading = false; - if (readAgainForBranch1) { - pull1Algorithm(); - } - else if (readAgainForBranch2) { - pull2Algorithm(); - } - }); - }, - _closeSteps: () => { - reading = false; - if (!canceled1) { - ReadableByteStreamControllerClose(branch1._readableStreamController); - } - if (!canceled2) { - ReadableByteStreamControllerClose(branch2._readableStreamController); - } - if (branch1._readableStreamController._pendingPullIntos.length > 0) { - ReadableByteStreamControllerRespond(branch1._readableStreamController, 0); - } - if (branch2._readableStreamController._pendingPullIntos.length > 0) { - ReadableByteStreamControllerRespond(branch2._readableStreamController, 0); - } - if (!canceled1 || !canceled2) { - resolveCancelPromise(undefined); - } - }, - _errorSteps: () => { - reading = false; - } - }; - ReadableStreamDefaultReaderRead(reader, readRequest); - } - function pullWithBYOBReader(view, forBranch2) { - if (IsReadableStreamDefaultReader(reader)) { - ReadableStreamReaderGenericRelease(reader); - reader = AcquireReadableStreamBYOBReader(stream); - forwardReaderError(reader); - } - const byobBranch = forBranch2 ? branch2 : branch1; - const otherBranch = forBranch2 ? branch1 : branch2; - const readIntoRequest = { - _chunkSteps: chunk => { - // This needs to be delayed a microtask because it takes at least a microtask to detect errors (using - // reader._closedPromise below), and we want errors in stream to error both branches immediately. We cannot let - // successful synchronously-available reads get ahead of asynchronously-available errors. - _queueMicrotask(() => { - readAgainForBranch1 = false; - readAgainForBranch2 = false; - const byobCanceled = forBranch2 ? canceled2 : canceled1; - const otherCanceled = forBranch2 ? canceled1 : canceled2; - if (!otherCanceled) { - let clonedChunk; - try { - clonedChunk = CloneAsUint8Array(chunk); - } - catch (cloneE) { - ReadableByteStreamControllerError(byobBranch._readableStreamController, cloneE); - ReadableByteStreamControllerError(otherBranch._readableStreamController, cloneE); - resolveCancelPromise(ReadableStreamCancel(stream, cloneE)); - return; - } - if (!byobCanceled) { - ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); - } - ReadableByteStreamControllerEnqueue(otherBranch._readableStreamController, clonedChunk); - } - else if (!byobCanceled) { - ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); - } - reading = false; - if (readAgainForBranch1) { - pull1Algorithm(); - } - else if (readAgainForBranch2) { - pull2Algorithm(); - } - }); - }, - _closeSteps: chunk => { - reading = false; - const byobCanceled = forBranch2 ? canceled2 : canceled1; - const otherCanceled = forBranch2 ? canceled1 : canceled2; - if (!byobCanceled) { - ReadableByteStreamControllerClose(byobBranch._readableStreamController); - } - if (!otherCanceled) { - ReadableByteStreamControllerClose(otherBranch._readableStreamController); - } - if (chunk !== undefined) { - if (!byobCanceled) { - ReadableByteStreamControllerRespondWithNewView(byobBranch._readableStreamController, chunk); - } - if (!otherCanceled && otherBranch._readableStreamController._pendingPullIntos.length > 0) { - ReadableByteStreamControllerRespond(otherBranch._readableStreamController, 0); - } - } - if (!byobCanceled || !otherCanceled) { - resolveCancelPromise(undefined); - } - }, - _errorSteps: () => { - reading = false; - } - }; - ReadableStreamBYOBReaderRead(reader, view, 1, readIntoRequest); - } - function pull1Algorithm() { - if (reading) { - readAgainForBranch1 = true; - return promiseResolvedWith(undefined); - } - reading = true; - const byobRequest = ReadableByteStreamControllerGetBYOBRequest(branch1._readableStreamController); - if (byobRequest === null) { - pullWithDefaultReader(); - } - else { - pullWithBYOBReader(byobRequest._view, false); - } - return promiseResolvedWith(undefined); - } - function pull2Algorithm() { - if (reading) { - readAgainForBranch2 = true; - return promiseResolvedWith(undefined); - } - reading = true; - const byobRequest = ReadableByteStreamControllerGetBYOBRequest(branch2._readableStreamController); - if (byobRequest === null) { - pullWithDefaultReader(); - } - else { - pullWithBYOBReader(byobRequest._view, true); - } - return promiseResolvedWith(undefined); - } - function cancel1Algorithm(reason) { - canceled1 = true; - reason1 = reason; - if (canceled2) { - const compositeReason = CreateArrayFromList([reason1, reason2]); - const cancelResult = ReadableStreamCancel(stream, compositeReason); - resolveCancelPromise(cancelResult); - } - return cancelPromise; - } - function cancel2Algorithm(reason) { - canceled2 = true; - reason2 = reason; - if (canceled1) { - const compositeReason = CreateArrayFromList([reason1, reason2]); - const cancelResult = ReadableStreamCancel(stream, compositeReason); - resolveCancelPromise(cancelResult); - } - return cancelPromise; - } - function startAlgorithm() { - return; - } - branch1 = CreateReadableByteStream(startAlgorithm, pull1Algorithm, cancel1Algorithm); - branch2 = CreateReadableByteStream(startAlgorithm, pull2Algorithm, cancel2Algorithm); - forwardReaderError(reader); - return [branch1, branch2]; - } - - function isReadableStreamLike(stream) { - return typeIsObject(stream) && typeof stream.getReader !== 'undefined'; - } - - function ReadableStreamFrom(source) { - if (isReadableStreamLike(source)) { - return ReadableStreamFromDefaultReader(source.getReader()); - } - return ReadableStreamFromIterable(source); - } - function ReadableStreamFromIterable(asyncIterable) { - let stream; - const iteratorRecord = GetIterator(asyncIterable, 'async'); - const startAlgorithm = noop; - function pullAlgorithm() { - let nextResult; - try { - nextResult = IteratorNext(iteratorRecord); - } - catch (e) { - return promiseRejectedWith(e); - } - const nextPromise = promiseResolvedWith(nextResult); - return transformPromiseWith(nextPromise, iterResult => { - if (!typeIsObject(iterResult)) { - throw new TypeError('The promise returned by the iterator.next() method must fulfill with an object'); - } - const done = IteratorComplete(iterResult); - if (done) { - ReadableStreamDefaultControllerClose(stream._readableStreamController); - } - else { - const value = IteratorValue(iterResult); - ReadableStreamDefaultControllerEnqueue(stream._readableStreamController, value); - } - }); - } - function cancelAlgorithm(reason) { - const iterator = iteratorRecord.iterator; - let returnMethod; - try { - returnMethod = GetMethod(iterator, 'return'); - } - catch (e) { - return promiseRejectedWith(e); - } - if (returnMethod === undefined) { - return promiseResolvedWith(undefined); - } - let returnResult; - try { - returnResult = reflectCall(returnMethod, iterator, [reason]); - } - catch (e) { - return promiseRejectedWith(e); - } - const returnPromise = promiseResolvedWith(returnResult); - return transformPromiseWith(returnPromise, iterResult => { - if (!typeIsObject(iterResult)) { - throw new TypeError('The promise returned by the iterator.return() method must fulfill with an object'); - } - return undefined; - }); - } - stream = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, 0); - return stream; - } - function ReadableStreamFromDefaultReader(reader) { - let stream; - const startAlgorithm = noop; - function pullAlgorithm() { - let readPromise; - try { - readPromise = reader.read(); - } - catch (e) { - return promiseRejectedWith(e); - } - return transformPromiseWith(readPromise, readResult => { - if (!typeIsObject(readResult)) { - throw new TypeError('The promise returned by the reader.read() method must fulfill with an object'); - } - if (readResult.done) { - ReadableStreamDefaultControllerClose(stream._readableStreamController); - } - else { - const value = readResult.value; - ReadableStreamDefaultControllerEnqueue(stream._readableStreamController, value); - } - }); - } - function cancelAlgorithm(reason) { - try { - return promiseResolvedWith(reader.cancel(reason)); - } - catch (e) { - return promiseRejectedWith(e); - } - } - stream = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, 0); - return stream; - } - - function convertUnderlyingDefaultOrByteSource(source, context) { - assertDictionary(source, context); - const original = source; - const autoAllocateChunkSize = original === null || original === void 0 ? void 0 : original.autoAllocateChunkSize; - const cancel = original === null || original === void 0 ? void 0 : original.cancel; - const pull = original === null || original === void 0 ? void 0 : original.pull; - const start = original === null || original === void 0 ? void 0 : original.start; - const type = original === null || original === void 0 ? void 0 : original.type; - return { - autoAllocateChunkSize: autoAllocateChunkSize === undefined ? - undefined : - convertUnsignedLongLongWithEnforceRange(autoAllocateChunkSize, `${context} has member 'autoAllocateChunkSize' that`), - cancel: cancel === undefined ? - undefined : - convertUnderlyingSourceCancelCallback(cancel, original, `${context} has member 'cancel' that`), - pull: pull === undefined ? - undefined : - convertUnderlyingSourcePullCallback(pull, original, `${context} has member 'pull' that`), - start: start === undefined ? - undefined : - convertUnderlyingSourceStartCallback(start, original, `${context} has member 'start' that`), - type: type === undefined ? undefined : convertReadableStreamType(type, `${context} has member 'type' that`) - }; - } - function convertUnderlyingSourceCancelCallback(fn, original, context) { - assertFunction(fn, context); - return (reason) => promiseCall(fn, original, [reason]); - } - function convertUnderlyingSourcePullCallback(fn, original, context) { - assertFunction(fn, context); - return (controller) => promiseCall(fn, original, [controller]); - } - function convertUnderlyingSourceStartCallback(fn, original, context) { - assertFunction(fn, context); - return (controller) => reflectCall(fn, original, [controller]); - } - function convertReadableStreamType(type, context) { - type = `${type}`; - if (type !== 'bytes') { - throw new TypeError(`${context} '${type}' is not a valid enumeration value for ReadableStreamType`); - } - return type; - } - - function convertIteratorOptions(options, context) { - assertDictionary(options, context); - const preventCancel = options === null || options === void 0 ? void 0 : options.preventCancel; - return { preventCancel: Boolean(preventCancel) }; - } - - function convertPipeOptions(options, context) { - assertDictionary(options, context); - const preventAbort = options === null || options === void 0 ? void 0 : options.preventAbort; - const preventCancel = options === null || options === void 0 ? void 0 : options.preventCancel; - const preventClose = options === null || options === void 0 ? void 0 : options.preventClose; - const signal = options === null || options === void 0 ? void 0 : options.signal; - if (signal !== undefined) { - assertAbortSignal(signal, `${context} has member 'signal' that`); - } - return { - preventAbort: Boolean(preventAbort), - preventCancel: Boolean(preventCancel), - preventClose: Boolean(preventClose), - signal - }; - } - function assertAbortSignal(signal, context) { - if (!isAbortSignal(signal)) { - throw new TypeError(`${context} is not an AbortSignal.`); - } - } - - function convertReadableWritablePair(pair, context) { - assertDictionary(pair, context); - const readable = pair === null || pair === void 0 ? void 0 : pair.readable; - assertRequiredField(readable, 'readable', 'ReadableWritablePair'); - assertReadableStream(readable, `${context} has member 'readable' that`); - const writable = pair === null || pair === void 0 ? void 0 : pair.writable; - assertRequiredField(writable, 'writable', 'ReadableWritablePair'); - assertWritableStream(writable, `${context} has member 'writable' that`); - return { readable, writable }; - } - - /** - * A readable stream represents a source of data, from which you can read. - * - * @public - */ - class ReadableStream { - constructor(rawUnderlyingSource = {}, rawStrategy = {}) { - if (rawUnderlyingSource === undefined) { - rawUnderlyingSource = null; - } - else { - assertObject(rawUnderlyingSource, 'First parameter'); - } - const strategy = convertQueuingStrategy(rawStrategy, 'Second parameter'); - const underlyingSource = convertUnderlyingDefaultOrByteSource(rawUnderlyingSource, 'First parameter'); - InitializeReadableStream(this); - if (underlyingSource.type === 'bytes') { - if (strategy.size !== undefined) { - throw new RangeError('The strategy for a byte stream cannot have a size function'); - } - const highWaterMark = ExtractHighWaterMark(strategy, 0); - SetUpReadableByteStreamControllerFromUnderlyingSource(this, underlyingSource, highWaterMark); - } - else { - const sizeAlgorithm = ExtractSizeAlgorithm(strategy); - const highWaterMark = ExtractHighWaterMark(strategy, 1); - SetUpReadableStreamDefaultControllerFromUnderlyingSource(this, underlyingSource, highWaterMark, sizeAlgorithm); - } - } - /** - * Whether or not the readable stream is locked to a {@link ReadableStreamDefaultReader | reader}. - */ - get locked() { - if (!IsReadableStream(this)) { - throw streamBrandCheckException$1('locked'); - } - return IsReadableStreamLocked(this); - } - /** - * Cancels the stream, signaling a loss of interest in the stream by a consumer. - * - * The supplied `reason` argument will be given to the underlying source's {@link UnderlyingSource.cancel | cancel()} - * method, which might or might not use it. - */ - cancel(reason = undefined) { - if (!IsReadableStream(this)) { - return promiseRejectedWith(streamBrandCheckException$1('cancel')); - } - if (IsReadableStreamLocked(this)) { - return promiseRejectedWith(new TypeError('Cannot cancel a stream that already has a reader')); - } - return ReadableStreamCancel(this, reason); - } - getReader(rawOptions = undefined) { - if (!IsReadableStream(this)) { - throw streamBrandCheckException$1('getReader'); - } - const options = convertReaderOptions(rawOptions, 'First parameter'); - if (options.mode === undefined) { - return AcquireReadableStreamDefaultReader(this); - } - return AcquireReadableStreamBYOBReader(this); - } - pipeThrough(rawTransform, rawOptions = {}) { - if (!IsReadableStream(this)) { - throw streamBrandCheckException$1('pipeThrough'); - } - assertRequiredArgument(rawTransform, 1, 'pipeThrough'); - const transform = convertReadableWritablePair(rawTransform, 'First parameter'); - const options = convertPipeOptions(rawOptions, 'Second parameter'); - if (IsReadableStreamLocked(this)) { - throw new TypeError('ReadableStream.prototype.pipeThrough cannot be used on a locked ReadableStream'); - } - if (IsWritableStreamLocked(transform.writable)) { - throw new TypeError('ReadableStream.prototype.pipeThrough cannot be used on a locked WritableStream'); - } - const promise = ReadableStreamPipeTo(this, transform.writable, options.preventClose, options.preventAbort, options.preventCancel, options.signal); - setPromiseIsHandledToTrue(promise); - return transform.readable; - } - pipeTo(destination, rawOptions = {}) { - if (!IsReadableStream(this)) { - return promiseRejectedWith(streamBrandCheckException$1('pipeTo')); - } - if (destination === undefined) { - return promiseRejectedWith(`Parameter 1 is required in 'pipeTo'.`); - } - if (!IsWritableStream(destination)) { - return promiseRejectedWith(new TypeError(`ReadableStream.prototype.pipeTo's first argument must be a WritableStream`)); - } - let options; - try { - options = convertPipeOptions(rawOptions, 'Second parameter'); - } - catch (e) { - return promiseRejectedWith(e); - } - if (IsReadableStreamLocked(this)) { - return promiseRejectedWith(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked ReadableStream')); - } - if (IsWritableStreamLocked(destination)) { - return promiseRejectedWith(new TypeError('ReadableStream.prototype.pipeTo cannot be used on a locked WritableStream')); - } - return ReadableStreamPipeTo(this, destination, options.preventClose, options.preventAbort, options.preventCancel, options.signal); - } - /** - * Tees this readable stream, returning a two-element array containing the two resulting branches as - * new {@link ReadableStream} instances. - * - * Teeing a stream will lock it, preventing any other consumer from acquiring a reader. - * To cancel the stream, cancel both of the resulting branches; a composite cancellation reason will then be - * propagated to the stream's underlying source. - * - * Note that the chunks seen in each branch will be the same object. If the chunks are not immutable, - * this could allow interference between the two branches. - */ - tee() { - if (!IsReadableStream(this)) { - throw streamBrandCheckException$1('tee'); - } - const branches = ReadableStreamTee(this); - return CreateArrayFromList(branches); - } - values(rawOptions = undefined) { - if (!IsReadableStream(this)) { - throw streamBrandCheckException$1('values'); - } - const options = convertIteratorOptions(rawOptions, 'First parameter'); - return AcquireReadableStreamAsyncIterator(this, options.preventCancel); - } - [SymbolAsyncIterator](options) { - // Stub implementation, overridden below - return this.values(options); - } - /** - * Creates a new ReadableStream wrapping the provided iterable or async iterable. - * - * This can be used to adapt various kinds of objects into a readable stream, - * such as an array, an async generator, or a Node.js readable stream. - */ - static from(asyncIterable) { - return ReadableStreamFrom(asyncIterable); - } - } - Object.defineProperties(ReadableStream, { - from: { enumerable: true } - }); - Object.defineProperties(ReadableStream.prototype, { - cancel: { enumerable: true }, - getReader: { enumerable: true }, - pipeThrough: { enumerable: true }, - pipeTo: { enumerable: true }, - tee: { enumerable: true }, - values: { enumerable: true }, - locked: { enumerable: true } - }); - setFunctionName(ReadableStream.from, 'from'); - setFunctionName(ReadableStream.prototype.cancel, 'cancel'); - setFunctionName(ReadableStream.prototype.getReader, 'getReader'); - setFunctionName(ReadableStream.prototype.pipeThrough, 'pipeThrough'); - setFunctionName(ReadableStream.prototype.pipeTo, 'pipeTo'); - setFunctionName(ReadableStream.prototype.tee, 'tee'); - setFunctionName(ReadableStream.prototype.values, 'values'); - if (typeof Symbol.toStringTag === 'symbol') { - Object.defineProperty(ReadableStream.prototype, Symbol.toStringTag, { - value: 'ReadableStream', - configurable: true - }); - } - Object.defineProperty(ReadableStream.prototype, SymbolAsyncIterator, { - value: ReadableStream.prototype.values, - writable: true, - configurable: true - }); - // Abstract operations for the ReadableStream. - // Throws if and only if startAlgorithm throws. - function CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark = 1, sizeAlgorithm = () => 1) { - const stream = Object.create(ReadableStream.prototype); - InitializeReadableStream(stream); - const controller = Object.create(ReadableStreamDefaultController.prototype); - SetUpReadableStreamDefaultController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, highWaterMark, sizeAlgorithm); - return stream; - } - // Throws if and only if startAlgorithm throws. - function CreateReadableByteStream(startAlgorithm, pullAlgorithm, cancelAlgorithm) { - const stream = Object.create(ReadableStream.prototype); - InitializeReadableStream(stream); - const controller = Object.create(ReadableByteStreamController.prototype); - SetUpReadableByteStreamController(stream, controller, startAlgorithm, pullAlgorithm, cancelAlgorithm, 0, undefined); - return stream; - } - function InitializeReadableStream(stream) { - stream._state = 'readable'; - stream._reader = undefined; - stream._storedError = undefined; - stream._disturbed = false; - } - function IsReadableStream(x) { - if (!typeIsObject(x)) { - return false; - } - if (!Object.prototype.hasOwnProperty.call(x, '_readableStreamController')) { - return false; - } - return x instanceof ReadableStream; - } - function IsReadableStreamLocked(stream) { - if (stream._reader === undefined) { - return false; - } - return true; - } - // ReadableStream API exposed for controllers. - function ReadableStreamCancel(stream, reason) { - stream._disturbed = true; - if (stream._state === 'closed') { - return promiseResolvedWith(undefined); - } - if (stream._state === 'errored') { - return promiseRejectedWith(stream._storedError); - } - ReadableStreamClose(stream); - const reader = stream._reader; - if (reader !== undefined && IsReadableStreamBYOBReader(reader)) { - const readIntoRequests = reader._readIntoRequests; - reader._readIntoRequests = new SimpleQueue(); - readIntoRequests.forEach(readIntoRequest => { - readIntoRequest._closeSteps(undefined); - }); - } - const sourceCancelPromise = stream._readableStreamController[CancelSteps](reason); - return transformPromiseWith(sourceCancelPromise, noop); - } - function ReadableStreamClose(stream) { - stream._state = 'closed'; - const reader = stream._reader; - if (reader === undefined) { - return; - } - defaultReaderClosedPromiseResolve(reader); - if (IsReadableStreamDefaultReader(reader)) { - const readRequests = reader._readRequests; - reader._readRequests = new SimpleQueue(); - readRequests.forEach(readRequest => { - readRequest._closeSteps(); - }); - } - } - function ReadableStreamError(stream, e) { - stream._state = 'errored'; - stream._storedError = e; - const reader = stream._reader; - if (reader === undefined) { - return; - } - defaultReaderClosedPromiseReject(reader, e); - if (IsReadableStreamDefaultReader(reader)) { - ReadableStreamDefaultReaderErrorReadRequests(reader, e); - } - else { - ReadableStreamBYOBReaderErrorReadIntoRequests(reader, e); - } - } - // Helper functions for the ReadableStream. - function streamBrandCheckException$1(name) { - return new TypeError(`ReadableStream.prototype.${name} can only be used on a ReadableStream`); - } - - function convertQueuingStrategyInit(init, context) { - assertDictionary(init, context); - const highWaterMark = init === null || init === void 0 ? void 0 : init.highWaterMark; - assertRequiredField(highWaterMark, 'highWaterMark', 'QueuingStrategyInit'); - return { - highWaterMark: convertUnrestrictedDouble(highWaterMark) - }; - } - - // The size function must not have a prototype property nor be a constructor - const byteLengthSizeFunction = (chunk) => { - return chunk.byteLength; - }; - setFunctionName(byteLengthSizeFunction, 'size'); - /** - * A queuing strategy that counts the number of bytes in each chunk. - * - * @public - */ - class ByteLengthQueuingStrategy { - constructor(options) { - assertRequiredArgument(options, 1, 'ByteLengthQueuingStrategy'); - options = convertQueuingStrategyInit(options, 'First parameter'); - this._byteLengthQueuingStrategyHighWaterMark = options.highWaterMark; - } - /** - * Returns the high water mark provided to the constructor. - */ - get highWaterMark() { - if (!IsByteLengthQueuingStrategy(this)) { - throw byteLengthBrandCheckException('highWaterMark'); - } - return this._byteLengthQueuingStrategyHighWaterMark; - } - /** - * Measures the size of `chunk` by returning the value of its `byteLength` property. - */ - get size() { - if (!IsByteLengthQueuingStrategy(this)) { - throw byteLengthBrandCheckException('size'); - } - return byteLengthSizeFunction; - } - } - Object.defineProperties(ByteLengthQueuingStrategy.prototype, { - highWaterMark: { enumerable: true }, - size: { enumerable: true } - }); - if (typeof Symbol.toStringTag === 'symbol') { - Object.defineProperty(ByteLengthQueuingStrategy.prototype, Symbol.toStringTag, { - value: 'ByteLengthQueuingStrategy', - configurable: true - }); - } - // Helper functions for the ByteLengthQueuingStrategy. - function byteLengthBrandCheckException(name) { - return new TypeError(`ByteLengthQueuingStrategy.prototype.${name} can only be used on a ByteLengthQueuingStrategy`); - } - function IsByteLengthQueuingStrategy(x) { - if (!typeIsObject(x)) { - return false; - } - if (!Object.prototype.hasOwnProperty.call(x, '_byteLengthQueuingStrategyHighWaterMark')) { - return false; - } - return x instanceof ByteLengthQueuingStrategy; - } - - // The size function must not have a prototype property nor be a constructor - const countSizeFunction = () => { - return 1; - }; - setFunctionName(countSizeFunction, 'size'); - /** - * A queuing strategy that counts the number of chunks. - * - * @public - */ - class CountQueuingStrategy { - constructor(options) { - assertRequiredArgument(options, 1, 'CountQueuingStrategy'); - options = convertQueuingStrategyInit(options, 'First parameter'); - this._countQueuingStrategyHighWaterMark = options.highWaterMark; - } - /** - * Returns the high water mark provided to the constructor. - */ - get highWaterMark() { - if (!IsCountQueuingStrategy(this)) { - throw countBrandCheckException('highWaterMark'); - } - return this._countQueuingStrategyHighWaterMark; - } - /** - * Measures the size of `chunk` by always returning 1. - * This ensures that the total queue size is a count of the number of chunks in the queue. - */ - get size() { - if (!IsCountQueuingStrategy(this)) { - throw countBrandCheckException('size'); - } - return countSizeFunction; - } - } - Object.defineProperties(CountQueuingStrategy.prototype, { - highWaterMark: { enumerable: true }, - size: { enumerable: true } - }); - if (typeof Symbol.toStringTag === 'symbol') { - Object.defineProperty(CountQueuingStrategy.prototype, Symbol.toStringTag, { - value: 'CountQueuingStrategy', - configurable: true - }); - } - // Helper functions for the CountQueuingStrategy. - function countBrandCheckException(name) { - return new TypeError(`CountQueuingStrategy.prototype.${name} can only be used on a CountQueuingStrategy`); - } - function IsCountQueuingStrategy(x) { - if (!typeIsObject(x)) { - return false; - } - if (!Object.prototype.hasOwnProperty.call(x, '_countQueuingStrategyHighWaterMark')) { - return false; - } - return x instanceof CountQueuingStrategy; - } - - function convertTransformer(original, context) { - assertDictionary(original, context); - const cancel = original === null || original === void 0 ? void 0 : original.cancel; - const flush = original === null || original === void 0 ? void 0 : original.flush; - const readableType = original === null || original === void 0 ? void 0 : original.readableType; - const start = original === null || original === void 0 ? void 0 : original.start; - const transform = original === null || original === void 0 ? void 0 : original.transform; - const writableType = original === null || original === void 0 ? void 0 : original.writableType; - return { - cancel: cancel === undefined ? - undefined : - convertTransformerCancelCallback(cancel, original, `${context} has member 'cancel' that`), - flush: flush === undefined ? - undefined : - convertTransformerFlushCallback(flush, original, `${context} has member 'flush' that`), - readableType, - start: start === undefined ? - undefined : - convertTransformerStartCallback(start, original, `${context} has member 'start' that`), - transform: transform === undefined ? - undefined : - convertTransformerTransformCallback(transform, original, `${context} has member 'transform' that`), - writableType - }; - } - function convertTransformerFlushCallback(fn, original, context) { - assertFunction(fn, context); - return (controller) => promiseCall(fn, original, [controller]); - } - function convertTransformerStartCallback(fn, original, context) { - assertFunction(fn, context); - return (controller) => reflectCall(fn, original, [controller]); - } - function convertTransformerTransformCallback(fn, original, context) { - assertFunction(fn, context); - return (chunk, controller) => promiseCall(fn, original, [chunk, controller]); - } - function convertTransformerCancelCallback(fn, original, context) { - assertFunction(fn, context); - return (reason) => promiseCall(fn, original, [reason]); - } - - // Class TransformStream - /** - * A transform stream consists of a pair of streams: a {@link WritableStream | writable stream}, - * known as its writable side, and a {@link ReadableStream | readable stream}, known as its readable side. - * In a manner specific to the transform stream in question, writes to the writable side result in new data being - * made available for reading from the readable side. - * - * @public - */ - class TransformStream { - constructor(rawTransformer = {}, rawWritableStrategy = {}, rawReadableStrategy = {}) { - if (rawTransformer === undefined) { - rawTransformer = null; - } - const writableStrategy = convertQueuingStrategy(rawWritableStrategy, 'Second parameter'); - const readableStrategy = convertQueuingStrategy(rawReadableStrategy, 'Third parameter'); - const transformer = convertTransformer(rawTransformer, 'First parameter'); - if (transformer.readableType !== undefined) { - throw new RangeError('Invalid readableType specified'); - } - if (transformer.writableType !== undefined) { - throw new RangeError('Invalid writableType specified'); - } - const readableHighWaterMark = ExtractHighWaterMark(readableStrategy, 0); - const readableSizeAlgorithm = ExtractSizeAlgorithm(readableStrategy); - const writableHighWaterMark = ExtractHighWaterMark(writableStrategy, 1); - const writableSizeAlgorithm = ExtractSizeAlgorithm(writableStrategy); - let startPromise_resolve; - const startPromise = newPromise(resolve => { - startPromise_resolve = resolve; - }); - InitializeTransformStream(this, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm); - SetUpTransformStreamDefaultControllerFromTransformer(this, transformer); - if (transformer.start !== undefined) { - startPromise_resolve(transformer.start(this._transformStreamController)); - } - else { - startPromise_resolve(undefined); - } - } - /** - * The readable side of the transform stream. - */ - get readable() { - if (!IsTransformStream(this)) { - throw streamBrandCheckException('readable'); - } - return this._readable; - } - /** - * The writable side of the transform stream. - */ - get writable() { - if (!IsTransformStream(this)) { - throw streamBrandCheckException('writable'); - } - return this._writable; - } - } - Object.defineProperties(TransformStream.prototype, { - readable: { enumerable: true }, - writable: { enumerable: true } - }); - if (typeof Symbol.toStringTag === 'symbol') { - Object.defineProperty(TransformStream.prototype, Symbol.toStringTag, { - value: 'TransformStream', - configurable: true - }); - } - function InitializeTransformStream(stream, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm) { - function startAlgorithm() { - return startPromise; - } - function writeAlgorithm(chunk) { - return TransformStreamDefaultSinkWriteAlgorithm(stream, chunk); - } - function abortAlgorithm(reason) { - return TransformStreamDefaultSinkAbortAlgorithm(stream, reason); - } - function closeAlgorithm() { - return TransformStreamDefaultSinkCloseAlgorithm(stream); - } - stream._writable = CreateWritableStream(startAlgorithm, writeAlgorithm, closeAlgorithm, abortAlgorithm, writableHighWaterMark, writableSizeAlgorithm); - function pullAlgorithm() { - return TransformStreamDefaultSourcePullAlgorithm(stream); - } - function cancelAlgorithm(reason) { - return TransformStreamDefaultSourceCancelAlgorithm(stream, reason); - } - stream._readable = CreateReadableStream(startAlgorithm, pullAlgorithm, cancelAlgorithm, readableHighWaterMark, readableSizeAlgorithm); - // The [[backpressure]] slot is set to undefined so that it can be initialised by TransformStreamSetBackpressure. - stream._backpressure = undefined; - stream._backpressureChangePromise = undefined; - stream._backpressureChangePromise_resolve = undefined; - TransformStreamSetBackpressure(stream, true); - stream._transformStreamController = undefined; - } - function IsTransformStream(x) { - if (!typeIsObject(x)) { - return false; - } - if (!Object.prototype.hasOwnProperty.call(x, '_transformStreamController')) { - return false; - } - return x instanceof TransformStream; - } - // This is a no-op if both sides are already errored. - function TransformStreamError(stream, e) { - ReadableStreamDefaultControllerError(stream._readable._readableStreamController, e); - TransformStreamErrorWritableAndUnblockWrite(stream, e); - } - function TransformStreamErrorWritableAndUnblockWrite(stream, e) { - TransformStreamDefaultControllerClearAlgorithms(stream._transformStreamController); - WritableStreamDefaultControllerErrorIfNeeded(stream._writable._writableStreamController, e); - TransformStreamUnblockWrite(stream); - } - function TransformStreamUnblockWrite(stream) { - if (stream._backpressure) { - // Pretend that pull() was called to permit any pending write() calls to complete. TransformStreamSetBackpressure() - // cannot be called from enqueue() or pull() once the ReadableStream is errored, so this will will be the final time - // _backpressure is set. - TransformStreamSetBackpressure(stream, false); - } - } - function TransformStreamSetBackpressure(stream, backpressure) { - // Passes also when called during construction. - if (stream._backpressureChangePromise !== undefined) { - stream._backpressureChangePromise_resolve(); - } - stream._backpressureChangePromise = newPromise(resolve => { - stream._backpressureChangePromise_resolve = resolve; - }); - stream._backpressure = backpressure; - } - // Class TransformStreamDefaultController - /** - * Allows control of the {@link ReadableStream} and {@link WritableStream} of the associated {@link TransformStream}. - * - * @public - */ - class TransformStreamDefaultController { - constructor() { - throw new TypeError('Illegal constructor'); - } - /** - * Returns the desired size to fill the readable side’s internal queue. It can be negative, if the queue is over-full. - */ - get desiredSize() { - if (!IsTransformStreamDefaultController(this)) { - throw defaultControllerBrandCheckException('desiredSize'); - } - const readableController = this._controlledTransformStream._readable._readableStreamController; - return ReadableStreamDefaultControllerGetDesiredSize(readableController); - } - enqueue(chunk = undefined) { - if (!IsTransformStreamDefaultController(this)) { - throw defaultControllerBrandCheckException('enqueue'); - } - TransformStreamDefaultControllerEnqueue(this, chunk); - } - /** - * Errors both the readable side and the writable side of the controlled transform stream, making all future - * interactions with it fail with the given error `e`. Any chunks queued for transformation will be discarded. - */ - error(reason = undefined) { - if (!IsTransformStreamDefaultController(this)) { - throw defaultControllerBrandCheckException('error'); - } - TransformStreamDefaultControllerError(this, reason); - } - /** - * Closes the readable side and errors the writable side of the controlled transform stream. This is useful when the - * transformer only needs to consume a portion of the chunks written to the writable side. - */ - terminate() { - if (!IsTransformStreamDefaultController(this)) { - throw defaultControllerBrandCheckException('terminate'); - } - TransformStreamDefaultControllerTerminate(this); - } - } - Object.defineProperties(TransformStreamDefaultController.prototype, { - enqueue: { enumerable: true }, - error: { enumerable: true }, - terminate: { enumerable: true }, - desiredSize: { enumerable: true } - }); - setFunctionName(TransformStreamDefaultController.prototype.enqueue, 'enqueue'); - setFunctionName(TransformStreamDefaultController.prototype.error, 'error'); - setFunctionName(TransformStreamDefaultController.prototype.terminate, 'terminate'); - if (typeof Symbol.toStringTag === 'symbol') { - Object.defineProperty(TransformStreamDefaultController.prototype, Symbol.toStringTag, { - value: 'TransformStreamDefaultController', - configurable: true - }); - } - // Transform Stream Default Controller Abstract Operations - function IsTransformStreamDefaultController(x) { - if (!typeIsObject(x)) { - return false; - } - if (!Object.prototype.hasOwnProperty.call(x, '_controlledTransformStream')) { - return false; - } - return x instanceof TransformStreamDefaultController; - } - function SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm, cancelAlgorithm) { - controller._controlledTransformStream = stream; - stream._transformStreamController = controller; - controller._transformAlgorithm = transformAlgorithm; - controller._flushAlgorithm = flushAlgorithm; - controller._cancelAlgorithm = cancelAlgorithm; - controller._finishPromise = undefined; - controller._finishPromise_resolve = undefined; - controller._finishPromise_reject = undefined; - } - function SetUpTransformStreamDefaultControllerFromTransformer(stream, transformer) { - const controller = Object.create(TransformStreamDefaultController.prototype); - let transformAlgorithm; - let flushAlgorithm; - let cancelAlgorithm; - if (transformer.transform !== undefined) { - transformAlgorithm = chunk => transformer.transform(chunk, controller); - } - else { - transformAlgorithm = chunk => { - try { - TransformStreamDefaultControllerEnqueue(controller, chunk); - return promiseResolvedWith(undefined); - } - catch (transformResultE) { - return promiseRejectedWith(transformResultE); - } - }; - } - if (transformer.flush !== undefined) { - flushAlgorithm = () => transformer.flush(controller); - } - else { - flushAlgorithm = () => promiseResolvedWith(undefined); - } - if (transformer.cancel !== undefined) { - cancelAlgorithm = reason => transformer.cancel(reason); - } - else { - cancelAlgorithm = () => promiseResolvedWith(undefined); - } - SetUpTransformStreamDefaultController(stream, controller, transformAlgorithm, flushAlgorithm, cancelAlgorithm); - } - function TransformStreamDefaultControllerClearAlgorithms(controller) { - controller._transformAlgorithm = undefined; - controller._flushAlgorithm = undefined; - controller._cancelAlgorithm = undefined; - } - function TransformStreamDefaultControllerEnqueue(controller, chunk) { - const stream = controller._controlledTransformStream; - const readableController = stream._readable._readableStreamController; - if (!ReadableStreamDefaultControllerCanCloseOrEnqueue(readableController)) { - throw new TypeError('Readable side is not in a state that permits enqueue'); - } - // We throttle transform invocations based on the backpressure of the ReadableStream, but we still - // accept TransformStreamDefaultControllerEnqueue() calls. - try { - ReadableStreamDefaultControllerEnqueue(readableController, chunk); - } - catch (e) { - // This happens when readableStrategy.size() throws. - TransformStreamErrorWritableAndUnblockWrite(stream, e); - throw stream._readable._storedError; - } - const backpressure = ReadableStreamDefaultControllerHasBackpressure(readableController); - if (backpressure !== stream._backpressure) { - TransformStreamSetBackpressure(stream, true); - } - } - function TransformStreamDefaultControllerError(controller, e) { - TransformStreamError(controller._controlledTransformStream, e); - } - function TransformStreamDefaultControllerPerformTransform(controller, chunk) { - const transformPromise = controller._transformAlgorithm(chunk); - return transformPromiseWith(transformPromise, undefined, r => { - TransformStreamError(controller._controlledTransformStream, r); - throw r; - }); - } - function TransformStreamDefaultControllerTerminate(controller) { - const stream = controller._controlledTransformStream; - const readableController = stream._readable._readableStreamController; - ReadableStreamDefaultControllerClose(readableController); - const error = new TypeError('TransformStream terminated'); - TransformStreamErrorWritableAndUnblockWrite(stream, error); - } - // TransformStreamDefaultSink Algorithms - function TransformStreamDefaultSinkWriteAlgorithm(stream, chunk) { - const controller = stream._transformStreamController; - if (stream._backpressure) { - const backpressureChangePromise = stream._backpressureChangePromise; - return transformPromiseWith(backpressureChangePromise, () => { - const writable = stream._writable; - const state = writable._state; - if (state === 'erroring') { - throw writable._storedError; - } - return TransformStreamDefaultControllerPerformTransform(controller, chunk); - }); - } - return TransformStreamDefaultControllerPerformTransform(controller, chunk); - } - function TransformStreamDefaultSinkAbortAlgorithm(stream, reason) { - const controller = stream._transformStreamController; - if (controller._finishPromise !== undefined) { - return controller._finishPromise; - } - // stream._readable cannot change after construction, so caching it across a call to user code is safe. - const readable = stream._readable; - // Assign the _finishPromise now so that if _cancelAlgorithm calls readable.cancel() internally, - // we don't run the _cancelAlgorithm again. - controller._finishPromise = newPromise((resolve, reject) => { - controller._finishPromise_resolve = resolve; - controller._finishPromise_reject = reject; - }); - const cancelPromise = controller._cancelAlgorithm(reason); - TransformStreamDefaultControllerClearAlgorithms(controller); - uponPromise(cancelPromise, () => { - if (readable._state === 'errored') { - defaultControllerFinishPromiseReject(controller, readable._storedError); - } - else { - ReadableStreamDefaultControllerError(readable._readableStreamController, reason); - defaultControllerFinishPromiseResolve(controller); - } - return null; - }, r => { - ReadableStreamDefaultControllerError(readable._readableStreamController, r); - defaultControllerFinishPromiseReject(controller, r); - return null; - }); - return controller._finishPromise; - } - function TransformStreamDefaultSinkCloseAlgorithm(stream) { - const controller = stream._transformStreamController; - if (controller._finishPromise !== undefined) { - return controller._finishPromise; - } - // stream._readable cannot change after construction, so caching it across a call to user code is safe. - const readable = stream._readable; - // Assign the _finishPromise now so that if _flushAlgorithm calls readable.cancel() internally, - // we don't also run the _cancelAlgorithm. - controller._finishPromise = newPromise((resolve, reject) => { - controller._finishPromise_resolve = resolve; - controller._finishPromise_reject = reject; - }); - const flushPromise = controller._flushAlgorithm(); - TransformStreamDefaultControllerClearAlgorithms(controller); - uponPromise(flushPromise, () => { - if (readable._state === 'errored') { - defaultControllerFinishPromiseReject(controller, readable._storedError); - } - else { - ReadableStreamDefaultControllerClose(readable._readableStreamController); - defaultControllerFinishPromiseResolve(controller); - } - return null; - }, r => { - ReadableStreamDefaultControllerError(readable._readableStreamController, r); - defaultControllerFinishPromiseReject(controller, r); - return null; - }); - return controller._finishPromise; - } - // TransformStreamDefaultSource Algorithms - function TransformStreamDefaultSourcePullAlgorithm(stream) { - // Invariant. Enforced by the promises returned by start() and pull(). - TransformStreamSetBackpressure(stream, false); - // Prevent the next pull() call until there is backpressure. - return stream._backpressureChangePromise; - } - function TransformStreamDefaultSourceCancelAlgorithm(stream, reason) { - const controller = stream._transformStreamController; - if (controller._finishPromise !== undefined) { - return controller._finishPromise; - } - // stream._writable cannot change after construction, so caching it across a call to user code is safe. - const writable = stream._writable; - // Assign the _finishPromise now so that if _flushAlgorithm calls writable.abort() or - // writable.cancel() internally, we don't run the _cancelAlgorithm again, or also run the - // _flushAlgorithm. - controller._finishPromise = newPromise((resolve, reject) => { - controller._finishPromise_resolve = resolve; - controller._finishPromise_reject = reject; - }); - const cancelPromise = controller._cancelAlgorithm(reason); - TransformStreamDefaultControllerClearAlgorithms(controller); - uponPromise(cancelPromise, () => { - if (writable._state === 'errored') { - defaultControllerFinishPromiseReject(controller, writable._storedError); - } - else { - WritableStreamDefaultControllerErrorIfNeeded(writable._writableStreamController, reason); - TransformStreamUnblockWrite(stream); - defaultControllerFinishPromiseResolve(controller); - } - return null; - }, r => { - WritableStreamDefaultControllerErrorIfNeeded(writable._writableStreamController, r); - TransformStreamUnblockWrite(stream); - defaultControllerFinishPromiseReject(controller, r); - return null; - }); - return controller._finishPromise; - } - // Helper functions for the TransformStreamDefaultController. - function defaultControllerBrandCheckException(name) { - return new TypeError(`TransformStreamDefaultController.prototype.${name} can only be used on a TransformStreamDefaultController`); - } - function defaultControllerFinishPromiseResolve(controller) { - if (controller._finishPromise_resolve === undefined) { - return; - } - controller._finishPromise_resolve(); - controller._finishPromise_resolve = undefined; - controller._finishPromise_reject = undefined; - } - function defaultControllerFinishPromiseReject(controller, reason) { - if (controller._finishPromise_reject === undefined) { - return; - } - setPromiseIsHandledToTrue(controller._finishPromise); - controller._finishPromise_reject(reason); - controller._finishPromise_resolve = undefined; - controller._finishPromise_reject = undefined; - } - // Helper functions for the TransformStream. - function streamBrandCheckException(name) { - return new TypeError(`TransformStream.prototype.${name} can only be used on a TransformStream`); - } - - exports.ByteLengthQueuingStrategy = ByteLengthQueuingStrategy; - exports.CountQueuingStrategy = CountQueuingStrategy; - exports.ReadableByteStreamController = ReadableByteStreamController; - exports.ReadableStream = ReadableStream; - exports.ReadableStreamBYOBReader = ReadableStreamBYOBReader; - exports.ReadableStreamBYOBRequest = ReadableStreamBYOBRequest; - exports.ReadableStreamDefaultController = ReadableStreamDefaultController; - exports.ReadableStreamDefaultReader = ReadableStreamDefaultReader; - exports.TransformStream = TransformStream; - exports.TransformStreamDefaultController = TransformStreamDefaultController; - exports.WritableStream = WritableStream; - exports.WritableStreamDefaultController = WritableStreamDefaultController; - exports.WritableStreamDefaultWriter = WritableStreamDefaultWriter; - -})); -//# sourceMappingURL=ponyfill.es2018.js.map - - -/***/ }), - -/***/ 2940: -/***/ ((module) => { - -// Returns a wrapper function that returns a wrapped callback -// The wrapper function should do some stuff, and return a -// presumably different callback function. -// This makes sure that own properties are retained, so that -// decorations and such are not lost along the way. -module.exports = wrappy -function wrappy (fn, cb) { - if (fn && cb) return wrappy(fn)(cb) - - if (typeof fn !== 'function') - throw new TypeError('need wrapper function') - - Object.keys(fn).forEach(function (k) { - wrapper[k] = fn[k] - }) - - return wrapper - - function wrapper() { - var args = new Array(arguments.length) - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - var ret = fn.apply(this, args) - var cb = args[args.length-1] - if (typeof ret === 'function' && ret !== cb) { - Object.keys(cb).forEach(function (k) { - ret[k] = cb[k] - }) - } - return ret - } -} - - -/***/ }), - -/***/ 3571: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -const github_1 = __nccwpck_require__(5438); -const openai_1 = __importDefault(__nccwpck_require__(47)); -const CONST_1 = __importDefault(__nccwpck_require__(9873)); -const OpenAI = new openai_1.default({ apiKey: process.env.OPENAI_API_KEY }); -async function processIssueCommentEdit(octokit) { - const payload = github_1.context.payload; - const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; - // check if the issue is open and the has labels - if (payload.issue?.state !== 'open' && !payload.issue?.labels.some((issueLabel) => issueLabel.name === CONST_1.default.LABELS.HELP_WANTED)) { - return; - } - if (!OPENAI_ASSISTANT_ID) { - console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); - return; - } - // You need to adapt this part to fit the Edit Use Case as in the original function - const content = `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body?.from}.\n\nEdited comment content: ${payload.comment?.body}`; - // create thread with first user message and run it - const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ - /* eslint-disable @typescript-eslint/naming-convention */ - assistant_id: OPENAI_ASSISTANT_ID ?? '', - thread: { messages: [{ role: 'user', content }] }, - }); - // count calls for debug purposes - let count = 0; - // poll for run completion - const intervalID = setInterval(() => { - OpenAI.beta.threads.runs - .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) - .then((threadRun) => { - // return if run is not completed yet - if (threadRun.status !== 'completed') { - console.log('issue_comment.edited - run pending completion'); - return; - } - // get assistant response - OpenAI.beta.threads.messages - .list(createAndRunResponse.thread_id) - .then((threadMessages) => { - // list thread messages content - threadMessages.data.forEach((message, index) => { - // @ts-expect-error - we do have `text` in content[0] but typescript doesn't know that this is a 'openai' package type issue - const assistantResponse = message.content?.[index]?.text?.value; - console.log('issue_comment.edited - assistantResponse', assistantResponse); - if (!assistantResponse) { - return console.log('issue_comment.edited - assistantResponse is empty'); - } - // check if assistant response is either NO_ACTION or "NO_ACTION" strings - // as sometimes the assistant response varies - const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; - // if assistant response is NO_ACTION or message role is 'user', do nothing - if (isNoAction || threadMessages.data?.[index]?.role === 'user') { - if (threadMessages.data?.[index]?.role === 'user') { - return; - } - return console.log('issue_comment.edited - NO_ACTION'); - } - // edit comment if assistant detected substantial changes and if the comment was not edited already by the bot - if (assistantResponse.includes('[EDIT_COMMENT]') && !payload.comment?.body.includes('Edited by **proposal-police**')) { - // extract the text after [EDIT_COMMENT] from assistantResponse since this is a - // bot related action keyword - let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); - // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC - const date = new Date(payload.comment?.updated_at ?? ''); - const formattedDate = `${date.toISOString()?.split('.')?.[0]?.replace('T', ' ')} UTC`; - extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); - console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment?.id}`); - octokit.issues.updateComment({ - ...github_1.context.repo, - /* eslint-disable @typescript-eslint/naming-convention */ - comment_id: payload.comment?.id ?? -1, - body: `${extractedNotice}\n\n${payload.comment?.body}`, - }); - } - return false; - }); - }) - .catch((error) => console.log('threads.messages.list - error', error)); - // stop polling - clearInterval(intervalID); - }) - .catch((error) => console.log('threads.runs.retrieve - error', error)); - // increment count for every threads.runs.retrieve call - count++; - console.log('threads.runs.retrieve - called:', count); - }, 1500); -} -async function run() { - // @ts-expect-error - process is not imported - const octokit = (0, github_1.getOctokit)(process.env.GITHUB_TOKEN); - await processIssueCommentEdit(octokit); -} -run().catch((error) => { - console.error(error); - process.exit(1); -}); - - -/***/ }), - -/***/ 9873: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const GITHUB_BASE_URL_REGEX = new RegExp('https?://(?:github\\.com|api\\.github\\.com)'); -const GIT_CONST = { - GITHUB_OWNER: 'Expensify', - APP_REPO: 'App', -}; -const CONST = { - ...GIT_CONST, - APPLAUSE_BOT: 'applausebot', - OS_BOTIFY: 'OSBotify', - LABELS: { - STAGING_DEPLOY: 'StagingDeployCash', - DEPLOY_BLOCKER: 'DeployBlockerCash', - INTERNAL_QA: 'InternalQA', - HELP_WANTED: 'Help Wanted', - }, - DATE_FORMAT_STRING: 'yyyy-MM-dd', - PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), - ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), - ISSUE_OR_PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/(?:pull|issues)/([0-9]+).*`), - POLL_RATE: 10000, - APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, - APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, -}; -exports["default"] = CONST; - - -/***/ }), - -/***/ 2877: -/***/ ((module) => { - -module.exports = eval("require")("encoding"); - - -/***/ }), - -/***/ 9491: -/***/ ((module) => { - -"use strict"; -module.exports = require("assert"); - -/***/ }), - -/***/ 2361: -/***/ ((module) => { - -"use strict"; -module.exports = require("events"); - -/***/ }), - -/***/ 7147: -/***/ ((module) => { - -"use strict"; -module.exports = require("fs"); - -/***/ }), - -/***/ 3685: -/***/ ((module) => { - -"use strict"; -module.exports = require("http"); - -/***/ }), - -/***/ 5687: -/***/ ((module) => { - -"use strict"; -module.exports = require("https"); - -/***/ }), - -/***/ 1808: -/***/ ((module) => { - -"use strict"; -module.exports = require("net"); - -/***/ }), - -/***/ 7561: -/***/ ((module) => { - -"use strict"; -module.exports = require("node:fs"); - -/***/ }), - -/***/ 4492: -/***/ ((module) => { - -"use strict"; -module.exports = require("node:stream"); - -/***/ }), - -/***/ 2037: -/***/ ((module) => { - -"use strict"; -module.exports = require("os"); - -/***/ }), - -/***/ 1017: -/***/ ((module) => { - -"use strict"; -module.exports = require("path"); - -/***/ }), - -/***/ 5477: -/***/ ((module) => { - -"use strict"; -module.exports = require("punycode"); - -/***/ }), - -/***/ 2781: -/***/ ((module) => { - -"use strict"; -module.exports = require("stream"); - -/***/ }), - -/***/ 4404: -/***/ ((module) => { - -"use strict"; -module.exports = require("tls"); - -/***/ }), - -/***/ 7310: -/***/ ((module) => { - -"use strict"; -module.exports = require("url"); - -/***/ }), - -/***/ 3837: -/***/ ((module) => { - -"use strict"; -module.exports = require("util"); - -/***/ }), - -/***/ 1267: -/***/ ((module) => { - -"use strict"; -module.exports = require("worker_threads"); - -/***/ }), - -/***/ 9796: -/***/ ((module) => { - -"use strict"; -module.exports = require("zlib"); - -/***/ }), - -/***/ 1778: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 5860: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -var _FormDataEncoder_instances, _FormDataEncoder_CRLF, _FormDataEncoder_CRLF_BYTES, _FormDataEncoder_CRLF_BYTES_LENGTH, _FormDataEncoder_DASHES, _FormDataEncoder_encoder, _FormDataEncoder_footer, _FormDataEncoder_form, _FormDataEncoder_options, _FormDataEncoder_getFieldHeader; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Encoder = exports.FormDataEncoder = void 0; -const createBoundary_1 = __importDefault(__nccwpck_require__(7956)); -const isPlainObject_1 = __importDefault(__nccwpck_require__(5240)); -const normalizeValue_1 = __importDefault(__nccwpck_require__(1391)); -const escapeName_1 = __importDefault(__nccwpck_require__(3864)); -const isFileLike_1 = __nccwpck_require__(6860); -const isFormData_1 = __nccwpck_require__(1633); -const defaultOptions = { - enableAdditionalHeaders: false -}; -class FormDataEncoder { - constructor(form, boundaryOrOptions, options) { - _FormDataEncoder_instances.add(this); - _FormDataEncoder_CRLF.set(this, "\r\n"); - _FormDataEncoder_CRLF_BYTES.set(this, void 0); - _FormDataEncoder_CRLF_BYTES_LENGTH.set(this, void 0); - _FormDataEncoder_DASHES.set(this, "-".repeat(2)); - _FormDataEncoder_encoder.set(this, new TextEncoder()); - _FormDataEncoder_footer.set(this, void 0); - _FormDataEncoder_form.set(this, void 0); - _FormDataEncoder_options.set(this, void 0); - if (!(0, isFormData_1.isFormData)(form)) { - throw new TypeError("Expected first argument to be a FormData instance."); - } - let boundary; - if ((0, isPlainObject_1.default)(boundaryOrOptions)) { - options = boundaryOrOptions; - } - else { - boundary = boundaryOrOptions; - } - if (!boundary) { - boundary = (0, createBoundary_1.default)(); - } - if (typeof boundary !== "string") { - throw new TypeError("Expected boundary argument to be a string."); - } - if (options && !(0, isPlainObject_1.default)(options)) { - throw new TypeError("Expected options argument to be an object."); - } - __classPrivateFieldSet(this, _FormDataEncoder_form, form, "f"); - __classPrivateFieldSet(this, _FormDataEncoder_options, { ...defaultOptions, ...options }, "f"); - __classPrivateFieldSet(this, _FormDataEncoder_CRLF_BYTES, __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode(__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")), "f"); - __classPrivateFieldSet(this, _FormDataEncoder_CRLF_BYTES_LENGTH, __classPrivateFieldGet(this, _FormDataEncoder_CRLF_BYTES, "f").byteLength, "f"); - this.boundary = `form-data-boundary-${boundary}`; - this.contentType = `multipart/form-data; boundary=${this.boundary}`; - __classPrivateFieldSet(this, _FormDataEncoder_footer, __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode(`${__classPrivateFieldGet(this, _FormDataEncoder_DASHES, "f")}${this.boundary}${__classPrivateFieldGet(this, _FormDataEncoder_DASHES, "f")}${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f").repeat(2)}`), "f"); - this.contentLength = String(this.getContentLength()); - this.headers = Object.freeze({ - "Content-Type": this.contentType, - "Content-Length": this.contentLength - }); - Object.defineProperties(this, { - boundary: { writable: false, configurable: false }, - contentType: { writable: false, configurable: false }, - contentLength: { writable: false, configurable: false }, - headers: { writable: false, configurable: false } - }); - } - getContentLength() { - let length = 0; - for (const [name, raw] of __classPrivateFieldGet(this, _FormDataEncoder_form, "f")) { - const value = (0, isFileLike_1.isFileLike)(raw) ? raw : __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode((0, normalizeValue_1.default)(raw)); - length += __classPrivateFieldGet(this, _FormDataEncoder_instances, "m", _FormDataEncoder_getFieldHeader).call(this, name, value).byteLength; - length += (0, isFileLike_1.isFileLike)(value) ? value.size : value.byteLength; - length += __classPrivateFieldGet(this, _FormDataEncoder_CRLF_BYTES_LENGTH, "f"); - } - return length + __classPrivateFieldGet(this, _FormDataEncoder_footer, "f").byteLength; - } - *values() { - for (const [name, raw] of __classPrivateFieldGet(this, _FormDataEncoder_form, "f").entries()) { - const value = (0, isFileLike_1.isFileLike)(raw) ? raw : __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode((0, normalizeValue_1.default)(raw)); - yield __classPrivateFieldGet(this, _FormDataEncoder_instances, "m", _FormDataEncoder_getFieldHeader).call(this, name, value); - yield value; - yield __classPrivateFieldGet(this, _FormDataEncoder_CRLF_BYTES, "f"); - } - yield __classPrivateFieldGet(this, _FormDataEncoder_footer, "f"); - } - async *encode() { - for (const part of this.values()) { - if ((0, isFileLike_1.isFileLike)(part)) { - yield* part.stream(); - } - else { - yield part; - } - } - } - [(_FormDataEncoder_CRLF = new WeakMap(), _FormDataEncoder_CRLF_BYTES = new WeakMap(), _FormDataEncoder_CRLF_BYTES_LENGTH = new WeakMap(), _FormDataEncoder_DASHES = new WeakMap(), _FormDataEncoder_encoder = new WeakMap(), _FormDataEncoder_footer = new WeakMap(), _FormDataEncoder_form = new WeakMap(), _FormDataEncoder_options = new WeakMap(), _FormDataEncoder_instances = new WeakSet(), _FormDataEncoder_getFieldHeader = function _FormDataEncoder_getFieldHeader(name, value) { - let header = ""; - header += `${__classPrivateFieldGet(this, _FormDataEncoder_DASHES, "f")}${this.boundary}${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")}`; - header += `Content-Disposition: form-data; name="${(0, escapeName_1.default)(name)}"`; - if ((0, isFileLike_1.isFileLike)(value)) { - header += `; filename="${(0, escapeName_1.default)(value.name)}"${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")}`; - header += `Content-Type: ${value.type || "application/octet-stream"}`; - } - if (__classPrivateFieldGet(this, _FormDataEncoder_options, "f").enableAdditionalHeaders === true) { - header += `${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f")}Content-Length: ${(0, isFileLike_1.isFileLike)(value) ? value.size : value.byteLength}`; - } - return __classPrivateFieldGet(this, _FormDataEncoder_encoder, "f").encode(`${header}${__classPrivateFieldGet(this, _FormDataEncoder_CRLF, "f").repeat(2)}`); - }, Symbol.iterator)]() { - return this.values(); - } - [Symbol.asyncIterator]() { - return this.encode(); - } -} -exports.FormDataEncoder = FormDataEncoder; -exports.Encoder = FormDataEncoder; - - -/***/ }), - -/***/ 6921: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); - - -/***/ }), - -/***/ 8824: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -__exportStar(__nccwpck_require__(5860), exports); -__exportStar(__nccwpck_require__(1778), exports); -__exportStar(__nccwpck_require__(6921), exports); -__exportStar(__nccwpck_require__(6860), exports); -__exportStar(__nccwpck_require__(1633), exports); - - -/***/ }), - -/***/ 7956: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"; -function createBoundary() { - let size = 16; - let res = ""; - while (size--) { - res += alphabet[(Math.random() * alphabet.length) << 0]; - } - return res; -} -exports["default"] = createBoundary; - - -/***/ }), - -/***/ 3864: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const escapeName = (name) => String(name) - .replace(/\r/g, "%0D") - .replace(/\n/g, "%0A") - .replace(/"/g, "%22"); -exports["default"] = escapeName; - - -/***/ }), - -/***/ 6860: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isFileLike = void 0; -const isFunction_1 = __importDefault(__nccwpck_require__(2498)); -const isFileLike = (value) => Boolean(value - && typeof value === "object" - && (0, isFunction_1.default)(value.constructor) - && value[Symbol.toStringTag] === "File" - && (0, isFunction_1.default)(value.stream) - && value.name != null - && value.size != null - && value.lastModified != null); -exports.isFileLike = isFileLike; - - -/***/ }), - -/***/ 1633: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isFormDataLike = exports.isFormData = void 0; -const isFunction_1 = __importDefault(__nccwpck_require__(2498)); -const isFormData = (value) => Boolean(value - && (0, isFunction_1.default)(value.constructor) - && value[Symbol.toStringTag] === "FormData" - && (0, isFunction_1.default)(value.append) - && (0, isFunction_1.default)(value.getAll) - && (0, isFunction_1.default)(value.entries) - && (0, isFunction_1.default)(value[Symbol.iterator])); -exports.isFormData = isFormData; -exports.isFormDataLike = exports.isFormData; - - -/***/ }), - -/***/ 2498: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const isFunction = (value) => (typeof value === "function"); -exports["default"] = isFunction; - - -/***/ }), - -/***/ 5240: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const getType = (value) => (Object.prototype.toString.call(value).slice(8, -1).toLowerCase()); -function isPlainObject(value) { - if (getType(value) !== "object") { - return false; - } - const pp = Object.getPrototypeOf(value); - if (pp === null || pp === undefined) { - return true; - } - const Ctor = pp.constructor && pp.constructor.toString(); - return Ctor === Object.toString(); -} -exports["default"] = isPlainObject; - - -/***/ }), - -/***/ 1391: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const normalizeValue = (value) => String(value) - .replace(/\r|\n/g, (match, i, str) => { - if ((match === "\r" && str[i + 1] !== "\n") - || (match === "\n" && str[i - 1] !== "\r")) { - return "\r\n"; - } - return match; -}); -exports["default"] = normalizeValue; - - -/***/ }), - -/***/ 6637: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -/*! Based on fetch-blob. MIT License. Jimmy Wärting & David Frank */ -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -}; -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; -var _Blob_parts, _Blob_type, _Blob_size; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Blob = void 0; -const web_streams_polyfill_1 = __nccwpck_require__(6993); -const isFunction_1 = __nccwpck_require__(4245); -const blobHelpers_1 = __nccwpck_require__(7058); -class Blob { - constructor(blobParts = [], options = {}) { - _Blob_parts.set(this, []); - _Blob_type.set(this, ""); - _Blob_size.set(this, 0); - options !== null && options !== void 0 ? options : (options = {}); - if (typeof blobParts !== "object" || blobParts === null) { - throw new TypeError("Failed to construct 'Blob': " - + "The provided value cannot be converted to a sequence."); - } - if (!(0, isFunction_1.isFunction)(blobParts[Symbol.iterator])) { - throw new TypeError("Failed to construct 'Blob': " - + "The object must have a callable @@iterator property."); - } - if (typeof options !== "object" && !(0, isFunction_1.isFunction)(options)) { - throw new TypeError("Failed to construct 'Blob': parameter 2 cannot convert to dictionary."); - } - const encoder = new TextEncoder(); - for (const raw of blobParts) { - let part; - if (ArrayBuffer.isView(raw)) { - part = new Uint8Array(raw.buffer.slice(raw.byteOffset, raw.byteOffset + raw.byteLength)); - } - else if (raw instanceof ArrayBuffer) { - part = new Uint8Array(raw.slice(0)); - } - else if (raw instanceof Blob) { - part = raw; - } - else { - part = encoder.encode(String(raw)); - } - __classPrivateFieldSet(this, _Blob_size, __classPrivateFieldGet(this, _Blob_size, "f") + (ArrayBuffer.isView(part) ? part.byteLength : part.size), "f"); - __classPrivateFieldGet(this, _Blob_parts, "f").push(part); - } - const type = options.type === undefined ? "" : String(options.type); - __classPrivateFieldSet(this, _Blob_type, /^[\x20-\x7E]*$/.test(type) ? type : "", "f"); - } - static [(_Blob_parts = new WeakMap(), _Blob_type = new WeakMap(), _Blob_size = new WeakMap(), Symbol.hasInstance)](value) { - return Boolean(value - && typeof value === "object" - && (0, isFunction_1.isFunction)(value.constructor) - && ((0, isFunction_1.isFunction)(value.stream) - || (0, isFunction_1.isFunction)(value.arrayBuffer)) - && /^(Blob|File)$/.test(value[Symbol.toStringTag])); - } - get type() { - return __classPrivateFieldGet(this, _Blob_type, "f"); - } - get size() { - return __classPrivateFieldGet(this, _Blob_size, "f"); - } - slice(start, end, contentType) { - return new Blob((0, blobHelpers_1.sliceBlob)(__classPrivateFieldGet(this, _Blob_parts, "f"), this.size, start, end), { - type: contentType - }); - } - async text() { - const decoder = new TextDecoder(); - let result = ""; - for await (const chunk of (0, blobHelpers_1.consumeBlobParts)(__classPrivateFieldGet(this, _Blob_parts, "f"))) { - result += decoder.decode(chunk, { stream: true }); - } - result += decoder.decode(); - return result; - } - async arrayBuffer() { - const view = new Uint8Array(this.size); - let offset = 0; - for await (const chunk of (0, blobHelpers_1.consumeBlobParts)(__classPrivateFieldGet(this, _Blob_parts, "f"))) { - view.set(chunk, offset); - offset += chunk.length; - } - return view.buffer; - } - stream() { - const iterator = (0, blobHelpers_1.consumeBlobParts)(__classPrivateFieldGet(this, _Blob_parts, "f"), true); - return new web_streams_polyfill_1.ReadableStream({ - async pull(controller) { - const { value, done } = await iterator.next(); - if (done) { - return queueMicrotask(() => controller.close()); - } - controller.enqueue(value); - }, - async cancel() { - await iterator.return(); - } - }); - } - get [Symbol.toStringTag]() { - return "Blob"; - } -} -exports.Blob = Blob; -Object.defineProperties(Blob.prototype, { - type: { enumerable: true }, - size: { enumerable: true }, - slice: { enumerable: true }, - stream: { enumerable: true }, - text: { enumerable: true }, - arrayBuffer: { enumerable: true } -}); - - -/***/ }), - -/***/ 3637: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -}; -var _File_name, _File_lastModified; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.File = void 0; -const Blob_1 = __nccwpck_require__(6637); -class File extends Blob_1.Blob { - constructor(fileBits, name, options = {}) { - super(fileBits, options); - _File_name.set(this, void 0); - _File_lastModified.set(this, 0); - if (arguments.length < 2) { - throw new TypeError("Failed to construct 'File': 2 arguments required, " - + `but only ${arguments.length} present.`); - } - __classPrivateFieldSet(this, _File_name, String(name), "f"); - const lastModified = options.lastModified === undefined - ? Date.now() - : Number(options.lastModified); - if (!Number.isNaN(lastModified)) { - __classPrivateFieldSet(this, _File_lastModified, lastModified, "f"); - } - } - static [(_File_name = new WeakMap(), _File_lastModified = new WeakMap(), Symbol.hasInstance)](value) { - return value instanceof Blob_1.Blob - && value[Symbol.toStringTag] === "File" - && typeof value.name === "string"; - } - get name() { - return __classPrivateFieldGet(this, _File_name, "f"); - } - get lastModified() { - return __classPrivateFieldGet(this, _File_lastModified, "f"); - } - get webkitRelativePath() { - return ""; - } - get [Symbol.toStringTag]() { - return "File"; - } -} -exports.File = File; - - -/***/ }), - -/***/ 7268: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -}; -var _FormData_instances, _FormData_entries, _FormData_setEntry; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.FormData = void 0; -const util_1 = __nccwpck_require__(3837); -const File_1 = __nccwpck_require__(3637); -const isFile_1 = __nccwpck_require__(4529); -const isBlob_1 = __nccwpck_require__(5493); -const isFunction_1 = __nccwpck_require__(4245); -const deprecateConstructorEntries_1 = __nccwpck_require__(2689); -class FormData { - constructor(entries) { - _FormData_instances.add(this); - _FormData_entries.set(this, new Map()); - if (entries) { - (0, deprecateConstructorEntries_1.deprecateConstructorEntries)(); - entries.forEach(({ name, value, fileName }) => this.append(name, value, fileName)); - } - } - static [(_FormData_entries = new WeakMap(), _FormData_instances = new WeakSet(), Symbol.hasInstance)](value) { - return Boolean(value - && (0, isFunction_1.isFunction)(value.constructor) - && value[Symbol.toStringTag] === "FormData" - && (0, isFunction_1.isFunction)(value.append) - && (0, isFunction_1.isFunction)(value.set) - && (0, isFunction_1.isFunction)(value.get) - && (0, isFunction_1.isFunction)(value.getAll) - && (0, isFunction_1.isFunction)(value.has) - && (0, isFunction_1.isFunction)(value.delete) - && (0, isFunction_1.isFunction)(value.entries) - && (0, isFunction_1.isFunction)(value.values) - && (0, isFunction_1.isFunction)(value.keys) - && (0, isFunction_1.isFunction)(value[Symbol.iterator]) - && (0, isFunction_1.isFunction)(value.forEach)); - } - append(name, value, fileName) { - __classPrivateFieldGet(this, _FormData_instances, "m", _FormData_setEntry).call(this, { - name, - fileName, - append: true, - rawValue: value, - argsLength: arguments.length - }); - } - set(name, value, fileName) { - __classPrivateFieldGet(this, _FormData_instances, "m", _FormData_setEntry).call(this, { - name, - fileName, - append: false, - rawValue: value, - argsLength: arguments.length - }); - } - get(name) { - const field = __classPrivateFieldGet(this, _FormData_entries, "f").get(String(name)); - if (!field) { - return null; - } - return field[0]; - } - getAll(name) { - const field = __classPrivateFieldGet(this, _FormData_entries, "f").get(String(name)); - if (!field) { - return []; - } - return field.slice(); - } - has(name) { - return __classPrivateFieldGet(this, _FormData_entries, "f").has(String(name)); - } - delete(name) { - __classPrivateFieldGet(this, _FormData_entries, "f").delete(String(name)); - } - *keys() { - for (const key of __classPrivateFieldGet(this, _FormData_entries, "f").keys()) { - yield key; - } - } - *entries() { - for (const name of this.keys()) { - const values = this.getAll(name); - for (const value of values) { - yield [name, value]; - } - } - } - *values() { - for (const [, value] of this) { - yield value; - } - } - [(_FormData_setEntry = function _FormData_setEntry({ name, rawValue, append, fileName, argsLength }) { - const methodName = append ? "append" : "set"; - if (argsLength < 2) { - throw new TypeError(`Failed to execute '${methodName}' on 'FormData': ` - + `2 arguments required, but only ${argsLength} present.`); - } - name = String(name); - let value; - if ((0, isFile_1.isFile)(rawValue)) { - value = fileName === undefined - ? rawValue - : new File_1.File([rawValue], fileName, { - type: rawValue.type, - lastModified: rawValue.lastModified - }); - } - else if ((0, isBlob_1.isBlob)(rawValue)) { - value = new File_1.File([rawValue], fileName === undefined ? "blob" : fileName, { - type: rawValue.type - }); - } - else if (fileName) { - throw new TypeError(`Failed to execute '${methodName}' on 'FormData': ` - + "parameter 2 is not of type 'Blob'."); - } - else { - value = String(rawValue); - } - const values = __classPrivateFieldGet(this, _FormData_entries, "f").get(name); - if (!values) { - return void __classPrivateFieldGet(this, _FormData_entries, "f").set(name, [value]); - } - if (!append) { - return void __classPrivateFieldGet(this, _FormData_entries, "f").set(name, [value]); - } - values.push(value); - }, Symbol.iterator)]() { - return this.entries(); - } - forEach(callback, thisArg) { - for (const [name, value] of this) { - callback.call(thisArg, value, name, this); - } - } - get [Symbol.toStringTag]() { - return "FormData"; - } - [util_1.inspect.custom]() { - return this[Symbol.toStringTag]; - } -} -exports.FormData = FormData; - - -/***/ }), - -/***/ 7058: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -/*! Based on fetch-blob. MIT License. Jimmy Wärting & David Frank */ -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.sliceBlob = exports.consumeBlobParts = void 0; -const isFunction_1 = __nccwpck_require__(4245); -const CHUNK_SIZE = 65536; -async function* clonePart(part) { - const end = part.byteOffset + part.byteLength; - let position = part.byteOffset; - while (position !== end) { - const size = Math.min(end - position, CHUNK_SIZE); - const chunk = part.buffer.slice(position, position + size); - position += chunk.byteLength; - yield new Uint8Array(chunk); - } -} -async function* consumeNodeBlob(blob) { - let position = 0; - while (position !== blob.size) { - const chunk = blob.slice(position, Math.min(blob.size, position + CHUNK_SIZE)); - const buffer = await chunk.arrayBuffer(); - position += buffer.byteLength; - yield new Uint8Array(buffer); - } -} -async function* consumeBlobParts(parts, clone = false) { - for (const part of parts) { - if (ArrayBuffer.isView(part)) { - if (clone) { - yield* clonePart(part); - } - else { - yield part; - } - } - else if ((0, isFunction_1.isFunction)(part.stream)) { - yield* part.stream(); - } - else { - yield* consumeNodeBlob(part); - } - } -} -exports.consumeBlobParts = consumeBlobParts; -function* sliceBlob(blobParts, blobSize, start = 0, end) { - end !== null && end !== void 0 ? end : (end = blobSize); - let relativeStart = start < 0 - ? Math.max(blobSize + start, 0) - : Math.min(start, blobSize); - let relativeEnd = end < 0 - ? Math.max(blobSize + end, 0) - : Math.min(end, blobSize); - const span = Math.max(relativeEnd - relativeStart, 0); - let added = 0; - for (const part of blobParts) { - if (added >= span) { - break; - } - const partSize = ArrayBuffer.isView(part) ? part.byteLength : part.size; - if (relativeStart && partSize <= relativeStart) { - relativeStart -= partSize; - relativeEnd -= partSize; - } - else { - let chunk; - if (ArrayBuffer.isView(part)) { - chunk = part.subarray(relativeStart, Math.min(partSize, relativeEnd)); - added += chunk.byteLength; - } - else { - chunk = part.slice(relativeStart, Math.min(partSize, relativeEnd)); - added += chunk.size; - } - relativeEnd -= partSize; - relativeStart = 0; - yield chunk; - } - } -} -exports.sliceBlob = sliceBlob; - - -/***/ }), - -/***/ 2689: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.deprecateConstructorEntries = void 0; -const util_1 = __nccwpck_require__(3837); -exports.deprecateConstructorEntries = (0, util_1.deprecate)(() => { }, "Constructor \"entries\" argument is not spec-compliant " - + "and will be removed in next major release."); - - -/***/ }), - -/***/ 8735: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -var _FileFromPath_path, _FileFromPath_start; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.fileFromPath = exports.fileFromPathSync = void 0; -const fs_1 = __nccwpck_require__(7147); -const path_1 = __nccwpck_require__(1017); -const node_domexception_1 = __importDefault(__nccwpck_require__(7760)); -const File_1 = __nccwpck_require__(3637); -const isPlainObject_1 = __importDefault(__nccwpck_require__(4722)); -__exportStar(__nccwpck_require__(4529), exports); -const MESSAGE = "The requested file could not be read, " - + "typically due to permission problems that have occurred after a reference " - + "to a file was acquired."; -class FileFromPath { - constructor(input) { - _FileFromPath_path.set(this, void 0); - _FileFromPath_start.set(this, void 0); - __classPrivateFieldSet(this, _FileFromPath_path, input.path, "f"); - __classPrivateFieldSet(this, _FileFromPath_start, input.start || 0, "f"); - this.name = (0, path_1.basename)(__classPrivateFieldGet(this, _FileFromPath_path, "f")); - this.size = input.size; - this.lastModified = input.lastModified; - } - slice(start, end) { - return new FileFromPath({ - path: __classPrivateFieldGet(this, _FileFromPath_path, "f"), - lastModified: this.lastModified, - size: end - start, - start - }); - } - async *stream() { - const { mtimeMs } = await fs_1.promises.stat(__classPrivateFieldGet(this, _FileFromPath_path, "f")); - if (mtimeMs > this.lastModified) { - throw new node_domexception_1.default(MESSAGE, "NotReadableError"); - } - if (this.size) { - yield* (0, fs_1.createReadStream)(__classPrivateFieldGet(this, _FileFromPath_path, "f"), { - start: __classPrivateFieldGet(this, _FileFromPath_start, "f"), - end: __classPrivateFieldGet(this, _FileFromPath_start, "f") + this.size - 1 - }); - } - } - get [(_FileFromPath_path = new WeakMap(), _FileFromPath_start = new WeakMap(), Symbol.toStringTag)]() { - return "File"; - } -} -function createFileFromPath(path, { mtimeMs, size }, filenameOrOptions, options = {}) { - let filename; - if ((0, isPlainObject_1.default)(filenameOrOptions)) { - [options, filename] = [filenameOrOptions, undefined]; - } - else { - filename = filenameOrOptions; - } - const file = new FileFromPath({ path, size, lastModified: mtimeMs }); - if (!filename) { - filename = file.name; - } - return new File_1.File([file], filename, { - ...options, lastModified: file.lastModified - }); -} -function fileFromPathSync(path, filenameOrOptions, options = {}) { - const stats = (0, fs_1.statSync)(path); - return createFileFromPath(path, stats, filenameOrOptions, options); -} -exports.fileFromPathSync = fileFromPathSync; -async function fileFromPath(path, filenameOrOptions, options) { - const stats = await fs_1.promises.stat(path); - return createFileFromPath(path, stats, filenameOrOptions, options); -} -exports.fileFromPath = fileFromPath; - - -/***/ }), - -/***/ 880: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -__exportStar(__nccwpck_require__(7268), exports); -__exportStar(__nccwpck_require__(6637), exports); -__exportStar(__nccwpck_require__(3637), exports); - - -/***/ }), - -/***/ 5493: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isBlob = void 0; -const Blob_1 = __nccwpck_require__(6637); -const isBlob = (value) => value instanceof Blob_1.Blob; -exports.isBlob = isBlob; - - -/***/ }), - -/***/ 4529: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isFile = void 0; -const File_1 = __nccwpck_require__(3637); -const isFile = (value) => value instanceof File_1.File; -exports.isFile = isFile; - - -/***/ }), - -/***/ 4245: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isFunction = void 0; -const isFunction = (value) => (typeof value === "function"); -exports.isFunction = isFunction; - - -/***/ }), - -/***/ 4722: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -const getType = (value) => (Object.prototype.toString.call(value).slice(8, -1).toLowerCase()); -function isPlainObject(value) { - if (getType(value) !== "object") { - return false; - } - const pp = Object.getPrototypeOf(value); - if (pp === null || pp === undefined) { - return true; - } - const Ctor = pp.constructor && pp.constructor.toString(); - return Ctor === Object.toString(); -} -exports["default"] = isPlainObject; - - -/***/ }), - -/***/ 4595: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.MultipartBody = void 0; -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ -class MultipartBody { - constructor(body) { - this.body = body; - } - get [Symbol.toStringTag]() { - return 'MultipartBody'; - } -} -exports.MultipartBody = MultipartBody; -//# sourceMappingURL=MultipartBody.js.map - -/***/ }), - -/***/ 3506: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ -__exportStar(__nccwpck_require__(1749), exports); -//# sourceMappingURL=runtime-node.js.map - -/***/ }), - -/***/ 6678: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ -const shims = __nccwpck_require__(4437); -const auto = __nccwpck_require__(3506); -if (!shims.kind) shims.setShims(auto.getRuntime(), { auto: true }); -for (const property of Object.keys(shims)) { - Object.defineProperty(exports, property, { - get() { - return shims[property]; - }, - }); -} - - -/***/ }), - -/***/ 1749: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getRuntime = void 0; -/** - * Disclaimer: modules in _shims aren't intended to be imported by SDK users. - */ -const nf = __importStar(__nccwpck_require__(467)); -const fd = __importStar(__nccwpck_require__(880)); -const agentkeepalive_1 = __importDefault(__nccwpck_require__(4623)); -const abort_controller_1 = __nccwpck_require__(1659); -const node_fs_1 = __nccwpck_require__(7561); -const form_data_encoder_1 = __nccwpck_require__(8824); -const node_stream_1 = __nccwpck_require__(4492); -const MultipartBody_1 = __nccwpck_require__(4595); -// @ts-ignore (this package does not have proper export maps for this export) -const ponyfill_es2018_js_1 = __nccwpck_require__(1452); -let fileFromPathWarned = false; -async function fileFromPath(path, ...args) { - // this import fails in environments that don't handle export maps correctly, like old versions of Jest - const { fileFromPath: _fileFromPath } = await Promise.resolve().then(() => __importStar(__nccwpck_require__(8735))); - if (!fileFromPathWarned) { - console.warn(`fileFromPath is deprecated; use fs.createReadStream(${JSON.stringify(path)}) instead`); - fileFromPathWarned = true; - } - // @ts-ignore - return await _fileFromPath(path, ...args); -} -const defaultHttpAgent = new agentkeepalive_1.default({ keepAlive: true, timeout: 5 * 60 * 1000 }); -const defaultHttpsAgent = new agentkeepalive_1.default.HttpsAgent({ keepAlive: true, timeout: 5 * 60 * 1000 }); -async function getMultipartRequestOptions(form, opts) { - const encoder = new form_data_encoder_1.FormDataEncoder(form); - const readable = node_stream_1.Readable.from(encoder); - const body = new MultipartBody_1.MultipartBody(readable); - const headers = { - ...opts.headers, - ...encoder.headers, - 'Content-Length': encoder.contentLength, - }; - return { ...opts, body: body, headers }; -} -function getRuntime() { - // Polyfill global object if needed. - if (typeof AbortController === 'undefined') { - // @ts-expect-error (the types are subtly different, but compatible in practice) - globalThis.AbortController = abort_controller_1.AbortController; - } - return { - kind: 'node', - fetch: nf.default, - Request: nf.Request, - Response: nf.Response, - Headers: nf.Headers, - FormData: fd.FormData, - Blob: fd.Blob, - File: fd.File, - ReadableStream: ponyfill_es2018_js_1.ReadableStream, - getMultipartRequestOptions, - getDefaultAgent: (url) => (url.startsWith('https') ? defaultHttpsAgent : defaultHttpAgent), - fileFromPath, - isFsReadStream: (value) => value instanceof node_fs_1.ReadStream, - }; -} -exports.getRuntime = getRuntime; -//# sourceMappingURL=node-runtime.js.map - -/***/ }), - -/***/ 4437: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.setShims = exports.isFsReadStream = exports.fileFromPath = exports.getDefaultAgent = exports.getMultipartRequestOptions = exports.ReadableStream = exports.File = exports.Blob = exports.FormData = exports.Headers = exports.Response = exports.Request = exports.fetch = exports.kind = exports.auto = void 0; -exports.auto = false; -exports.kind = undefined; -exports.fetch = undefined; -exports.Request = undefined; -exports.Response = undefined; -exports.Headers = undefined; -exports.FormData = undefined; -exports.Blob = undefined; -exports.File = undefined; -exports.ReadableStream = undefined; -exports.getMultipartRequestOptions = undefined; -exports.getDefaultAgent = undefined; -exports.fileFromPath = undefined; -exports.isFsReadStream = undefined; -function setShims(shims, options = { auto: false }) { - if (exports.auto) { - throw new Error(`you must \`import 'openai/shims/${shims.kind}'\` before importing anything else from openai`); - } - if (exports.kind) { - throw new Error(`can't \`import 'openai/shims/${shims.kind}'\` after \`import 'openai/shims/${exports.kind}'\``); - } - exports.auto = options.auto; - exports.kind = shims.kind; - exports.fetch = shims.fetch; - exports.Request = shims.Request; - exports.Response = shims.Response; - exports.Headers = shims.Headers; - exports.FormData = shims.FormData; - exports.Blob = shims.Blob; - exports.File = shims.File; - exports.ReadableStream = shims.ReadableStream; - exports.getMultipartRequestOptions = shims.getMultipartRequestOptions; - exports.getDefaultAgent = shims.getDefaultAgent; - exports.fileFromPath = shims.fileFromPath; - exports.isFsReadStream = shims.isFsReadStream; -} -exports.setShims = setShims; -//# sourceMappingURL=registry.js.map - -/***/ }), - -/***/ 1798: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -}; -var _AbstractPage_client; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isObj = exports.toBase64 = exports.getRequiredHeader = exports.isHeadersProtocol = exports.isRunningInBrowser = exports.debug = exports.hasOwn = exports.isEmptyObj = exports.maybeCoerceBoolean = exports.maybeCoerceFloat = exports.maybeCoerceInteger = exports.coerceBoolean = exports.coerceFloat = exports.coerceInteger = exports.readEnv = exports.ensurePresent = exports.castToError = exports.sleep = exports.safeJSON = exports.isRequestOptions = exports.createResponseHeaders = exports.PagePromise = exports.AbstractPage = exports.APIClient = exports.APIPromise = exports.createForm = exports.multipartFormRequestOptions = exports.maybeMultipartFormRequestOptions = void 0; -const version_1 = __nccwpck_require__(6417); -const streaming_1 = __nccwpck_require__(884); -const error_1 = __nccwpck_require__(8905); -const index_1 = __nccwpck_require__(6678); -const uploads_1 = __nccwpck_require__(3394); -var uploads_2 = __nccwpck_require__(3394); -Object.defineProperty(exports, "maybeMultipartFormRequestOptions", ({ enumerable: true, get: function () { return uploads_2.maybeMultipartFormRequestOptions; } })); -Object.defineProperty(exports, "multipartFormRequestOptions", ({ enumerable: true, get: function () { return uploads_2.multipartFormRequestOptions; } })); -Object.defineProperty(exports, "createForm", ({ enumerable: true, get: function () { return uploads_2.createForm; } })); -async function defaultParseResponse(props) { - const { response } = props; - if (props.options.stream) { - debug('response', response.status, response.url, response.headers, response.body); - // Note: there is an invariant here that isn't represented in the type system - // that if you set `stream: true` the response type must also be `Stream` - if (props.options.__streamClass) { - return props.options.__streamClass.fromSSEResponse(response, props.controller); - } - return streaming_1.Stream.fromSSEResponse(response, props.controller); - } - // fetch refuses to read the body when the status code is 204. - if (response.status === 204) { - return null; - } - if (props.options.__binaryResponse) { - return response; - } - const contentType = response.headers.get('content-type'); - const isJSON = contentType?.includes('application/json') || contentType?.includes('application/vnd.api+json'); - if (isJSON) { - const json = await response.json(); - debug('response', response.status, response.url, response.headers, json); - return json; - } - const text = await response.text(); - debug('response', response.status, response.url, response.headers, text); - // TODO handle blob, arraybuffer, other content types, etc. - return text; -} -/** - * A subclass of `Promise` providing additional helper methods - * for interacting with the SDK. - */ -class APIPromise extends Promise { - constructor(responsePromise, parseResponse = defaultParseResponse) { - super((resolve) => { - // this is maybe a bit weird but this has to be a no-op to not implicitly - // parse the response body; instead .then, .catch, .finally are overridden - // to parse the response - resolve(null); - }); - this.responsePromise = responsePromise; - this.parseResponse = parseResponse; - } - _thenUnwrap(transform) { - return new APIPromise(this.responsePromise, async (props) => transform(await this.parseResponse(props))); - } - /** - * Gets the raw `Response` instance instead of parsing the response - * data. - * - * If you want to parse the response body but still get the `Response` - * instance, you can use {@link withResponse()}. - * - * 👋 Getting the wrong TypeScript type for `Response`? - * Try setting `"moduleResolution": "NodeNext"` if you can, - * or add one of these imports before your first `import … from 'openai'`: - * - `import 'openai/shims/node'` (if you're running on Node) - * - `import 'openai/shims/web'` (otherwise) - */ - asResponse() { - return this.responsePromise.then((p) => p.response); - } - /** - * Gets the parsed response data and the raw `Response` instance. - * - * If you just want to get the raw `Response` instance without parsing it, - * you can use {@link asResponse()}. - * - * - * 👋 Getting the wrong TypeScript type for `Response`? - * Try setting `"moduleResolution": "NodeNext"` if you can, - * or add one of these imports before your first `import … from 'openai'`: - * - `import 'openai/shims/node'` (if you're running on Node) - * - `import 'openai/shims/web'` (otherwise) - */ - async withResponse() { - const [data, response] = await Promise.all([this.parse(), this.asResponse()]); - return { data, response }; - } - parse() { - if (!this.parsedPromise) { - this.parsedPromise = this.responsePromise.then(this.parseResponse); - } - return this.parsedPromise; - } - then(onfulfilled, onrejected) { - return this.parse().then(onfulfilled, onrejected); - } - catch(onrejected) { - return this.parse().catch(onrejected); - } - finally(onfinally) { - return this.parse().finally(onfinally); - } -} -exports.APIPromise = APIPromise; -class APIClient { - constructor({ baseURL, maxRetries = 2, timeout = 600000, // 10 minutes - httpAgent, fetch: overridenFetch, }) { - this.baseURL = baseURL; - this.maxRetries = validatePositiveInteger('maxRetries', maxRetries); - this.timeout = validatePositiveInteger('timeout', timeout); - this.httpAgent = httpAgent; - this.fetch = overridenFetch ?? index_1.fetch; - } - authHeaders(opts) { - return {}; - } - /** - * Override this to add your own default headers, for example: - * - * { - * ...super.defaultHeaders(), - * Authorization: 'Bearer 123', - * } - */ - defaultHeaders(opts) { - return { - Accept: 'application/json', - 'Content-Type': 'application/json', - 'User-Agent': this.getUserAgent(), - ...getPlatformHeaders(), - ...this.authHeaders(opts), - }; - } - /** - * Override this to add your own headers validation: - */ - validateHeaders(headers, customHeaders) { } - defaultIdempotencyKey() { - return `stainless-node-retry-${uuid4()}`; - } - get(path, opts) { - return this.methodRequest('get', path, opts); - } - post(path, opts) { - return this.methodRequest('post', path, opts); - } - patch(path, opts) { - return this.methodRequest('patch', path, opts); - } - put(path, opts) { - return this.methodRequest('put', path, opts); - } - delete(path, opts) { - return this.methodRequest('delete', path, opts); - } - methodRequest(method, path, opts) { - return this.request(Promise.resolve(opts).then((opts) => ({ method, path, ...opts }))); - } - getAPIList(path, Page, opts) { - return this.requestAPIList(Page, { method: 'get', path, ...opts }); - } - calculateContentLength(body) { - if (typeof body === 'string') { - if (typeof Buffer !== 'undefined') { - return Buffer.byteLength(body, 'utf8').toString(); - } - if (typeof TextEncoder !== 'undefined') { - const encoder = new TextEncoder(); - const encoded = encoder.encode(body); - return encoded.length.toString(); - } - } - return null; - } - buildRequest(options) { - const { method, path, query, headers: headers = {} } = options; - const body = (0, uploads_1.isMultipartBody)(options.body) ? options.body.body - : options.body ? JSON.stringify(options.body, null, 2) - : null; - const contentLength = this.calculateContentLength(body); - const url = this.buildURL(path, query); - if ('timeout' in options) - validatePositiveInteger('timeout', options.timeout); - const timeout = options.timeout ?? this.timeout; - const httpAgent = options.httpAgent ?? this.httpAgent ?? (0, index_1.getDefaultAgent)(url); - const minAgentTimeout = timeout + 1000; - if (typeof httpAgent?.options?.timeout === 'number' && - minAgentTimeout > (httpAgent.options.timeout ?? 0)) { - // Allow any given request to bump our agent active socket timeout. - // This may seem strange, but leaking active sockets should be rare and not particularly problematic, - // and without mutating agent we would need to create more of them. - // This tradeoff optimizes for performance. - httpAgent.options.timeout = minAgentTimeout; - } - if (this.idempotencyHeader && method !== 'get') { - if (!options.idempotencyKey) - options.idempotencyKey = this.defaultIdempotencyKey(); - headers[this.idempotencyHeader] = options.idempotencyKey; - } - const reqHeaders = this.buildHeaders({ options, headers, contentLength }); - const req = { - method, - ...(body && { body: body }), - headers: reqHeaders, - ...(httpAgent && { agent: httpAgent }), - // @ts-ignore node-fetch uses a custom AbortSignal type that is - // not compatible with standard web types - signal: options.signal ?? null, - }; - return { req, url, timeout }; - } - buildHeaders({ options, headers, contentLength, }) { - const reqHeaders = {}; - if (contentLength) { - reqHeaders['content-length'] = contentLength; - } - const defaultHeaders = this.defaultHeaders(options); - applyHeadersMut(reqHeaders, defaultHeaders); - applyHeadersMut(reqHeaders, headers); - // let builtin fetch set the Content-Type for multipart bodies - if ((0, uploads_1.isMultipartBody)(options.body) && index_1.kind !== 'node') { - delete reqHeaders['content-type']; - } - this.validateHeaders(reqHeaders, headers); - return reqHeaders; - } - /** - * Used as a callback for mutating the given `FinalRequestOptions` object. - */ - async prepareOptions(options) { } - /** - * Used as a callback for mutating the given `RequestInit` object. - * - * This is useful for cases where you want to add certain headers based off of - * the request properties, e.g. `method` or `url`. - */ - async prepareRequest(request, { url, options }) { } - parseHeaders(headers) { - return (!headers ? {} - : Symbol.iterator in headers ? - Object.fromEntries(Array.from(headers).map((header) => [...header])) - : { ...headers }); - } - makeStatusError(status, error, message, headers) { - return error_1.APIError.generate(status, error, message, headers); - } - request(options, remainingRetries = null) { - return new APIPromise(this.makeRequest(options, remainingRetries)); - } - async makeRequest(optionsInput, retriesRemaining) { - const options = await optionsInput; - if (retriesRemaining == null) { - retriesRemaining = options.maxRetries ?? this.maxRetries; - } - await this.prepareOptions(options); - const { req, url, timeout } = this.buildRequest(options); - await this.prepareRequest(req, { url, options }); - debug('request', url, options, req.headers); - if (options.signal?.aborted) { - throw new error_1.APIUserAbortError(); - } - const controller = new AbortController(); - const response = await this.fetchWithTimeout(url, req, timeout, controller).catch(exports.castToError); - if (response instanceof Error) { - if (options.signal?.aborted) { - throw new error_1.APIUserAbortError(); - } - if (retriesRemaining) { - return this.retryRequest(options, retriesRemaining); - } - if (response.name === 'AbortError') { - throw new error_1.APIConnectionTimeoutError(); - } - throw new error_1.APIConnectionError({ cause: response }); - } - const responseHeaders = (0, exports.createResponseHeaders)(response.headers); - if (!response.ok) { - if (retriesRemaining && this.shouldRetry(response)) { - const retryMessage = `retrying, ${retriesRemaining} attempts remaining`; - debug(`response (error; ${retryMessage})`, response.status, url, responseHeaders); - return this.retryRequest(options, retriesRemaining, responseHeaders); - } - const errText = await response.text().catch((e) => (0, exports.castToError)(e).message); - const errJSON = (0, exports.safeJSON)(errText); - const errMessage = errJSON ? undefined : errText; - const retryMessage = retriesRemaining ? `(error; no more retries left)` : `(error; not retryable)`; - debug(`response (error; ${retryMessage})`, response.status, url, responseHeaders, errMessage); - const err = this.makeStatusError(response.status, errJSON, errMessage, responseHeaders); - throw err; - } - return { response, options, controller }; - } - requestAPIList(Page, options) { - const request = this.makeRequest(options, null); - return new PagePromise(this, request, Page); - } - buildURL(path, query) { - const url = isAbsoluteURL(path) ? - new URL(path) - : new URL(this.baseURL + (this.baseURL.endsWith('/') && path.startsWith('/') ? path.slice(1) : path)); - const defaultQuery = this.defaultQuery(); - if (!isEmptyObj(defaultQuery)) { - query = { ...defaultQuery, ...query }; - } - if (typeof query === 'object' && query && !Array.isArray(query)) { - url.search = this.stringifyQuery(query); - } - return url.toString(); - } - stringifyQuery(query) { - return Object.entries(query) - .filter(([_, value]) => typeof value !== 'undefined') - .map(([key, value]) => { - if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { - return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`; - } - if (value === null) { - return `${encodeURIComponent(key)}=`; - } - throw new error_1.OpenAIError(`Cannot stringify type ${typeof value}; Expected string, number, boolean, or null. If you need to pass nested query parameters, you can manually encode them, e.g. { query: { 'foo[key1]': value1, 'foo[key2]': value2 } }, and please open a GitHub issue requesting better support for your use case.`); - }) - .join('&'); - } - async fetchWithTimeout(url, init, ms, controller) { - const { signal, ...options } = init || {}; - if (signal) - signal.addEventListener('abort', () => controller.abort()); - const timeout = setTimeout(() => controller.abort(), ms); - return (this.getRequestClient() - // use undefined this binding; fetch errors if bound to something else in browser/cloudflare - .fetch.call(undefined, url, { signal: controller.signal, ...options }) - .finally(() => { - clearTimeout(timeout); - })); - } - getRequestClient() { - return { fetch: this.fetch }; - } - shouldRetry(response) { - // Note this is not a standard header. - const shouldRetryHeader = response.headers.get('x-should-retry'); - // If the server explicitly says whether or not to retry, obey. - if (shouldRetryHeader === 'true') - return true; - if (shouldRetryHeader === 'false') - return false; - // Retry on request timeouts. - if (response.status === 408) - return true; - // Retry on lock timeouts. - if (response.status === 409) - return true; - // Retry on rate limits. - if (response.status === 429) - return true; - // Retry internal errors. - if (response.status >= 500) - return true; - return false; - } - async retryRequest(options, retriesRemaining, responseHeaders) { - let timeoutMillis; - // Note the `retry-after-ms` header may not be standard, but is a good idea and we'd like proactive support for it. - const retryAfterMillisHeader = responseHeaders?.['retry-after-ms']; - if (retryAfterMillisHeader) { - const timeoutMs = parseFloat(retryAfterMillisHeader); - if (!Number.isNaN(timeoutMs)) { - timeoutMillis = timeoutMs; - } - } - // About the Retry-After header: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Retry-After - const retryAfterHeader = responseHeaders?.['retry-after']; - if (retryAfterHeader && !timeoutMillis) { - const timeoutSeconds = parseFloat(retryAfterHeader); - if (!Number.isNaN(timeoutSeconds)) { - timeoutMillis = timeoutSeconds * 1000; - } - else { - timeoutMillis = Date.parse(retryAfterHeader) - Date.now(); - } - } - // If the API asks us to wait a certain amount of time (and it's a reasonable amount), - // just do what it says, but otherwise calculate a default - if (!(timeoutMillis && 0 <= timeoutMillis && timeoutMillis < 60 * 1000)) { - const maxRetries = options.maxRetries ?? this.maxRetries; - timeoutMillis = this.calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries); - } - await (0, exports.sleep)(timeoutMillis); - return this.makeRequest(options, retriesRemaining - 1); - } - calculateDefaultRetryTimeoutMillis(retriesRemaining, maxRetries) { - const initialRetryDelay = 0.5; - const maxRetryDelay = 8.0; - const numRetries = maxRetries - retriesRemaining; - // Apply exponential backoff, but not more than the max. - const sleepSeconds = Math.min(initialRetryDelay * Math.pow(2, numRetries), maxRetryDelay); - // Apply some jitter, take up to at most 25 percent of the retry time. - const jitter = 1 - Math.random() * 0.25; - return sleepSeconds * jitter * 1000; - } - getUserAgent() { - return `${this.constructor.name}/JS ${version_1.VERSION}`; - } -} -exports.APIClient = APIClient; -class AbstractPage { - constructor(client, response, body, options) { - _AbstractPage_client.set(this, void 0); - __classPrivateFieldSet(this, _AbstractPage_client, client, "f"); - this.options = options; - this.response = response; - this.body = body; - } - hasNextPage() { - const items = this.getPaginatedItems(); - if (!items.length) - return false; - return this.nextPageInfo() != null; - } - async getNextPage() { - const nextInfo = this.nextPageInfo(); - if (!nextInfo) { - throw new error_1.OpenAIError('No next page expected; please check `.hasNextPage()` before calling `.getNextPage()`.'); - } - const nextOptions = { ...this.options }; - if ('params' in nextInfo && typeof nextOptions.query === 'object') { - nextOptions.query = { ...nextOptions.query, ...nextInfo.params }; - } - else if ('url' in nextInfo) { - const params = [...Object.entries(nextOptions.query || {}), ...nextInfo.url.searchParams.entries()]; - for (const [key, value] of params) { - nextInfo.url.searchParams.set(key, value); - } - nextOptions.query = undefined; - nextOptions.path = nextInfo.url.toString(); - } - return await __classPrivateFieldGet(this, _AbstractPage_client, "f").requestAPIList(this.constructor, nextOptions); - } - async *iterPages() { - // eslint-disable-next-line @typescript-eslint/no-this-alias - let page = this; - yield page; - while (page.hasNextPage()) { - page = await page.getNextPage(); - yield page; - } - } - async *[(_AbstractPage_client = new WeakMap(), Symbol.asyncIterator)]() { - for await (const page of this.iterPages()) { - for (const item of page.getPaginatedItems()) { - yield item; - } - } - } -} -exports.AbstractPage = AbstractPage; -/** - * This subclass of Promise will resolve to an instantiated Page once the request completes. - * - * It also implements AsyncIterable to allow auto-paginating iteration on an unawaited list call, eg: - * - * for await (const item of client.items.list()) { - * console.log(item) - * } - */ -class PagePromise extends APIPromise { - constructor(client, request, Page) { - super(request, async (props) => new Page(client, props.response, await defaultParseResponse(props), props.options)); - } - /** - * Allow auto-paginating iteration on an unawaited list call, eg: - * - * for await (const item of client.items.list()) { - * console.log(item) - * } - */ - async *[Symbol.asyncIterator]() { - const page = await this; - for await (const item of page) { - yield item; - } - } -} -exports.PagePromise = PagePromise; -const createResponseHeaders = (headers) => { - return new Proxy(Object.fromEntries( - // @ts-ignore - headers.entries()), { - get(target, name) { - const key = name.toString(); - return target[key.toLowerCase()] || target[key]; - }, - }); -}; -exports.createResponseHeaders = createResponseHeaders; -// This is required so that we can determine if a given object matches the RequestOptions -// type at runtime. While this requires duplication, it is enforced by the TypeScript -// compiler such that any missing / extraneous keys will cause an error. -const requestOptionsKeys = { - method: true, - path: true, - query: true, - body: true, - headers: true, - maxRetries: true, - stream: true, - timeout: true, - httpAgent: true, - signal: true, - idempotencyKey: true, - __binaryResponse: true, - __streamClass: true, -}; -const isRequestOptions = (obj) => { - return (typeof obj === 'object' && - obj !== null && - !isEmptyObj(obj) && - Object.keys(obj).every((k) => hasOwn(requestOptionsKeys, k))); -}; -exports.isRequestOptions = isRequestOptions; -const getPlatformProperties = () => { - if (typeof Deno !== 'undefined' && Deno.build != null) { - return { - 'X-Stainless-Lang': 'js', - 'X-Stainless-Package-Version': version_1.VERSION, - 'X-Stainless-OS': normalizePlatform(Deno.build.os), - 'X-Stainless-Arch': normalizeArch(Deno.build.arch), - 'X-Stainless-Runtime': 'deno', - 'X-Stainless-Runtime-Version': typeof Deno.version === 'string' ? Deno.version : Deno.version?.deno ?? 'unknown', - }; - } - if (typeof EdgeRuntime !== 'undefined') { - return { - 'X-Stainless-Lang': 'js', - 'X-Stainless-Package-Version': version_1.VERSION, - 'X-Stainless-OS': 'Unknown', - 'X-Stainless-Arch': `other:${EdgeRuntime}`, - 'X-Stainless-Runtime': 'edge', - 'X-Stainless-Runtime-Version': process.version, - }; - } - // Check if Node.js - if (Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]') { - return { - 'X-Stainless-Lang': 'js', - 'X-Stainless-Package-Version': version_1.VERSION, - 'X-Stainless-OS': normalizePlatform(process.platform), - 'X-Stainless-Arch': normalizeArch(process.arch), - 'X-Stainless-Runtime': 'node', - 'X-Stainless-Runtime-Version': process.version, - }; - } - const browserInfo = getBrowserInfo(); - if (browserInfo) { - return { - 'X-Stainless-Lang': 'js', - 'X-Stainless-Package-Version': version_1.VERSION, - 'X-Stainless-OS': 'Unknown', - 'X-Stainless-Arch': 'unknown', - 'X-Stainless-Runtime': `browser:${browserInfo.browser}`, - 'X-Stainless-Runtime-Version': browserInfo.version, - }; - } - // TODO add support for Cloudflare workers, etc. - return { - 'X-Stainless-Lang': 'js', - 'X-Stainless-Package-Version': version_1.VERSION, - 'X-Stainless-OS': 'Unknown', - 'X-Stainless-Arch': 'unknown', - 'X-Stainless-Runtime': 'unknown', - 'X-Stainless-Runtime-Version': 'unknown', - }; -}; -// Note: modified from https://github.com/JS-DevTools/host-environment/blob/b1ab79ecde37db5d6e163c050e54fe7d287d7c92/src/isomorphic.browser.ts -function getBrowserInfo() { - if (typeof navigator === 'undefined' || !navigator) { - return null; - } - // NOTE: The order matters here! - const browserPatterns = [ - { key: 'edge', pattern: /Edge(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, - { key: 'ie', pattern: /MSIE(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, - { key: 'ie', pattern: /Trident(?:.*rv\:(\d+)\.(\d+)(?:\.(\d+))?)?/ }, - { key: 'chrome', pattern: /Chrome(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, - { key: 'firefox', pattern: /Firefox(?:\W+(\d+)\.(\d+)(?:\.(\d+))?)?/ }, - { key: 'safari', pattern: /(?:Version\W+(\d+)\.(\d+)(?:\.(\d+))?)?(?:\W+Mobile\S*)?\W+Safari/ }, - ]; - // Find the FIRST matching browser - for (const { key, pattern } of browserPatterns) { - const match = pattern.exec(navigator.userAgent); - if (match) { - const major = match[1] || 0; - const minor = match[2] || 0; - const patch = match[3] || 0; - return { browser: key, version: `${major}.${minor}.${patch}` }; - } - } - return null; -} -const normalizeArch = (arch) => { - // Node docs: - // - https://nodejs.org/api/process.html#processarch - // Deno docs: - // - https://doc.deno.land/deno/stable/~/Deno.build - if (arch === 'x32') - return 'x32'; - if (arch === 'x86_64' || arch === 'x64') - return 'x64'; - if (arch === 'arm') - return 'arm'; - if (arch === 'aarch64' || arch === 'arm64') - return 'arm64'; - if (arch) - return `other:${arch}`; - return 'unknown'; -}; -const normalizePlatform = (platform) => { - // Node platforms: - // - https://nodejs.org/api/process.html#processplatform - // Deno platforms: - // - https://doc.deno.land/deno/stable/~/Deno.build - // - https://github.com/denoland/deno/issues/14799 - platform = platform.toLowerCase(); - // NOTE: this iOS check is untested and may not work - // Node does not work natively on IOS, there is a fork at - // https://github.com/nodejs-mobile/nodejs-mobile - // however it is unknown at the time of writing how to detect if it is running - if (platform.includes('ios')) - return 'iOS'; - if (platform === 'android') - return 'Android'; - if (platform === 'darwin') - return 'MacOS'; - if (platform === 'win32') - return 'Windows'; - if (platform === 'freebsd') - return 'FreeBSD'; - if (platform === 'openbsd') - return 'OpenBSD'; - if (platform === 'linux') - return 'Linux'; - if (platform) - return `Other:${platform}`; - return 'Unknown'; -}; -let _platformHeaders; -const getPlatformHeaders = () => { - return (_platformHeaders ?? (_platformHeaders = getPlatformProperties())); -}; -const safeJSON = (text) => { - try { - return JSON.parse(text); - } - catch (err) { - return undefined; - } -}; -exports.safeJSON = safeJSON; -// https://stackoverflow.com/a/19709846 -const startsWithSchemeRegexp = new RegExp('^(?:[a-z]+:)?//', 'i'); -const isAbsoluteURL = (url) => { - return startsWithSchemeRegexp.test(url); -}; -const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); -exports.sleep = sleep; -const validatePositiveInteger = (name, n) => { - if (typeof n !== 'number' || !Number.isInteger(n)) { - throw new error_1.OpenAIError(`${name} must be an integer`); - } - if (n < 0) { - throw new error_1.OpenAIError(`${name} must be a positive integer`); - } - return n; -}; -const castToError = (err) => { - if (err instanceof Error) - return err; - return new Error(err); -}; -exports.castToError = castToError; -const ensurePresent = (value) => { - if (value == null) - throw new error_1.OpenAIError(`Expected a value to be given but received ${value} instead.`); - return value; -}; -exports.ensurePresent = ensurePresent; -/** - * Read an environment variable. - * - * Trims beginning and trailing whitespace. - * - * Will return undefined if the environment variable doesn't exist or cannot be accessed. - */ -const readEnv = (env) => { - if (typeof process !== 'undefined') { - return process.env?.[env]?.trim() ?? undefined; - } - if (typeof Deno !== 'undefined') { - return Deno.env?.get?.(env)?.trim(); - } - return undefined; -}; -exports.readEnv = readEnv; -const coerceInteger = (value) => { - if (typeof value === 'number') - return Math.round(value); - if (typeof value === 'string') - return parseInt(value, 10); - throw new error_1.OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`); -}; -exports.coerceInteger = coerceInteger; -const coerceFloat = (value) => { - if (typeof value === 'number') - return value; - if (typeof value === 'string') - return parseFloat(value); - throw new error_1.OpenAIError(`Could not coerce ${value} (type: ${typeof value}) into a number`); -}; -exports.coerceFloat = coerceFloat; -const coerceBoolean = (value) => { - if (typeof value === 'boolean') - return value; - if (typeof value === 'string') - return value === 'true'; - return Boolean(value); -}; -exports.coerceBoolean = coerceBoolean; -const maybeCoerceInteger = (value) => { - if (value === undefined) { - return undefined; - } - return (0, exports.coerceInteger)(value); -}; -exports.maybeCoerceInteger = maybeCoerceInteger; -const maybeCoerceFloat = (value) => { - if (value === undefined) { - return undefined; - } - return (0, exports.coerceFloat)(value); -}; -exports.maybeCoerceFloat = maybeCoerceFloat; -const maybeCoerceBoolean = (value) => { - if (value === undefined) { - return undefined; - } - return (0, exports.coerceBoolean)(value); -}; -exports.maybeCoerceBoolean = maybeCoerceBoolean; -// https://stackoverflow.com/a/34491287 -function isEmptyObj(obj) { - if (!obj) - return true; - for (const _k in obj) - return false; - return true; -} -exports.isEmptyObj = isEmptyObj; -// https://eslint.org/docs/latest/rules/no-prototype-builtins -function hasOwn(obj, key) { - return Object.prototype.hasOwnProperty.call(obj, key); -} -exports.hasOwn = hasOwn; -/** - * Copies headers from "newHeaders" onto "targetHeaders", - * using lower-case for all properties, - * ignoring any keys with undefined values, - * and deleting any keys with null values. - */ -function applyHeadersMut(targetHeaders, newHeaders) { - for (const k in newHeaders) { - if (!hasOwn(newHeaders, k)) - continue; - const lowerKey = k.toLowerCase(); - if (!lowerKey) - continue; - const val = newHeaders[k]; - if (val === null) { - delete targetHeaders[lowerKey]; - } - else if (val !== undefined) { - targetHeaders[lowerKey] = val; - } - } -} -function debug(action, ...args) { - if (typeof process !== 'undefined' && process?.env?.['DEBUG'] === 'true') { - console.log(`OpenAI:DEBUG:${action}`, ...args); - } -} -exports.debug = debug; -/** - * https://stackoverflow.com/a/2117523 - */ -const uuid4 = () => { - return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { - const r = (Math.random() * 16) | 0; - const v = c === 'x' ? r : (r & 0x3) | 0x8; - return v.toString(16); - }); -}; -const isRunningInBrowser = () => { - return ( - // @ts-ignore - typeof window !== 'undefined' && - // @ts-ignore - typeof window.document !== 'undefined' && - // @ts-ignore - typeof navigator !== 'undefined'); -}; -exports.isRunningInBrowser = isRunningInBrowser; -const isHeadersProtocol = (headers) => { - return typeof headers?.get === 'function'; -}; -exports.isHeadersProtocol = isHeadersProtocol; -const getRequiredHeader = (headers, header) => { - const lowerCasedHeader = header.toLowerCase(); - if ((0, exports.isHeadersProtocol)(headers)) { - // to deal with the case where the header looks like Stainless-Event-Id - const intercapsHeader = header[0]?.toUpperCase() + - header.substring(1).replace(/([^\w])(\w)/g, (_m, g1, g2) => g1 + g2.toUpperCase()); - for (const key of [header, lowerCasedHeader, header.toUpperCase(), intercapsHeader]) { - const value = headers.get(key); - if (value) { - return value; - } - } - } - for (const [key, value] of Object.entries(headers)) { - if (key.toLowerCase() === lowerCasedHeader) { - if (Array.isArray(value)) { - if (value.length <= 1) - return value[0]; - console.warn(`Received ${value.length} entries for the ${header} header, using the first entry.`); - return value[0]; - } - return value; - } - } - throw new Error(`Could not find ${header} header`); -}; -exports.getRequiredHeader = getRequiredHeader; -/** - * Encodes a string to Base64 format. - */ -const toBase64 = (str) => { - if (!str) - return ''; - if (typeof Buffer !== 'undefined') { - return Buffer.from(str).toString('base64'); - } - if (typeof btoa !== 'undefined') { - return btoa(str); - } - throw new error_1.OpenAIError('Cannot generate b64 string; Expected `Buffer` or `btoa` to be defined'); -}; -exports.toBase64 = toBase64; -function isObj(obj) { - return obj != null && typeof obj === 'object' && !Array.isArray(obj); -} -exports.isObj = isObj; -//# sourceMappingURL=core.js.map - -/***/ }), - -/***/ 8905: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.InternalServerError = exports.RateLimitError = exports.UnprocessableEntityError = exports.ConflictError = exports.NotFoundError = exports.PermissionDeniedError = exports.AuthenticationError = exports.BadRequestError = exports.APIConnectionTimeoutError = exports.APIConnectionError = exports.APIUserAbortError = exports.APIError = exports.OpenAIError = void 0; -const core_1 = __nccwpck_require__(1798); -class OpenAIError extends Error { -} -exports.OpenAIError = OpenAIError; -class APIError extends OpenAIError { - constructor(status, error, message, headers) { - super(`${APIError.makeMessage(status, error, message)}`); - this.status = status; - this.headers = headers; - this.request_id = headers?.['x-request-id']; - const data = error; - this.error = data; - this.code = data?.['code']; - this.param = data?.['param']; - this.type = data?.['type']; - } - static makeMessage(status, error, message) { - const msg = error?.message ? - typeof error.message === 'string' ? - error.message - : JSON.stringify(error.message) - : error ? JSON.stringify(error) - : message; - if (status && msg) { - return `${status} ${msg}`; - } - if (status) { - return `${status} status code (no body)`; - } - if (msg) { - return msg; - } - return '(no status code or body)'; - } - static generate(status, errorResponse, message, headers) { - if (!status) { - return new APIConnectionError({ cause: (0, core_1.castToError)(errorResponse) }); - } - const error = errorResponse?.['error']; - if (status === 400) { - return new BadRequestError(status, error, message, headers); - } - if (status === 401) { - return new AuthenticationError(status, error, message, headers); - } - if (status === 403) { - return new PermissionDeniedError(status, error, message, headers); - } - if (status === 404) { - return new NotFoundError(status, error, message, headers); - } - if (status === 409) { - return new ConflictError(status, error, message, headers); - } - if (status === 422) { - return new UnprocessableEntityError(status, error, message, headers); - } - if (status === 429) { - return new RateLimitError(status, error, message, headers); - } - if (status >= 500) { - return new InternalServerError(status, error, message, headers); - } - return new APIError(status, error, message, headers); - } -} -exports.APIError = APIError; -class APIUserAbortError extends APIError { - constructor({ message } = {}) { - super(undefined, undefined, message || 'Request was aborted.', undefined); - this.status = undefined; - } -} -exports.APIUserAbortError = APIUserAbortError; -class APIConnectionError extends APIError { - constructor({ message, cause }) { - super(undefined, undefined, message || 'Connection error.', undefined); - this.status = undefined; - // in some environments the 'cause' property is already declared - // @ts-ignore - if (cause) - this.cause = cause; - } -} -exports.APIConnectionError = APIConnectionError; -class APIConnectionTimeoutError extends APIConnectionError { - constructor({ message } = {}) { - super({ message: message ?? 'Request timed out.' }); - } -} -exports.APIConnectionTimeoutError = APIConnectionTimeoutError; -class BadRequestError extends APIError { - constructor() { - super(...arguments); - this.status = 400; - } -} -exports.BadRequestError = BadRequestError; -class AuthenticationError extends APIError { - constructor() { - super(...arguments); - this.status = 401; - } -} -exports.AuthenticationError = AuthenticationError; -class PermissionDeniedError extends APIError { - constructor() { - super(...arguments); - this.status = 403; - } -} -exports.PermissionDeniedError = PermissionDeniedError; -class NotFoundError extends APIError { - constructor() { - super(...arguments); - this.status = 404; - } -} -exports.NotFoundError = NotFoundError; -class ConflictError extends APIError { - constructor() { - super(...arguments); - this.status = 409; - } -} -exports.ConflictError = ConflictError; -class UnprocessableEntityError extends APIError { - constructor() { - super(...arguments); - this.status = 422; - } -} -exports.UnprocessableEntityError = UnprocessableEntityError; -class RateLimitError extends APIError { - constructor() { - super(...arguments); - this.status = 429; - } -} -exports.RateLimitError = RateLimitError; -class InternalServerError extends APIError { -} -exports.InternalServerError = InternalServerError; -//# sourceMappingURL=error.js.map - -/***/ }), - -/***/ 47: -/***/ (function(module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var _a; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.fileFromPath = exports.toFile = exports.UnprocessableEntityError = exports.PermissionDeniedError = exports.InternalServerError = exports.AuthenticationError = exports.BadRequestError = exports.RateLimitError = exports.ConflictError = exports.NotFoundError = exports.APIUserAbortError = exports.APIConnectionTimeoutError = exports.APIConnectionError = exports.APIError = exports.OpenAIError = exports.OpenAI = void 0; -const Core = __importStar(__nccwpck_require__(1798)); -const Errors = __importStar(__nccwpck_require__(8905)); -const Uploads = __importStar(__nccwpck_require__(3394)); -const Pagination = __importStar(__nccwpck_require__(7401)); -const API = __importStar(__nccwpck_require__(5690)); -/** API Client for interfacing with the OpenAI API. */ -class OpenAI extends Core.APIClient { - /** - * API Client for interfacing with the OpenAI API. - * - * @param {string | undefined} [opts.apiKey=process.env['OPENAI_API_KEY'] ?? undefined] - * @param {string | null | undefined} [opts.organization=process.env['OPENAI_ORG_ID'] ?? null] - * @param {string | null | undefined} [opts.project=process.env['OPENAI_PROJECT_ID'] ?? null] - * @param {string} [opts.baseURL=process.env['OPENAI_BASE_URL'] ?? https://api.openai.com/v1] - Override the default base URL for the API. - * @param {number} [opts.timeout=10 minutes] - The maximum amount of time (in milliseconds) the client will wait for a response before timing out. - * @param {number} [opts.httpAgent] - An HTTP agent used to manage HTTP(s) connections. - * @param {Core.Fetch} [opts.fetch] - Specify a custom `fetch` function implementation. - * @param {number} [opts.maxRetries=2] - The maximum number of times the client will retry a request. - * @param {Core.Headers} opts.defaultHeaders - Default headers to include with every request to the API. - * @param {Core.DefaultQuery} opts.defaultQuery - Default query parameters to include with every request to the API. - * @param {boolean} [opts.dangerouslyAllowBrowser=false] - By default, client-side use of this library is not allowed, as it risks exposing your secret API credentials to attackers. - */ - constructor({ baseURL = Core.readEnv('OPENAI_BASE_URL'), apiKey = Core.readEnv('OPENAI_API_KEY'), organization = Core.readEnv('OPENAI_ORG_ID') ?? null, project = Core.readEnv('OPENAI_PROJECT_ID') ?? null, ...opts } = {}) { - if (apiKey === undefined) { - throw new Errors.OpenAIError("The OPENAI_API_KEY environment variable is missing or empty; either provide it, or instantiate the OpenAI client with an apiKey option, like new OpenAI({ apiKey: 'My API Key' })."); - } - const options = { - apiKey, - organization, - project, - ...opts, - baseURL: baseURL || `https://api.openai.com/v1`, - }; - if (!options.dangerouslyAllowBrowser && Core.isRunningInBrowser()) { - throw new Errors.OpenAIError("It looks like you're running in a browser-like environment.\n\nThis is disabled by default, as it risks exposing your secret API credentials to attackers.\nIf you understand the risks and have appropriate mitigations in place,\nyou can set the `dangerouslyAllowBrowser` option to `true`, e.g.,\n\nnew OpenAI({ apiKey, dangerouslyAllowBrowser: true });\n\nhttps://help.openai.com/en/articles/5112595-best-practices-for-api-key-safety\n"); - } - super({ - baseURL: options.baseURL, - timeout: options.timeout ?? 600000 /* 10 minutes */, - httpAgent: options.httpAgent, - maxRetries: options.maxRetries, - fetch: options.fetch, - }); - this.completions = new API.Completions(this); - this.chat = new API.Chat(this); - this.embeddings = new API.Embeddings(this); - this.files = new API.Files(this); - this.images = new API.Images(this); - this.audio = new API.Audio(this); - this.moderations = new API.Moderations(this); - this.models = new API.Models(this); - this.fineTuning = new API.FineTuning(this); - this.beta = new API.Beta(this); - this.batches = new API.Batches(this); - this._options = options; - this.apiKey = apiKey; - this.organization = organization; - this.project = project; - } - defaultQuery() { - return this._options.defaultQuery; - } - defaultHeaders(opts) { - return { - ...super.defaultHeaders(opts), - 'OpenAI-Organization': this.organization, - 'OpenAI-Project': this.project, - ...this._options.defaultHeaders, - }; - } - authHeaders(opts) { - return { Authorization: `Bearer ${this.apiKey}` }; - } -} -exports.OpenAI = OpenAI; -_a = OpenAI; -OpenAI.OpenAI = _a; -OpenAI.OpenAIError = Errors.OpenAIError; -OpenAI.APIError = Errors.APIError; -OpenAI.APIConnectionError = Errors.APIConnectionError; -OpenAI.APIConnectionTimeoutError = Errors.APIConnectionTimeoutError; -OpenAI.APIUserAbortError = Errors.APIUserAbortError; -OpenAI.NotFoundError = Errors.NotFoundError; -OpenAI.ConflictError = Errors.ConflictError; -OpenAI.RateLimitError = Errors.RateLimitError; -OpenAI.BadRequestError = Errors.BadRequestError; -OpenAI.AuthenticationError = Errors.AuthenticationError; -OpenAI.InternalServerError = Errors.InternalServerError; -OpenAI.PermissionDeniedError = Errors.PermissionDeniedError; -OpenAI.UnprocessableEntityError = Errors.UnprocessableEntityError; -OpenAI.toFile = Uploads.toFile; -OpenAI.fileFromPath = Uploads.fileFromPath; -exports.OpenAIError = Errors.OpenAIError, exports.APIError = Errors.APIError, exports.APIConnectionError = Errors.APIConnectionError, exports.APIConnectionTimeoutError = Errors.APIConnectionTimeoutError, exports.APIUserAbortError = Errors.APIUserAbortError, exports.NotFoundError = Errors.NotFoundError, exports.ConflictError = Errors.ConflictError, exports.RateLimitError = Errors.RateLimitError, exports.BadRequestError = Errors.BadRequestError, exports.AuthenticationError = Errors.AuthenticationError, exports.InternalServerError = Errors.InternalServerError, exports.PermissionDeniedError = Errors.PermissionDeniedError, exports.UnprocessableEntityError = Errors.UnprocessableEntityError; -exports.toFile = Uploads.toFile; -exports.fileFromPath = Uploads.fileFromPath; -(function (OpenAI) { - OpenAI.Page = Pagination.Page; - OpenAI.CursorPage = Pagination.CursorPage; - OpenAI.Completions = API.Completions; - OpenAI.Chat = API.Chat; - OpenAI.Embeddings = API.Embeddings; - OpenAI.Files = API.Files; - OpenAI.FileObjectsPage = API.FileObjectsPage; - OpenAI.Images = API.Images; - OpenAI.Audio = API.Audio; - OpenAI.Moderations = API.Moderations; - OpenAI.Models = API.Models; - OpenAI.ModelsPage = API.ModelsPage; - OpenAI.FineTuning = API.FineTuning; - OpenAI.Beta = API.Beta; - OpenAI.Batches = API.Batches; - OpenAI.BatchesPage = API.BatchesPage; -})(OpenAI = exports.OpenAI || (exports.OpenAI = {})); -exports = module.exports = OpenAI; -exports["default"] = OpenAI; -//# sourceMappingURL=index.js.map - -/***/ }), - -/***/ 9365: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -}; -var _AbstractAssistantStreamRunner_connectedPromise, _AbstractAssistantStreamRunner_resolveConnectedPromise, _AbstractAssistantStreamRunner_rejectConnectedPromise, _AbstractAssistantStreamRunner_endPromise, _AbstractAssistantStreamRunner_resolveEndPromise, _AbstractAssistantStreamRunner_rejectEndPromise, _AbstractAssistantStreamRunner_listeners, _AbstractAssistantStreamRunner_ended, _AbstractAssistantStreamRunner_errored, _AbstractAssistantStreamRunner_aborted, _AbstractAssistantStreamRunner_catchingPromiseCreated, _AbstractAssistantStreamRunner_handleError; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.AbstractAssistantStreamRunner = void 0; -const error_1 = __nccwpck_require__(8905); -class AbstractAssistantStreamRunner { - constructor() { - this.controller = new AbortController(); - _AbstractAssistantStreamRunner_connectedPromise.set(this, void 0); - _AbstractAssistantStreamRunner_resolveConnectedPromise.set(this, () => { }); - _AbstractAssistantStreamRunner_rejectConnectedPromise.set(this, () => { }); - _AbstractAssistantStreamRunner_endPromise.set(this, void 0); - _AbstractAssistantStreamRunner_resolveEndPromise.set(this, () => { }); - _AbstractAssistantStreamRunner_rejectEndPromise.set(this, () => { }); - _AbstractAssistantStreamRunner_listeners.set(this, {}); - _AbstractAssistantStreamRunner_ended.set(this, false); - _AbstractAssistantStreamRunner_errored.set(this, false); - _AbstractAssistantStreamRunner_aborted.set(this, false); - _AbstractAssistantStreamRunner_catchingPromiseCreated.set(this, false); - _AbstractAssistantStreamRunner_handleError.set(this, (error) => { - __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_errored, true, "f"); - if (error instanceof Error && error.name === 'AbortError') { - error = new error_1.APIUserAbortError(); - } - if (error instanceof error_1.APIUserAbortError) { - __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_aborted, true, "f"); - return this._emit('abort', error); - } - if (error instanceof error_1.OpenAIError) { - return this._emit('error', error); - } - if (error instanceof Error) { - const openAIError = new error_1.OpenAIError(error.message); - // @ts-ignore - openAIError.cause = error; - return this._emit('error', openAIError); - } - return this._emit('error', new error_1.OpenAIError(String(error))); - }); - __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_connectedPromise, new Promise((resolve, reject) => { - __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_resolveConnectedPromise, resolve, "f"); - __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_rejectConnectedPromise, reject, "f"); - }), "f"); - __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_endPromise, new Promise((resolve, reject) => { - __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_resolveEndPromise, resolve, "f"); - __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_rejectEndPromise, reject, "f"); - }), "f"); - // Don't let these promises cause unhandled rejection errors. - // we will manually cause an unhandled rejection error later - // if the user hasn't registered any error listener or called - // any promise-returning method. - __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_connectedPromise, "f").catch(() => { }); - __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_endPromise, "f").catch(() => { }); - } - _run(executor) { - // Unfortunately if we call `executor()` immediately we get runtime errors about - // references to `this` before the `super()` constructor call returns. - setTimeout(() => { - executor().then(() => { - // this._emitFinal(); - this._emit('end'); - }, __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_handleError, "f")); - }, 0); - } - _addRun(run) { - return run; - } - _connected() { - if (this.ended) - return; - __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_resolveConnectedPromise, "f").call(this); - this._emit('connect'); - } - get ended() { - return __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_ended, "f"); - } - get errored() { - return __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_errored, "f"); - } - get aborted() { - return __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_aborted, "f"); - } - abort() { - this.controller.abort(); - } - /** - * Adds the listener function to the end of the listeners array for the event. - * No checks are made to see if the listener has already been added. Multiple calls passing - * the same combination of event and listener will result in the listener being added, and - * called, multiple times. - * @returns this ChatCompletionStream, so that calls can be chained - */ - on(event, listener) { - const listeners = __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] || (__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] = []); - listeners.push({ listener }); - return this; - } - /** - * Removes the specified listener from the listener array for the event. - * off() will remove, at most, one instance of a listener from the listener array. If any single - * listener has been added multiple times to the listener array for the specified event, then - * off() must be called multiple times to remove each instance. - * @returns this ChatCompletionStream, so that calls can be chained - */ - off(event, listener) { - const listeners = __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event]; - if (!listeners) - return this; - const index = listeners.findIndex((l) => l.listener === listener); - if (index >= 0) - listeners.splice(index, 1); - return this; - } - /** - * Adds a one-time listener function for the event. The next time the event is triggered, - * this listener is removed and then invoked. - * @returns this ChatCompletionStream, so that calls can be chained - */ - once(event, listener) { - const listeners = __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] || (__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] = []); - listeners.push({ listener, once: true }); - return this; - } - /** - * This is similar to `.once()`, but returns a Promise that resolves the next time - * the event is triggered, instead of calling a listener callback. - * @returns a Promise that resolves the next time given event is triggered, - * or rejects if an error is emitted. (If you request the 'error' event, - * returns a promise that resolves with the error). - * - * Example: - * - * const message = await stream.emitted('message') // rejects if the stream errors - */ - emitted(event) { - return new Promise((resolve, reject) => { - __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_catchingPromiseCreated, true, "f"); - if (event !== 'error') - this.once('error', reject); - this.once(event, resolve); - }); - } - async done() { - __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_catchingPromiseCreated, true, "f"); - await __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_endPromise, "f"); - } - _emit(event, ...args) { - // make sure we don't emit any events after end - if (__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_ended, "f")) { - return; - } - if (event === 'end') { - __classPrivateFieldSet(this, _AbstractAssistantStreamRunner_ended, true, "f"); - __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_resolveEndPromise, "f").call(this); - } - const listeners = __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event]; - if (listeners) { - __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_listeners, "f")[event] = listeners.filter((l) => !l.once); - listeners.forEach(({ listener }) => listener(...args)); - } - if (event === 'abort') { - const error = args[0]; - if (!__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_catchingPromiseCreated, "f") && !listeners?.length) { - Promise.reject(error); - } - __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_rejectConnectedPromise, "f").call(this, error); - __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_rejectEndPromise, "f").call(this, error); - this._emit('end'); - return; - } - if (event === 'error') { - // NOTE: _emit('error', error) should only be called from #handleError(). - const error = args[0]; - if (!__classPrivateFieldGet(this, _AbstractAssistantStreamRunner_catchingPromiseCreated, "f") && !listeners?.length) { - // Trigger an unhandled rejection if the user hasn't registered any error handlers. - // If you are seeing stack traces here, make sure to handle errors via either: - // - runner.on('error', () => ...) - // - await runner.done() - // - await runner.finalChatCompletion() - // - etc. - Promise.reject(error); - } - __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_rejectConnectedPromise, "f").call(this, error); - __classPrivateFieldGet(this, _AbstractAssistantStreamRunner_rejectEndPromise, "f").call(this, error); - this._emit('end'); - } - } - async _threadAssistantStream(body, thread, options) { - return await this._createThreadAssistantStream(thread, body, options); - } - async _runAssistantStream(threadId, runs, params, options) { - return await this._createAssistantStream(runs, threadId, params, options); - } - async _runToolAssistantStream(threadId, runId, runs, params, options) { - return await this._createToolAssistantStream(runs, threadId, runId, params, options); - } - async _createThreadAssistantStream(thread, body, options) { - const signal = options?.signal; - if (signal) { - if (signal.aborted) - this.controller.abort(); - signal.addEventListener('abort', () => this.controller.abort()); - } - // this.#validateParams(params); - const runResult = await thread.createAndRun({ ...body, stream: false }, { ...options, signal: this.controller.signal }); - this._connected(); - return this._addRun(runResult); - } - async _createToolAssistantStream(run, threadId, runId, params, options) { - const signal = options?.signal; - if (signal) { - if (signal.aborted) - this.controller.abort(); - signal.addEventListener('abort', () => this.controller.abort()); - } - const runResult = await run.submitToolOutputs(threadId, runId, { ...params, stream: false }, { ...options, signal: this.controller.signal }); - this._connected(); - return this._addRun(runResult); - } - async _createAssistantStream(run, threadId, params, options) { - const signal = options?.signal; - if (signal) { - if (signal.aborted) - this.controller.abort(); - signal.addEventListener('abort', () => this.controller.abort()); - } - // this.#validateParams(params); - const runResult = await run.create(threadId, { ...params, stream: false }, { ...options, signal: this.controller.signal }); - this._connected(); - return this._addRun(runResult); - } -} -exports.AbstractAssistantStreamRunner = AbstractAssistantStreamRunner; -_AbstractAssistantStreamRunner_connectedPromise = new WeakMap(), _AbstractAssistantStreamRunner_resolveConnectedPromise = new WeakMap(), _AbstractAssistantStreamRunner_rejectConnectedPromise = new WeakMap(), _AbstractAssistantStreamRunner_endPromise = new WeakMap(), _AbstractAssistantStreamRunner_resolveEndPromise = new WeakMap(), _AbstractAssistantStreamRunner_rejectEndPromise = new WeakMap(), _AbstractAssistantStreamRunner_listeners = new WeakMap(), _AbstractAssistantStreamRunner_ended = new WeakMap(), _AbstractAssistantStreamRunner_errored = new WeakMap(), _AbstractAssistantStreamRunner_aborted = new WeakMap(), _AbstractAssistantStreamRunner_catchingPromiseCreated = new WeakMap(), _AbstractAssistantStreamRunner_handleError = new WeakMap(); -//# sourceMappingURL=AbstractAssistantStreamRunner.js.map - -/***/ }), - -/***/ 8398: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -}; -var _AbstractChatCompletionRunner_instances, _AbstractChatCompletionRunner_connectedPromise, _AbstractChatCompletionRunner_resolveConnectedPromise, _AbstractChatCompletionRunner_rejectConnectedPromise, _AbstractChatCompletionRunner_endPromise, _AbstractChatCompletionRunner_resolveEndPromise, _AbstractChatCompletionRunner_rejectEndPromise, _AbstractChatCompletionRunner_listeners, _AbstractChatCompletionRunner_ended, _AbstractChatCompletionRunner_errored, _AbstractChatCompletionRunner_aborted, _AbstractChatCompletionRunner_catchingPromiseCreated, _AbstractChatCompletionRunner_getFinalContent, _AbstractChatCompletionRunner_getFinalMessage, _AbstractChatCompletionRunner_getFinalFunctionCall, _AbstractChatCompletionRunner_getFinalFunctionCallResult, _AbstractChatCompletionRunner_calculateTotalUsage, _AbstractChatCompletionRunner_handleError, _AbstractChatCompletionRunner_validateParams, _AbstractChatCompletionRunner_stringifyFunctionCallResult; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.AbstractChatCompletionRunner = void 0; -const error_1 = __nccwpck_require__(8905); -const RunnableFunction_1 = __nccwpck_require__(5464); -const chatCompletionUtils_1 = __nccwpck_require__(7858); -const DEFAULT_MAX_CHAT_COMPLETIONS = 10; -class AbstractChatCompletionRunner { - constructor() { - _AbstractChatCompletionRunner_instances.add(this); - this.controller = new AbortController(); - _AbstractChatCompletionRunner_connectedPromise.set(this, void 0); - _AbstractChatCompletionRunner_resolveConnectedPromise.set(this, () => { }); - _AbstractChatCompletionRunner_rejectConnectedPromise.set(this, () => { }); - _AbstractChatCompletionRunner_endPromise.set(this, void 0); - _AbstractChatCompletionRunner_resolveEndPromise.set(this, () => { }); - _AbstractChatCompletionRunner_rejectEndPromise.set(this, () => { }); - _AbstractChatCompletionRunner_listeners.set(this, {}); - this._chatCompletions = []; - this.messages = []; - _AbstractChatCompletionRunner_ended.set(this, false); - _AbstractChatCompletionRunner_errored.set(this, false); - _AbstractChatCompletionRunner_aborted.set(this, false); - _AbstractChatCompletionRunner_catchingPromiseCreated.set(this, false); - _AbstractChatCompletionRunner_handleError.set(this, (error) => { - __classPrivateFieldSet(this, _AbstractChatCompletionRunner_errored, true, "f"); - if (error instanceof Error && error.name === 'AbortError') { - error = new error_1.APIUserAbortError(); - } - if (error instanceof error_1.APIUserAbortError) { - __classPrivateFieldSet(this, _AbstractChatCompletionRunner_aborted, true, "f"); - return this._emit('abort', error); - } - if (error instanceof error_1.OpenAIError) { - return this._emit('error', error); - } - if (error instanceof Error) { - const openAIError = new error_1.OpenAIError(error.message); - // @ts-ignore - openAIError.cause = error; - return this._emit('error', openAIError); - } - return this._emit('error', new error_1.OpenAIError(String(error))); - }); - __classPrivateFieldSet(this, _AbstractChatCompletionRunner_connectedPromise, new Promise((resolve, reject) => { - __classPrivateFieldSet(this, _AbstractChatCompletionRunner_resolveConnectedPromise, resolve, "f"); - __classPrivateFieldSet(this, _AbstractChatCompletionRunner_rejectConnectedPromise, reject, "f"); - }), "f"); - __classPrivateFieldSet(this, _AbstractChatCompletionRunner_endPromise, new Promise((resolve, reject) => { - __classPrivateFieldSet(this, _AbstractChatCompletionRunner_resolveEndPromise, resolve, "f"); - __classPrivateFieldSet(this, _AbstractChatCompletionRunner_rejectEndPromise, reject, "f"); - }), "f"); - // Don't let these promises cause unhandled rejection errors. - // we will manually cause an unhandled rejection error later - // if the user hasn't registered any error listener or called - // any promise-returning method. - __classPrivateFieldGet(this, _AbstractChatCompletionRunner_connectedPromise, "f").catch(() => { }); - __classPrivateFieldGet(this, _AbstractChatCompletionRunner_endPromise, "f").catch(() => { }); - } - _run(executor) { - // Unfortunately if we call `executor()` immediately we get runtime errors about - // references to `this` before the `super()` constructor call returns. - setTimeout(() => { - executor().then(() => { - this._emitFinal(); - this._emit('end'); - }, __classPrivateFieldGet(this, _AbstractChatCompletionRunner_handleError, "f")); - }, 0); - } - _addChatCompletion(chatCompletion) { - this._chatCompletions.push(chatCompletion); - this._emit('chatCompletion', chatCompletion); - const message = chatCompletion.choices[0]?.message; - if (message) - this._addMessage(message); - return chatCompletion; - } - _addMessage(message, emit = true) { - if (!('content' in message)) - message.content = null; - this.messages.push(message); - if (emit) { - this._emit('message', message); - if (((0, chatCompletionUtils_1.isFunctionMessage)(message) || (0, chatCompletionUtils_1.isToolMessage)(message)) && message.content) { - // Note, this assumes that {role: 'tool', content: …} is always the result of a call of tool of type=function. - this._emit('functionCallResult', message.content); - } - else if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message.function_call) { - this._emit('functionCall', message.function_call); - } - else if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message.tool_calls) { - for (const tool_call of message.tool_calls) { - if (tool_call.type === 'function') { - this._emit('functionCall', tool_call.function); - } - } - } - } - } - _connected() { - if (this.ended) - return; - __classPrivateFieldGet(this, _AbstractChatCompletionRunner_resolveConnectedPromise, "f").call(this); - this._emit('connect'); - } - get ended() { - return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_ended, "f"); - } - get errored() { - return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_errored, "f"); - } - get aborted() { - return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_aborted, "f"); - } - abort() { - this.controller.abort(); - } - /** - * Adds the listener function to the end of the listeners array for the event. - * No checks are made to see if the listener has already been added. Multiple calls passing - * the same combination of event and listener will result in the listener being added, and - * called, multiple times. - * @returns this ChatCompletionStream, so that calls can be chained - */ - on(event, listener) { - const listeners = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] || (__classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] = []); - listeners.push({ listener }); - return this; - } - /** - * Removes the specified listener from the listener array for the event. - * off() will remove, at most, one instance of a listener from the listener array. If any single - * listener has been added multiple times to the listener array for the specified event, then - * off() must be called multiple times to remove each instance. - * @returns this ChatCompletionStream, so that calls can be chained - */ - off(event, listener) { - const listeners = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event]; - if (!listeners) - return this; - const index = listeners.findIndex((l) => l.listener === listener); - if (index >= 0) - listeners.splice(index, 1); - return this; - } - /** - * Adds a one-time listener function for the event. The next time the event is triggered, - * this listener is removed and then invoked. - * @returns this ChatCompletionStream, so that calls can be chained - */ - once(event, listener) { - const listeners = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] || (__classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] = []); - listeners.push({ listener, once: true }); - return this; - } - /** - * This is similar to `.once()`, but returns a Promise that resolves the next time - * the event is triggered, instead of calling a listener callback. - * @returns a Promise that resolves the next time given event is triggered, - * or rejects if an error is emitted. (If you request the 'error' event, - * returns a promise that resolves with the error). - * - * Example: - * - * const message = await stream.emitted('message') // rejects if the stream errors - */ - emitted(event) { - return new Promise((resolve, reject) => { - __classPrivateFieldSet(this, _AbstractChatCompletionRunner_catchingPromiseCreated, true, "f"); - if (event !== 'error') - this.once('error', reject); - this.once(event, resolve); - }); - } - async done() { - __classPrivateFieldSet(this, _AbstractChatCompletionRunner_catchingPromiseCreated, true, "f"); - await __classPrivateFieldGet(this, _AbstractChatCompletionRunner_endPromise, "f"); - } - /** - * @returns a promise that resolves with the final ChatCompletion, or rejects - * if an error occurred or the stream ended prematurely without producing a ChatCompletion. - */ - async finalChatCompletion() { - await this.done(); - const completion = this._chatCompletions[this._chatCompletions.length - 1]; - if (!completion) - throw new error_1.OpenAIError('stream ended without producing a ChatCompletion'); - return completion; - } - /** - * @returns a promise that resolves with the content of the final ChatCompletionMessage, or rejects - * if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage. - */ - async finalContent() { - await this.done(); - return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalContent).call(this); - } - /** - * @returns a promise that resolves with the the final assistant ChatCompletionMessage response, - * or rejects if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage. - */ - async finalMessage() { - await this.done(); - return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalMessage).call(this); - } - /** - * @returns a promise that resolves with the content of the final FunctionCall, or rejects - * if an error occurred or the stream ended prematurely without producing a ChatCompletionMessage. - */ - async finalFunctionCall() { - await this.done(); - return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalFunctionCall).call(this); - } - async finalFunctionCallResult() { - await this.done(); - return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalFunctionCallResult).call(this); - } - async totalUsage() { - await this.done(); - return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_calculateTotalUsage).call(this); - } - allChatCompletions() { - return [...this._chatCompletions]; - } - _emit(event, ...args) { - // make sure we don't emit any events after end - if (__classPrivateFieldGet(this, _AbstractChatCompletionRunner_ended, "f")) { - return; - } - if (event === 'end') { - __classPrivateFieldSet(this, _AbstractChatCompletionRunner_ended, true, "f"); - __classPrivateFieldGet(this, _AbstractChatCompletionRunner_resolveEndPromise, "f").call(this); - } - const listeners = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event]; - if (listeners) { - __classPrivateFieldGet(this, _AbstractChatCompletionRunner_listeners, "f")[event] = listeners.filter((l) => !l.once); - listeners.forEach(({ listener }) => listener(...args)); - } - if (event === 'abort') { - const error = args[0]; - if (!__classPrivateFieldGet(this, _AbstractChatCompletionRunner_catchingPromiseCreated, "f") && !listeners?.length) { - Promise.reject(error); - } - __classPrivateFieldGet(this, _AbstractChatCompletionRunner_rejectConnectedPromise, "f").call(this, error); - __classPrivateFieldGet(this, _AbstractChatCompletionRunner_rejectEndPromise, "f").call(this, error); - this._emit('end'); - return; - } - if (event === 'error') { - // NOTE: _emit('error', error) should only be called from #handleError(). - const error = args[0]; - if (!__classPrivateFieldGet(this, _AbstractChatCompletionRunner_catchingPromiseCreated, "f") && !listeners?.length) { - // Trigger an unhandled rejection if the user hasn't registered any error handlers. - // If you are seeing stack traces here, make sure to handle errors via either: - // - runner.on('error', () => ...) - // - await runner.done() - // - await runner.finalChatCompletion() - // - etc. - Promise.reject(error); - } - __classPrivateFieldGet(this, _AbstractChatCompletionRunner_rejectConnectedPromise, "f").call(this, error); - __classPrivateFieldGet(this, _AbstractChatCompletionRunner_rejectEndPromise, "f").call(this, error); - this._emit('end'); - } - } - _emitFinal() { - const completion = this._chatCompletions[this._chatCompletions.length - 1]; - if (completion) - this._emit('finalChatCompletion', completion); - const finalMessage = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalMessage).call(this); - if (finalMessage) - this._emit('finalMessage', finalMessage); - const finalContent = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalContent).call(this); - if (finalContent) - this._emit('finalContent', finalContent); - const finalFunctionCall = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalFunctionCall).call(this); - if (finalFunctionCall) - this._emit('finalFunctionCall', finalFunctionCall); - const finalFunctionCallResult = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalFunctionCallResult).call(this); - if (finalFunctionCallResult != null) - this._emit('finalFunctionCallResult', finalFunctionCallResult); - if (this._chatCompletions.some((c) => c.usage)) { - this._emit('totalUsage', __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_calculateTotalUsage).call(this)); - } - } - async _createChatCompletion(completions, params, options) { - const signal = options?.signal; - if (signal) { - if (signal.aborted) - this.controller.abort(); - signal.addEventListener('abort', () => this.controller.abort()); - } - __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_validateParams).call(this, params); - const chatCompletion = await completions.create({ ...params, stream: false }, { ...options, signal: this.controller.signal }); - this._connected(); - return this._addChatCompletion(chatCompletion); - } - async _runChatCompletion(completions, params, options) { - for (const message of params.messages) { - this._addMessage(message, false); - } - return await this._createChatCompletion(completions, params, options); - } - async _runFunctions(completions, params, options) { - const role = 'function'; - const { function_call = 'auto', stream, ...restParams } = params; - const singleFunctionToCall = typeof function_call !== 'string' && function_call?.name; - const { maxChatCompletions = DEFAULT_MAX_CHAT_COMPLETIONS } = options || {}; - const functionsByName = {}; - for (const f of params.functions) { - functionsByName[f.name || f.function.name] = f; - } - const functions = params.functions.map((f) => ({ - name: f.name || f.function.name, - parameters: f.parameters, - description: f.description, - })); - for (const message of params.messages) { - this._addMessage(message, false); - } - for (let i = 0; i < maxChatCompletions; ++i) { - const chatCompletion = await this._createChatCompletion(completions, { - ...restParams, - function_call, - functions, - messages: [...this.messages], - }, options); - const message = chatCompletion.choices[0]?.message; - if (!message) { - throw new error_1.OpenAIError(`missing message in ChatCompletion response`); - } - if (!message.function_call) - return; - const { name, arguments: args } = message.function_call; - const fn = functionsByName[name]; - if (!fn) { - const content = `Invalid function_call: ${JSON.stringify(name)}. Available options are: ${functions - .map((f) => JSON.stringify(f.name)) - .join(', ')}. Please try again`; - this._addMessage({ role, name, content }); - continue; - } - else if (singleFunctionToCall && singleFunctionToCall !== name) { - const content = `Invalid function_call: ${JSON.stringify(name)}. ${JSON.stringify(singleFunctionToCall)} requested. Please try again`; - this._addMessage({ role, name, content }); - continue; - } - let parsed; - try { - parsed = (0, RunnableFunction_1.isRunnableFunctionWithParse)(fn) ? await fn.parse(args) : args; - } - catch (error) { - this._addMessage({ - role, - name, - content: error instanceof Error ? error.message : String(error), - }); - continue; - } - // @ts-expect-error it can't rule out `never` type. - const rawContent = await fn.function(parsed, this); - const content = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_stringifyFunctionCallResult).call(this, rawContent); - this._addMessage({ role, name, content }); - if (singleFunctionToCall) - return; - } - } - async _runTools(completions, params, options) { - const role = 'tool'; - const { tool_choice = 'auto', stream, ...restParams } = params; - const singleFunctionToCall = typeof tool_choice !== 'string' && tool_choice?.function?.name; - const { maxChatCompletions = DEFAULT_MAX_CHAT_COMPLETIONS } = options || {}; - const functionsByName = {}; - for (const f of params.tools) { - if (f.type === 'function') { - functionsByName[f.function.name || f.function.function.name] = f.function; - } - } - const tools = 'tools' in params ? - params.tools.map((t) => t.type === 'function' ? - { - type: 'function', - function: { - name: t.function.name || t.function.function.name, - parameters: t.function.parameters, - description: t.function.description, - }, - } - : t) - : undefined; - for (const message of params.messages) { - this._addMessage(message, false); - } - for (let i = 0; i < maxChatCompletions; ++i) { - const chatCompletion = await this._createChatCompletion(completions, { - ...restParams, - tool_choice, - tools, - messages: [...this.messages], - }, options); - const message = chatCompletion.choices[0]?.message; - if (!message) { - throw new error_1.OpenAIError(`missing message in ChatCompletion response`); - } - if (!message.tool_calls) { - return; - } - for (const tool_call of message.tool_calls) { - if (tool_call.type !== 'function') - continue; - const tool_call_id = tool_call.id; - const { name, arguments: args } = tool_call.function; - const fn = functionsByName[name]; - if (!fn) { - const content = `Invalid tool_call: ${JSON.stringify(name)}. Available options are: ${tools - .map((f) => JSON.stringify(f.function.name)) - .join(', ')}. Please try again`; - this._addMessage({ role, tool_call_id, content }); - continue; - } - else if (singleFunctionToCall && singleFunctionToCall !== name) { - const content = `Invalid tool_call: ${JSON.stringify(name)}. ${JSON.stringify(singleFunctionToCall)} requested. Please try again`; - this._addMessage({ role, tool_call_id, content }); - continue; - } - let parsed; - try { - parsed = (0, RunnableFunction_1.isRunnableFunctionWithParse)(fn) ? await fn.parse(args) : args; - } - catch (error) { - const content = error instanceof Error ? error.message : String(error); - this._addMessage({ role, tool_call_id, content }); - continue; - } - // @ts-expect-error it can't rule out `never` type. - const rawContent = await fn.function(parsed, this); - const content = __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_stringifyFunctionCallResult).call(this, rawContent); - this._addMessage({ role, tool_call_id, content }); - if (singleFunctionToCall) { - return; - } - } - } - return; - } -} -exports.AbstractChatCompletionRunner = AbstractChatCompletionRunner; -_AbstractChatCompletionRunner_connectedPromise = new WeakMap(), _AbstractChatCompletionRunner_resolveConnectedPromise = new WeakMap(), _AbstractChatCompletionRunner_rejectConnectedPromise = new WeakMap(), _AbstractChatCompletionRunner_endPromise = new WeakMap(), _AbstractChatCompletionRunner_resolveEndPromise = new WeakMap(), _AbstractChatCompletionRunner_rejectEndPromise = new WeakMap(), _AbstractChatCompletionRunner_listeners = new WeakMap(), _AbstractChatCompletionRunner_ended = new WeakMap(), _AbstractChatCompletionRunner_errored = new WeakMap(), _AbstractChatCompletionRunner_aborted = new WeakMap(), _AbstractChatCompletionRunner_catchingPromiseCreated = new WeakMap(), _AbstractChatCompletionRunner_handleError = new WeakMap(), _AbstractChatCompletionRunner_instances = new WeakSet(), _AbstractChatCompletionRunner_getFinalContent = function _AbstractChatCompletionRunner_getFinalContent() { - return __classPrivateFieldGet(this, _AbstractChatCompletionRunner_instances, "m", _AbstractChatCompletionRunner_getFinalMessage).call(this).content ?? null; -}, _AbstractChatCompletionRunner_getFinalMessage = function _AbstractChatCompletionRunner_getFinalMessage() { - let i = this.messages.length; - while (i-- > 0) { - const message = this.messages[i]; - if ((0, chatCompletionUtils_1.isAssistantMessage)(message)) { - return { ...message, content: message.content ?? null }; - } - } - throw new error_1.OpenAIError('stream ended without producing a ChatCompletionMessage with role=assistant'); -}, _AbstractChatCompletionRunner_getFinalFunctionCall = function _AbstractChatCompletionRunner_getFinalFunctionCall() { - for (let i = this.messages.length - 1; i >= 0; i--) { - const message = this.messages[i]; - if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message?.function_call) { - return message.function_call; - } - if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message?.tool_calls?.length) { - return message.tool_calls.at(-1)?.function; - } - } - return; -}, _AbstractChatCompletionRunner_getFinalFunctionCallResult = function _AbstractChatCompletionRunner_getFinalFunctionCallResult() { - for (let i = this.messages.length - 1; i >= 0; i--) { - const message = this.messages[i]; - if ((0, chatCompletionUtils_1.isFunctionMessage)(message) && message.content != null) { - return message.content; - } - if ((0, chatCompletionUtils_1.isToolMessage)(message) && - message.content != null && - this.messages.some((x) => x.role === 'assistant' && - x.tool_calls?.some((y) => y.type === 'function' && y.id === message.tool_call_id))) { - return message.content; - } - } - return; -}, _AbstractChatCompletionRunner_calculateTotalUsage = function _AbstractChatCompletionRunner_calculateTotalUsage() { - const total = { - completion_tokens: 0, - prompt_tokens: 0, - total_tokens: 0, - }; - for (const { usage } of this._chatCompletions) { - if (usage) { - total.completion_tokens += usage.completion_tokens; - total.prompt_tokens += usage.prompt_tokens; - total.total_tokens += usage.total_tokens; - } - } - return total; -}, _AbstractChatCompletionRunner_validateParams = function _AbstractChatCompletionRunner_validateParams(params) { - if (params.n != null && params.n > 1) { - throw new error_1.OpenAIError('ChatCompletion convenience helpers only support n=1 at this time. To use n>1, please use chat.completions.create() directly.'); - } -}, _AbstractChatCompletionRunner_stringifyFunctionCallResult = function _AbstractChatCompletionRunner_stringifyFunctionCallResult(rawContent) { - return (typeof rawContent === 'string' ? rawContent - : rawContent === undefined ? 'undefined' - : JSON.stringify(rawContent)); -}; -//# sourceMappingURL=AbstractChatCompletionRunner.js.map - -/***/ }), - -/***/ 7514: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -}; -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; -var _AssistantStream_instances, _AssistantStream_events, _AssistantStream_runStepSnapshots, _AssistantStream_messageSnapshots, _AssistantStream_messageSnapshot, _AssistantStream_finalRun, _AssistantStream_currentContentIndex, _AssistantStream_currentContent, _AssistantStream_currentToolCallIndex, _AssistantStream_currentToolCall, _AssistantStream_currentEvent, _AssistantStream_currentRunSnapshot, _AssistantStream_currentRunStepSnapshot, _AssistantStream_addEvent, _AssistantStream_endRequest, _AssistantStream_handleMessage, _AssistantStream_handleRunStep, _AssistantStream_handleEvent, _AssistantStream_accumulateRunStep, _AssistantStream_accumulateMessage, _AssistantStream_accumulateContent, _AssistantStream_handleRun; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.AssistantStream = void 0; -const Core = __importStar(__nccwpck_require__(1798)); -const AbstractAssistantStreamRunner_1 = __nccwpck_require__(9365); -const streaming_1 = __nccwpck_require__(884); -const error_1 = __nccwpck_require__(8905); -class AssistantStream extends AbstractAssistantStreamRunner_1.AbstractAssistantStreamRunner { - constructor() { - super(...arguments); - _AssistantStream_instances.add(this); - //Track all events in a single list for reference - _AssistantStream_events.set(this, []); - //Used to accumulate deltas - //We are accumulating many types so the value here is not strict - _AssistantStream_runStepSnapshots.set(this, {}); - _AssistantStream_messageSnapshots.set(this, {}); - _AssistantStream_messageSnapshot.set(this, void 0); - _AssistantStream_finalRun.set(this, void 0); - _AssistantStream_currentContentIndex.set(this, void 0); - _AssistantStream_currentContent.set(this, void 0); - _AssistantStream_currentToolCallIndex.set(this, void 0); - _AssistantStream_currentToolCall.set(this, void 0); - //For current snapshot methods - _AssistantStream_currentEvent.set(this, void 0); - _AssistantStream_currentRunSnapshot.set(this, void 0); - _AssistantStream_currentRunStepSnapshot.set(this, void 0); - } - [(_AssistantStream_events = new WeakMap(), _AssistantStream_runStepSnapshots = new WeakMap(), _AssistantStream_messageSnapshots = new WeakMap(), _AssistantStream_messageSnapshot = new WeakMap(), _AssistantStream_finalRun = new WeakMap(), _AssistantStream_currentContentIndex = new WeakMap(), _AssistantStream_currentContent = new WeakMap(), _AssistantStream_currentToolCallIndex = new WeakMap(), _AssistantStream_currentToolCall = new WeakMap(), _AssistantStream_currentEvent = new WeakMap(), _AssistantStream_currentRunSnapshot = new WeakMap(), _AssistantStream_currentRunStepSnapshot = new WeakMap(), _AssistantStream_instances = new WeakSet(), Symbol.asyncIterator)]() { - const pushQueue = []; - const readQueue = []; - let done = false; - //Catch all for passing along all events - this.on('event', (event) => { - const reader = readQueue.shift(); - if (reader) { - reader.resolve(event); - } - else { - pushQueue.push(event); - } - }); - this.on('end', () => { - done = true; - for (const reader of readQueue) { - reader.resolve(undefined); - } - readQueue.length = 0; - }); - this.on('abort', (err) => { - done = true; - for (const reader of readQueue) { - reader.reject(err); - } - readQueue.length = 0; - }); - this.on('error', (err) => { - done = true; - for (const reader of readQueue) { - reader.reject(err); - } - readQueue.length = 0; - }); - return { - next: async () => { - if (!pushQueue.length) { - if (done) { - return { value: undefined, done: true }; - } - return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true })); - } - const chunk = pushQueue.shift(); - return { value: chunk, done: false }; - }, - return: async () => { - this.abort(); - return { value: undefined, done: true }; - }, - }; - } - static fromReadableStream(stream) { - const runner = new AssistantStream(); - runner._run(() => runner._fromReadableStream(stream)); - return runner; - } - async _fromReadableStream(readableStream, options) { - const signal = options?.signal; - if (signal) { - if (signal.aborted) - this.controller.abort(); - signal.addEventListener('abort', () => this.controller.abort()); - } - this._connected(); - const stream = streaming_1.Stream.fromReadableStream(readableStream, this.controller); - for await (const event of stream) { - __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event); - } - if (stream.controller.signal?.aborted) { - throw new error_1.APIUserAbortError(); - } - return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this)); - } - toReadableStream() { - const stream = new streaming_1.Stream(this[Symbol.asyncIterator].bind(this), this.controller); - return stream.toReadableStream(); - } - static createToolAssistantStream(threadId, runId, runs, body, options) { - const runner = new AssistantStream(); - runner._run(() => runner._runToolAssistantStream(threadId, runId, runs, body, { - ...options, - headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' }, - })); - return runner; - } - async _createToolAssistantStream(run, threadId, runId, params, options) { - const signal = options?.signal; - if (signal) { - if (signal.aborted) - this.controller.abort(); - signal.addEventListener('abort', () => this.controller.abort()); - } - const body = { ...params, stream: true }; - const stream = await run.submitToolOutputs(threadId, runId, body, { - ...options, - signal: this.controller.signal, - }); - this._connected(); - for await (const event of stream) { - __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event); - } - if (stream.controller.signal?.aborted) { - throw new error_1.APIUserAbortError(); - } - return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this)); - } - static createThreadAssistantStream(body, thread, options) { - const runner = new AssistantStream(); - runner._run(() => runner._threadAssistantStream(body, thread, { - ...options, - headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' }, - })); - return runner; - } - static createAssistantStream(threadId, runs, params, options) { - const runner = new AssistantStream(); - runner._run(() => runner._runAssistantStream(threadId, runs, params, { - ...options, - headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' }, - })); - return runner; - } - currentEvent() { - return __classPrivateFieldGet(this, _AssistantStream_currentEvent, "f"); - } - currentRun() { - return __classPrivateFieldGet(this, _AssistantStream_currentRunSnapshot, "f"); - } - currentMessageSnapshot() { - return __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f"); - } - currentRunStepSnapshot() { - return __classPrivateFieldGet(this, _AssistantStream_currentRunStepSnapshot, "f"); - } - async finalRunSteps() { - await this.done(); - return Object.values(__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")); - } - async finalMessages() { - await this.done(); - return Object.values(__classPrivateFieldGet(this, _AssistantStream_messageSnapshots, "f")); - } - async finalRun() { - await this.done(); - if (!__classPrivateFieldGet(this, _AssistantStream_finalRun, "f")) - throw Error('Final run was not received.'); - return __classPrivateFieldGet(this, _AssistantStream_finalRun, "f"); - } - async _createThreadAssistantStream(thread, params, options) { - const signal = options?.signal; - if (signal) { - if (signal.aborted) - this.controller.abort(); - signal.addEventListener('abort', () => this.controller.abort()); - } - const body = { ...params, stream: true }; - const stream = await thread.createAndRun(body, { ...options, signal: this.controller.signal }); - this._connected(); - for await (const event of stream) { - __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event); - } - if (stream.controller.signal?.aborted) { - throw new error_1.APIUserAbortError(); - } - return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this)); - } - async _createAssistantStream(run, threadId, params, options) { - const signal = options?.signal; - if (signal) { - if (signal.aborted) - this.controller.abort(); - signal.addEventListener('abort', () => this.controller.abort()); - } - const body = { ...params, stream: true }; - const stream = await run.create(threadId, body, { ...options, signal: this.controller.signal }); - this._connected(); - for await (const event of stream) { - __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_addEvent).call(this, event); - } - if (stream.controller.signal?.aborted) { - throw new error_1.APIUserAbortError(); - } - return this._addRun(__classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_endRequest).call(this)); - } - static accumulateDelta(acc, delta) { - for (const [key, deltaValue] of Object.entries(delta)) { - if (!acc.hasOwnProperty(key)) { - acc[key] = deltaValue; - continue; - } - let accValue = acc[key]; - if (accValue === null || accValue === undefined) { - acc[key] = deltaValue; - continue; - } - // We don't accumulate these special properties - if (key === 'index' || key === 'type') { - acc[key] = deltaValue; - continue; - } - // Type-specific accumulation logic - if (typeof accValue === 'string' && typeof deltaValue === 'string') { - accValue += deltaValue; - } - else if (typeof accValue === 'number' && typeof deltaValue === 'number') { - accValue += deltaValue; - } - else if (Core.isObj(accValue) && Core.isObj(deltaValue)) { - accValue = this.accumulateDelta(accValue, deltaValue); - } - else if (Array.isArray(accValue) && Array.isArray(deltaValue)) { - if (accValue.every((x) => typeof x === 'string' || typeof x === 'number')) { - accValue.push(...deltaValue); // Use spread syntax for efficient addition - continue; - } - } - else { - throw Error(`Unhandled record type: ${key}, deltaValue: ${deltaValue}, accValue: ${accValue}`); - } - acc[key] = accValue; - } - return acc; - } -} -exports.AssistantStream = AssistantStream; -_AssistantStream_addEvent = function _AssistantStream_addEvent(event) { - if (this.ended) - return; - __classPrivateFieldSet(this, _AssistantStream_currentEvent, event, "f"); - __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleEvent).call(this, event); - switch (event.event) { - case 'thread.created': - //No action on this event. - break; - case 'thread.run.created': - case 'thread.run.queued': - case 'thread.run.in_progress': - case 'thread.run.requires_action': - case 'thread.run.completed': - case 'thread.run.failed': - case 'thread.run.cancelling': - case 'thread.run.cancelled': - case 'thread.run.expired': - __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleRun).call(this, event); - break; - case 'thread.run.step.created': - case 'thread.run.step.in_progress': - case 'thread.run.step.delta': - case 'thread.run.step.completed': - case 'thread.run.step.failed': - case 'thread.run.step.cancelled': - case 'thread.run.step.expired': - __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleRunStep).call(this, event); - break; - case 'thread.message.created': - case 'thread.message.in_progress': - case 'thread.message.delta': - case 'thread.message.completed': - case 'thread.message.incomplete': - __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_handleMessage).call(this, event); - break; - case 'error': - //This is included for completeness, but errors are processed in the SSE event processing so this should not occur - throw new Error('Encountered an error event in event processing - errors should be processed earlier'); - } -}, _AssistantStream_endRequest = function _AssistantStream_endRequest() { - if (this.ended) { - throw new error_1.OpenAIError(`stream has ended, this shouldn't happen`); - } - if (!__classPrivateFieldGet(this, _AssistantStream_finalRun, "f")) - throw Error('Final run has not been received'); - return __classPrivateFieldGet(this, _AssistantStream_finalRun, "f"); -}, _AssistantStream_handleMessage = function _AssistantStream_handleMessage(event) { - const [accumulatedMessage, newContent] = __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_accumulateMessage).call(this, event, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); - __classPrivateFieldSet(this, _AssistantStream_messageSnapshot, accumulatedMessage, "f"); - __classPrivateFieldGet(this, _AssistantStream_messageSnapshots, "f")[accumulatedMessage.id] = accumulatedMessage; - for (const content of newContent) { - const snapshotContent = accumulatedMessage.content[content.index]; - if (snapshotContent?.type == 'text') { - this._emit('textCreated', snapshotContent.text); - } - } - switch (event.event) { - case 'thread.message.created': - this._emit('messageCreated', event.data); - break; - case 'thread.message.in_progress': - break; - case 'thread.message.delta': - this._emit('messageDelta', event.data.delta, accumulatedMessage); - if (event.data.delta.content) { - for (const content of event.data.delta.content) { - //If it is text delta, emit a text delta event - if (content.type == 'text' && content.text) { - let textDelta = content.text; - let snapshot = accumulatedMessage.content[content.index]; - if (snapshot && snapshot.type == 'text') { - this._emit('textDelta', textDelta, snapshot.text); - } - else { - throw Error('The snapshot associated with this text delta is not text or missing'); - } - } - if (content.index != __classPrivateFieldGet(this, _AssistantStream_currentContentIndex, "f")) { - //See if we have in progress content - if (__classPrivateFieldGet(this, _AssistantStream_currentContent, "f")) { - switch (__classPrivateFieldGet(this, _AssistantStream_currentContent, "f").type) { - case 'text': - this._emit('textDone', __classPrivateFieldGet(this, _AssistantStream_currentContent, "f").text, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); - break; - case 'image_file': - this._emit('imageFileDone', __classPrivateFieldGet(this, _AssistantStream_currentContent, "f").image_file, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); - break; - } - } - __classPrivateFieldSet(this, _AssistantStream_currentContentIndex, content.index, "f"); - } - __classPrivateFieldSet(this, _AssistantStream_currentContent, accumulatedMessage.content[content.index], "f"); - } - } - break; - case 'thread.message.completed': - case 'thread.message.incomplete': - //We emit the latest content we were working on on completion (including incomplete) - if (__classPrivateFieldGet(this, _AssistantStream_currentContentIndex, "f") !== undefined) { - const currentContent = event.data.content[__classPrivateFieldGet(this, _AssistantStream_currentContentIndex, "f")]; - if (currentContent) { - switch (currentContent.type) { - case 'image_file': - this._emit('imageFileDone', currentContent.image_file, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); - break; - case 'text': - this._emit('textDone', currentContent.text, __classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")); - break; - } - } - } - if (__classPrivateFieldGet(this, _AssistantStream_messageSnapshot, "f")) { - this._emit('messageDone', event.data); - } - __classPrivateFieldSet(this, _AssistantStream_messageSnapshot, undefined, "f"); - } -}, _AssistantStream_handleRunStep = function _AssistantStream_handleRunStep(event) { - const accumulatedRunStep = __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_accumulateRunStep).call(this, event); - __classPrivateFieldSet(this, _AssistantStream_currentRunStepSnapshot, accumulatedRunStep, "f"); - switch (event.event) { - case 'thread.run.step.created': - this._emit('runStepCreated', event.data); - break; - case 'thread.run.step.delta': - const delta = event.data.delta; - if (delta.step_details && - delta.step_details.type == 'tool_calls' && - delta.step_details.tool_calls && - accumulatedRunStep.step_details.type == 'tool_calls') { - for (const toolCall of delta.step_details.tool_calls) { - if (toolCall.index == __classPrivateFieldGet(this, _AssistantStream_currentToolCallIndex, "f")) { - this._emit('toolCallDelta', toolCall, accumulatedRunStep.step_details.tool_calls[toolCall.index]); - } - else { - if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) { - this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")); - } - __classPrivateFieldSet(this, _AssistantStream_currentToolCallIndex, toolCall.index, "f"); - __classPrivateFieldSet(this, _AssistantStream_currentToolCall, accumulatedRunStep.step_details.tool_calls[toolCall.index], "f"); - if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) - this._emit('toolCallCreated', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")); - } - } - } - this._emit('runStepDelta', event.data.delta, accumulatedRunStep); - break; - case 'thread.run.step.completed': - case 'thread.run.step.failed': - case 'thread.run.step.cancelled': - case 'thread.run.step.expired': - __classPrivateFieldSet(this, _AssistantStream_currentRunStepSnapshot, undefined, "f"); - const details = event.data.step_details; - if (details.type == 'tool_calls') { - if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) { - this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")); - __classPrivateFieldSet(this, _AssistantStream_currentToolCall, undefined, "f"); - } - } - this._emit('runStepDone', event.data, accumulatedRunStep); - break; - case 'thread.run.step.in_progress': - break; - } -}, _AssistantStream_handleEvent = function _AssistantStream_handleEvent(event) { - __classPrivateFieldGet(this, _AssistantStream_events, "f").push(event); - this._emit('event', event); -}, _AssistantStream_accumulateRunStep = function _AssistantStream_accumulateRunStep(event) { - switch (event.event) { - case 'thread.run.step.created': - __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = event.data; - return event.data; - case 'thread.run.step.delta': - let snapshot = __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; - if (!snapshot) { - throw Error('Received a RunStepDelta before creation of a snapshot'); - } - let data = event.data; - if (data.delta) { - const accumulated = AssistantStream.accumulateDelta(snapshot, data.delta); - __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = accumulated; - } - return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; - case 'thread.run.step.completed': - case 'thread.run.step.failed': - case 'thread.run.step.cancelled': - case 'thread.run.step.expired': - case 'thread.run.step.in_progress': - __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id] = event.data; - break; - } - if (__classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]) - return __classPrivateFieldGet(this, _AssistantStream_runStepSnapshots, "f")[event.data.id]; - throw new Error('No snapshot available'); -}, _AssistantStream_accumulateMessage = function _AssistantStream_accumulateMessage(event, snapshot) { - let newContent = []; - switch (event.event) { - case 'thread.message.created': - //On creation the snapshot is just the initial message - return [event.data, newContent]; - case 'thread.message.delta': - if (!snapshot) { - throw Error('Received a delta with no existing snapshot (there should be one from message creation)'); - } - let data = event.data; - //If this delta does not have content, nothing to process - if (data.delta.content) { - for (const contentElement of data.delta.content) { - if (contentElement.index in snapshot.content) { - let currentContent = snapshot.content[contentElement.index]; - snapshot.content[contentElement.index] = __classPrivateFieldGet(this, _AssistantStream_instances, "m", _AssistantStream_accumulateContent).call(this, contentElement, currentContent); - } - else { - snapshot.content[contentElement.index] = contentElement; - //This is a new element - newContent.push(contentElement); - } - } - } - return [snapshot, newContent]; - case 'thread.message.in_progress': - case 'thread.message.completed': - case 'thread.message.incomplete': - //No changes on other thread events - if (snapshot) { - return [snapshot, newContent]; - } - else { - throw Error('Received thread message event with no existing snapshot'); - } - } - throw Error('Tried to accumulate a non-message event'); -}, _AssistantStream_accumulateContent = function _AssistantStream_accumulateContent(contentElement, currentContent) { - return AssistantStream.accumulateDelta(currentContent, contentElement); -}, _AssistantStream_handleRun = function _AssistantStream_handleRun(event) { - __classPrivateFieldSet(this, _AssistantStream_currentRunSnapshot, event.data, "f"); - switch (event.event) { - case 'thread.run.created': - break; - case 'thread.run.queued': - break; - case 'thread.run.in_progress': - break; - case 'thread.run.requires_action': - case 'thread.run.cancelled': - case 'thread.run.failed': - case 'thread.run.completed': - case 'thread.run.expired': - __classPrivateFieldSet(this, _AssistantStream_finalRun, event.data, "f"); - if (__classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")) { - this._emit('toolCallDone', __classPrivateFieldGet(this, _AssistantStream_currentToolCall, "f")); - __classPrivateFieldSet(this, _AssistantStream_currentToolCall, undefined, "f"); - } - break; - case 'thread.run.cancelling': - break; - } -}; -//# sourceMappingURL=AssistantStream.js.map - -/***/ }), - -/***/ 5575: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ChatCompletionRunner = void 0; -const AbstractChatCompletionRunner_1 = __nccwpck_require__(8398); -const chatCompletionUtils_1 = __nccwpck_require__(7858); -class ChatCompletionRunner extends AbstractChatCompletionRunner_1.AbstractChatCompletionRunner { - /** @deprecated - please use `runTools` instead. */ - static runFunctions(completions, params, options) { - const runner = new ChatCompletionRunner(); - const opts = { - ...options, - headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runFunctions' }, - }; - runner._run(() => runner._runFunctions(completions, params, opts)); - return runner; - } - static runTools(completions, params, options) { - const runner = new ChatCompletionRunner(); - const opts = { - ...options, - headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runTools' }, - }; - runner._run(() => runner._runTools(completions, params, opts)); - return runner; - } - _addMessage(message) { - super._addMessage(message); - if ((0, chatCompletionUtils_1.isAssistantMessage)(message) && message.content) { - this._emit('content', message.content); - } - } -} -exports.ChatCompletionRunner = ChatCompletionRunner; -//# sourceMappingURL=ChatCompletionRunner.js.map - -/***/ }), - -/***/ 7823: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -}; -var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { - if (kind === "m") throw new TypeError("Private method is not writable"); - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it"); - return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; -}; -var _ChatCompletionStream_instances, _ChatCompletionStream_currentChatCompletionSnapshot, _ChatCompletionStream_beginRequest, _ChatCompletionStream_addChunk, _ChatCompletionStream_endRequest, _ChatCompletionStream_accumulateChatCompletion; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ChatCompletionStream = void 0; -const error_1 = __nccwpck_require__(8905); -const AbstractChatCompletionRunner_1 = __nccwpck_require__(8398); -const streaming_1 = __nccwpck_require__(884); -class ChatCompletionStream extends AbstractChatCompletionRunner_1.AbstractChatCompletionRunner { - constructor() { - super(...arguments); - _ChatCompletionStream_instances.add(this); - _ChatCompletionStream_currentChatCompletionSnapshot.set(this, void 0); - } - get currentChatCompletionSnapshot() { - return __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); - } - /** - * Intended for use on the frontend, consuming a stream produced with - * `.toReadableStream()` on the backend. - * - * Note that messages sent to the model do not appear in `.on('message')` - * in this context. - */ - static fromReadableStream(stream) { - const runner = new ChatCompletionStream(); - runner._run(() => runner._fromReadableStream(stream)); - return runner; - } - static createChatCompletion(completions, params, options) { - const runner = new ChatCompletionStream(); - runner._run(() => runner._runChatCompletion(completions, { ...params, stream: true }, { ...options, headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'stream' } })); - return runner; - } - async _createChatCompletion(completions, params, options) { - const signal = options?.signal; - if (signal) { - if (signal.aborted) - this.controller.abort(); - signal.addEventListener('abort', () => this.controller.abort()); - } - __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_beginRequest).call(this); - const stream = await completions.create({ ...params, stream: true }, { ...options, signal: this.controller.signal }); - this._connected(); - for await (const chunk of stream) { - __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_addChunk).call(this, chunk); - } - if (stream.controller.signal?.aborted) { - throw new error_1.APIUserAbortError(); - } - return this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_endRequest).call(this)); - } - async _fromReadableStream(readableStream, options) { - const signal = options?.signal; - if (signal) { - if (signal.aborted) - this.controller.abort(); - signal.addEventListener('abort', () => this.controller.abort()); - } - __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_beginRequest).call(this); - this._connected(); - const stream = streaming_1.Stream.fromReadableStream(readableStream, this.controller); - let chatId; - for await (const chunk of stream) { - if (chatId && chatId !== chunk.id) { - // A new request has been made. - this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_endRequest).call(this)); - } - __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_addChunk).call(this, chunk); - chatId = chunk.id; - } - if (stream.controller.signal?.aborted) { - throw new error_1.APIUserAbortError(); - } - return this._addChatCompletion(__classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_endRequest).call(this)); - } - [(_ChatCompletionStream_currentChatCompletionSnapshot = new WeakMap(), _ChatCompletionStream_instances = new WeakSet(), _ChatCompletionStream_beginRequest = function _ChatCompletionStream_beginRequest() { - if (this.ended) - return; - __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, "f"); - }, _ChatCompletionStream_addChunk = function _ChatCompletionStream_addChunk(chunk) { - if (this.ended) - return; - const completion = __classPrivateFieldGet(this, _ChatCompletionStream_instances, "m", _ChatCompletionStream_accumulateChatCompletion).call(this, chunk); - this._emit('chunk', chunk, completion); - const delta = chunk.choices[0]?.delta?.content; - const snapshot = completion.choices[0]?.message; - if (delta != null && snapshot?.role === 'assistant' && snapshot?.content) { - this._emit('content', delta, snapshot.content); - } - }, _ChatCompletionStream_endRequest = function _ChatCompletionStream_endRequest() { - if (this.ended) { - throw new error_1.OpenAIError(`stream has ended, this shouldn't happen`); - } - const snapshot = __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); - if (!snapshot) { - throw new error_1.OpenAIError(`request ended without sending any chunks`); - } - __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, undefined, "f"); - return finalizeChatCompletion(snapshot); - }, _ChatCompletionStream_accumulateChatCompletion = function _ChatCompletionStream_accumulateChatCompletion(chunk) { - var _a, _b, _c; - let snapshot = __classPrivateFieldGet(this, _ChatCompletionStream_currentChatCompletionSnapshot, "f"); - const { choices, ...rest } = chunk; - if (!snapshot) { - snapshot = __classPrivateFieldSet(this, _ChatCompletionStream_currentChatCompletionSnapshot, { - ...rest, - choices: [], - }, "f"); - } - else { - Object.assign(snapshot, rest); - } - for (const { delta, finish_reason, index, logprobs = null, ...other } of chunk.choices) { - let choice = snapshot.choices[index]; - if (!choice) { - choice = snapshot.choices[index] = { finish_reason, index, message: {}, logprobs, ...other }; - } - if (logprobs) { - if (!choice.logprobs) { - choice.logprobs = Object.assign({}, logprobs); - } - else { - const { content, ...rest } = logprobs; - Object.assign(choice.logprobs, rest); - if (content) { - (_a = choice.logprobs).content ?? (_a.content = []); - choice.logprobs.content.push(...content); - } - } - } - if (finish_reason) - choice.finish_reason = finish_reason; - Object.assign(choice, other); - if (!delta) - continue; // Shouldn't happen; just in case. - const { content, function_call, role, tool_calls, ...rest } = delta; - Object.assign(choice.message, rest); - if (content) - choice.message.content = (choice.message.content || '') + content; - if (role) - choice.message.role = role; - if (function_call) { - if (!choice.message.function_call) { - choice.message.function_call = function_call; - } - else { - if (function_call.name) - choice.message.function_call.name = function_call.name; - if (function_call.arguments) { - (_b = choice.message.function_call).arguments ?? (_b.arguments = ''); - choice.message.function_call.arguments += function_call.arguments; - } - } - } - if (tool_calls) { - if (!choice.message.tool_calls) - choice.message.tool_calls = []; - for (const { index, id, type, function: fn, ...rest } of tool_calls) { - const tool_call = ((_c = choice.message.tool_calls)[index] ?? (_c[index] = {})); - Object.assign(tool_call, rest); - if (id) - tool_call.id = id; - if (type) - tool_call.type = type; - if (fn) - tool_call.function ?? (tool_call.function = { arguments: '' }); - if (fn?.name) - tool_call.function.name = fn.name; - if (fn?.arguments) - tool_call.function.arguments += fn.arguments; - } - } - } - return snapshot; - }, Symbol.asyncIterator)]() { - const pushQueue = []; - const readQueue = []; - let done = false; - this.on('chunk', (chunk) => { - const reader = readQueue.shift(); - if (reader) { - reader.resolve(chunk); - } - else { - pushQueue.push(chunk); - } - }); - this.on('end', () => { - done = true; - for (const reader of readQueue) { - reader.resolve(undefined); - } - readQueue.length = 0; - }); - this.on('abort', (err) => { - done = true; - for (const reader of readQueue) { - reader.reject(err); - } - readQueue.length = 0; - }); - this.on('error', (err) => { - done = true; - for (const reader of readQueue) { - reader.reject(err); - } - readQueue.length = 0; - }); - return { - next: async () => { - if (!pushQueue.length) { - if (done) { - return { value: undefined, done: true }; - } - return new Promise((resolve, reject) => readQueue.push({ resolve, reject })).then((chunk) => (chunk ? { value: chunk, done: false } : { value: undefined, done: true })); - } - const chunk = pushQueue.shift(); - return { value: chunk, done: false }; - }, - return: async () => { - this.abort(); - return { value: undefined, done: true }; - }, - }; - } - toReadableStream() { - const stream = new streaming_1.Stream(this[Symbol.asyncIterator].bind(this), this.controller); - return stream.toReadableStream(); - } -} -exports.ChatCompletionStream = ChatCompletionStream; -function finalizeChatCompletion(snapshot) { - const { id, choices, created, model, system_fingerprint, ...rest } = snapshot; - return { - ...rest, - id, - choices: choices.map(({ message, finish_reason, index, logprobs, ...choiceRest }) => { - if (!finish_reason) - throw new error_1.OpenAIError(`missing finish_reason for choice ${index}`); - const { content = null, function_call, tool_calls, ...messageRest } = message; - const role = message.role; // this is what we expect; in theory it could be different which would make our types a slight lie but would be fine. - if (!role) - throw new error_1.OpenAIError(`missing role for choice ${index}`); - if (function_call) { - const { arguments: args, name } = function_call; - if (args == null) - throw new error_1.OpenAIError(`missing function_call.arguments for choice ${index}`); - if (!name) - throw new error_1.OpenAIError(`missing function_call.name for choice ${index}`); - return { - ...choiceRest, - message: { content, function_call: { arguments: args, name }, role }, - finish_reason, - index, - logprobs, - }; - } - if (tool_calls) { - return { - ...choiceRest, - index, - finish_reason, - logprobs, - message: { - ...messageRest, - role, - content, - tool_calls: tool_calls.map((tool_call, i) => { - const { function: fn, type, id, ...toolRest } = tool_call; - const { arguments: args, name, ...fnRest } = fn || {}; - if (id == null) - throw new error_1.OpenAIError(`missing choices[${index}].tool_calls[${i}].id\n${str(snapshot)}`); - if (type == null) - throw new error_1.OpenAIError(`missing choices[${index}].tool_calls[${i}].type\n${str(snapshot)}`); - if (name == null) - throw new error_1.OpenAIError(`missing choices[${index}].tool_calls[${i}].function.name\n${str(snapshot)}`); - if (args == null) - throw new error_1.OpenAIError(`missing choices[${index}].tool_calls[${i}].function.arguments\n${str(snapshot)}`); - return { ...toolRest, id, type, function: { ...fnRest, name, arguments: args } }; - }), - }, - }; - } - return { - ...choiceRest, - message: { ...messageRest, content, role }, - finish_reason, - index, - logprobs, - }; - }), - created, - model, - object: 'chat.completion', - ...(system_fingerprint ? { system_fingerprint } : {}), - }; -} -function str(x) { - return JSON.stringify(x); -} -//# sourceMappingURL=ChatCompletionStream.js.map - -/***/ }), - -/***/ 794: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ChatCompletionStreamingRunner = void 0; -const ChatCompletionStream_1 = __nccwpck_require__(7823); -class ChatCompletionStreamingRunner extends ChatCompletionStream_1.ChatCompletionStream { - static fromReadableStream(stream) { - const runner = new ChatCompletionStreamingRunner(); - runner._run(() => runner._fromReadableStream(stream)); - return runner; - } - /** @deprecated - please use `runTools` instead. */ - static runFunctions(completions, params, options) { - const runner = new ChatCompletionStreamingRunner(); - const opts = { - ...options, - headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runFunctions' }, - }; - runner._run(() => runner._runFunctions(completions, params, opts)); - return runner; - } - static runTools(completions, params, options) { - const runner = new ChatCompletionStreamingRunner(); - const opts = { - ...options, - headers: { ...options?.headers, 'X-Stainless-Helper-Method': 'runTools' }, - }; - runner._run(() => runner._runTools(completions, params, opts)); - return runner; - } -} -exports.ChatCompletionStreamingRunner = ChatCompletionStreamingRunner; -//# sourceMappingURL=ChatCompletionStreamingRunner.js.map - -/***/ }), - -/***/ 5464: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ParsingToolFunction = exports.ParsingFunction = exports.isRunnableFunctionWithParse = void 0; -function isRunnableFunctionWithParse(fn) { - return typeof fn.parse === 'function'; -} -exports.isRunnableFunctionWithParse = isRunnableFunctionWithParse; -/** - * This is helper class for passing a `function` and `parse` where the `function` - * argument type matches the `parse` return type. - * - * @deprecated - please use ParsingToolFunction instead. - */ -class ParsingFunction { - constructor(input) { - this.function = input.function; - this.parse = input.parse; - this.parameters = input.parameters; - this.description = input.description; - this.name = input.name; - } -} -exports.ParsingFunction = ParsingFunction; -/** - * This is helper class for passing a `function` and `parse` where the `function` - * argument type matches the `parse` return type. - */ -class ParsingToolFunction { - constructor(input) { - this.type = 'function'; - this.function = input; - } -} -exports.ParsingToolFunction = ParsingToolFunction; -//# sourceMappingURL=RunnableFunction.js.map - -/***/ }), - -/***/ 2626: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.allSettledWithThrow = void 0; -/** - * Like `Promise.allSettled()` but throws an error if any promises are rejected. - */ -const allSettledWithThrow = async (promises) => { - const results = await Promise.allSettled(promises); - const rejected = results.filter((result) => result.status === 'rejected'); - if (rejected.length) { - for (const result of rejected) { - console.error(result.reason); - } - throw new Error(`${rejected.length} promise(s) failed - see the above errors`); - } - // Note: TS was complaining about using `.filter().map()` here for some reason - const values = []; - for (const result of results) { - if (result.status === 'fulfilled') { - values.push(result.value); - } - } - return values; -}; -exports.allSettledWithThrow = allSettledWithThrow; -//# sourceMappingURL=Util.js.map - -/***/ }), - -/***/ 7858: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.isPresent = exports.isToolMessage = exports.isFunctionMessage = exports.isAssistantMessage = void 0; -const isAssistantMessage = (message) => { - return message?.role === 'assistant'; -}; -exports.isAssistantMessage = isAssistantMessage; -const isFunctionMessage = (message) => { - return message?.role === 'function'; -}; -exports.isFunctionMessage = isFunctionMessage; -const isToolMessage = (message) => { - return message?.role === 'tool'; -}; -exports.isToolMessage = isToolMessage; -function isPresent(obj) { - return obj != null; -} -exports.isPresent = isPresent; -//# sourceMappingURL=chatCompletionUtils.js.map - -/***/ }), - -/***/ 7401: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.CursorPage = exports.Page = void 0; -const core_1 = __nccwpck_require__(1798); -/** - * Note: no pagination actually occurs yet, this is for forwards-compatibility. - */ -class Page extends core_1.AbstractPage { - constructor(client, response, body, options) { - super(client, response, body, options); - this.data = body.data || []; - this.object = body.object; - } - getPaginatedItems() { - return this.data ?? []; - } - // @deprecated Please use `nextPageInfo()` instead - /** - * This page represents a response that isn't actually paginated at the API level - * so there will never be any next page params. - */ - nextPageParams() { - return null; - } - nextPageInfo() { - return null; - } -} -exports.Page = Page; -class CursorPage extends core_1.AbstractPage { - constructor(client, response, body, options) { - super(client, response, body, options); - this.data = body.data || []; - } - getPaginatedItems() { - return this.data ?? []; - } - // @deprecated Please use `nextPageInfo()` instead - nextPageParams() { - const info = this.nextPageInfo(); - if (!info) - return null; - if ('params' in info) - return info.params; - const params = Object.fromEntries(info.url.searchParams); - if (!Object.keys(params).length) - return null; - return params; - } - nextPageInfo() { - const data = this.getPaginatedItems(); - if (!data.length) { - return null; - } - const id = data[data.length - 1]?.id; - if (!id) { - return null; - } - return { params: { after: id } }; - } -} -exports.CursorPage = CursorPage; -//# sourceMappingURL=pagination.js.map - -/***/ }), - -/***/ 9593: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.APIResource = void 0; -class APIResource { - constructor(client) { - this._client = client; - } -} -exports.APIResource = APIResource; -//# sourceMappingURL=resource.js.map - -/***/ }), - -/***/ 6376: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Audio = void 0; -const resource_1 = __nccwpck_require__(9593); -const SpeechAPI = __importStar(__nccwpck_require__(4117)); -const TranscriptionsAPI = __importStar(__nccwpck_require__(5622)); -const TranslationsAPI = __importStar(__nccwpck_require__(7735)); -class Audio extends resource_1.APIResource { - constructor() { - super(...arguments); - this.transcriptions = new TranscriptionsAPI.Transcriptions(this._client); - this.translations = new TranslationsAPI.Translations(this._client); - this.speech = new SpeechAPI.Speech(this._client); - } -} -exports.Audio = Audio; -(function (Audio) { - Audio.Transcriptions = TranscriptionsAPI.Transcriptions; - Audio.Translations = TranslationsAPI.Translations; - Audio.Speech = SpeechAPI.Speech; -})(Audio = exports.Audio || (exports.Audio = {})); -//# sourceMappingURL=audio.js.map - -/***/ }), - -/***/ 4117: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Speech = void 0; -const resource_1 = __nccwpck_require__(9593); -class Speech extends resource_1.APIResource { - /** - * Generates audio from the input text. - */ - create(body, options) { - return this._client.post('/audio/speech', { body, ...options, __binaryResponse: true }); - } -} -exports.Speech = Speech; -(function (Speech) { -})(Speech = exports.Speech || (exports.Speech = {})); -//# sourceMappingURL=speech.js.map - -/***/ }), - -/***/ 5622: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Transcriptions = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -class Transcriptions extends resource_1.APIResource { - /** - * Transcribes audio into the input language. - */ - create(body, options) { - return this._client.post('/audio/transcriptions', (0, core_1.multipartFormRequestOptions)({ body, ...options })); - } -} -exports.Transcriptions = Transcriptions; -(function (Transcriptions) { -})(Transcriptions = exports.Transcriptions || (exports.Transcriptions = {})); -//# sourceMappingURL=transcriptions.js.map - -/***/ }), - -/***/ 7735: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Translations = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -class Translations extends resource_1.APIResource { - /** - * Translates audio into English. - */ - create(body, options) { - return this._client.post('/audio/translations', (0, core_1.multipartFormRequestOptions)({ body, ...options })); - } -} -exports.Translations = Translations; -(function (Translations) { -})(Translations = exports.Translations || (exports.Translations = {})); -//# sourceMappingURL=translations.js.map - -/***/ }), - -/***/ 341: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.BatchesPage = exports.Batches = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -const BatchesAPI = __importStar(__nccwpck_require__(341)); -const pagination_1 = __nccwpck_require__(7401); -class Batches extends resource_1.APIResource { - /** - * Creates and executes a batch from an uploaded file of requests - */ - create(body, options) { - return this._client.post('/batches', { body, ...options }); - } - /** - * Retrieves a batch. - */ - retrieve(batchId, options) { - return this._client.get(`/batches/${batchId}`, options); - } - list(query = {}, options) { - if ((0, core_1.isRequestOptions)(query)) { - return this.list({}, query); - } - return this._client.getAPIList('/batches', BatchesPage, { query, ...options }); - } - /** - * Cancels an in-progress batch. - */ - cancel(batchId, options) { - return this._client.post(`/batches/${batchId}/cancel`, options); - } -} -exports.Batches = Batches; -class BatchesPage extends pagination_1.CursorPage { -} -exports.BatchesPage = BatchesPage; -(function (Batches) { - Batches.BatchesPage = BatchesAPI.BatchesPage; -})(Batches = exports.Batches || (exports.Batches = {})); -//# sourceMappingURL=batches.js.map - -/***/ }), - -/***/ 616: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.AssistantsPage = exports.Assistants = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -const AssistantsAPI = __importStar(__nccwpck_require__(616)); -const pagination_1 = __nccwpck_require__(7401); -class Assistants extends resource_1.APIResource { - /** - * Create an assistant with a model and instructions. - */ - create(body, options) { - return this._client.post('/assistants', { - body, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Retrieves an assistant. - */ - retrieve(assistantId, options) { - return this._client.get(`/assistants/${assistantId}`, { - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Modifies an assistant. - */ - update(assistantId, body, options) { - return this._client.post(`/assistants/${assistantId}`, { - body, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - list(query = {}, options) { - if ((0, core_1.isRequestOptions)(query)) { - return this.list({}, query); - } - return this._client.getAPIList('/assistants', AssistantsPage, { - query, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Delete an assistant. - */ - del(assistantId, options) { - return this._client.delete(`/assistants/${assistantId}`, { - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } -} -exports.Assistants = Assistants; -class AssistantsPage extends pagination_1.CursorPage { -} -exports.AssistantsPage = AssistantsPage; -(function (Assistants) { - Assistants.AssistantsPage = AssistantsAPI.AssistantsPage; -})(Assistants = exports.Assistants || (exports.Assistants = {})); -//# sourceMappingURL=assistants.js.map - -/***/ }), - -/***/ 853: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Beta = void 0; -const resource_1 = __nccwpck_require__(9593); -const AssistantsAPI = __importStar(__nccwpck_require__(616)); -const ChatAPI = __importStar(__nccwpck_require__(8691)); -const ThreadsAPI = __importStar(__nccwpck_require__(1931)); -const VectorStoresAPI = __importStar(__nccwpck_require__(5822)); -class Beta extends resource_1.APIResource { - constructor() { - super(...arguments); - this.vectorStores = new VectorStoresAPI.VectorStores(this._client); - this.chat = new ChatAPI.Chat(this._client); - this.assistants = new AssistantsAPI.Assistants(this._client); - this.threads = new ThreadsAPI.Threads(this._client); - } -} -exports.Beta = Beta; -(function (Beta) { - Beta.VectorStores = VectorStoresAPI.VectorStores; - Beta.VectorStoresPage = VectorStoresAPI.VectorStoresPage; - Beta.Chat = ChatAPI.Chat; - Beta.Assistants = AssistantsAPI.Assistants; - Beta.AssistantsPage = AssistantsAPI.AssistantsPage; - Beta.Threads = ThreadsAPI.Threads; -})(Beta = exports.Beta || (exports.Beta = {})); -//# sourceMappingURL=beta.js.map - -/***/ }), - -/***/ 8691: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Chat = void 0; -const resource_1 = __nccwpck_require__(9593); -const CompletionsAPI = __importStar(__nccwpck_require__(559)); -class Chat extends resource_1.APIResource { - constructor() { - super(...arguments); - this.completions = new CompletionsAPI.Completions(this._client); - } -} -exports.Chat = Chat; -(function (Chat) { - Chat.Completions = CompletionsAPI.Completions; -})(Chat = exports.Chat || (exports.Chat = {})); -//# sourceMappingURL=chat.js.map - -/***/ }), - -/***/ 559: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Completions = exports.ChatCompletionStream = exports.ParsingToolFunction = exports.ParsingFunction = exports.ChatCompletionStreamingRunner = exports.ChatCompletionRunner = void 0; -const resource_1 = __nccwpck_require__(9593); -const ChatCompletionRunner_1 = __nccwpck_require__(5575); -var ChatCompletionRunner_2 = __nccwpck_require__(5575); -Object.defineProperty(exports, "ChatCompletionRunner", ({ enumerable: true, get: function () { return ChatCompletionRunner_2.ChatCompletionRunner; } })); -const ChatCompletionStreamingRunner_1 = __nccwpck_require__(794); -var ChatCompletionStreamingRunner_2 = __nccwpck_require__(794); -Object.defineProperty(exports, "ChatCompletionStreamingRunner", ({ enumerable: true, get: function () { return ChatCompletionStreamingRunner_2.ChatCompletionStreamingRunner; } })); -var RunnableFunction_1 = __nccwpck_require__(5464); -Object.defineProperty(exports, "ParsingFunction", ({ enumerable: true, get: function () { return RunnableFunction_1.ParsingFunction; } })); -Object.defineProperty(exports, "ParsingToolFunction", ({ enumerable: true, get: function () { return RunnableFunction_1.ParsingToolFunction; } })); -const ChatCompletionStream_1 = __nccwpck_require__(7823); -var ChatCompletionStream_2 = __nccwpck_require__(7823); -Object.defineProperty(exports, "ChatCompletionStream", ({ enumerable: true, get: function () { return ChatCompletionStream_2.ChatCompletionStream; } })); -class Completions extends resource_1.APIResource { - runFunctions(body, options) { - if (body.stream) { - return ChatCompletionStreamingRunner_1.ChatCompletionStreamingRunner.runFunctions(this._client.chat.completions, body, options); - } - return ChatCompletionRunner_1.ChatCompletionRunner.runFunctions(this._client.chat.completions, body, options); - } - runTools(body, options) { - if (body.stream) { - return ChatCompletionStreamingRunner_1.ChatCompletionStreamingRunner.runTools(this._client.chat.completions, body, options); - } - return ChatCompletionRunner_1.ChatCompletionRunner.runTools(this._client.chat.completions, body, options); - } - /** - * Creates a chat completion stream - */ - stream(body, options) { - return ChatCompletionStream_1.ChatCompletionStream.createChatCompletion(this._client.chat.completions, body, options); - } -} -exports.Completions = Completions; -//# sourceMappingURL=completions.js.map - -/***/ }), - -/***/ 1787: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.MessagesPage = exports.Messages = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -const MessagesAPI = __importStar(__nccwpck_require__(1787)); -const pagination_1 = __nccwpck_require__(7401); -class Messages extends resource_1.APIResource { - /** - * Create a message. - */ - create(threadId, body, options) { - return this._client.post(`/threads/${threadId}/messages`, { - body, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Retrieve a message. - */ - retrieve(threadId, messageId, options) { - return this._client.get(`/threads/${threadId}/messages/${messageId}`, { - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Modifies a message. - */ - update(threadId, messageId, body, options) { - return this._client.post(`/threads/${threadId}/messages/${messageId}`, { - body, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - list(threadId, query = {}, options) { - if ((0, core_1.isRequestOptions)(query)) { - return this.list(threadId, {}, query); - } - return this._client.getAPIList(`/threads/${threadId}/messages`, MessagesPage, { - query, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } -} -exports.Messages = Messages; -class MessagesPage extends pagination_1.CursorPage { -} -exports.MessagesPage = MessagesPage; -(function (Messages) { - Messages.MessagesPage = MessagesAPI.MessagesPage; -})(Messages = exports.Messages || (exports.Messages = {})); -//# sourceMappingURL=messages.js.map - -/***/ }), - -/***/ 3187: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RunsPage = exports.Runs = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -const AssistantStream_1 = __nccwpck_require__(7514); -const core_2 = __nccwpck_require__(1798); -const RunsAPI = __importStar(__nccwpck_require__(3187)); -const StepsAPI = __importStar(__nccwpck_require__(2630)); -const pagination_1 = __nccwpck_require__(7401); -class Runs extends resource_1.APIResource { - constructor() { - super(...arguments); - this.steps = new StepsAPI.Steps(this._client); - } - create(threadId, body, options) { - return this._client.post(`/threads/${threadId}/runs`, { - body, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - stream: body.stream ?? false, - }); - } - /** - * Retrieves a run. - */ - retrieve(threadId, runId, options) { - return this._client.get(`/threads/${threadId}/runs/${runId}`, { - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Modifies a run. - */ - update(threadId, runId, body, options) { - return this._client.post(`/threads/${threadId}/runs/${runId}`, { - body, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - list(threadId, query = {}, options) { - if ((0, core_1.isRequestOptions)(query)) { - return this.list(threadId, {}, query); - } - return this._client.getAPIList(`/threads/${threadId}/runs`, RunsPage, { - query, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Cancels a run that is `in_progress`. - */ - cancel(threadId, runId, options) { - return this._client.post(`/threads/${threadId}/runs/${runId}/cancel`, { - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * A helper to create a run an poll for a terminal state. More information on Run - * lifecycles can be found here: - * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps - */ - async createAndPoll(threadId, body, options) { - const run = await this.create(threadId, body, options); - return await this.poll(threadId, run.id, options); - } - /** - * Create a Run stream - * - * @deprecated use `stream` instead - */ - createAndStream(threadId, body, options) { - return AssistantStream_1.AssistantStream.createAssistantStream(threadId, this._client.beta.threads.runs, body, options); - } - /** - * A helper to poll a run status until it reaches a terminal state. More - * information on Run lifecycles can be found here: - * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps - */ - async poll(threadId, runId, options) { - const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' }; - if (options?.pollIntervalMs) { - headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString(); - } - while (true) { - const { data: run, response } = await this.retrieve(threadId, runId, { - ...options, - headers: { ...options?.headers, ...headers }, - }).withResponse(); - switch (run.status) { - //If we are in any sort of intermediate state we poll - case 'queued': - case 'in_progress': - case 'cancelling': - let sleepInterval = 5000; - if (options?.pollIntervalMs) { - sleepInterval = options.pollIntervalMs; - } - else { - const headerInterval = response.headers.get('openai-poll-after-ms'); - if (headerInterval) { - const headerIntervalMs = parseInt(headerInterval); - if (!isNaN(headerIntervalMs)) { - sleepInterval = headerIntervalMs; - } - } - } - await (0, core_2.sleep)(sleepInterval); - break; - //We return the run in any terminal state. - case 'requires_action': - case 'cancelled': - case 'completed': - case 'failed': - case 'expired': - return run; - } - } - } - /** - * Create a Run stream - */ - stream(threadId, body, options) { - return AssistantStream_1.AssistantStream.createAssistantStream(threadId, this._client.beta.threads.runs, body, options); - } - submitToolOutputs(threadId, runId, body, options) { - return this._client.post(`/threads/${threadId}/runs/${runId}/submit_tool_outputs`, { - body, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - stream: body.stream ?? false, - }); - } - /** - * A helper to submit a tool output to a run and poll for a terminal run state. - * More information on Run lifecycles can be found here: - * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps - */ - async submitToolOutputsAndPoll(threadId, runId, body, options) { - const run = await this.submitToolOutputs(threadId, runId, body, options); - return await this.poll(threadId, run.id, options); - } - /** - * Submit the tool outputs from a previous run and stream the run to a terminal - * state. More information on Run lifecycles can be found here: - * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps - */ - submitToolOutputsStream(threadId, runId, body, options) { - return AssistantStream_1.AssistantStream.createToolAssistantStream(threadId, runId, this._client.beta.threads.runs, body, options); - } -} -exports.Runs = Runs; -class RunsPage extends pagination_1.CursorPage { -} -exports.RunsPage = RunsPage; -(function (Runs) { - Runs.RunsPage = RunsAPI.RunsPage; - Runs.Steps = StepsAPI.Steps; - Runs.RunStepsPage = StepsAPI.RunStepsPage; -})(Runs = exports.Runs || (exports.Runs = {})); -//# sourceMappingURL=runs.js.map - -/***/ }), - -/***/ 2630: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.RunStepsPage = exports.Steps = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -const StepsAPI = __importStar(__nccwpck_require__(2630)); -const pagination_1 = __nccwpck_require__(7401); -class Steps extends resource_1.APIResource { - /** - * Retrieves a run step. - */ - retrieve(threadId, runId, stepId, options) { - return this._client.get(`/threads/${threadId}/runs/${runId}/steps/${stepId}`, { - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - list(threadId, runId, query = {}, options) { - if ((0, core_1.isRequestOptions)(query)) { - return this.list(threadId, runId, {}, query); - } - return this._client.getAPIList(`/threads/${threadId}/runs/${runId}/steps`, RunStepsPage, { - query, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } -} -exports.Steps = Steps; -class RunStepsPage extends pagination_1.CursorPage { -} -exports.RunStepsPage = RunStepsPage; -(function (Steps) { - Steps.RunStepsPage = StepsAPI.RunStepsPage; -})(Steps = exports.Steps || (exports.Steps = {})); -//# sourceMappingURL=steps.js.map - -/***/ }), - -/***/ 1931: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Threads = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -const AssistantStream_1 = __nccwpck_require__(7514); -const MessagesAPI = __importStar(__nccwpck_require__(1787)); -const RunsAPI = __importStar(__nccwpck_require__(3187)); -class Threads extends resource_1.APIResource { - constructor() { - super(...arguments); - this.runs = new RunsAPI.Runs(this._client); - this.messages = new MessagesAPI.Messages(this._client); - } - create(body = {}, options) { - if ((0, core_1.isRequestOptions)(body)) { - return this.create({}, body); - } - return this._client.post('/threads', { - body, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Retrieves a thread. - */ - retrieve(threadId, options) { - return this._client.get(`/threads/${threadId}`, { - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Modifies a thread. - */ - update(threadId, body, options) { - return this._client.post(`/threads/${threadId}`, { - body, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Delete a thread. - */ - del(threadId, options) { - return this._client.delete(`/threads/${threadId}`, { - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - createAndRun(body, options) { - return this._client.post('/threads/runs', { - body, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - stream: body.stream ?? false, - }); - } - /** - * A helper to create a thread, start a run and then poll for a terminal state. - * More information on Run lifecycles can be found here: - * https://platform.openai.com/docs/assistants/how-it-works/runs-and-run-steps - */ - async createAndRunPoll(body, options) { - const run = await this.createAndRun(body, options); - return await this.runs.poll(run.thread_id, run.id, options); - } - /** - * Create a thread and stream the run back - */ - createAndRunStream(body, options) { - return AssistantStream_1.AssistantStream.createThreadAssistantStream(body, this._client.beta.threads, options); - } -} -exports.Threads = Threads; -(function (Threads) { - Threads.Runs = RunsAPI.Runs; - Threads.RunsPage = RunsAPI.RunsPage; - Threads.Messages = MessagesAPI.Messages; - Threads.MessagesPage = MessagesAPI.MessagesPage; -})(Threads = exports.Threads || (exports.Threads = {})); -//# sourceMappingURL=threads.js.map - -/***/ }), - -/***/ 3922: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.VectorStoreFilesPage = exports.FileBatches = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -const core_2 = __nccwpck_require__(1798); -const Util_1 = __nccwpck_require__(2626); -const files_1 = __nccwpck_require__(9180); -Object.defineProperty(exports, "VectorStoreFilesPage", ({ enumerable: true, get: function () { return files_1.VectorStoreFilesPage; } })); -class FileBatches extends resource_1.APIResource { - /** - * Create a vector store file batch. - */ - create(vectorStoreId, body, options) { - return this._client.post(`/vector_stores/${vectorStoreId}/file_batches`, { - body, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Retrieves a vector store file batch. - */ - retrieve(vectorStoreId, batchId, options) { - return this._client.get(`/vector_stores/${vectorStoreId}/file_batches/${batchId}`, { - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Cancel a vector store file batch. This attempts to cancel the processing of - * files in this batch as soon as possible. - */ - cancel(vectorStoreId, batchId, options) { - return this._client.post(`/vector_stores/${vectorStoreId}/file_batches/${batchId}/cancel`, { - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Create a vector store batch and poll until all files have been processed. - */ - async createAndPoll(vectorStoreId, body, options) { - const batch = await this.create(vectorStoreId, body); - return await this.poll(vectorStoreId, batch.id, options); - } - listFiles(vectorStoreId, batchId, query = {}, options) { - if ((0, core_1.isRequestOptions)(query)) { - return this.listFiles(vectorStoreId, batchId, {}, query); - } - return this._client.getAPIList(`/vector_stores/${vectorStoreId}/file_batches/${batchId}/files`, files_1.VectorStoreFilesPage, { query, ...options, headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers } }); - } - /** - * Wait for the given file batch to be processed. - * - * Note: this will return even if one of the files failed to process, you need to - * check batch.file_counts.failed_count to handle this case. - */ - async poll(vectorStoreId, batchId, options) { - const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' }; - if (options?.pollIntervalMs) { - headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString(); - } - while (true) { - const { data: batch, response } = await this.retrieve(vectorStoreId, batchId, { - ...options, - headers, - }).withResponse(); - switch (batch.status) { - case 'in_progress': - let sleepInterval = 5000; - if (options?.pollIntervalMs) { - sleepInterval = options.pollIntervalMs; - } - else { - const headerInterval = response.headers.get('openai-poll-after-ms'); - if (headerInterval) { - const headerIntervalMs = parseInt(headerInterval); - if (!isNaN(headerIntervalMs)) { - sleepInterval = headerIntervalMs; - } - } - } - await (0, core_2.sleep)(sleepInterval); - break; - case 'failed': - case 'completed': - return batch; - } - } - } - /** - * Uploads the given files concurrently and then creates a vector store file batch. - * - * The concurrency limit is configurable using the `maxConcurrency` parameter. - */ - async uploadAndPoll(vectorStoreId, { files, fileIds = [] }, options) { - if (files === null || files.length == 0) { - throw new Error('No files provided to process.'); - } - const configuredConcurrency = options?.maxConcurrency ?? 5; - //We cap the number of workers at the number of files (so we don't start any unnecessary workers) - const concurrencyLimit = Math.min(configuredConcurrency, files.length); - const client = this._client; - const fileIterator = files.values(); - const allFileIds = [...fileIds]; - //This code is based on this design. The libraries don't accommodate our environment limits. - // https://stackoverflow.com/questions/40639432/what-is-the-best-way-to-limit-concurrency-when-using-es6s-promise-all - async function processFiles(iterator) { - for (let item of iterator) { - const fileObj = await client.files.create({ file: item, purpose: 'assistants' }, options); - allFileIds.push(fileObj.id); - } - } - //Start workers to process results - const workers = Array(concurrencyLimit).fill(fileIterator).map(processFiles); - //Wait for all processing to complete. - await (0, Util_1.allSettledWithThrow)(workers); - return await this.createAndPoll(vectorStoreId, { - file_ids: allFileIds, - }); - } -} -exports.FileBatches = FileBatches; -(function (FileBatches) { -})(FileBatches = exports.FileBatches || (exports.FileBatches = {})); -//# sourceMappingURL=file-batches.js.map - -/***/ }), - -/***/ 9180: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.VectorStoreFilesPage = exports.Files = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -const core_2 = __nccwpck_require__(1798); -const FilesAPI = __importStar(__nccwpck_require__(9180)); -const pagination_1 = __nccwpck_require__(7401); -class Files extends resource_1.APIResource { - /** - * Create a vector store file by attaching a - * [File](https://platform.openai.com/docs/api-reference/files) to a - * [vector store](https://platform.openai.com/docs/api-reference/vector-stores/object). - */ - create(vectorStoreId, body, options) { - return this._client.post(`/vector_stores/${vectorStoreId}/files`, { - body, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Retrieves a vector store file. - */ - retrieve(vectorStoreId, fileId, options) { - return this._client.get(`/vector_stores/${vectorStoreId}/files/${fileId}`, { - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - list(vectorStoreId, query = {}, options) { - if ((0, core_1.isRequestOptions)(query)) { - return this.list(vectorStoreId, {}, query); - } - return this._client.getAPIList(`/vector_stores/${vectorStoreId}/files`, VectorStoreFilesPage, { - query, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Delete a vector store file. This will remove the file from the vector store but - * the file itself will not be deleted. To delete the file, use the - * [delete file](https://platform.openai.com/docs/api-reference/files/delete) - * endpoint. - */ - del(vectorStoreId, fileId, options) { - return this._client.delete(`/vector_stores/${vectorStoreId}/files/${fileId}`, { - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Attach a file to the given vector store and wait for it to be processed. - */ - async createAndPoll(vectorStoreId, body, options) { - const file = await this.create(vectorStoreId, body, options); - return await this.poll(vectorStoreId, file.id, options); - } - /** - * Wait for the vector store file to finish processing. - * - * Note: this will return even if the file failed to process, you need to check - * file.last_error and file.status to handle these cases - */ - async poll(vectorStoreId, fileId, options) { - const headers = { ...options?.headers, 'X-Stainless-Poll-Helper': 'true' }; - if (options?.pollIntervalMs) { - headers['X-Stainless-Custom-Poll-Interval'] = options.pollIntervalMs.toString(); - } - while (true) { - const fileResponse = await this.retrieve(vectorStoreId, fileId, { - ...options, - headers, - }).withResponse(); - const file = fileResponse.data; - switch (file.status) { - case 'in_progress': - let sleepInterval = 5000; - if (options?.pollIntervalMs) { - sleepInterval = options.pollIntervalMs; - } - else { - const headerInterval = fileResponse.response.headers.get('openai-poll-after-ms'); - if (headerInterval) { - const headerIntervalMs = parseInt(headerInterval); - if (!isNaN(headerIntervalMs)) { - sleepInterval = headerIntervalMs; - } - } - } - await (0, core_2.sleep)(sleepInterval); - break; - case 'failed': - case 'completed': - return file; - } - } - } - /** - * Upload a file to the `files` API and then attach it to the given vector store. - * Note the file will be asynchronously processed (you can use the alternative - * polling helper method to wait for processing to complete). - */ - async upload(vectorStoreId, file, options) { - const fileInfo = await this._client.files.create({ file: file, purpose: 'assistants' }, options); - return this.create(vectorStoreId, { file_id: fileInfo.id }, options); - } - /** - * Add a file to a vector store and poll until processing is complete. - */ - async uploadAndPoll(vectorStoreId, file, options) { - const fileInfo = await this._client.files.create({ file: file, purpose: 'assistants' }, options); - return await this.poll(vectorStoreId, fileInfo.id, options); - } -} -exports.Files = Files; -class VectorStoreFilesPage extends pagination_1.CursorPage { -} -exports.VectorStoreFilesPage = VectorStoreFilesPage; -(function (Files) { - Files.VectorStoreFilesPage = FilesAPI.VectorStoreFilesPage; -})(Files = exports.Files || (exports.Files = {})); -//# sourceMappingURL=files.js.map - -/***/ }), - -/***/ 5822: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.VectorStoresPage = exports.VectorStores = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -const VectorStoresAPI = __importStar(__nccwpck_require__(5822)); -const FileBatchesAPI = __importStar(__nccwpck_require__(3922)); -const FilesAPI = __importStar(__nccwpck_require__(9180)); -const pagination_1 = __nccwpck_require__(7401); -class VectorStores extends resource_1.APIResource { - constructor() { - super(...arguments); - this.files = new FilesAPI.Files(this._client); - this.fileBatches = new FileBatchesAPI.FileBatches(this._client); - } - /** - * Create a vector store. - */ - create(body, options) { - return this._client.post('/vector_stores', { - body, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Retrieves a vector store. - */ - retrieve(vectorStoreId, options) { - return this._client.get(`/vector_stores/${vectorStoreId}`, { - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Modifies a vector store. - */ - update(vectorStoreId, body, options) { - return this._client.post(`/vector_stores/${vectorStoreId}`, { - body, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - list(query = {}, options) { - if ((0, core_1.isRequestOptions)(query)) { - return this.list({}, query); - } - return this._client.getAPIList('/vector_stores', VectorStoresPage, { - query, - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } - /** - * Delete a vector store. - */ - del(vectorStoreId, options) { - return this._client.delete(`/vector_stores/${vectorStoreId}`, { - ...options, - headers: { 'OpenAI-Beta': 'assistants=v2', ...options?.headers }, - }); - } -} -exports.VectorStores = VectorStores; -class VectorStoresPage extends pagination_1.CursorPage { -} -exports.VectorStoresPage = VectorStoresPage; -(function (VectorStores) { - VectorStores.VectorStoresPage = VectorStoresAPI.VectorStoresPage; - VectorStores.Files = FilesAPI.Files; - VectorStores.VectorStoreFilesPage = FilesAPI.VectorStoreFilesPage; - VectorStores.FileBatches = FileBatchesAPI.FileBatches; -})(VectorStores = exports.VectorStores || (exports.VectorStores = {})); -//# sourceMappingURL=vector-stores.js.map - -/***/ }), - -/***/ 7670: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Chat = void 0; -const resource_1 = __nccwpck_require__(9593); -const CompletionsAPI = __importStar(__nccwpck_require__(2875)); -class Chat extends resource_1.APIResource { - constructor() { - super(...arguments); - this.completions = new CompletionsAPI.Completions(this._client); - } -} -exports.Chat = Chat; -(function (Chat) { - Chat.Completions = CompletionsAPI.Completions; -})(Chat = exports.Chat || (exports.Chat = {})); -//# sourceMappingURL=chat.js.map - -/***/ }), - -/***/ 2875: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Completions = void 0; -const resource_1 = __nccwpck_require__(9593); -class Completions extends resource_1.APIResource { - create(body, options) { - return this._client.post('/chat/completions', { body, ...options, stream: body.stream ?? false }); - } -} -exports.Completions = Completions; -(function (Completions) { -})(Completions = exports.Completions || (exports.Completions = {})); -//# sourceMappingURL=completions.js.map - -/***/ }), - -/***/ 8240: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Chat = exports.Completions = void 0; -var completions_1 = __nccwpck_require__(2875); -Object.defineProperty(exports, "Completions", ({ enumerable: true, get: function () { return completions_1.Completions; } })); -var chat_1 = __nccwpck_require__(7670); -Object.defineProperty(exports, "Chat", ({ enumerable: true, get: function () { return chat_1.Chat; } })); -//# sourceMappingURL=index.js.map - -/***/ }), - -/***/ 9327: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Completions = void 0; -const resource_1 = __nccwpck_require__(9593); -class Completions extends resource_1.APIResource { - create(body, options) { - return this._client.post('/completions', { body, ...options, stream: body.stream ?? false }); - } -} -exports.Completions = Completions; -(function (Completions) { -})(Completions = exports.Completions || (exports.Completions = {})); -//# sourceMappingURL=completions.js.map - -/***/ }), - -/***/ 8064: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Embeddings = void 0; -const resource_1 = __nccwpck_require__(9593); -class Embeddings extends resource_1.APIResource { - /** - * Creates an embedding vector representing the input text. - */ - create(body, options) { - return this._client.post('/embeddings', { body, ...options }); - } -} -exports.Embeddings = Embeddings; -(function (Embeddings) { -})(Embeddings = exports.Embeddings || (exports.Embeddings = {})); -//# sourceMappingURL=embeddings.js.map - -/***/ }), - -/***/ 3873: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.FileObjectsPage = exports.Files = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -const core_2 = __nccwpck_require__(1798); -const error_1 = __nccwpck_require__(8905); -const FilesAPI = __importStar(__nccwpck_require__(3873)); -const core_3 = __nccwpck_require__(1798); -const pagination_1 = __nccwpck_require__(7401); -class Files extends resource_1.APIResource { - /** - * Upload a file that can be used across various endpoints. The size of all the - * files uploaded by one organization can be up to 100 GB. - * - * The size of individual files can be a maximum of 512 MB or 2 million tokens for - * Assistants. See the - * [Assistants Tools guide](https://platform.openai.com/docs/assistants/tools) to - * learn more about the types of files supported. The Fine-tuning API only supports - * `.jsonl` files. - * - * Please [contact us](https://help.openai.com/) if you need to increase these - * storage limits. - */ - create(body, options) { - return this._client.post('/files', (0, core_3.multipartFormRequestOptions)({ body, ...options })); - } - /** - * Returns information about a specific file. - */ - retrieve(fileId, options) { - return this._client.get(`/files/${fileId}`, options); - } - list(query = {}, options) { - if ((0, core_1.isRequestOptions)(query)) { - return this.list({}, query); - } - return this._client.getAPIList('/files', FileObjectsPage, { query, ...options }); - } - /** - * Delete a file. - */ - del(fileId, options) { - return this._client.delete(`/files/${fileId}`, options); - } - /** - * Returns the contents of the specified file. - */ - content(fileId, options) { - return this._client.get(`/files/${fileId}/content`, { ...options, __binaryResponse: true }); - } - /** - * Returns the contents of the specified file. - * - * @deprecated The `.content()` method should be used instead - */ - retrieveContent(fileId, options) { - return this._client.get(`/files/${fileId}/content`, { - ...options, - headers: { Accept: 'application/json', ...options?.headers }, - }); - } - /** - * Waits for the given file to be processed, default timeout is 30 mins. - */ - async waitForProcessing(id, { pollInterval = 5000, maxWait = 30 * 60 * 1000 } = {}) { - const TERMINAL_STATES = new Set(['processed', 'error', 'deleted']); - const start = Date.now(); - let file = await this.retrieve(id); - while (!file.status || !TERMINAL_STATES.has(file.status)) { - await (0, core_2.sleep)(pollInterval); - file = await this.retrieve(id); - if (Date.now() - start > maxWait) { - throw new error_1.APIConnectionTimeoutError({ - message: `Giving up on waiting for file ${id} to finish processing after ${maxWait} milliseconds.`, - }); - } - } - return file; - } -} -exports.Files = Files; -/** - * Note: no pagination actually occurs yet, this is for forwards-compatibility. - */ -class FileObjectsPage extends pagination_1.Page { -} -exports.FileObjectsPage = FileObjectsPage; -(function (Files) { - Files.FileObjectsPage = FilesAPI.FileObjectsPage; -})(Files = exports.Files || (exports.Files = {})); -//# sourceMappingURL=files.js.map - -/***/ }), - -/***/ 1364: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.FineTuning = void 0; -const resource_1 = __nccwpck_require__(9593); -const JobsAPI = __importStar(__nccwpck_require__(816)); -class FineTuning extends resource_1.APIResource { - constructor() { - super(...arguments); - this.jobs = new JobsAPI.Jobs(this._client); - } -} -exports.FineTuning = FineTuning; -(function (FineTuning) { - FineTuning.Jobs = JobsAPI.Jobs; - FineTuning.FineTuningJobsPage = JobsAPI.FineTuningJobsPage; - FineTuning.FineTuningJobEventsPage = JobsAPI.FineTuningJobEventsPage; -})(FineTuning = exports.FineTuning || (exports.FineTuning = {})); -//# sourceMappingURL=fine-tuning.js.map - -/***/ }), - -/***/ 3104: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.FineTuningJobCheckpointsPage = exports.Checkpoints = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -const CheckpointsAPI = __importStar(__nccwpck_require__(3104)); -const pagination_1 = __nccwpck_require__(7401); -class Checkpoints extends resource_1.APIResource { - list(fineTuningJobId, query = {}, options) { - if ((0, core_1.isRequestOptions)(query)) { - return this.list(fineTuningJobId, {}, query); - } - return this._client.getAPIList(`/fine_tuning/jobs/${fineTuningJobId}/checkpoints`, FineTuningJobCheckpointsPage, { query, ...options }); - } -} -exports.Checkpoints = Checkpoints; -class FineTuningJobCheckpointsPage extends pagination_1.CursorPage { -} -exports.FineTuningJobCheckpointsPage = FineTuningJobCheckpointsPage; -(function (Checkpoints) { - Checkpoints.FineTuningJobCheckpointsPage = CheckpointsAPI.FineTuningJobCheckpointsPage; -})(Checkpoints = exports.Checkpoints || (exports.Checkpoints = {})); -//# sourceMappingURL=checkpoints.js.map - -/***/ }), - -/***/ 816: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.FineTuningJobEventsPage = exports.FineTuningJobsPage = exports.Jobs = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -const JobsAPI = __importStar(__nccwpck_require__(816)); -const CheckpointsAPI = __importStar(__nccwpck_require__(3104)); -const pagination_1 = __nccwpck_require__(7401); -class Jobs extends resource_1.APIResource { - constructor() { - super(...arguments); - this.checkpoints = new CheckpointsAPI.Checkpoints(this._client); - } - /** - * Creates a fine-tuning job which begins the process of creating a new model from - * a given dataset. - * - * Response includes details of the enqueued job including job status and the name - * of the fine-tuned models once complete. - * - * [Learn more about fine-tuning](https://platform.openai.com/docs/guides/fine-tuning) - */ - create(body, options) { - return this._client.post('/fine_tuning/jobs', { body, ...options }); - } - /** - * Get info about a fine-tuning job. - * - * [Learn more about fine-tuning](https://platform.openai.com/docs/guides/fine-tuning) - */ - retrieve(fineTuningJobId, options) { - return this._client.get(`/fine_tuning/jobs/${fineTuningJobId}`, options); - } - list(query = {}, options) { - if ((0, core_1.isRequestOptions)(query)) { - return this.list({}, query); - } - return this._client.getAPIList('/fine_tuning/jobs', FineTuningJobsPage, { query, ...options }); - } - /** - * Immediately cancel a fine-tune job. - */ - cancel(fineTuningJobId, options) { - return this._client.post(`/fine_tuning/jobs/${fineTuningJobId}/cancel`, options); - } - listEvents(fineTuningJobId, query = {}, options) { - if ((0, core_1.isRequestOptions)(query)) { - return this.listEvents(fineTuningJobId, {}, query); - } - return this._client.getAPIList(`/fine_tuning/jobs/${fineTuningJobId}/events`, FineTuningJobEventsPage, { - query, - ...options, - }); - } -} -exports.Jobs = Jobs; -class FineTuningJobsPage extends pagination_1.CursorPage { -} -exports.FineTuningJobsPage = FineTuningJobsPage; -class FineTuningJobEventsPage extends pagination_1.CursorPage { -} -exports.FineTuningJobEventsPage = FineTuningJobEventsPage; -(function (Jobs) { - Jobs.FineTuningJobsPage = JobsAPI.FineTuningJobsPage; - Jobs.FineTuningJobEventsPage = JobsAPI.FineTuningJobEventsPage; - Jobs.Checkpoints = CheckpointsAPI.Checkpoints; - Jobs.FineTuningJobCheckpointsPage = CheckpointsAPI.FineTuningJobCheckpointsPage; -})(Jobs = exports.Jobs || (exports.Jobs = {})); -//# sourceMappingURL=jobs.js.map - -/***/ }), - -/***/ 2621: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Images = void 0; -const resource_1 = __nccwpck_require__(9593); -const core_1 = __nccwpck_require__(1798); -class Images extends resource_1.APIResource { - /** - * Creates a variation of a given image. - */ - createVariation(body, options) { - return this._client.post('/images/variations', (0, core_1.multipartFormRequestOptions)({ body, ...options })); - } - /** - * Creates an edited or extended image given an original image and a prompt. - */ - edit(body, options) { - return this._client.post('/images/edits', (0, core_1.multipartFormRequestOptions)({ body, ...options })); - } - /** - * Creates an image given a prompt. - */ - generate(body, options) { - return this._client.post('/images/generations', { body, ...options }); - } -} -exports.Images = Images; -(function (Images) { -})(Images = exports.Images || (exports.Images = {})); -//# sourceMappingURL=images.js.map - -/***/ }), - -/***/ 5690: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __exportStar = (this && this.__exportStar) || function(m, exports) { - for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Moderations = exports.Models = exports.ModelsPage = exports.Images = exports.FineTuning = exports.Files = exports.FileObjectsPage = exports.Embeddings = exports.Completions = exports.Beta = exports.Batches = exports.BatchesPage = exports.Audio = void 0; -__exportStar(__nccwpck_require__(8240), exports); -__exportStar(__nccwpck_require__(4866), exports); -var audio_1 = __nccwpck_require__(6376); -Object.defineProperty(exports, "Audio", ({ enumerable: true, get: function () { return audio_1.Audio; } })); -var batches_1 = __nccwpck_require__(341); -Object.defineProperty(exports, "BatchesPage", ({ enumerable: true, get: function () { return batches_1.BatchesPage; } })); -Object.defineProperty(exports, "Batches", ({ enumerable: true, get: function () { return batches_1.Batches; } })); -var beta_1 = __nccwpck_require__(853); -Object.defineProperty(exports, "Beta", ({ enumerable: true, get: function () { return beta_1.Beta; } })); -var completions_1 = __nccwpck_require__(9327); -Object.defineProperty(exports, "Completions", ({ enumerable: true, get: function () { return completions_1.Completions; } })); -var embeddings_1 = __nccwpck_require__(8064); -Object.defineProperty(exports, "Embeddings", ({ enumerable: true, get: function () { return embeddings_1.Embeddings; } })); -var files_1 = __nccwpck_require__(3873); -Object.defineProperty(exports, "FileObjectsPage", ({ enumerable: true, get: function () { return files_1.FileObjectsPage; } })); -Object.defineProperty(exports, "Files", ({ enumerable: true, get: function () { return files_1.Files; } })); -var fine_tuning_1 = __nccwpck_require__(1364); -Object.defineProperty(exports, "FineTuning", ({ enumerable: true, get: function () { return fine_tuning_1.FineTuning; } })); -var images_1 = __nccwpck_require__(2621); -Object.defineProperty(exports, "Images", ({ enumerable: true, get: function () { return images_1.Images; } })); -var models_1 = __nccwpck_require__(6467); -Object.defineProperty(exports, "ModelsPage", ({ enumerable: true, get: function () { return models_1.ModelsPage; } })); -Object.defineProperty(exports, "Models", ({ enumerable: true, get: function () { return models_1.Models; } })); -var moderations_1 = __nccwpck_require__(2085); -Object.defineProperty(exports, "Moderations", ({ enumerable: true, get: function () { return moderations_1.Moderations; } })); -//# sourceMappingURL=index.js.map - -/***/ }), - -/***/ 6467: -/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.ModelsPage = exports.Models = void 0; -const resource_1 = __nccwpck_require__(9593); -const ModelsAPI = __importStar(__nccwpck_require__(6467)); -const pagination_1 = __nccwpck_require__(7401); -class Models extends resource_1.APIResource { - /** - * Retrieves a model instance, providing basic information about the model such as - * the owner and permissioning. - */ - retrieve(model, options) { - return this._client.get(`/models/${model}`, options); - } - /** - * Lists the currently available models, and provides basic information about each - * one such as the owner and availability. - */ - list(options) { - return this._client.getAPIList('/models', ModelsPage, options); - } - /** - * Delete a fine-tuned model. You must have the Owner role in your organization to - * delete a model. - */ - del(model, options) { - return this._client.delete(`/models/${model}`, options); - } -} -exports.Models = Models; -/** - * Note: no pagination actually occurs yet, this is for forwards-compatibility. - */ -class ModelsPage extends pagination_1.Page { -} -exports.ModelsPage = ModelsPage; -(function (Models) { - Models.ModelsPage = ModelsAPI.ModelsPage; -})(Models = exports.Models || (exports.Models = {})); -//# sourceMappingURL=models.js.map - -/***/ }), - -/***/ 2085: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.Moderations = void 0; -const resource_1 = __nccwpck_require__(9593); -class Moderations extends resource_1.APIResource { - /** - * Classifies if text is potentially harmful. - */ - create(body, options) { - return this._client.post('/moderations', { body, ...options }); - } -} -exports.Moderations = Moderations; -(function (Moderations) { -})(Moderations = exports.Moderations || (exports.Moderations = {})); -//# sourceMappingURL=moderations.js.map - -/***/ }), - -/***/ 4866: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details. -Object.defineProperty(exports, "__esModule", ({ value: true })); -//# sourceMappingURL=shared.js.map - -/***/ }), - -/***/ 884: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.readableStreamAsyncIterable = exports._decodeChunks = exports._iterSSEMessages = exports.Stream = void 0; -const index_1 = __nccwpck_require__(6678); -const error_1 = __nccwpck_require__(8905); -const error_2 = __nccwpck_require__(8905); -class Stream { - constructor(iterator, controller) { - this.iterator = iterator; - this.controller = controller; - } - static fromSSEResponse(response, controller) { - let consumed = false; - async function* iterator() { - if (consumed) { - throw new Error('Cannot iterate over a consumed stream, use `.tee()` to split the stream.'); - } - consumed = true; - let done = false; - try { - for await (const sse of _iterSSEMessages(response, controller)) { - if (done) - continue; - if (sse.data.startsWith('[DONE]')) { - done = true; - continue; - } - if (sse.event === null) { - let data; - try { - data = JSON.parse(sse.data); - } - catch (e) { - console.error(`Could not parse message into JSON:`, sse.data); - console.error(`From chunk:`, sse.raw); - throw e; - } - if (data && data.error) { - throw new error_2.APIError(undefined, data.error, undefined, undefined); - } - yield data; - } - else { - let data; - try { - data = JSON.parse(sse.data); - } - catch (e) { - console.error(`Could not parse message into JSON:`, sse.data); - console.error(`From chunk:`, sse.raw); - throw e; - } - // TODO: Is this where the error should be thrown? - if (sse.event == 'error') { - throw new error_2.APIError(undefined, data.error, data.message, undefined); - } - yield { event: sse.event, data: data }; - } - } - done = true; - } - catch (e) { - // If the user calls `stream.controller.abort()`, we should exit without throwing. - if (e instanceof Error && e.name === 'AbortError') - return; - throw e; - } - finally { - // If the user `break`s, abort the ongoing request. - if (!done) - controller.abort(); - } - } - return new Stream(iterator, controller); - } - /** - * Generates a Stream from a newline-separated ReadableStream - * where each item is a JSON value. - */ - static fromReadableStream(readableStream, controller) { - let consumed = false; - async function* iterLines() { - const lineDecoder = new LineDecoder(); - const iter = readableStreamAsyncIterable(readableStream); - for await (const chunk of iter) { - for (const line of lineDecoder.decode(chunk)) { - yield line; - } - } - for (const line of lineDecoder.flush()) { - yield line; - } - } - async function* iterator() { - if (consumed) { - throw new Error('Cannot iterate over a consumed stream, use `.tee()` to split the stream.'); - } - consumed = true; - let done = false; - try { - for await (const line of iterLines()) { - if (done) - continue; - if (line) - yield JSON.parse(line); - } - done = true; - } - catch (e) { - // If the user calls `stream.controller.abort()`, we should exit without throwing. - if (e instanceof Error && e.name === 'AbortError') - return; - throw e; - } - finally { - // If the user `break`s, abort the ongoing request. - if (!done) - controller.abort(); - } - } - return new Stream(iterator, controller); - } - [Symbol.asyncIterator]() { - return this.iterator(); - } - /** - * Splits the stream into two streams which can be - * independently read from at different speeds. - */ - tee() { - const left = []; - const right = []; - const iterator = this.iterator(); - const teeIterator = (queue) => { - return { - next: () => { - if (queue.length === 0) { - const result = iterator.next(); - left.push(result); - right.push(result); - } - return queue.shift(); - }, - }; - }; - return [ - new Stream(() => teeIterator(left), this.controller), - new Stream(() => teeIterator(right), this.controller), - ]; - } - /** - * Converts this stream to a newline-separated ReadableStream of - * JSON stringified values in the stream - * which can be turned back into a Stream with `Stream.fromReadableStream()`. - */ - toReadableStream() { - const self = this; - let iter; - const encoder = new TextEncoder(); - return new index_1.ReadableStream({ - async start() { - iter = self[Symbol.asyncIterator](); - }, - async pull(ctrl) { - try { - const { value, done } = await iter.next(); - if (done) - return ctrl.close(); - const bytes = encoder.encode(JSON.stringify(value) + '\n'); - ctrl.enqueue(bytes); - } - catch (err) { - ctrl.error(err); - } - }, - async cancel() { - await iter.return?.(); - }, - }); - } -} -exports.Stream = Stream; -async function* _iterSSEMessages(response, controller) { - if (!response.body) { - controller.abort(); - throw new error_1.OpenAIError(`Attempted to iterate over a response with no body`); - } - const sseDecoder = new SSEDecoder(); - const lineDecoder = new LineDecoder(); - const iter = readableStreamAsyncIterable(response.body); - for await (const sseChunk of iterSSEChunks(iter)) { - for (const line of lineDecoder.decode(sseChunk)) { - const sse = sseDecoder.decode(line); - if (sse) - yield sse; - } - } - for (const line of lineDecoder.flush()) { - const sse = sseDecoder.decode(line); - if (sse) - yield sse; - } -} -exports._iterSSEMessages = _iterSSEMessages; -/** - * Given an async iterable iterator, iterates over it and yields full - * SSE chunks, i.e. yields when a double new-line is encountered. - */ -async function* iterSSEChunks(iterator) { - let data = new Uint8Array(); - for await (const chunk of iterator) { - if (chunk == null) { - continue; - } - const binaryChunk = chunk instanceof ArrayBuffer ? new Uint8Array(chunk) - : typeof chunk === 'string' ? new TextEncoder().encode(chunk) - : chunk; - let newData = new Uint8Array(data.length + binaryChunk.length); - newData.set(data); - newData.set(binaryChunk, data.length); - data = newData; - let patternIndex; - while ((patternIndex = findDoubleNewlineIndex(data)) !== -1) { - yield data.slice(0, patternIndex); - data = data.slice(patternIndex); - } - } - if (data.length > 0) { - yield data; - } -} -function findDoubleNewlineIndex(buffer) { - // This function searches the buffer for the end patterns (\r\r, \n\n, \r\n\r\n) - // and returns the index right after the first occurrence of any pattern, - // or -1 if none of the patterns are found. - const newline = 0x0a; // \n - const carriage = 0x0d; // \r - for (let i = 0; i < buffer.length - 2; i++) { - if (buffer[i] === newline && buffer[i + 1] === newline) { - // \n\n - return i + 2; - } - if (buffer[i] === carriage && buffer[i + 1] === carriage) { - // \r\r - return i + 2; - } - if (buffer[i] === carriage && - buffer[i + 1] === newline && - i + 3 < buffer.length && - buffer[i + 2] === carriage && - buffer[i + 3] === newline) { - // \r\n\r\n - return i + 4; - } - } - return -1; -} -class SSEDecoder { - constructor() { - this.event = null; - this.data = []; - this.chunks = []; - } - decode(line) { - if (line.endsWith('\r')) { - line = line.substring(0, line.length - 1); - } - if (!line) { - // empty line and we didn't previously encounter any messages - if (!this.event && !this.data.length) - return null; - const sse = { - event: this.event, - data: this.data.join('\n'), - raw: this.chunks, - }; - this.event = null; - this.data = []; - this.chunks = []; - return sse; - } - this.chunks.push(line); - if (line.startsWith(':')) { - return null; - } - let [fieldname, _, value] = partition(line, ':'); - if (value.startsWith(' ')) { - value = value.substring(1); - } - if (fieldname === 'event') { - this.event = value; - } - else if (fieldname === 'data') { - this.data.push(value); - } - return null; - } -} -/** - * A re-implementation of httpx's `LineDecoder` in Python that handles incrementally - * reading lines from text. - * - * https://github.com/encode/httpx/blob/920333ea98118e9cf617f246905d7b202510941c/httpx/_decoders.py#L258 - */ -class LineDecoder { - constructor() { - this.buffer = []; - this.trailingCR = false; - } - decode(chunk) { - let text = this.decodeText(chunk); - if (this.trailingCR) { - text = '\r' + text; - this.trailingCR = false; - } - if (text.endsWith('\r')) { - this.trailingCR = true; - text = text.slice(0, -1); - } - if (!text) { - return []; - } - const trailingNewline = LineDecoder.NEWLINE_CHARS.has(text[text.length - 1] || ''); - let lines = text.split(LineDecoder.NEWLINE_REGEXP); - // if there is a trailing new line then the last entry will be an empty - // string which we don't care about - if (trailingNewline) { - lines.pop(); - } - if (lines.length === 1 && !trailingNewline) { - this.buffer.push(lines[0]); - return []; - } - if (this.buffer.length > 0) { - lines = [this.buffer.join('') + lines[0], ...lines.slice(1)]; - this.buffer = []; - } - if (!trailingNewline) { - this.buffer = [lines.pop() || '']; - } - return lines; - } - decodeText(bytes) { - if (bytes == null) - return ''; - if (typeof bytes === 'string') - return bytes; - // Node: - if (typeof Buffer !== 'undefined') { - if (bytes instanceof Buffer) { - return bytes.toString(); - } - if (bytes instanceof Uint8Array) { - return Buffer.from(bytes).toString(); - } - throw new error_1.OpenAIError(`Unexpected: received non-Uint8Array (${bytes.constructor.name}) stream chunk in an environment with a global "Buffer" defined, which this library assumes to be Node. Please report this error.`); - } - // Browser - if (typeof TextDecoder !== 'undefined') { - if (bytes instanceof Uint8Array || bytes instanceof ArrayBuffer) { - this.textDecoder ?? (this.textDecoder = new TextDecoder('utf8')); - return this.textDecoder.decode(bytes); - } - throw new error_1.OpenAIError(`Unexpected: received non-Uint8Array/ArrayBuffer (${bytes.constructor.name}) in a web platform. Please report this error.`); - } - throw new error_1.OpenAIError(`Unexpected: neither Buffer nor TextDecoder are available as globals. Please report this error.`); - } - flush() { - if (!this.buffer.length && !this.trailingCR) { - return []; - } - const lines = [this.buffer.join('')]; - this.buffer = []; - this.trailingCR = false; - return lines; - } -} -// prettier-ignore -LineDecoder.NEWLINE_CHARS = new Set(['\n', '\r']); -LineDecoder.NEWLINE_REGEXP = /\r\n|[\n\r]/g; -/** This is an internal helper function that's just used for testing */ -function _decodeChunks(chunks) { - const decoder = new LineDecoder(); - const lines = []; - for (const chunk of chunks) { - lines.push(...decoder.decode(chunk)); - } - return lines; -} -exports._decodeChunks = _decodeChunks; -function partition(str, delimiter) { - const index = str.indexOf(delimiter); - if (index !== -1) { - return [str.substring(0, index), delimiter, str.substring(index + delimiter.length)]; - } - return [str, '', '']; -} -/** - * Most browsers don't yet have async iterable support for ReadableStream, - * and Node has a very different way of reading bytes from its "ReadableStream". - * - * This polyfill was pulled from https://github.com/MattiasBuelens/web-streams-polyfill/pull/122#issuecomment-1627354490 - */ -function readableStreamAsyncIterable(stream) { - if (stream[Symbol.asyncIterator]) - return stream; - const reader = stream.getReader(); - return { - async next() { - try { - const result = await reader.read(); - if (result?.done) - reader.releaseLock(); // release lock when stream becomes closed - return result; - } - catch (e) { - reader.releaseLock(); // release lock when stream becomes errored - throw e; - } - }, - async return() { - const cancelPromise = reader.cancel(); - reader.releaseLock(); - await cancelPromise; - return { done: true, value: undefined }; - }, - [Symbol.asyncIterator]() { - return this; - }, - }; -} -exports.readableStreamAsyncIterable = readableStreamAsyncIterable; -//# sourceMappingURL=streaming.js.map - -/***/ }), - -/***/ 3394: -/***/ ((__unused_webpack_module, exports, __nccwpck_require__) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.createForm = exports.multipartFormRequestOptions = exports.maybeMultipartFormRequestOptions = exports.isMultipartBody = exports.toFile = exports.isUploadable = exports.isBlobLike = exports.isFileLike = exports.isResponseLike = exports.fileFromPath = void 0; -const index_1 = __nccwpck_require__(6678); -var index_2 = __nccwpck_require__(6678); -Object.defineProperty(exports, "fileFromPath", ({ enumerable: true, get: function () { return index_2.fileFromPath; } })); -const isResponseLike = (value) => value != null && - typeof value === 'object' && - typeof value.url === 'string' && - typeof value.blob === 'function'; -exports.isResponseLike = isResponseLike; -const isFileLike = (value) => value != null && - typeof value === 'object' && - typeof value.name === 'string' && - typeof value.lastModified === 'number' && - (0, exports.isBlobLike)(value); -exports.isFileLike = isFileLike; -/** - * The BlobLike type omits arrayBuffer() because @types/node-fetch@^2.6.4 lacks it; but this check - * adds the arrayBuffer() method type because it is available and used at runtime - */ -const isBlobLike = (value) => value != null && - typeof value === 'object' && - typeof value.size === 'number' && - typeof value.type === 'string' && - typeof value.text === 'function' && - typeof value.slice === 'function' && - typeof value.arrayBuffer === 'function'; -exports.isBlobLike = isBlobLike; -const isUploadable = (value) => { - return (0, exports.isFileLike)(value) || (0, exports.isResponseLike)(value) || (0, index_1.isFsReadStream)(value); -}; -exports.isUploadable = isUploadable; -/** - * Helper for creating a {@link File} to pass to an SDK upload method from a variety of different data formats - * @param value the raw content of the file. Can be an {@link Uploadable}, {@link BlobLikePart}, or {@link AsyncIterable} of {@link BlobLikePart}s - * @param {string=} name the name of the file. If omitted, toFile will try to determine a file name from bits if possible - * @param {Object=} options additional properties - * @param {string=} options.type the MIME type of the content - * @param {number=} options.lastModified the last modified timestamp - * @returns a {@link File} with the given properties - */ -async function toFile(value, name, options) { - // If it's a promise, resolve it. - value = await value; - // Use the file's options if there isn't one provided - options ?? (options = (0, exports.isFileLike)(value) ? { lastModified: value.lastModified, type: value.type } : {}); - if ((0, exports.isResponseLike)(value)) { - const blob = await value.blob(); - name || (name = new URL(value.url).pathname.split(/[\\/]/).pop() ?? 'unknown_file'); - return new index_1.File([blob], name, options); - } - const bits = await getBytes(value); - name || (name = getName(value) ?? 'unknown_file'); - if (!options.type) { - const type = bits[0]?.type; - if (typeof type === 'string') { - options = { ...options, type }; - } - } - return new index_1.File(bits, name, options); -} -exports.toFile = toFile; -async function getBytes(value) { - let parts = []; - if (typeof value === 'string' || - ArrayBuffer.isView(value) || // includes Uint8Array, Buffer, etc. - value instanceof ArrayBuffer) { - parts.push(value); - } - else if ((0, exports.isBlobLike)(value)) { - parts.push(await value.arrayBuffer()); - } - else if (isAsyncIterableIterator(value) // includes Readable, ReadableStream, etc. - ) { - for await (const chunk of value) { - parts.push(chunk); // TODO, consider validating? - } - } - else { - throw new Error(`Unexpected data type: ${typeof value}; constructor: ${value?.constructor - ?.name}; props: ${propsForError(value)}`); - } - return parts; -} -function propsForError(value) { - const props = Object.getOwnPropertyNames(value); - return `[${props.map((p) => `"${p}"`).join(', ')}]`; -} -function getName(value) { - return (getStringFromMaybeBuffer(value.name) || - getStringFromMaybeBuffer(value.filename) || - // For fs.ReadStream - getStringFromMaybeBuffer(value.path)?.split(/[\\/]/).pop()); -} -const getStringFromMaybeBuffer = (x) => { - if (typeof x === 'string') - return x; - if (typeof Buffer !== 'undefined' && x instanceof Buffer) - return String(x); - return undefined; -}; -const isAsyncIterableIterator = (value) => value != null && typeof value === 'object' && typeof value[Symbol.asyncIterator] === 'function'; -const isMultipartBody = (body) => body && typeof body === 'object' && body.body && body[Symbol.toStringTag] === 'MultipartBody'; -exports.isMultipartBody = isMultipartBody; -/** - * Returns a multipart/form-data request if any part of the given request body contains a File / Blob value. - * Otherwise returns the request as is. - */ -const maybeMultipartFormRequestOptions = async (opts) => { - if (!hasUploadableValue(opts.body)) - return opts; - const form = await (0, exports.createForm)(opts.body); - return (0, index_1.getMultipartRequestOptions)(form, opts); -}; -exports.maybeMultipartFormRequestOptions = maybeMultipartFormRequestOptions; -const multipartFormRequestOptions = async (opts) => { - const form = await (0, exports.createForm)(opts.body); - return (0, index_1.getMultipartRequestOptions)(form, opts); -}; -exports.multipartFormRequestOptions = multipartFormRequestOptions; -const createForm = async (body) => { - const form = new index_1.FormData(); - await Promise.all(Object.entries(body || {}).map(([key, value]) => addFormValue(form, key, value))); - return form; -}; -exports.createForm = createForm; -const hasUploadableValue = (value) => { - if ((0, exports.isUploadable)(value)) - return true; - if (Array.isArray(value)) - return value.some(hasUploadableValue); - if (value && typeof value === 'object') { - for (const k in value) { - if (hasUploadableValue(value[k])) - return true; - } - } - return false; -}; -const addFormValue = async (form, key, value) => { - if (value === undefined) - return; - if (value == null) { - throw new TypeError(`Received null for "${key}"; to pass null in FormData, you must use the string 'null'`); - } - // TODO: make nested formats configurable - if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { - form.append(key, String(value)); - } - else if ((0, exports.isUploadable)(value)) { - const file = await toFile(value); - form.append(key, file); - } - else if (Array.isArray(value)) { - await Promise.all(value.map((entry) => addFormValue(form, key + '[]', entry))); - } - else if (typeof value === 'object') { - await Promise.all(Object.entries(value).map(([name, prop]) => addFormValue(form, `${key}[${name}]`, prop))); - } - else { - throw new TypeError(`Invalid value given to form, expected a string, number, boolean, object, Array, File or Blob but got ${value} instead`); - } -}; -//# sourceMappingURL=uploads.js.map - -/***/ }), - -/***/ 6417: -/***/ ((__unused_webpack_module, exports) => { - -"use strict"; - -Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.VERSION = void 0; -exports.VERSION = '4.38.5'; // x-release-please-version -//# sourceMappingURL=version.js.map - -/***/ }), - -/***/ 1907: -/***/ ((module) => { - -"use strict"; -module.exports = JSON.parse('[[[0,44],"disallowed_STD3_valid"],[[45,46],"valid"],[[47,47],"disallowed_STD3_valid"],[[48,57],"valid"],[[58,64],"disallowed_STD3_valid"],[[65,65],"mapped",[97]],[[66,66],"mapped",[98]],[[67,67],"mapped",[99]],[[68,68],"mapped",[100]],[[69,69],"mapped",[101]],[[70,70],"mapped",[102]],[[71,71],"mapped",[103]],[[72,72],"mapped",[104]],[[73,73],"mapped",[105]],[[74,74],"mapped",[106]],[[75,75],"mapped",[107]],[[76,76],"mapped",[108]],[[77,77],"mapped",[109]],[[78,78],"mapped",[110]],[[79,79],"mapped",[111]],[[80,80],"mapped",[112]],[[81,81],"mapped",[113]],[[82,82],"mapped",[114]],[[83,83],"mapped",[115]],[[84,84],"mapped",[116]],[[85,85],"mapped",[117]],[[86,86],"mapped",[118]],[[87,87],"mapped",[119]],[[88,88],"mapped",[120]],[[89,89],"mapped",[121]],[[90,90],"mapped",[122]],[[91,96],"disallowed_STD3_valid"],[[97,122],"valid"],[[123,127],"disallowed_STD3_valid"],[[128,159],"disallowed"],[[160,160],"disallowed_STD3_mapped",[32]],[[161,167],"valid",[],"NV8"],[[168,168],"disallowed_STD3_mapped",[32,776]],[[169,169],"valid",[],"NV8"],[[170,170],"mapped",[97]],[[171,172],"valid",[],"NV8"],[[173,173],"ignored"],[[174,174],"valid",[],"NV8"],[[175,175],"disallowed_STD3_mapped",[32,772]],[[176,177],"valid",[],"NV8"],[[178,178],"mapped",[50]],[[179,179],"mapped",[51]],[[180,180],"disallowed_STD3_mapped",[32,769]],[[181,181],"mapped",[956]],[[182,182],"valid",[],"NV8"],[[183,183],"valid"],[[184,184],"disallowed_STD3_mapped",[32,807]],[[185,185],"mapped",[49]],[[186,186],"mapped",[111]],[[187,187],"valid",[],"NV8"],[[188,188],"mapped",[49,8260,52]],[[189,189],"mapped",[49,8260,50]],[[190,190],"mapped",[51,8260,52]],[[191,191],"valid",[],"NV8"],[[192,192],"mapped",[224]],[[193,193],"mapped",[225]],[[194,194],"mapped",[226]],[[195,195],"mapped",[227]],[[196,196],"mapped",[228]],[[197,197],"mapped",[229]],[[198,198],"mapped",[230]],[[199,199],"mapped",[231]],[[200,200],"mapped",[232]],[[201,201],"mapped",[233]],[[202,202],"mapped",[234]],[[203,203],"mapped",[235]],[[204,204],"mapped",[236]],[[205,205],"mapped",[237]],[[206,206],"mapped",[238]],[[207,207],"mapped",[239]],[[208,208],"mapped",[240]],[[209,209],"mapped",[241]],[[210,210],"mapped",[242]],[[211,211],"mapped",[243]],[[212,212],"mapped",[244]],[[213,213],"mapped",[245]],[[214,214],"mapped",[246]],[[215,215],"valid",[],"NV8"],[[216,216],"mapped",[248]],[[217,217],"mapped",[249]],[[218,218],"mapped",[250]],[[219,219],"mapped",[251]],[[220,220],"mapped",[252]],[[221,221],"mapped",[253]],[[222,222],"mapped",[254]],[[223,223],"deviation",[115,115]],[[224,246],"valid"],[[247,247],"valid",[],"NV8"],[[248,255],"valid"],[[256,256],"mapped",[257]],[[257,257],"valid"],[[258,258],"mapped",[259]],[[259,259],"valid"],[[260,260],"mapped",[261]],[[261,261],"valid"],[[262,262],"mapped",[263]],[[263,263],"valid"],[[264,264],"mapped",[265]],[[265,265],"valid"],[[266,266],"mapped",[267]],[[267,267],"valid"],[[268,268],"mapped",[269]],[[269,269],"valid"],[[270,270],"mapped",[271]],[[271,271],"valid"],[[272,272],"mapped",[273]],[[273,273],"valid"],[[274,274],"mapped",[275]],[[275,275],"valid"],[[276,276],"mapped",[277]],[[277,277],"valid"],[[278,278],"mapped",[279]],[[279,279],"valid"],[[280,280],"mapped",[281]],[[281,281],"valid"],[[282,282],"mapped",[283]],[[283,283],"valid"],[[284,284],"mapped",[285]],[[285,285],"valid"],[[286,286],"mapped",[287]],[[287,287],"valid"],[[288,288],"mapped",[289]],[[289,289],"valid"],[[290,290],"mapped",[291]],[[291,291],"valid"],[[292,292],"mapped",[293]],[[293,293],"valid"],[[294,294],"mapped",[295]],[[295,295],"valid"],[[296,296],"mapped",[297]],[[297,297],"valid"],[[298,298],"mapped",[299]],[[299,299],"valid"],[[300,300],"mapped",[301]],[[301,301],"valid"],[[302,302],"mapped",[303]],[[303,303],"valid"],[[304,304],"mapped",[105,775]],[[305,305],"valid"],[[306,307],"mapped",[105,106]],[[308,308],"mapped",[309]],[[309,309],"valid"],[[310,310],"mapped",[311]],[[311,312],"valid"],[[313,313],"mapped",[314]],[[314,314],"valid"],[[315,315],"mapped",[316]],[[316,316],"valid"],[[317,317],"mapped",[318]],[[318,318],"valid"],[[319,320],"mapped",[108,183]],[[321,321],"mapped",[322]],[[322,322],"valid"],[[323,323],"mapped",[324]],[[324,324],"valid"],[[325,325],"mapped",[326]],[[326,326],"valid"],[[327,327],"mapped",[328]],[[328,328],"valid"],[[329,329],"mapped",[700,110]],[[330,330],"mapped",[331]],[[331,331],"valid"],[[332,332],"mapped",[333]],[[333,333],"valid"],[[334,334],"mapped",[335]],[[335,335],"valid"],[[336,336],"mapped",[337]],[[337,337],"valid"],[[338,338],"mapped",[339]],[[339,339],"valid"],[[340,340],"mapped",[341]],[[341,341],"valid"],[[342,342],"mapped",[343]],[[343,343],"valid"],[[344,344],"mapped",[345]],[[345,345],"valid"],[[346,346],"mapped",[347]],[[347,347],"valid"],[[348,348],"mapped",[349]],[[349,349],"valid"],[[350,350],"mapped",[351]],[[351,351],"valid"],[[352,352],"mapped",[353]],[[353,353],"valid"],[[354,354],"mapped",[355]],[[355,355],"valid"],[[356,356],"mapped",[357]],[[357,357],"valid"],[[358,358],"mapped",[359]],[[359,359],"valid"],[[360,360],"mapped",[361]],[[361,361],"valid"],[[362,362],"mapped",[363]],[[363,363],"valid"],[[364,364],"mapped",[365]],[[365,365],"valid"],[[366,366],"mapped",[367]],[[367,367],"valid"],[[368,368],"mapped",[369]],[[369,369],"valid"],[[370,370],"mapped",[371]],[[371,371],"valid"],[[372,372],"mapped",[373]],[[373,373],"valid"],[[374,374],"mapped",[375]],[[375,375],"valid"],[[376,376],"mapped",[255]],[[377,377],"mapped",[378]],[[378,378],"valid"],[[379,379],"mapped",[380]],[[380,380],"valid"],[[381,381],"mapped",[382]],[[382,382],"valid"],[[383,383],"mapped",[115]],[[384,384],"valid"],[[385,385],"mapped",[595]],[[386,386],"mapped",[387]],[[387,387],"valid"],[[388,388],"mapped",[389]],[[389,389],"valid"],[[390,390],"mapped",[596]],[[391,391],"mapped",[392]],[[392,392],"valid"],[[393,393],"mapped",[598]],[[394,394],"mapped",[599]],[[395,395],"mapped",[396]],[[396,397],"valid"],[[398,398],"mapped",[477]],[[399,399],"mapped",[601]],[[400,400],"mapped",[603]],[[401,401],"mapped",[402]],[[402,402],"valid"],[[403,403],"mapped",[608]],[[404,404],"mapped",[611]],[[405,405],"valid"],[[406,406],"mapped",[617]],[[407,407],"mapped",[616]],[[408,408],"mapped",[409]],[[409,411],"valid"],[[412,412],"mapped",[623]],[[413,413],"mapped",[626]],[[414,414],"valid"],[[415,415],"mapped",[629]],[[416,416],"mapped",[417]],[[417,417],"valid"],[[418,418],"mapped",[419]],[[419,419],"valid"],[[420,420],"mapped",[421]],[[421,421],"valid"],[[422,422],"mapped",[640]],[[423,423],"mapped",[424]],[[424,424],"valid"],[[425,425],"mapped",[643]],[[426,427],"valid"],[[428,428],"mapped",[429]],[[429,429],"valid"],[[430,430],"mapped",[648]],[[431,431],"mapped",[432]],[[432,432],"valid"],[[433,433],"mapped",[650]],[[434,434],"mapped",[651]],[[435,435],"mapped",[436]],[[436,436],"valid"],[[437,437],"mapped",[438]],[[438,438],"valid"],[[439,439],"mapped",[658]],[[440,440],"mapped",[441]],[[441,443],"valid"],[[444,444],"mapped",[445]],[[445,451],"valid"],[[452,454],"mapped",[100,382]],[[455,457],"mapped",[108,106]],[[458,460],"mapped",[110,106]],[[461,461],"mapped",[462]],[[462,462],"valid"],[[463,463],"mapped",[464]],[[464,464],"valid"],[[465,465],"mapped",[466]],[[466,466],"valid"],[[467,467],"mapped",[468]],[[468,468],"valid"],[[469,469],"mapped",[470]],[[470,470],"valid"],[[471,471],"mapped",[472]],[[472,472],"valid"],[[473,473],"mapped",[474]],[[474,474],"valid"],[[475,475],"mapped",[476]],[[476,477],"valid"],[[478,478],"mapped",[479]],[[479,479],"valid"],[[480,480],"mapped",[481]],[[481,481],"valid"],[[482,482],"mapped",[483]],[[483,483],"valid"],[[484,484],"mapped",[485]],[[485,485],"valid"],[[486,486],"mapped",[487]],[[487,487],"valid"],[[488,488],"mapped",[489]],[[489,489],"valid"],[[490,490],"mapped",[491]],[[491,491],"valid"],[[492,492],"mapped",[493]],[[493,493],"valid"],[[494,494],"mapped",[495]],[[495,496],"valid"],[[497,499],"mapped",[100,122]],[[500,500],"mapped",[501]],[[501,501],"valid"],[[502,502],"mapped",[405]],[[503,503],"mapped",[447]],[[504,504],"mapped",[505]],[[505,505],"valid"],[[506,506],"mapped",[507]],[[507,507],"valid"],[[508,508],"mapped",[509]],[[509,509],"valid"],[[510,510],"mapped",[511]],[[511,511],"valid"],[[512,512],"mapped",[513]],[[513,513],"valid"],[[514,514],"mapped",[515]],[[515,515],"valid"],[[516,516],"mapped",[517]],[[517,517],"valid"],[[518,518],"mapped",[519]],[[519,519],"valid"],[[520,520],"mapped",[521]],[[521,521],"valid"],[[522,522],"mapped",[523]],[[523,523],"valid"],[[524,524],"mapped",[525]],[[525,525],"valid"],[[526,526],"mapped",[527]],[[527,527],"valid"],[[528,528],"mapped",[529]],[[529,529],"valid"],[[530,530],"mapped",[531]],[[531,531],"valid"],[[532,532],"mapped",[533]],[[533,533],"valid"],[[534,534],"mapped",[535]],[[535,535],"valid"],[[536,536],"mapped",[537]],[[537,537],"valid"],[[538,538],"mapped",[539]],[[539,539],"valid"],[[540,540],"mapped",[541]],[[541,541],"valid"],[[542,542],"mapped",[543]],[[543,543],"valid"],[[544,544],"mapped",[414]],[[545,545],"valid"],[[546,546],"mapped",[547]],[[547,547],"valid"],[[548,548],"mapped",[549]],[[549,549],"valid"],[[550,550],"mapped",[551]],[[551,551],"valid"],[[552,552],"mapped",[553]],[[553,553],"valid"],[[554,554],"mapped",[555]],[[555,555],"valid"],[[556,556],"mapped",[557]],[[557,557],"valid"],[[558,558],"mapped",[559]],[[559,559],"valid"],[[560,560],"mapped",[561]],[[561,561],"valid"],[[562,562],"mapped",[563]],[[563,563],"valid"],[[564,566],"valid"],[[567,569],"valid"],[[570,570],"mapped",[11365]],[[571,571],"mapped",[572]],[[572,572],"valid"],[[573,573],"mapped",[410]],[[574,574],"mapped",[11366]],[[575,576],"valid"],[[577,577],"mapped",[578]],[[578,578],"valid"],[[579,579],"mapped",[384]],[[580,580],"mapped",[649]],[[581,581],"mapped",[652]],[[582,582],"mapped",[583]],[[583,583],"valid"],[[584,584],"mapped",[585]],[[585,585],"valid"],[[586,586],"mapped",[587]],[[587,587],"valid"],[[588,588],"mapped",[589]],[[589,589],"valid"],[[590,590],"mapped",[591]],[[591,591],"valid"],[[592,680],"valid"],[[681,685],"valid"],[[686,687],"valid"],[[688,688],"mapped",[104]],[[689,689],"mapped",[614]],[[690,690],"mapped",[106]],[[691,691],"mapped",[114]],[[692,692],"mapped",[633]],[[693,693],"mapped",[635]],[[694,694],"mapped",[641]],[[695,695],"mapped",[119]],[[696,696],"mapped",[121]],[[697,705],"valid"],[[706,709],"valid",[],"NV8"],[[710,721],"valid"],[[722,727],"valid",[],"NV8"],[[728,728],"disallowed_STD3_mapped",[32,774]],[[729,729],"disallowed_STD3_mapped",[32,775]],[[730,730],"disallowed_STD3_mapped",[32,778]],[[731,731],"disallowed_STD3_mapped",[32,808]],[[732,732],"disallowed_STD3_mapped",[32,771]],[[733,733],"disallowed_STD3_mapped",[32,779]],[[734,734],"valid",[],"NV8"],[[735,735],"valid",[],"NV8"],[[736,736],"mapped",[611]],[[737,737],"mapped",[108]],[[738,738],"mapped",[115]],[[739,739],"mapped",[120]],[[740,740],"mapped",[661]],[[741,745],"valid",[],"NV8"],[[746,747],"valid",[],"NV8"],[[748,748],"valid"],[[749,749],"valid",[],"NV8"],[[750,750],"valid"],[[751,767],"valid",[],"NV8"],[[768,831],"valid"],[[832,832],"mapped",[768]],[[833,833],"mapped",[769]],[[834,834],"valid"],[[835,835],"mapped",[787]],[[836,836],"mapped",[776,769]],[[837,837],"mapped",[953]],[[838,846],"valid"],[[847,847],"ignored"],[[848,855],"valid"],[[856,860],"valid"],[[861,863],"valid"],[[864,865],"valid"],[[866,866],"valid"],[[867,879],"valid"],[[880,880],"mapped",[881]],[[881,881],"valid"],[[882,882],"mapped",[883]],[[883,883],"valid"],[[884,884],"mapped",[697]],[[885,885],"valid"],[[886,886],"mapped",[887]],[[887,887],"valid"],[[888,889],"disallowed"],[[890,890],"disallowed_STD3_mapped",[32,953]],[[891,893],"valid"],[[894,894],"disallowed_STD3_mapped",[59]],[[895,895],"mapped",[1011]],[[896,899],"disallowed"],[[900,900],"disallowed_STD3_mapped",[32,769]],[[901,901],"disallowed_STD3_mapped",[32,776,769]],[[902,902],"mapped",[940]],[[903,903],"mapped",[183]],[[904,904],"mapped",[941]],[[905,905],"mapped",[942]],[[906,906],"mapped",[943]],[[907,907],"disallowed"],[[908,908],"mapped",[972]],[[909,909],"disallowed"],[[910,910],"mapped",[973]],[[911,911],"mapped",[974]],[[912,912],"valid"],[[913,913],"mapped",[945]],[[914,914],"mapped",[946]],[[915,915],"mapped",[947]],[[916,916],"mapped",[948]],[[917,917],"mapped",[949]],[[918,918],"mapped",[950]],[[919,919],"mapped",[951]],[[920,920],"mapped",[952]],[[921,921],"mapped",[953]],[[922,922],"mapped",[954]],[[923,923],"mapped",[955]],[[924,924],"mapped",[956]],[[925,925],"mapped",[957]],[[926,926],"mapped",[958]],[[927,927],"mapped",[959]],[[928,928],"mapped",[960]],[[929,929],"mapped",[961]],[[930,930],"disallowed"],[[931,931],"mapped",[963]],[[932,932],"mapped",[964]],[[933,933],"mapped",[965]],[[934,934],"mapped",[966]],[[935,935],"mapped",[967]],[[936,936],"mapped",[968]],[[937,937],"mapped",[969]],[[938,938],"mapped",[970]],[[939,939],"mapped",[971]],[[940,961],"valid"],[[962,962],"deviation",[963]],[[963,974],"valid"],[[975,975],"mapped",[983]],[[976,976],"mapped",[946]],[[977,977],"mapped",[952]],[[978,978],"mapped",[965]],[[979,979],"mapped",[973]],[[980,980],"mapped",[971]],[[981,981],"mapped",[966]],[[982,982],"mapped",[960]],[[983,983],"valid"],[[984,984],"mapped",[985]],[[985,985],"valid"],[[986,986],"mapped",[987]],[[987,987],"valid"],[[988,988],"mapped",[989]],[[989,989],"valid"],[[990,990],"mapped",[991]],[[991,991],"valid"],[[992,992],"mapped",[993]],[[993,993],"valid"],[[994,994],"mapped",[995]],[[995,995],"valid"],[[996,996],"mapped",[997]],[[997,997],"valid"],[[998,998],"mapped",[999]],[[999,999],"valid"],[[1000,1000],"mapped",[1001]],[[1001,1001],"valid"],[[1002,1002],"mapped",[1003]],[[1003,1003],"valid"],[[1004,1004],"mapped",[1005]],[[1005,1005],"valid"],[[1006,1006],"mapped",[1007]],[[1007,1007],"valid"],[[1008,1008],"mapped",[954]],[[1009,1009],"mapped",[961]],[[1010,1010],"mapped",[963]],[[1011,1011],"valid"],[[1012,1012],"mapped",[952]],[[1013,1013],"mapped",[949]],[[1014,1014],"valid",[],"NV8"],[[1015,1015],"mapped",[1016]],[[1016,1016],"valid"],[[1017,1017],"mapped",[963]],[[1018,1018],"mapped",[1019]],[[1019,1019],"valid"],[[1020,1020],"valid"],[[1021,1021],"mapped",[891]],[[1022,1022],"mapped",[892]],[[1023,1023],"mapped",[893]],[[1024,1024],"mapped",[1104]],[[1025,1025],"mapped",[1105]],[[1026,1026],"mapped",[1106]],[[1027,1027],"mapped",[1107]],[[1028,1028],"mapped",[1108]],[[1029,1029],"mapped",[1109]],[[1030,1030],"mapped",[1110]],[[1031,1031],"mapped",[1111]],[[1032,1032],"mapped",[1112]],[[1033,1033],"mapped",[1113]],[[1034,1034],"mapped",[1114]],[[1035,1035],"mapped",[1115]],[[1036,1036],"mapped",[1116]],[[1037,1037],"mapped",[1117]],[[1038,1038],"mapped",[1118]],[[1039,1039],"mapped",[1119]],[[1040,1040],"mapped",[1072]],[[1041,1041],"mapped",[1073]],[[1042,1042],"mapped",[1074]],[[1043,1043],"mapped",[1075]],[[1044,1044],"mapped",[1076]],[[1045,1045],"mapped",[1077]],[[1046,1046],"mapped",[1078]],[[1047,1047],"mapped",[1079]],[[1048,1048],"mapped",[1080]],[[1049,1049],"mapped",[1081]],[[1050,1050],"mapped",[1082]],[[1051,1051],"mapped",[1083]],[[1052,1052],"mapped",[1084]],[[1053,1053],"mapped",[1085]],[[1054,1054],"mapped",[1086]],[[1055,1055],"mapped",[1087]],[[1056,1056],"mapped",[1088]],[[1057,1057],"mapped",[1089]],[[1058,1058],"mapped",[1090]],[[1059,1059],"mapped",[1091]],[[1060,1060],"mapped",[1092]],[[1061,1061],"mapped",[1093]],[[1062,1062],"mapped",[1094]],[[1063,1063],"mapped",[1095]],[[1064,1064],"mapped",[1096]],[[1065,1065],"mapped",[1097]],[[1066,1066],"mapped",[1098]],[[1067,1067],"mapped",[1099]],[[1068,1068],"mapped",[1100]],[[1069,1069],"mapped",[1101]],[[1070,1070],"mapped",[1102]],[[1071,1071],"mapped",[1103]],[[1072,1103],"valid"],[[1104,1104],"valid"],[[1105,1116],"valid"],[[1117,1117],"valid"],[[1118,1119],"valid"],[[1120,1120],"mapped",[1121]],[[1121,1121],"valid"],[[1122,1122],"mapped",[1123]],[[1123,1123],"valid"],[[1124,1124],"mapped",[1125]],[[1125,1125],"valid"],[[1126,1126],"mapped",[1127]],[[1127,1127],"valid"],[[1128,1128],"mapped",[1129]],[[1129,1129],"valid"],[[1130,1130],"mapped",[1131]],[[1131,1131],"valid"],[[1132,1132],"mapped",[1133]],[[1133,1133],"valid"],[[1134,1134],"mapped",[1135]],[[1135,1135],"valid"],[[1136,1136],"mapped",[1137]],[[1137,1137],"valid"],[[1138,1138],"mapped",[1139]],[[1139,1139],"valid"],[[1140,1140],"mapped",[1141]],[[1141,1141],"valid"],[[1142,1142],"mapped",[1143]],[[1143,1143],"valid"],[[1144,1144],"mapped",[1145]],[[1145,1145],"valid"],[[1146,1146],"mapped",[1147]],[[1147,1147],"valid"],[[1148,1148],"mapped",[1149]],[[1149,1149],"valid"],[[1150,1150],"mapped",[1151]],[[1151,1151],"valid"],[[1152,1152],"mapped",[1153]],[[1153,1153],"valid"],[[1154,1154],"valid",[],"NV8"],[[1155,1158],"valid"],[[1159,1159],"valid"],[[1160,1161],"valid",[],"NV8"],[[1162,1162],"mapped",[1163]],[[1163,1163],"valid"],[[1164,1164],"mapped",[1165]],[[1165,1165],"valid"],[[1166,1166],"mapped",[1167]],[[1167,1167],"valid"],[[1168,1168],"mapped",[1169]],[[1169,1169],"valid"],[[1170,1170],"mapped",[1171]],[[1171,1171],"valid"],[[1172,1172],"mapped",[1173]],[[1173,1173],"valid"],[[1174,1174],"mapped",[1175]],[[1175,1175],"valid"],[[1176,1176],"mapped",[1177]],[[1177,1177],"valid"],[[1178,1178],"mapped",[1179]],[[1179,1179],"valid"],[[1180,1180],"mapped",[1181]],[[1181,1181],"valid"],[[1182,1182],"mapped",[1183]],[[1183,1183],"valid"],[[1184,1184],"mapped",[1185]],[[1185,1185],"valid"],[[1186,1186],"mapped",[1187]],[[1187,1187],"valid"],[[1188,1188],"mapped",[1189]],[[1189,1189],"valid"],[[1190,1190],"mapped",[1191]],[[1191,1191],"valid"],[[1192,1192],"mapped",[1193]],[[1193,1193],"valid"],[[1194,1194],"mapped",[1195]],[[1195,1195],"valid"],[[1196,1196],"mapped",[1197]],[[1197,1197],"valid"],[[1198,1198],"mapped",[1199]],[[1199,1199],"valid"],[[1200,1200],"mapped",[1201]],[[1201,1201],"valid"],[[1202,1202],"mapped",[1203]],[[1203,1203],"valid"],[[1204,1204],"mapped",[1205]],[[1205,1205],"valid"],[[1206,1206],"mapped",[1207]],[[1207,1207],"valid"],[[1208,1208],"mapped",[1209]],[[1209,1209],"valid"],[[1210,1210],"mapped",[1211]],[[1211,1211],"valid"],[[1212,1212],"mapped",[1213]],[[1213,1213],"valid"],[[1214,1214],"mapped",[1215]],[[1215,1215],"valid"],[[1216,1216],"disallowed"],[[1217,1217],"mapped",[1218]],[[1218,1218],"valid"],[[1219,1219],"mapped",[1220]],[[1220,1220],"valid"],[[1221,1221],"mapped",[1222]],[[1222,1222],"valid"],[[1223,1223],"mapped",[1224]],[[1224,1224],"valid"],[[1225,1225],"mapped",[1226]],[[1226,1226],"valid"],[[1227,1227],"mapped",[1228]],[[1228,1228],"valid"],[[1229,1229],"mapped",[1230]],[[1230,1230],"valid"],[[1231,1231],"valid"],[[1232,1232],"mapped",[1233]],[[1233,1233],"valid"],[[1234,1234],"mapped",[1235]],[[1235,1235],"valid"],[[1236,1236],"mapped",[1237]],[[1237,1237],"valid"],[[1238,1238],"mapped",[1239]],[[1239,1239],"valid"],[[1240,1240],"mapped",[1241]],[[1241,1241],"valid"],[[1242,1242],"mapped",[1243]],[[1243,1243],"valid"],[[1244,1244],"mapped",[1245]],[[1245,1245],"valid"],[[1246,1246],"mapped",[1247]],[[1247,1247],"valid"],[[1248,1248],"mapped",[1249]],[[1249,1249],"valid"],[[1250,1250],"mapped",[1251]],[[1251,1251],"valid"],[[1252,1252],"mapped",[1253]],[[1253,1253],"valid"],[[1254,1254],"mapped",[1255]],[[1255,1255],"valid"],[[1256,1256],"mapped",[1257]],[[1257,1257],"valid"],[[1258,1258],"mapped",[1259]],[[1259,1259],"valid"],[[1260,1260],"mapped",[1261]],[[1261,1261],"valid"],[[1262,1262],"mapped",[1263]],[[1263,1263],"valid"],[[1264,1264],"mapped",[1265]],[[1265,1265],"valid"],[[1266,1266],"mapped",[1267]],[[1267,1267],"valid"],[[1268,1268],"mapped",[1269]],[[1269,1269],"valid"],[[1270,1270],"mapped",[1271]],[[1271,1271],"valid"],[[1272,1272],"mapped",[1273]],[[1273,1273],"valid"],[[1274,1274],"mapped",[1275]],[[1275,1275],"valid"],[[1276,1276],"mapped",[1277]],[[1277,1277],"valid"],[[1278,1278],"mapped",[1279]],[[1279,1279],"valid"],[[1280,1280],"mapped",[1281]],[[1281,1281],"valid"],[[1282,1282],"mapped",[1283]],[[1283,1283],"valid"],[[1284,1284],"mapped",[1285]],[[1285,1285],"valid"],[[1286,1286],"mapped",[1287]],[[1287,1287],"valid"],[[1288,1288],"mapped",[1289]],[[1289,1289],"valid"],[[1290,1290],"mapped",[1291]],[[1291,1291],"valid"],[[1292,1292],"mapped",[1293]],[[1293,1293],"valid"],[[1294,1294],"mapped",[1295]],[[1295,1295],"valid"],[[1296,1296],"mapped",[1297]],[[1297,1297],"valid"],[[1298,1298],"mapped",[1299]],[[1299,1299],"valid"],[[1300,1300],"mapped",[1301]],[[1301,1301],"valid"],[[1302,1302],"mapped",[1303]],[[1303,1303],"valid"],[[1304,1304],"mapped",[1305]],[[1305,1305],"valid"],[[1306,1306],"mapped",[1307]],[[1307,1307],"valid"],[[1308,1308],"mapped",[1309]],[[1309,1309],"valid"],[[1310,1310],"mapped",[1311]],[[1311,1311],"valid"],[[1312,1312],"mapped",[1313]],[[1313,1313],"valid"],[[1314,1314],"mapped",[1315]],[[1315,1315],"valid"],[[1316,1316],"mapped",[1317]],[[1317,1317],"valid"],[[1318,1318],"mapped",[1319]],[[1319,1319],"valid"],[[1320,1320],"mapped",[1321]],[[1321,1321],"valid"],[[1322,1322],"mapped",[1323]],[[1323,1323],"valid"],[[1324,1324],"mapped",[1325]],[[1325,1325],"valid"],[[1326,1326],"mapped",[1327]],[[1327,1327],"valid"],[[1328,1328],"disallowed"],[[1329,1329],"mapped",[1377]],[[1330,1330],"mapped",[1378]],[[1331,1331],"mapped",[1379]],[[1332,1332],"mapped",[1380]],[[1333,1333],"mapped",[1381]],[[1334,1334],"mapped",[1382]],[[1335,1335],"mapped",[1383]],[[1336,1336],"mapped",[1384]],[[1337,1337],"mapped",[1385]],[[1338,1338],"mapped",[1386]],[[1339,1339],"mapped",[1387]],[[1340,1340],"mapped",[1388]],[[1341,1341],"mapped",[1389]],[[1342,1342],"mapped",[1390]],[[1343,1343],"mapped",[1391]],[[1344,1344],"mapped",[1392]],[[1345,1345],"mapped",[1393]],[[1346,1346],"mapped",[1394]],[[1347,1347],"mapped",[1395]],[[1348,1348],"mapped",[1396]],[[1349,1349],"mapped",[1397]],[[1350,1350],"mapped",[1398]],[[1351,1351],"mapped",[1399]],[[1352,1352],"mapped",[1400]],[[1353,1353],"mapped",[1401]],[[1354,1354],"mapped",[1402]],[[1355,1355],"mapped",[1403]],[[1356,1356],"mapped",[1404]],[[1357,1357],"mapped",[1405]],[[1358,1358],"mapped",[1406]],[[1359,1359],"mapped",[1407]],[[1360,1360],"mapped",[1408]],[[1361,1361],"mapped",[1409]],[[1362,1362],"mapped",[1410]],[[1363,1363],"mapped",[1411]],[[1364,1364],"mapped",[1412]],[[1365,1365],"mapped",[1413]],[[1366,1366],"mapped",[1414]],[[1367,1368],"disallowed"],[[1369,1369],"valid"],[[1370,1375],"valid",[],"NV8"],[[1376,1376],"disallowed"],[[1377,1414],"valid"],[[1415,1415],"mapped",[1381,1410]],[[1416,1416],"disallowed"],[[1417,1417],"valid",[],"NV8"],[[1418,1418],"valid",[],"NV8"],[[1419,1420],"disallowed"],[[1421,1422],"valid",[],"NV8"],[[1423,1423],"valid",[],"NV8"],[[1424,1424],"disallowed"],[[1425,1441],"valid"],[[1442,1442],"valid"],[[1443,1455],"valid"],[[1456,1465],"valid"],[[1466,1466],"valid"],[[1467,1469],"valid"],[[1470,1470],"valid",[],"NV8"],[[1471,1471],"valid"],[[1472,1472],"valid",[],"NV8"],[[1473,1474],"valid"],[[1475,1475],"valid",[],"NV8"],[[1476,1476],"valid"],[[1477,1477],"valid"],[[1478,1478],"valid",[],"NV8"],[[1479,1479],"valid"],[[1480,1487],"disallowed"],[[1488,1514],"valid"],[[1515,1519],"disallowed"],[[1520,1524],"valid"],[[1525,1535],"disallowed"],[[1536,1539],"disallowed"],[[1540,1540],"disallowed"],[[1541,1541],"disallowed"],[[1542,1546],"valid",[],"NV8"],[[1547,1547],"valid",[],"NV8"],[[1548,1548],"valid",[],"NV8"],[[1549,1551],"valid",[],"NV8"],[[1552,1557],"valid"],[[1558,1562],"valid"],[[1563,1563],"valid",[],"NV8"],[[1564,1564],"disallowed"],[[1565,1565],"disallowed"],[[1566,1566],"valid",[],"NV8"],[[1567,1567],"valid",[],"NV8"],[[1568,1568],"valid"],[[1569,1594],"valid"],[[1595,1599],"valid"],[[1600,1600],"valid",[],"NV8"],[[1601,1618],"valid"],[[1619,1621],"valid"],[[1622,1624],"valid"],[[1625,1630],"valid"],[[1631,1631],"valid"],[[1632,1641],"valid"],[[1642,1645],"valid",[],"NV8"],[[1646,1647],"valid"],[[1648,1652],"valid"],[[1653,1653],"mapped",[1575,1652]],[[1654,1654],"mapped",[1608,1652]],[[1655,1655],"mapped",[1735,1652]],[[1656,1656],"mapped",[1610,1652]],[[1657,1719],"valid"],[[1720,1721],"valid"],[[1722,1726],"valid"],[[1727,1727],"valid"],[[1728,1742],"valid"],[[1743,1743],"valid"],[[1744,1747],"valid"],[[1748,1748],"valid",[],"NV8"],[[1749,1756],"valid"],[[1757,1757],"disallowed"],[[1758,1758],"valid",[],"NV8"],[[1759,1768],"valid"],[[1769,1769],"valid",[],"NV8"],[[1770,1773],"valid"],[[1774,1775],"valid"],[[1776,1785],"valid"],[[1786,1790],"valid"],[[1791,1791],"valid"],[[1792,1805],"valid",[],"NV8"],[[1806,1806],"disallowed"],[[1807,1807],"disallowed"],[[1808,1836],"valid"],[[1837,1839],"valid"],[[1840,1866],"valid"],[[1867,1868],"disallowed"],[[1869,1871],"valid"],[[1872,1901],"valid"],[[1902,1919],"valid"],[[1920,1968],"valid"],[[1969,1969],"valid"],[[1970,1983],"disallowed"],[[1984,2037],"valid"],[[2038,2042],"valid",[],"NV8"],[[2043,2047],"disallowed"],[[2048,2093],"valid"],[[2094,2095],"disallowed"],[[2096,2110],"valid",[],"NV8"],[[2111,2111],"disallowed"],[[2112,2139],"valid"],[[2140,2141],"disallowed"],[[2142,2142],"valid",[],"NV8"],[[2143,2207],"disallowed"],[[2208,2208],"valid"],[[2209,2209],"valid"],[[2210,2220],"valid"],[[2221,2226],"valid"],[[2227,2228],"valid"],[[2229,2274],"disallowed"],[[2275,2275],"valid"],[[2276,2302],"valid"],[[2303,2303],"valid"],[[2304,2304],"valid"],[[2305,2307],"valid"],[[2308,2308],"valid"],[[2309,2361],"valid"],[[2362,2363],"valid"],[[2364,2381],"valid"],[[2382,2382],"valid"],[[2383,2383],"valid"],[[2384,2388],"valid"],[[2389,2389],"valid"],[[2390,2391],"valid"],[[2392,2392],"mapped",[2325,2364]],[[2393,2393],"mapped",[2326,2364]],[[2394,2394],"mapped",[2327,2364]],[[2395,2395],"mapped",[2332,2364]],[[2396,2396],"mapped",[2337,2364]],[[2397,2397],"mapped",[2338,2364]],[[2398,2398],"mapped",[2347,2364]],[[2399,2399],"mapped",[2351,2364]],[[2400,2403],"valid"],[[2404,2405],"valid",[],"NV8"],[[2406,2415],"valid"],[[2416,2416],"valid",[],"NV8"],[[2417,2418],"valid"],[[2419,2423],"valid"],[[2424,2424],"valid"],[[2425,2426],"valid"],[[2427,2428],"valid"],[[2429,2429],"valid"],[[2430,2431],"valid"],[[2432,2432],"valid"],[[2433,2435],"valid"],[[2436,2436],"disallowed"],[[2437,2444],"valid"],[[2445,2446],"disallowed"],[[2447,2448],"valid"],[[2449,2450],"disallowed"],[[2451,2472],"valid"],[[2473,2473],"disallowed"],[[2474,2480],"valid"],[[2481,2481],"disallowed"],[[2482,2482],"valid"],[[2483,2485],"disallowed"],[[2486,2489],"valid"],[[2490,2491],"disallowed"],[[2492,2492],"valid"],[[2493,2493],"valid"],[[2494,2500],"valid"],[[2501,2502],"disallowed"],[[2503,2504],"valid"],[[2505,2506],"disallowed"],[[2507,2509],"valid"],[[2510,2510],"valid"],[[2511,2518],"disallowed"],[[2519,2519],"valid"],[[2520,2523],"disallowed"],[[2524,2524],"mapped",[2465,2492]],[[2525,2525],"mapped",[2466,2492]],[[2526,2526],"disallowed"],[[2527,2527],"mapped",[2479,2492]],[[2528,2531],"valid"],[[2532,2533],"disallowed"],[[2534,2545],"valid"],[[2546,2554],"valid",[],"NV8"],[[2555,2555],"valid",[],"NV8"],[[2556,2560],"disallowed"],[[2561,2561],"valid"],[[2562,2562],"valid"],[[2563,2563],"valid"],[[2564,2564],"disallowed"],[[2565,2570],"valid"],[[2571,2574],"disallowed"],[[2575,2576],"valid"],[[2577,2578],"disallowed"],[[2579,2600],"valid"],[[2601,2601],"disallowed"],[[2602,2608],"valid"],[[2609,2609],"disallowed"],[[2610,2610],"valid"],[[2611,2611],"mapped",[2610,2620]],[[2612,2612],"disallowed"],[[2613,2613],"valid"],[[2614,2614],"mapped",[2616,2620]],[[2615,2615],"disallowed"],[[2616,2617],"valid"],[[2618,2619],"disallowed"],[[2620,2620],"valid"],[[2621,2621],"disallowed"],[[2622,2626],"valid"],[[2627,2630],"disallowed"],[[2631,2632],"valid"],[[2633,2634],"disallowed"],[[2635,2637],"valid"],[[2638,2640],"disallowed"],[[2641,2641],"valid"],[[2642,2648],"disallowed"],[[2649,2649],"mapped",[2582,2620]],[[2650,2650],"mapped",[2583,2620]],[[2651,2651],"mapped",[2588,2620]],[[2652,2652],"valid"],[[2653,2653],"disallowed"],[[2654,2654],"mapped",[2603,2620]],[[2655,2661],"disallowed"],[[2662,2676],"valid"],[[2677,2677],"valid"],[[2678,2688],"disallowed"],[[2689,2691],"valid"],[[2692,2692],"disallowed"],[[2693,2699],"valid"],[[2700,2700],"valid"],[[2701,2701],"valid"],[[2702,2702],"disallowed"],[[2703,2705],"valid"],[[2706,2706],"disallowed"],[[2707,2728],"valid"],[[2729,2729],"disallowed"],[[2730,2736],"valid"],[[2737,2737],"disallowed"],[[2738,2739],"valid"],[[2740,2740],"disallowed"],[[2741,2745],"valid"],[[2746,2747],"disallowed"],[[2748,2757],"valid"],[[2758,2758],"disallowed"],[[2759,2761],"valid"],[[2762,2762],"disallowed"],[[2763,2765],"valid"],[[2766,2767],"disallowed"],[[2768,2768],"valid"],[[2769,2783],"disallowed"],[[2784,2784],"valid"],[[2785,2787],"valid"],[[2788,2789],"disallowed"],[[2790,2799],"valid"],[[2800,2800],"valid",[],"NV8"],[[2801,2801],"valid",[],"NV8"],[[2802,2808],"disallowed"],[[2809,2809],"valid"],[[2810,2816],"disallowed"],[[2817,2819],"valid"],[[2820,2820],"disallowed"],[[2821,2828],"valid"],[[2829,2830],"disallowed"],[[2831,2832],"valid"],[[2833,2834],"disallowed"],[[2835,2856],"valid"],[[2857,2857],"disallowed"],[[2858,2864],"valid"],[[2865,2865],"disallowed"],[[2866,2867],"valid"],[[2868,2868],"disallowed"],[[2869,2869],"valid"],[[2870,2873],"valid"],[[2874,2875],"disallowed"],[[2876,2883],"valid"],[[2884,2884],"valid"],[[2885,2886],"disallowed"],[[2887,2888],"valid"],[[2889,2890],"disallowed"],[[2891,2893],"valid"],[[2894,2901],"disallowed"],[[2902,2903],"valid"],[[2904,2907],"disallowed"],[[2908,2908],"mapped",[2849,2876]],[[2909,2909],"mapped",[2850,2876]],[[2910,2910],"disallowed"],[[2911,2913],"valid"],[[2914,2915],"valid"],[[2916,2917],"disallowed"],[[2918,2927],"valid"],[[2928,2928],"valid",[],"NV8"],[[2929,2929],"valid"],[[2930,2935],"valid",[],"NV8"],[[2936,2945],"disallowed"],[[2946,2947],"valid"],[[2948,2948],"disallowed"],[[2949,2954],"valid"],[[2955,2957],"disallowed"],[[2958,2960],"valid"],[[2961,2961],"disallowed"],[[2962,2965],"valid"],[[2966,2968],"disallowed"],[[2969,2970],"valid"],[[2971,2971],"disallowed"],[[2972,2972],"valid"],[[2973,2973],"disallowed"],[[2974,2975],"valid"],[[2976,2978],"disallowed"],[[2979,2980],"valid"],[[2981,2983],"disallowed"],[[2984,2986],"valid"],[[2987,2989],"disallowed"],[[2990,2997],"valid"],[[2998,2998],"valid"],[[2999,3001],"valid"],[[3002,3005],"disallowed"],[[3006,3010],"valid"],[[3011,3013],"disallowed"],[[3014,3016],"valid"],[[3017,3017],"disallowed"],[[3018,3021],"valid"],[[3022,3023],"disallowed"],[[3024,3024],"valid"],[[3025,3030],"disallowed"],[[3031,3031],"valid"],[[3032,3045],"disallowed"],[[3046,3046],"valid"],[[3047,3055],"valid"],[[3056,3058],"valid",[],"NV8"],[[3059,3066],"valid",[],"NV8"],[[3067,3071],"disallowed"],[[3072,3072],"valid"],[[3073,3075],"valid"],[[3076,3076],"disallowed"],[[3077,3084],"valid"],[[3085,3085],"disallowed"],[[3086,3088],"valid"],[[3089,3089],"disallowed"],[[3090,3112],"valid"],[[3113,3113],"disallowed"],[[3114,3123],"valid"],[[3124,3124],"valid"],[[3125,3129],"valid"],[[3130,3132],"disallowed"],[[3133,3133],"valid"],[[3134,3140],"valid"],[[3141,3141],"disallowed"],[[3142,3144],"valid"],[[3145,3145],"disallowed"],[[3146,3149],"valid"],[[3150,3156],"disallowed"],[[3157,3158],"valid"],[[3159,3159],"disallowed"],[[3160,3161],"valid"],[[3162,3162],"valid"],[[3163,3167],"disallowed"],[[3168,3169],"valid"],[[3170,3171],"valid"],[[3172,3173],"disallowed"],[[3174,3183],"valid"],[[3184,3191],"disallowed"],[[3192,3199],"valid",[],"NV8"],[[3200,3200],"disallowed"],[[3201,3201],"valid"],[[3202,3203],"valid"],[[3204,3204],"disallowed"],[[3205,3212],"valid"],[[3213,3213],"disallowed"],[[3214,3216],"valid"],[[3217,3217],"disallowed"],[[3218,3240],"valid"],[[3241,3241],"disallowed"],[[3242,3251],"valid"],[[3252,3252],"disallowed"],[[3253,3257],"valid"],[[3258,3259],"disallowed"],[[3260,3261],"valid"],[[3262,3268],"valid"],[[3269,3269],"disallowed"],[[3270,3272],"valid"],[[3273,3273],"disallowed"],[[3274,3277],"valid"],[[3278,3284],"disallowed"],[[3285,3286],"valid"],[[3287,3293],"disallowed"],[[3294,3294],"valid"],[[3295,3295],"disallowed"],[[3296,3297],"valid"],[[3298,3299],"valid"],[[3300,3301],"disallowed"],[[3302,3311],"valid"],[[3312,3312],"disallowed"],[[3313,3314],"valid"],[[3315,3328],"disallowed"],[[3329,3329],"valid"],[[3330,3331],"valid"],[[3332,3332],"disallowed"],[[3333,3340],"valid"],[[3341,3341],"disallowed"],[[3342,3344],"valid"],[[3345,3345],"disallowed"],[[3346,3368],"valid"],[[3369,3369],"valid"],[[3370,3385],"valid"],[[3386,3386],"valid"],[[3387,3388],"disallowed"],[[3389,3389],"valid"],[[3390,3395],"valid"],[[3396,3396],"valid"],[[3397,3397],"disallowed"],[[3398,3400],"valid"],[[3401,3401],"disallowed"],[[3402,3405],"valid"],[[3406,3406],"valid"],[[3407,3414],"disallowed"],[[3415,3415],"valid"],[[3416,3422],"disallowed"],[[3423,3423],"valid"],[[3424,3425],"valid"],[[3426,3427],"valid"],[[3428,3429],"disallowed"],[[3430,3439],"valid"],[[3440,3445],"valid",[],"NV8"],[[3446,3448],"disallowed"],[[3449,3449],"valid",[],"NV8"],[[3450,3455],"valid"],[[3456,3457],"disallowed"],[[3458,3459],"valid"],[[3460,3460],"disallowed"],[[3461,3478],"valid"],[[3479,3481],"disallowed"],[[3482,3505],"valid"],[[3506,3506],"disallowed"],[[3507,3515],"valid"],[[3516,3516],"disallowed"],[[3517,3517],"valid"],[[3518,3519],"disallowed"],[[3520,3526],"valid"],[[3527,3529],"disallowed"],[[3530,3530],"valid"],[[3531,3534],"disallowed"],[[3535,3540],"valid"],[[3541,3541],"disallowed"],[[3542,3542],"valid"],[[3543,3543],"disallowed"],[[3544,3551],"valid"],[[3552,3557],"disallowed"],[[3558,3567],"valid"],[[3568,3569],"disallowed"],[[3570,3571],"valid"],[[3572,3572],"valid",[],"NV8"],[[3573,3584],"disallowed"],[[3585,3634],"valid"],[[3635,3635],"mapped",[3661,3634]],[[3636,3642],"valid"],[[3643,3646],"disallowed"],[[3647,3647],"valid",[],"NV8"],[[3648,3662],"valid"],[[3663,3663],"valid",[],"NV8"],[[3664,3673],"valid"],[[3674,3675],"valid",[],"NV8"],[[3676,3712],"disallowed"],[[3713,3714],"valid"],[[3715,3715],"disallowed"],[[3716,3716],"valid"],[[3717,3718],"disallowed"],[[3719,3720],"valid"],[[3721,3721],"disallowed"],[[3722,3722],"valid"],[[3723,3724],"disallowed"],[[3725,3725],"valid"],[[3726,3731],"disallowed"],[[3732,3735],"valid"],[[3736,3736],"disallowed"],[[3737,3743],"valid"],[[3744,3744],"disallowed"],[[3745,3747],"valid"],[[3748,3748],"disallowed"],[[3749,3749],"valid"],[[3750,3750],"disallowed"],[[3751,3751],"valid"],[[3752,3753],"disallowed"],[[3754,3755],"valid"],[[3756,3756],"disallowed"],[[3757,3762],"valid"],[[3763,3763],"mapped",[3789,3762]],[[3764,3769],"valid"],[[3770,3770],"disallowed"],[[3771,3773],"valid"],[[3774,3775],"disallowed"],[[3776,3780],"valid"],[[3781,3781],"disallowed"],[[3782,3782],"valid"],[[3783,3783],"disallowed"],[[3784,3789],"valid"],[[3790,3791],"disallowed"],[[3792,3801],"valid"],[[3802,3803],"disallowed"],[[3804,3804],"mapped",[3755,3737]],[[3805,3805],"mapped",[3755,3745]],[[3806,3807],"valid"],[[3808,3839],"disallowed"],[[3840,3840],"valid"],[[3841,3850],"valid",[],"NV8"],[[3851,3851],"valid"],[[3852,3852],"mapped",[3851]],[[3853,3863],"valid",[],"NV8"],[[3864,3865],"valid"],[[3866,3871],"valid",[],"NV8"],[[3872,3881],"valid"],[[3882,3892],"valid",[],"NV8"],[[3893,3893],"valid"],[[3894,3894],"valid",[],"NV8"],[[3895,3895],"valid"],[[3896,3896],"valid",[],"NV8"],[[3897,3897],"valid"],[[3898,3901],"valid",[],"NV8"],[[3902,3906],"valid"],[[3907,3907],"mapped",[3906,4023]],[[3908,3911],"valid"],[[3912,3912],"disallowed"],[[3913,3916],"valid"],[[3917,3917],"mapped",[3916,4023]],[[3918,3921],"valid"],[[3922,3922],"mapped",[3921,4023]],[[3923,3926],"valid"],[[3927,3927],"mapped",[3926,4023]],[[3928,3931],"valid"],[[3932,3932],"mapped",[3931,4023]],[[3933,3944],"valid"],[[3945,3945],"mapped",[3904,4021]],[[3946,3946],"valid"],[[3947,3948],"valid"],[[3949,3952],"disallowed"],[[3953,3954],"valid"],[[3955,3955],"mapped",[3953,3954]],[[3956,3956],"valid"],[[3957,3957],"mapped",[3953,3956]],[[3958,3958],"mapped",[4018,3968]],[[3959,3959],"mapped",[4018,3953,3968]],[[3960,3960],"mapped",[4019,3968]],[[3961,3961],"mapped",[4019,3953,3968]],[[3962,3968],"valid"],[[3969,3969],"mapped",[3953,3968]],[[3970,3972],"valid"],[[3973,3973],"valid",[],"NV8"],[[3974,3979],"valid"],[[3980,3983],"valid"],[[3984,3986],"valid"],[[3987,3987],"mapped",[3986,4023]],[[3988,3989],"valid"],[[3990,3990],"valid"],[[3991,3991],"valid"],[[3992,3992],"disallowed"],[[3993,3996],"valid"],[[3997,3997],"mapped",[3996,4023]],[[3998,4001],"valid"],[[4002,4002],"mapped",[4001,4023]],[[4003,4006],"valid"],[[4007,4007],"mapped",[4006,4023]],[[4008,4011],"valid"],[[4012,4012],"mapped",[4011,4023]],[[4013,4013],"valid"],[[4014,4016],"valid"],[[4017,4023],"valid"],[[4024,4024],"valid"],[[4025,4025],"mapped",[3984,4021]],[[4026,4028],"valid"],[[4029,4029],"disallowed"],[[4030,4037],"valid",[],"NV8"],[[4038,4038],"valid"],[[4039,4044],"valid",[],"NV8"],[[4045,4045],"disallowed"],[[4046,4046],"valid",[],"NV8"],[[4047,4047],"valid",[],"NV8"],[[4048,4049],"valid",[],"NV8"],[[4050,4052],"valid",[],"NV8"],[[4053,4056],"valid",[],"NV8"],[[4057,4058],"valid",[],"NV8"],[[4059,4095],"disallowed"],[[4096,4129],"valid"],[[4130,4130],"valid"],[[4131,4135],"valid"],[[4136,4136],"valid"],[[4137,4138],"valid"],[[4139,4139],"valid"],[[4140,4146],"valid"],[[4147,4149],"valid"],[[4150,4153],"valid"],[[4154,4159],"valid"],[[4160,4169],"valid"],[[4170,4175],"valid",[],"NV8"],[[4176,4185],"valid"],[[4186,4249],"valid"],[[4250,4253],"valid"],[[4254,4255],"valid",[],"NV8"],[[4256,4293],"disallowed"],[[4294,4294],"disallowed"],[[4295,4295],"mapped",[11559]],[[4296,4300],"disallowed"],[[4301,4301],"mapped",[11565]],[[4302,4303],"disallowed"],[[4304,4342],"valid"],[[4343,4344],"valid"],[[4345,4346],"valid"],[[4347,4347],"valid",[],"NV8"],[[4348,4348],"mapped",[4316]],[[4349,4351],"valid"],[[4352,4441],"valid",[],"NV8"],[[4442,4446],"valid",[],"NV8"],[[4447,4448],"disallowed"],[[4449,4514],"valid",[],"NV8"],[[4515,4519],"valid",[],"NV8"],[[4520,4601],"valid",[],"NV8"],[[4602,4607],"valid",[],"NV8"],[[4608,4614],"valid"],[[4615,4615],"valid"],[[4616,4678],"valid"],[[4679,4679],"valid"],[[4680,4680],"valid"],[[4681,4681],"disallowed"],[[4682,4685],"valid"],[[4686,4687],"disallowed"],[[4688,4694],"valid"],[[4695,4695],"disallowed"],[[4696,4696],"valid"],[[4697,4697],"disallowed"],[[4698,4701],"valid"],[[4702,4703],"disallowed"],[[4704,4742],"valid"],[[4743,4743],"valid"],[[4744,4744],"valid"],[[4745,4745],"disallowed"],[[4746,4749],"valid"],[[4750,4751],"disallowed"],[[4752,4782],"valid"],[[4783,4783],"valid"],[[4784,4784],"valid"],[[4785,4785],"disallowed"],[[4786,4789],"valid"],[[4790,4791],"disallowed"],[[4792,4798],"valid"],[[4799,4799],"disallowed"],[[4800,4800],"valid"],[[4801,4801],"disallowed"],[[4802,4805],"valid"],[[4806,4807],"disallowed"],[[4808,4814],"valid"],[[4815,4815],"valid"],[[4816,4822],"valid"],[[4823,4823],"disallowed"],[[4824,4846],"valid"],[[4847,4847],"valid"],[[4848,4878],"valid"],[[4879,4879],"valid"],[[4880,4880],"valid"],[[4881,4881],"disallowed"],[[4882,4885],"valid"],[[4886,4887],"disallowed"],[[4888,4894],"valid"],[[4895,4895],"valid"],[[4896,4934],"valid"],[[4935,4935],"valid"],[[4936,4954],"valid"],[[4955,4956],"disallowed"],[[4957,4958],"valid"],[[4959,4959],"valid"],[[4960,4960],"valid",[],"NV8"],[[4961,4988],"valid",[],"NV8"],[[4989,4991],"disallowed"],[[4992,5007],"valid"],[[5008,5017],"valid",[],"NV8"],[[5018,5023],"disallowed"],[[5024,5108],"valid"],[[5109,5109],"valid"],[[5110,5111],"disallowed"],[[5112,5112],"mapped",[5104]],[[5113,5113],"mapped",[5105]],[[5114,5114],"mapped",[5106]],[[5115,5115],"mapped",[5107]],[[5116,5116],"mapped",[5108]],[[5117,5117],"mapped",[5109]],[[5118,5119],"disallowed"],[[5120,5120],"valid",[],"NV8"],[[5121,5740],"valid"],[[5741,5742],"valid",[],"NV8"],[[5743,5750],"valid"],[[5751,5759],"valid"],[[5760,5760],"disallowed"],[[5761,5786],"valid"],[[5787,5788],"valid",[],"NV8"],[[5789,5791],"disallowed"],[[5792,5866],"valid"],[[5867,5872],"valid",[],"NV8"],[[5873,5880],"valid"],[[5881,5887],"disallowed"],[[5888,5900],"valid"],[[5901,5901],"disallowed"],[[5902,5908],"valid"],[[5909,5919],"disallowed"],[[5920,5940],"valid"],[[5941,5942],"valid",[],"NV8"],[[5943,5951],"disallowed"],[[5952,5971],"valid"],[[5972,5983],"disallowed"],[[5984,5996],"valid"],[[5997,5997],"disallowed"],[[5998,6000],"valid"],[[6001,6001],"disallowed"],[[6002,6003],"valid"],[[6004,6015],"disallowed"],[[6016,6067],"valid"],[[6068,6069],"disallowed"],[[6070,6099],"valid"],[[6100,6102],"valid",[],"NV8"],[[6103,6103],"valid"],[[6104,6107],"valid",[],"NV8"],[[6108,6108],"valid"],[[6109,6109],"valid"],[[6110,6111],"disallowed"],[[6112,6121],"valid"],[[6122,6127],"disallowed"],[[6128,6137],"valid",[],"NV8"],[[6138,6143],"disallowed"],[[6144,6149],"valid",[],"NV8"],[[6150,6150],"disallowed"],[[6151,6154],"valid",[],"NV8"],[[6155,6157],"ignored"],[[6158,6158],"disallowed"],[[6159,6159],"disallowed"],[[6160,6169],"valid"],[[6170,6175],"disallowed"],[[6176,6263],"valid"],[[6264,6271],"disallowed"],[[6272,6313],"valid"],[[6314,6314],"valid"],[[6315,6319],"disallowed"],[[6320,6389],"valid"],[[6390,6399],"disallowed"],[[6400,6428],"valid"],[[6429,6430],"valid"],[[6431,6431],"disallowed"],[[6432,6443],"valid"],[[6444,6447],"disallowed"],[[6448,6459],"valid"],[[6460,6463],"disallowed"],[[6464,6464],"valid",[],"NV8"],[[6465,6467],"disallowed"],[[6468,6469],"valid",[],"NV8"],[[6470,6509],"valid"],[[6510,6511],"disallowed"],[[6512,6516],"valid"],[[6517,6527],"disallowed"],[[6528,6569],"valid"],[[6570,6571],"valid"],[[6572,6575],"disallowed"],[[6576,6601],"valid"],[[6602,6607],"disallowed"],[[6608,6617],"valid"],[[6618,6618],"valid",[],"XV8"],[[6619,6621],"disallowed"],[[6622,6623],"valid",[],"NV8"],[[6624,6655],"valid",[],"NV8"],[[6656,6683],"valid"],[[6684,6685],"disallowed"],[[6686,6687],"valid",[],"NV8"],[[6688,6750],"valid"],[[6751,6751],"disallowed"],[[6752,6780],"valid"],[[6781,6782],"disallowed"],[[6783,6793],"valid"],[[6794,6799],"disallowed"],[[6800,6809],"valid"],[[6810,6815],"disallowed"],[[6816,6822],"valid",[],"NV8"],[[6823,6823],"valid"],[[6824,6829],"valid",[],"NV8"],[[6830,6831],"disallowed"],[[6832,6845],"valid"],[[6846,6846],"valid",[],"NV8"],[[6847,6911],"disallowed"],[[6912,6987],"valid"],[[6988,6991],"disallowed"],[[6992,7001],"valid"],[[7002,7018],"valid",[],"NV8"],[[7019,7027],"valid"],[[7028,7036],"valid",[],"NV8"],[[7037,7039],"disallowed"],[[7040,7082],"valid"],[[7083,7085],"valid"],[[7086,7097],"valid"],[[7098,7103],"valid"],[[7104,7155],"valid"],[[7156,7163],"disallowed"],[[7164,7167],"valid",[],"NV8"],[[7168,7223],"valid"],[[7224,7226],"disallowed"],[[7227,7231],"valid",[],"NV8"],[[7232,7241],"valid"],[[7242,7244],"disallowed"],[[7245,7293],"valid"],[[7294,7295],"valid",[],"NV8"],[[7296,7359],"disallowed"],[[7360,7367],"valid",[],"NV8"],[[7368,7375],"disallowed"],[[7376,7378],"valid"],[[7379,7379],"valid",[],"NV8"],[[7380,7410],"valid"],[[7411,7414],"valid"],[[7415,7415],"disallowed"],[[7416,7417],"valid"],[[7418,7423],"disallowed"],[[7424,7467],"valid"],[[7468,7468],"mapped",[97]],[[7469,7469],"mapped",[230]],[[7470,7470],"mapped",[98]],[[7471,7471],"valid"],[[7472,7472],"mapped",[100]],[[7473,7473],"mapped",[101]],[[7474,7474],"mapped",[477]],[[7475,7475],"mapped",[103]],[[7476,7476],"mapped",[104]],[[7477,7477],"mapped",[105]],[[7478,7478],"mapped",[106]],[[7479,7479],"mapped",[107]],[[7480,7480],"mapped",[108]],[[7481,7481],"mapped",[109]],[[7482,7482],"mapped",[110]],[[7483,7483],"valid"],[[7484,7484],"mapped",[111]],[[7485,7485],"mapped",[547]],[[7486,7486],"mapped",[112]],[[7487,7487],"mapped",[114]],[[7488,7488],"mapped",[116]],[[7489,7489],"mapped",[117]],[[7490,7490],"mapped",[119]],[[7491,7491],"mapped",[97]],[[7492,7492],"mapped",[592]],[[7493,7493],"mapped",[593]],[[7494,7494],"mapped",[7426]],[[7495,7495],"mapped",[98]],[[7496,7496],"mapped",[100]],[[7497,7497],"mapped",[101]],[[7498,7498],"mapped",[601]],[[7499,7499],"mapped",[603]],[[7500,7500],"mapped",[604]],[[7501,7501],"mapped",[103]],[[7502,7502],"valid"],[[7503,7503],"mapped",[107]],[[7504,7504],"mapped",[109]],[[7505,7505],"mapped",[331]],[[7506,7506],"mapped",[111]],[[7507,7507],"mapped",[596]],[[7508,7508],"mapped",[7446]],[[7509,7509],"mapped",[7447]],[[7510,7510],"mapped",[112]],[[7511,7511],"mapped",[116]],[[7512,7512],"mapped",[117]],[[7513,7513],"mapped",[7453]],[[7514,7514],"mapped",[623]],[[7515,7515],"mapped",[118]],[[7516,7516],"mapped",[7461]],[[7517,7517],"mapped",[946]],[[7518,7518],"mapped",[947]],[[7519,7519],"mapped",[948]],[[7520,7520],"mapped",[966]],[[7521,7521],"mapped",[967]],[[7522,7522],"mapped",[105]],[[7523,7523],"mapped",[114]],[[7524,7524],"mapped",[117]],[[7525,7525],"mapped",[118]],[[7526,7526],"mapped",[946]],[[7527,7527],"mapped",[947]],[[7528,7528],"mapped",[961]],[[7529,7529],"mapped",[966]],[[7530,7530],"mapped",[967]],[[7531,7531],"valid"],[[7532,7543],"valid"],[[7544,7544],"mapped",[1085]],[[7545,7578],"valid"],[[7579,7579],"mapped",[594]],[[7580,7580],"mapped",[99]],[[7581,7581],"mapped",[597]],[[7582,7582],"mapped",[240]],[[7583,7583],"mapped",[604]],[[7584,7584],"mapped",[102]],[[7585,7585],"mapped",[607]],[[7586,7586],"mapped",[609]],[[7587,7587],"mapped",[613]],[[7588,7588],"mapped",[616]],[[7589,7589],"mapped",[617]],[[7590,7590],"mapped",[618]],[[7591,7591],"mapped",[7547]],[[7592,7592],"mapped",[669]],[[7593,7593],"mapped",[621]],[[7594,7594],"mapped",[7557]],[[7595,7595],"mapped",[671]],[[7596,7596],"mapped",[625]],[[7597,7597],"mapped",[624]],[[7598,7598],"mapped",[626]],[[7599,7599],"mapped",[627]],[[7600,7600],"mapped",[628]],[[7601,7601],"mapped",[629]],[[7602,7602],"mapped",[632]],[[7603,7603],"mapped",[642]],[[7604,7604],"mapped",[643]],[[7605,7605],"mapped",[427]],[[7606,7606],"mapped",[649]],[[7607,7607],"mapped",[650]],[[7608,7608],"mapped",[7452]],[[7609,7609],"mapped",[651]],[[7610,7610],"mapped",[652]],[[7611,7611],"mapped",[122]],[[7612,7612],"mapped",[656]],[[7613,7613],"mapped",[657]],[[7614,7614],"mapped",[658]],[[7615,7615],"mapped",[952]],[[7616,7619],"valid"],[[7620,7626],"valid"],[[7627,7654],"valid"],[[7655,7669],"valid"],[[7670,7675],"disallowed"],[[7676,7676],"valid"],[[7677,7677],"valid"],[[7678,7679],"valid"],[[7680,7680],"mapped",[7681]],[[7681,7681],"valid"],[[7682,7682],"mapped",[7683]],[[7683,7683],"valid"],[[7684,7684],"mapped",[7685]],[[7685,7685],"valid"],[[7686,7686],"mapped",[7687]],[[7687,7687],"valid"],[[7688,7688],"mapped",[7689]],[[7689,7689],"valid"],[[7690,7690],"mapped",[7691]],[[7691,7691],"valid"],[[7692,7692],"mapped",[7693]],[[7693,7693],"valid"],[[7694,7694],"mapped",[7695]],[[7695,7695],"valid"],[[7696,7696],"mapped",[7697]],[[7697,7697],"valid"],[[7698,7698],"mapped",[7699]],[[7699,7699],"valid"],[[7700,7700],"mapped",[7701]],[[7701,7701],"valid"],[[7702,7702],"mapped",[7703]],[[7703,7703],"valid"],[[7704,7704],"mapped",[7705]],[[7705,7705],"valid"],[[7706,7706],"mapped",[7707]],[[7707,7707],"valid"],[[7708,7708],"mapped",[7709]],[[7709,7709],"valid"],[[7710,7710],"mapped",[7711]],[[7711,7711],"valid"],[[7712,7712],"mapped",[7713]],[[7713,7713],"valid"],[[7714,7714],"mapped",[7715]],[[7715,7715],"valid"],[[7716,7716],"mapped",[7717]],[[7717,7717],"valid"],[[7718,7718],"mapped",[7719]],[[7719,7719],"valid"],[[7720,7720],"mapped",[7721]],[[7721,7721],"valid"],[[7722,7722],"mapped",[7723]],[[7723,7723],"valid"],[[7724,7724],"mapped",[7725]],[[7725,7725],"valid"],[[7726,7726],"mapped",[7727]],[[7727,7727],"valid"],[[7728,7728],"mapped",[7729]],[[7729,7729],"valid"],[[7730,7730],"mapped",[7731]],[[7731,7731],"valid"],[[7732,7732],"mapped",[7733]],[[7733,7733],"valid"],[[7734,7734],"mapped",[7735]],[[7735,7735],"valid"],[[7736,7736],"mapped",[7737]],[[7737,7737],"valid"],[[7738,7738],"mapped",[7739]],[[7739,7739],"valid"],[[7740,7740],"mapped",[7741]],[[7741,7741],"valid"],[[7742,7742],"mapped",[7743]],[[7743,7743],"valid"],[[7744,7744],"mapped",[7745]],[[7745,7745],"valid"],[[7746,7746],"mapped",[7747]],[[7747,7747],"valid"],[[7748,7748],"mapped",[7749]],[[7749,7749],"valid"],[[7750,7750],"mapped",[7751]],[[7751,7751],"valid"],[[7752,7752],"mapped",[7753]],[[7753,7753],"valid"],[[7754,7754],"mapped",[7755]],[[7755,7755],"valid"],[[7756,7756],"mapped",[7757]],[[7757,7757],"valid"],[[7758,7758],"mapped",[7759]],[[7759,7759],"valid"],[[7760,7760],"mapped",[7761]],[[7761,7761],"valid"],[[7762,7762],"mapped",[7763]],[[7763,7763],"valid"],[[7764,7764],"mapped",[7765]],[[7765,7765],"valid"],[[7766,7766],"mapped",[7767]],[[7767,7767],"valid"],[[7768,7768],"mapped",[7769]],[[7769,7769],"valid"],[[7770,7770],"mapped",[7771]],[[7771,7771],"valid"],[[7772,7772],"mapped",[7773]],[[7773,7773],"valid"],[[7774,7774],"mapped",[7775]],[[7775,7775],"valid"],[[7776,7776],"mapped",[7777]],[[7777,7777],"valid"],[[7778,7778],"mapped",[7779]],[[7779,7779],"valid"],[[7780,7780],"mapped",[7781]],[[7781,7781],"valid"],[[7782,7782],"mapped",[7783]],[[7783,7783],"valid"],[[7784,7784],"mapped",[7785]],[[7785,7785],"valid"],[[7786,7786],"mapped",[7787]],[[7787,7787],"valid"],[[7788,7788],"mapped",[7789]],[[7789,7789],"valid"],[[7790,7790],"mapped",[7791]],[[7791,7791],"valid"],[[7792,7792],"mapped",[7793]],[[7793,7793],"valid"],[[7794,7794],"mapped",[7795]],[[7795,7795],"valid"],[[7796,7796],"mapped",[7797]],[[7797,7797],"valid"],[[7798,7798],"mapped",[7799]],[[7799,7799],"valid"],[[7800,7800],"mapped",[7801]],[[7801,7801],"valid"],[[7802,7802],"mapped",[7803]],[[7803,7803],"valid"],[[7804,7804],"mapped",[7805]],[[7805,7805],"valid"],[[7806,7806],"mapped",[7807]],[[7807,7807],"valid"],[[7808,7808],"mapped",[7809]],[[7809,7809],"valid"],[[7810,7810],"mapped",[7811]],[[7811,7811],"valid"],[[7812,7812],"mapped",[7813]],[[7813,7813],"valid"],[[7814,7814],"mapped",[7815]],[[7815,7815],"valid"],[[7816,7816],"mapped",[7817]],[[7817,7817],"valid"],[[7818,7818],"mapped",[7819]],[[7819,7819],"valid"],[[7820,7820],"mapped",[7821]],[[7821,7821],"valid"],[[7822,7822],"mapped",[7823]],[[7823,7823],"valid"],[[7824,7824],"mapped",[7825]],[[7825,7825],"valid"],[[7826,7826],"mapped",[7827]],[[7827,7827],"valid"],[[7828,7828],"mapped",[7829]],[[7829,7833],"valid"],[[7834,7834],"mapped",[97,702]],[[7835,7835],"mapped",[7777]],[[7836,7837],"valid"],[[7838,7838],"mapped",[115,115]],[[7839,7839],"valid"],[[7840,7840],"mapped",[7841]],[[7841,7841],"valid"],[[7842,7842],"mapped",[7843]],[[7843,7843],"valid"],[[7844,7844],"mapped",[7845]],[[7845,7845],"valid"],[[7846,7846],"mapped",[7847]],[[7847,7847],"valid"],[[7848,7848],"mapped",[7849]],[[7849,7849],"valid"],[[7850,7850],"mapped",[7851]],[[7851,7851],"valid"],[[7852,7852],"mapped",[7853]],[[7853,7853],"valid"],[[7854,7854],"mapped",[7855]],[[7855,7855],"valid"],[[7856,7856],"mapped",[7857]],[[7857,7857],"valid"],[[7858,7858],"mapped",[7859]],[[7859,7859],"valid"],[[7860,7860],"mapped",[7861]],[[7861,7861],"valid"],[[7862,7862],"mapped",[7863]],[[7863,7863],"valid"],[[7864,7864],"mapped",[7865]],[[7865,7865],"valid"],[[7866,7866],"mapped",[7867]],[[7867,7867],"valid"],[[7868,7868],"mapped",[7869]],[[7869,7869],"valid"],[[7870,7870],"mapped",[7871]],[[7871,7871],"valid"],[[7872,7872],"mapped",[7873]],[[7873,7873],"valid"],[[7874,7874],"mapped",[7875]],[[7875,7875],"valid"],[[7876,7876],"mapped",[7877]],[[7877,7877],"valid"],[[7878,7878],"mapped",[7879]],[[7879,7879],"valid"],[[7880,7880],"mapped",[7881]],[[7881,7881],"valid"],[[7882,7882],"mapped",[7883]],[[7883,7883],"valid"],[[7884,7884],"mapped",[7885]],[[7885,7885],"valid"],[[7886,7886],"mapped",[7887]],[[7887,7887],"valid"],[[7888,7888],"mapped",[7889]],[[7889,7889],"valid"],[[7890,7890],"mapped",[7891]],[[7891,7891],"valid"],[[7892,7892],"mapped",[7893]],[[7893,7893],"valid"],[[7894,7894],"mapped",[7895]],[[7895,7895],"valid"],[[7896,7896],"mapped",[7897]],[[7897,7897],"valid"],[[7898,7898],"mapped",[7899]],[[7899,7899],"valid"],[[7900,7900],"mapped",[7901]],[[7901,7901],"valid"],[[7902,7902],"mapped",[7903]],[[7903,7903],"valid"],[[7904,7904],"mapped",[7905]],[[7905,7905],"valid"],[[7906,7906],"mapped",[7907]],[[7907,7907],"valid"],[[7908,7908],"mapped",[7909]],[[7909,7909],"valid"],[[7910,7910],"mapped",[7911]],[[7911,7911],"valid"],[[7912,7912],"mapped",[7913]],[[7913,7913],"valid"],[[7914,7914],"mapped",[7915]],[[7915,7915],"valid"],[[7916,7916],"mapped",[7917]],[[7917,7917],"valid"],[[7918,7918],"mapped",[7919]],[[7919,7919],"valid"],[[7920,7920],"mapped",[7921]],[[7921,7921],"valid"],[[7922,7922],"mapped",[7923]],[[7923,7923],"valid"],[[7924,7924],"mapped",[7925]],[[7925,7925],"valid"],[[7926,7926],"mapped",[7927]],[[7927,7927],"valid"],[[7928,7928],"mapped",[7929]],[[7929,7929],"valid"],[[7930,7930],"mapped",[7931]],[[7931,7931],"valid"],[[7932,7932],"mapped",[7933]],[[7933,7933],"valid"],[[7934,7934],"mapped",[7935]],[[7935,7935],"valid"],[[7936,7943],"valid"],[[7944,7944],"mapped",[7936]],[[7945,7945],"mapped",[7937]],[[7946,7946],"mapped",[7938]],[[7947,7947],"mapped",[7939]],[[7948,7948],"mapped",[7940]],[[7949,7949],"mapped",[7941]],[[7950,7950],"mapped",[7942]],[[7951,7951],"mapped",[7943]],[[7952,7957],"valid"],[[7958,7959],"disallowed"],[[7960,7960],"mapped",[7952]],[[7961,7961],"mapped",[7953]],[[7962,7962],"mapped",[7954]],[[7963,7963],"mapped",[7955]],[[7964,7964],"mapped",[7956]],[[7965,7965],"mapped",[7957]],[[7966,7967],"disallowed"],[[7968,7975],"valid"],[[7976,7976],"mapped",[7968]],[[7977,7977],"mapped",[7969]],[[7978,7978],"mapped",[7970]],[[7979,7979],"mapped",[7971]],[[7980,7980],"mapped",[7972]],[[7981,7981],"mapped",[7973]],[[7982,7982],"mapped",[7974]],[[7983,7983],"mapped",[7975]],[[7984,7991],"valid"],[[7992,7992],"mapped",[7984]],[[7993,7993],"mapped",[7985]],[[7994,7994],"mapped",[7986]],[[7995,7995],"mapped",[7987]],[[7996,7996],"mapped",[7988]],[[7997,7997],"mapped",[7989]],[[7998,7998],"mapped",[7990]],[[7999,7999],"mapped",[7991]],[[8000,8005],"valid"],[[8006,8007],"disallowed"],[[8008,8008],"mapped",[8000]],[[8009,8009],"mapped",[8001]],[[8010,8010],"mapped",[8002]],[[8011,8011],"mapped",[8003]],[[8012,8012],"mapped",[8004]],[[8013,8013],"mapped",[8005]],[[8014,8015],"disallowed"],[[8016,8023],"valid"],[[8024,8024],"disallowed"],[[8025,8025],"mapped",[8017]],[[8026,8026],"disallowed"],[[8027,8027],"mapped",[8019]],[[8028,8028],"disallowed"],[[8029,8029],"mapped",[8021]],[[8030,8030],"disallowed"],[[8031,8031],"mapped",[8023]],[[8032,8039],"valid"],[[8040,8040],"mapped",[8032]],[[8041,8041],"mapped",[8033]],[[8042,8042],"mapped",[8034]],[[8043,8043],"mapped",[8035]],[[8044,8044],"mapped",[8036]],[[8045,8045],"mapped",[8037]],[[8046,8046],"mapped",[8038]],[[8047,8047],"mapped",[8039]],[[8048,8048],"valid"],[[8049,8049],"mapped",[940]],[[8050,8050],"valid"],[[8051,8051],"mapped",[941]],[[8052,8052],"valid"],[[8053,8053],"mapped",[942]],[[8054,8054],"valid"],[[8055,8055],"mapped",[943]],[[8056,8056],"valid"],[[8057,8057],"mapped",[972]],[[8058,8058],"valid"],[[8059,8059],"mapped",[973]],[[8060,8060],"valid"],[[8061,8061],"mapped",[974]],[[8062,8063],"disallowed"],[[8064,8064],"mapped",[7936,953]],[[8065,8065],"mapped",[7937,953]],[[8066,8066],"mapped",[7938,953]],[[8067,8067],"mapped",[7939,953]],[[8068,8068],"mapped",[7940,953]],[[8069,8069],"mapped",[7941,953]],[[8070,8070],"mapped",[7942,953]],[[8071,8071],"mapped",[7943,953]],[[8072,8072],"mapped",[7936,953]],[[8073,8073],"mapped",[7937,953]],[[8074,8074],"mapped",[7938,953]],[[8075,8075],"mapped",[7939,953]],[[8076,8076],"mapped",[7940,953]],[[8077,8077],"mapped",[7941,953]],[[8078,8078],"mapped",[7942,953]],[[8079,8079],"mapped",[7943,953]],[[8080,8080],"mapped",[7968,953]],[[8081,8081],"mapped",[7969,953]],[[8082,8082],"mapped",[7970,953]],[[8083,8083],"mapped",[7971,953]],[[8084,8084],"mapped",[7972,953]],[[8085,8085],"mapped",[7973,953]],[[8086,8086],"mapped",[7974,953]],[[8087,8087],"mapped",[7975,953]],[[8088,8088],"mapped",[7968,953]],[[8089,8089],"mapped",[7969,953]],[[8090,8090],"mapped",[7970,953]],[[8091,8091],"mapped",[7971,953]],[[8092,8092],"mapped",[7972,953]],[[8093,8093],"mapped",[7973,953]],[[8094,8094],"mapped",[7974,953]],[[8095,8095],"mapped",[7975,953]],[[8096,8096],"mapped",[8032,953]],[[8097,8097],"mapped",[8033,953]],[[8098,8098],"mapped",[8034,953]],[[8099,8099],"mapped",[8035,953]],[[8100,8100],"mapped",[8036,953]],[[8101,8101],"mapped",[8037,953]],[[8102,8102],"mapped",[8038,953]],[[8103,8103],"mapped",[8039,953]],[[8104,8104],"mapped",[8032,953]],[[8105,8105],"mapped",[8033,953]],[[8106,8106],"mapped",[8034,953]],[[8107,8107],"mapped",[8035,953]],[[8108,8108],"mapped",[8036,953]],[[8109,8109],"mapped",[8037,953]],[[8110,8110],"mapped",[8038,953]],[[8111,8111],"mapped",[8039,953]],[[8112,8113],"valid"],[[8114,8114],"mapped",[8048,953]],[[8115,8115],"mapped",[945,953]],[[8116,8116],"mapped",[940,953]],[[8117,8117],"disallowed"],[[8118,8118],"valid"],[[8119,8119],"mapped",[8118,953]],[[8120,8120],"mapped",[8112]],[[8121,8121],"mapped",[8113]],[[8122,8122],"mapped",[8048]],[[8123,8123],"mapped",[940]],[[8124,8124],"mapped",[945,953]],[[8125,8125],"disallowed_STD3_mapped",[32,787]],[[8126,8126],"mapped",[953]],[[8127,8127],"disallowed_STD3_mapped",[32,787]],[[8128,8128],"disallowed_STD3_mapped",[32,834]],[[8129,8129],"disallowed_STD3_mapped",[32,776,834]],[[8130,8130],"mapped",[8052,953]],[[8131,8131],"mapped",[951,953]],[[8132,8132],"mapped",[942,953]],[[8133,8133],"disallowed"],[[8134,8134],"valid"],[[8135,8135],"mapped",[8134,953]],[[8136,8136],"mapped",[8050]],[[8137,8137],"mapped",[941]],[[8138,8138],"mapped",[8052]],[[8139,8139],"mapped",[942]],[[8140,8140],"mapped",[951,953]],[[8141,8141],"disallowed_STD3_mapped",[32,787,768]],[[8142,8142],"disallowed_STD3_mapped",[32,787,769]],[[8143,8143],"disallowed_STD3_mapped",[32,787,834]],[[8144,8146],"valid"],[[8147,8147],"mapped",[912]],[[8148,8149],"disallowed"],[[8150,8151],"valid"],[[8152,8152],"mapped",[8144]],[[8153,8153],"mapped",[8145]],[[8154,8154],"mapped",[8054]],[[8155,8155],"mapped",[943]],[[8156,8156],"disallowed"],[[8157,8157],"disallowed_STD3_mapped",[32,788,768]],[[8158,8158],"disallowed_STD3_mapped",[32,788,769]],[[8159,8159],"disallowed_STD3_mapped",[32,788,834]],[[8160,8162],"valid"],[[8163,8163],"mapped",[944]],[[8164,8167],"valid"],[[8168,8168],"mapped",[8160]],[[8169,8169],"mapped",[8161]],[[8170,8170],"mapped",[8058]],[[8171,8171],"mapped",[973]],[[8172,8172],"mapped",[8165]],[[8173,8173],"disallowed_STD3_mapped",[32,776,768]],[[8174,8174],"disallowed_STD3_mapped",[32,776,769]],[[8175,8175],"disallowed_STD3_mapped",[96]],[[8176,8177],"disallowed"],[[8178,8178],"mapped",[8060,953]],[[8179,8179],"mapped",[969,953]],[[8180,8180],"mapped",[974,953]],[[8181,8181],"disallowed"],[[8182,8182],"valid"],[[8183,8183],"mapped",[8182,953]],[[8184,8184],"mapped",[8056]],[[8185,8185],"mapped",[972]],[[8186,8186],"mapped",[8060]],[[8187,8187],"mapped",[974]],[[8188,8188],"mapped",[969,953]],[[8189,8189],"disallowed_STD3_mapped",[32,769]],[[8190,8190],"disallowed_STD3_mapped",[32,788]],[[8191,8191],"disallowed"],[[8192,8202],"disallowed_STD3_mapped",[32]],[[8203,8203],"ignored"],[[8204,8205],"deviation",[]],[[8206,8207],"disallowed"],[[8208,8208],"valid",[],"NV8"],[[8209,8209],"mapped",[8208]],[[8210,8214],"valid",[],"NV8"],[[8215,8215],"disallowed_STD3_mapped",[32,819]],[[8216,8227],"valid",[],"NV8"],[[8228,8230],"disallowed"],[[8231,8231],"valid",[],"NV8"],[[8232,8238],"disallowed"],[[8239,8239],"disallowed_STD3_mapped",[32]],[[8240,8242],"valid",[],"NV8"],[[8243,8243],"mapped",[8242,8242]],[[8244,8244],"mapped",[8242,8242,8242]],[[8245,8245],"valid",[],"NV8"],[[8246,8246],"mapped",[8245,8245]],[[8247,8247],"mapped",[8245,8245,8245]],[[8248,8251],"valid",[],"NV8"],[[8252,8252],"disallowed_STD3_mapped",[33,33]],[[8253,8253],"valid",[],"NV8"],[[8254,8254],"disallowed_STD3_mapped",[32,773]],[[8255,8262],"valid",[],"NV8"],[[8263,8263],"disallowed_STD3_mapped",[63,63]],[[8264,8264],"disallowed_STD3_mapped",[63,33]],[[8265,8265],"disallowed_STD3_mapped",[33,63]],[[8266,8269],"valid",[],"NV8"],[[8270,8274],"valid",[],"NV8"],[[8275,8276],"valid",[],"NV8"],[[8277,8278],"valid",[],"NV8"],[[8279,8279],"mapped",[8242,8242,8242,8242]],[[8280,8286],"valid",[],"NV8"],[[8287,8287],"disallowed_STD3_mapped",[32]],[[8288,8288],"ignored"],[[8289,8291],"disallowed"],[[8292,8292],"ignored"],[[8293,8293],"disallowed"],[[8294,8297],"disallowed"],[[8298,8303],"disallowed"],[[8304,8304],"mapped",[48]],[[8305,8305],"mapped",[105]],[[8306,8307],"disallowed"],[[8308,8308],"mapped",[52]],[[8309,8309],"mapped",[53]],[[8310,8310],"mapped",[54]],[[8311,8311],"mapped",[55]],[[8312,8312],"mapped",[56]],[[8313,8313],"mapped",[57]],[[8314,8314],"disallowed_STD3_mapped",[43]],[[8315,8315],"mapped",[8722]],[[8316,8316],"disallowed_STD3_mapped",[61]],[[8317,8317],"disallowed_STD3_mapped",[40]],[[8318,8318],"disallowed_STD3_mapped",[41]],[[8319,8319],"mapped",[110]],[[8320,8320],"mapped",[48]],[[8321,8321],"mapped",[49]],[[8322,8322],"mapped",[50]],[[8323,8323],"mapped",[51]],[[8324,8324],"mapped",[52]],[[8325,8325],"mapped",[53]],[[8326,8326],"mapped",[54]],[[8327,8327],"mapped",[55]],[[8328,8328],"mapped",[56]],[[8329,8329],"mapped",[57]],[[8330,8330],"disallowed_STD3_mapped",[43]],[[8331,8331],"mapped",[8722]],[[8332,8332],"disallowed_STD3_mapped",[61]],[[8333,8333],"disallowed_STD3_mapped",[40]],[[8334,8334],"disallowed_STD3_mapped",[41]],[[8335,8335],"disallowed"],[[8336,8336],"mapped",[97]],[[8337,8337],"mapped",[101]],[[8338,8338],"mapped",[111]],[[8339,8339],"mapped",[120]],[[8340,8340],"mapped",[601]],[[8341,8341],"mapped",[104]],[[8342,8342],"mapped",[107]],[[8343,8343],"mapped",[108]],[[8344,8344],"mapped",[109]],[[8345,8345],"mapped",[110]],[[8346,8346],"mapped",[112]],[[8347,8347],"mapped",[115]],[[8348,8348],"mapped",[116]],[[8349,8351],"disallowed"],[[8352,8359],"valid",[],"NV8"],[[8360,8360],"mapped",[114,115]],[[8361,8362],"valid",[],"NV8"],[[8363,8363],"valid",[],"NV8"],[[8364,8364],"valid",[],"NV8"],[[8365,8367],"valid",[],"NV8"],[[8368,8369],"valid",[],"NV8"],[[8370,8373],"valid",[],"NV8"],[[8374,8376],"valid",[],"NV8"],[[8377,8377],"valid",[],"NV8"],[[8378,8378],"valid",[],"NV8"],[[8379,8381],"valid",[],"NV8"],[[8382,8382],"valid",[],"NV8"],[[8383,8399],"disallowed"],[[8400,8417],"valid",[],"NV8"],[[8418,8419],"valid",[],"NV8"],[[8420,8426],"valid",[],"NV8"],[[8427,8427],"valid",[],"NV8"],[[8428,8431],"valid",[],"NV8"],[[8432,8432],"valid",[],"NV8"],[[8433,8447],"disallowed"],[[8448,8448],"disallowed_STD3_mapped",[97,47,99]],[[8449,8449],"disallowed_STD3_mapped",[97,47,115]],[[8450,8450],"mapped",[99]],[[8451,8451],"mapped",[176,99]],[[8452,8452],"valid",[],"NV8"],[[8453,8453],"disallowed_STD3_mapped",[99,47,111]],[[8454,8454],"disallowed_STD3_mapped",[99,47,117]],[[8455,8455],"mapped",[603]],[[8456,8456],"valid",[],"NV8"],[[8457,8457],"mapped",[176,102]],[[8458,8458],"mapped",[103]],[[8459,8462],"mapped",[104]],[[8463,8463],"mapped",[295]],[[8464,8465],"mapped",[105]],[[8466,8467],"mapped",[108]],[[8468,8468],"valid",[],"NV8"],[[8469,8469],"mapped",[110]],[[8470,8470],"mapped",[110,111]],[[8471,8472],"valid",[],"NV8"],[[8473,8473],"mapped",[112]],[[8474,8474],"mapped",[113]],[[8475,8477],"mapped",[114]],[[8478,8479],"valid",[],"NV8"],[[8480,8480],"mapped",[115,109]],[[8481,8481],"mapped",[116,101,108]],[[8482,8482],"mapped",[116,109]],[[8483,8483],"valid",[],"NV8"],[[8484,8484],"mapped",[122]],[[8485,8485],"valid",[],"NV8"],[[8486,8486],"mapped",[969]],[[8487,8487],"valid",[],"NV8"],[[8488,8488],"mapped",[122]],[[8489,8489],"valid",[],"NV8"],[[8490,8490],"mapped",[107]],[[8491,8491],"mapped",[229]],[[8492,8492],"mapped",[98]],[[8493,8493],"mapped",[99]],[[8494,8494],"valid",[],"NV8"],[[8495,8496],"mapped",[101]],[[8497,8497],"mapped",[102]],[[8498,8498],"disallowed"],[[8499,8499],"mapped",[109]],[[8500,8500],"mapped",[111]],[[8501,8501],"mapped",[1488]],[[8502,8502],"mapped",[1489]],[[8503,8503],"mapped",[1490]],[[8504,8504],"mapped",[1491]],[[8505,8505],"mapped",[105]],[[8506,8506],"valid",[],"NV8"],[[8507,8507],"mapped",[102,97,120]],[[8508,8508],"mapped",[960]],[[8509,8510],"mapped",[947]],[[8511,8511],"mapped",[960]],[[8512,8512],"mapped",[8721]],[[8513,8516],"valid",[],"NV8"],[[8517,8518],"mapped",[100]],[[8519,8519],"mapped",[101]],[[8520,8520],"mapped",[105]],[[8521,8521],"mapped",[106]],[[8522,8523],"valid",[],"NV8"],[[8524,8524],"valid",[],"NV8"],[[8525,8525],"valid",[],"NV8"],[[8526,8526],"valid"],[[8527,8527],"valid",[],"NV8"],[[8528,8528],"mapped",[49,8260,55]],[[8529,8529],"mapped",[49,8260,57]],[[8530,8530],"mapped",[49,8260,49,48]],[[8531,8531],"mapped",[49,8260,51]],[[8532,8532],"mapped",[50,8260,51]],[[8533,8533],"mapped",[49,8260,53]],[[8534,8534],"mapped",[50,8260,53]],[[8535,8535],"mapped",[51,8260,53]],[[8536,8536],"mapped",[52,8260,53]],[[8537,8537],"mapped",[49,8260,54]],[[8538,8538],"mapped",[53,8260,54]],[[8539,8539],"mapped",[49,8260,56]],[[8540,8540],"mapped",[51,8260,56]],[[8541,8541],"mapped",[53,8260,56]],[[8542,8542],"mapped",[55,8260,56]],[[8543,8543],"mapped",[49,8260]],[[8544,8544],"mapped",[105]],[[8545,8545],"mapped",[105,105]],[[8546,8546],"mapped",[105,105,105]],[[8547,8547],"mapped",[105,118]],[[8548,8548],"mapped",[118]],[[8549,8549],"mapped",[118,105]],[[8550,8550],"mapped",[118,105,105]],[[8551,8551],"mapped",[118,105,105,105]],[[8552,8552],"mapped",[105,120]],[[8553,8553],"mapped",[120]],[[8554,8554],"mapped",[120,105]],[[8555,8555],"mapped",[120,105,105]],[[8556,8556],"mapped",[108]],[[8557,8557],"mapped",[99]],[[8558,8558],"mapped",[100]],[[8559,8559],"mapped",[109]],[[8560,8560],"mapped",[105]],[[8561,8561],"mapped",[105,105]],[[8562,8562],"mapped",[105,105,105]],[[8563,8563],"mapped",[105,118]],[[8564,8564],"mapped",[118]],[[8565,8565],"mapped",[118,105]],[[8566,8566],"mapped",[118,105,105]],[[8567,8567],"mapped",[118,105,105,105]],[[8568,8568],"mapped",[105,120]],[[8569,8569],"mapped",[120]],[[8570,8570],"mapped",[120,105]],[[8571,8571],"mapped",[120,105,105]],[[8572,8572],"mapped",[108]],[[8573,8573],"mapped",[99]],[[8574,8574],"mapped",[100]],[[8575,8575],"mapped",[109]],[[8576,8578],"valid",[],"NV8"],[[8579,8579],"disallowed"],[[8580,8580],"valid"],[[8581,8584],"valid",[],"NV8"],[[8585,8585],"mapped",[48,8260,51]],[[8586,8587],"valid",[],"NV8"],[[8588,8591],"disallowed"],[[8592,8682],"valid",[],"NV8"],[[8683,8691],"valid",[],"NV8"],[[8692,8703],"valid",[],"NV8"],[[8704,8747],"valid",[],"NV8"],[[8748,8748],"mapped",[8747,8747]],[[8749,8749],"mapped",[8747,8747,8747]],[[8750,8750],"valid",[],"NV8"],[[8751,8751],"mapped",[8750,8750]],[[8752,8752],"mapped",[8750,8750,8750]],[[8753,8799],"valid",[],"NV8"],[[8800,8800],"disallowed_STD3_valid"],[[8801,8813],"valid",[],"NV8"],[[8814,8815],"disallowed_STD3_valid"],[[8816,8945],"valid",[],"NV8"],[[8946,8959],"valid",[],"NV8"],[[8960,8960],"valid",[],"NV8"],[[8961,8961],"valid",[],"NV8"],[[8962,9000],"valid",[],"NV8"],[[9001,9001],"mapped",[12296]],[[9002,9002],"mapped",[12297]],[[9003,9082],"valid",[],"NV8"],[[9083,9083],"valid",[],"NV8"],[[9084,9084],"valid",[],"NV8"],[[9085,9114],"valid",[],"NV8"],[[9115,9166],"valid",[],"NV8"],[[9167,9168],"valid",[],"NV8"],[[9169,9179],"valid",[],"NV8"],[[9180,9191],"valid",[],"NV8"],[[9192,9192],"valid",[],"NV8"],[[9193,9203],"valid",[],"NV8"],[[9204,9210],"valid",[],"NV8"],[[9211,9215],"disallowed"],[[9216,9252],"valid",[],"NV8"],[[9253,9254],"valid",[],"NV8"],[[9255,9279],"disallowed"],[[9280,9290],"valid",[],"NV8"],[[9291,9311],"disallowed"],[[9312,9312],"mapped",[49]],[[9313,9313],"mapped",[50]],[[9314,9314],"mapped",[51]],[[9315,9315],"mapped",[52]],[[9316,9316],"mapped",[53]],[[9317,9317],"mapped",[54]],[[9318,9318],"mapped",[55]],[[9319,9319],"mapped",[56]],[[9320,9320],"mapped",[57]],[[9321,9321],"mapped",[49,48]],[[9322,9322],"mapped",[49,49]],[[9323,9323],"mapped",[49,50]],[[9324,9324],"mapped",[49,51]],[[9325,9325],"mapped",[49,52]],[[9326,9326],"mapped",[49,53]],[[9327,9327],"mapped",[49,54]],[[9328,9328],"mapped",[49,55]],[[9329,9329],"mapped",[49,56]],[[9330,9330],"mapped",[49,57]],[[9331,9331],"mapped",[50,48]],[[9332,9332],"disallowed_STD3_mapped",[40,49,41]],[[9333,9333],"disallowed_STD3_mapped",[40,50,41]],[[9334,9334],"disallowed_STD3_mapped",[40,51,41]],[[9335,9335],"disallowed_STD3_mapped",[40,52,41]],[[9336,9336],"disallowed_STD3_mapped",[40,53,41]],[[9337,9337],"disallowed_STD3_mapped",[40,54,41]],[[9338,9338],"disallowed_STD3_mapped",[40,55,41]],[[9339,9339],"disallowed_STD3_mapped",[40,56,41]],[[9340,9340],"disallowed_STD3_mapped",[40,57,41]],[[9341,9341],"disallowed_STD3_mapped",[40,49,48,41]],[[9342,9342],"disallowed_STD3_mapped",[40,49,49,41]],[[9343,9343],"disallowed_STD3_mapped",[40,49,50,41]],[[9344,9344],"disallowed_STD3_mapped",[40,49,51,41]],[[9345,9345],"disallowed_STD3_mapped",[40,49,52,41]],[[9346,9346],"disallowed_STD3_mapped",[40,49,53,41]],[[9347,9347],"disallowed_STD3_mapped",[40,49,54,41]],[[9348,9348],"disallowed_STD3_mapped",[40,49,55,41]],[[9349,9349],"disallowed_STD3_mapped",[40,49,56,41]],[[9350,9350],"disallowed_STD3_mapped",[40,49,57,41]],[[9351,9351],"disallowed_STD3_mapped",[40,50,48,41]],[[9352,9371],"disallowed"],[[9372,9372],"disallowed_STD3_mapped",[40,97,41]],[[9373,9373],"disallowed_STD3_mapped",[40,98,41]],[[9374,9374],"disallowed_STD3_mapped",[40,99,41]],[[9375,9375],"disallowed_STD3_mapped",[40,100,41]],[[9376,9376],"disallowed_STD3_mapped",[40,101,41]],[[9377,9377],"disallowed_STD3_mapped",[40,102,41]],[[9378,9378],"disallowed_STD3_mapped",[40,103,41]],[[9379,9379],"disallowed_STD3_mapped",[40,104,41]],[[9380,9380],"disallowed_STD3_mapped",[40,105,41]],[[9381,9381],"disallowed_STD3_mapped",[40,106,41]],[[9382,9382],"disallowed_STD3_mapped",[40,107,41]],[[9383,9383],"disallowed_STD3_mapped",[40,108,41]],[[9384,9384],"disallowed_STD3_mapped",[40,109,41]],[[9385,9385],"disallowed_STD3_mapped",[40,110,41]],[[9386,9386],"disallowed_STD3_mapped",[40,111,41]],[[9387,9387],"disallowed_STD3_mapped",[40,112,41]],[[9388,9388],"disallowed_STD3_mapped",[40,113,41]],[[9389,9389],"disallowed_STD3_mapped",[40,114,41]],[[9390,9390],"disallowed_STD3_mapped",[40,115,41]],[[9391,9391],"disallowed_STD3_mapped",[40,116,41]],[[9392,9392],"disallowed_STD3_mapped",[40,117,41]],[[9393,9393],"disallowed_STD3_mapped",[40,118,41]],[[9394,9394],"disallowed_STD3_mapped",[40,119,41]],[[9395,9395],"disallowed_STD3_mapped",[40,120,41]],[[9396,9396],"disallowed_STD3_mapped",[40,121,41]],[[9397,9397],"disallowed_STD3_mapped",[40,122,41]],[[9398,9398],"mapped",[97]],[[9399,9399],"mapped",[98]],[[9400,9400],"mapped",[99]],[[9401,9401],"mapped",[100]],[[9402,9402],"mapped",[101]],[[9403,9403],"mapped",[102]],[[9404,9404],"mapped",[103]],[[9405,9405],"mapped",[104]],[[9406,9406],"mapped",[105]],[[9407,9407],"mapped",[106]],[[9408,9408],"mapped",[107]],[[9409,9409],"mapped",[108]],[[9410,9410],"mapped",[109]],[[9411,9411],"mapped",[110]],[[9412,9412],"mapped",[111]],[[9413,9413],"mapped",[112]],[[9414,9414],"mapped",[113]],[[9415,9415],"mapped",[114]],[[9416,9416],"mapped",[115]],[[9417,9417],"mapped",[116]],[[9418,9418],"mapped",[117]],[[9419,9419],"mapped",[118]],[[9420,9420],"mapped",[119]],[[9421,9421],"mapped",[120]],[[9422,9422],"mapped",[121]],[[9423,9423],"mapped",[122]],[[9424,9424],"mapped",[97]],[[9425,9425],"mapped",[98]],[[9426,9426],"mapped",[99]],[[9427,9427],"mapped",[100]],[[9428,9428],"mapped",[101]],[[9429,9429],"mapped",[102]],[[9430,9430],"mapped",[103]],[[9431,9431],"mapped",[104]],[[9432,9432],"mapped",[105]],[[9433,9433],"mapped",[106]],[[9434,9434],"mapped",[107]],[[9435,9435],"mapped",[108]],[[9436,9436],"mapped",[109]],[[9437,9437],"mapped",[110]],[[9438,9438],"mapped",[111]],[[9439,9439],"mapped",[112]],[[9440,9440],"mapped",[113]],[[9441,9441],"mapped",[114]],[[9442,9442],"mapped",[115]],[[9443,9443],"mapped",[116]],[[9444,9444],"mapped",[117]],[[9445,9445],"mapped",[118]],[[9446,9446],"mapped",[119]],[[9447,9447],"mapped",[120]],[[9448,9448],"mapped",[121]],[[9449,9449],"mapped",[122]],[[9450,9450],"mapped",[48]],[[9451,9470],"valid",[],"NV8"],[[9471,9471],"valid",[],"NV8"],[[9472,9621],"valid",[],"NV8"],[[9622,9631],"valid",[],"NV8"],[[9632,9711],"valid",[],"NV8"],[[9712,9719],"valid",[],"NV8"],[[9720,9727],"valid",[],"NV8"],[[9728,9747],"valid",[],"NV8"],[[9748,9749],"valid",[],"NV8"],[[9750,9751],"valid",[],"NV8"],[[9752,9752],"valid",[],"NV8"],[[9753,9753],"valid",[],"NV8"],[[9754,9839],"valid",[],"NV8"],[[9840,9841],"valid",[],"NV8"],[[9842,9853],"valid",[],"NV8"],[[9854,9855],"valid",[],"NV8"],[[9856,9865],"valid",[],"NV8"],[[9866,9873],"valid",[],"NV8"],[[9874,9884],"valid",[],"NV8"],[[9885,9885],"valid",[],"NV8"],[[9886,9887],"valid",[],"NV8"],[[9888,9889],"valid",[],"NV8"],[[9890,9905],"valid",[],"NV8"],[[9906,9906],"valid",[],"NV8"],[[9907,9916],"valid",[],"NV8"],[[9917,9919],"valid",[],"NV8"],[[9920,9923],"valid",[],"NV8"],[[9924,9933],"valid",[],"NV8"],[[9934,9934],"valid",[],"NV8"],[[9935,9953],"valid",[],"NV8"],[[9954,9954],"valid",[],"NV8"],[[9955,9955],"valid",[],"NV8"],[[9956,9959],"valid",[],"NV8"],[[9960,9983],"valid",[],"NV8"],[[9984,9984],"valid",[],"NV8"],[[9985,9988],"valid",[],"NV8"],[[9989,9989],"valid",[],"NV8"],[[9990,9993],"valid",[],"NV8"],[[9994,9995],"valid",[],"NV8"],[[9996,10023],"valid",[],"NV8"],[[10024,10024],"valid",[],"NV8"],[[10025,10059],"valid",[],"NV8"],[[10060,10060],"valid",[],"NV8"],[[10061,10061],"valid",[],"NV8"],[[10062,10062],"valid",[],"NV8"],[[10063,10066],"valid",[],"NV8"],[[10067,10069],"valid",[],"NV8"],[[10070,10070],"valid",[],"NV8"],[[10071,10071],"valid",[],"NV8"],[[10072,10078],"valid",[],"NV8"],[[10079,10080],"valid",[],"NV8"],[[10081,10087],"valid",[],"NV8"],[[10088,10101],"valid",[],"NV8"],[[10102,10132],"valid",[],"NV8"],[[10133,10135],"valid",[],"NV8"],[[10136,10159],"valid",[],"NV8"],[[10160,10160],"valid",[],"NV8"],[[10161,10174],"valid",[],"NV8"],[[10175,10175],"valid",[],"NV8"],[[10176,10182],"valid",[],"NV8"],[[10183,10186],"valid",[],"NV8"],[[10187,10187],"valid",[],"NV8"],[[10188,10188],"valid",[],"NV8"],[[10189,10189],"valid",[],"NV8"],[[10190,10191],"valid",[],"NV8"],[[10192,10219],"valid",[],"NV8"],[[10220,10223],"valid",[],"NV8"],[[10224,10239],"valid",[],"NV8"],[[10240,10495],"valid",[],"NV8"],[[10496,10763],"valid",[],"NV8"],[[10764,10764],"mapped",[8747,8747,8747,8747]],[[10765,10867],"valid",[],"NV8"],[[10868,10868],"disallowed_STD3_mapped",[58,58,61]],[[10869,10869],"disallowed_STD3_mapped",[61,61]],[[10870,10870],"disallowed_STD3_mapped",[61,61,61]],[[10871,10971],"valid",[],"NV8"],[[10972,10972],"mapped",[10973,824]],[[10973,11007],"valid",[],"NV8"],[[11008,11021],"valid",[],"NV8"],[[11022,11027],"valid",[],"NV8"],[[11028,11034],"valid",[],"NV8"],[[11035,11039],"valid",[],"NV8"],[[11040,11043],"valid",[],"NV8"],[[11044,11084],"valid",[],"NV8"],[[11085,11087],"valid",[],"NV8"],[[11088,11092],"valid",[],"NV8"],[[11093,11097],"valid",[],"NV8"],[[11098,11123],"valid",[],"NV8"],[[11124,11125],"disallowed"],[[11126,11157],"valid",[],"NV8"],[[11158,11159],"disallowed"],[[11160,11193],"valid",[],"NV8"],[[11194,11196],"disallowed"],[[11197,11208],"valid",[],"NV8"],[[11209,11209],"disallowed"],[[11210,11217],"valid",[],"NV8"],[[11218,11243],"disallowed"],[[11244,11247],"valid",[],"NV8"],[[11248,11263],"disallowed"],[[11264,11264],"mapped",[11312]],[[11265,11265],"mapped",[11313]],[[11266,11266],"mapped",[11314]],[[11267,11267],"mapped",[11315]],[[11268,11268],"mapped",[11316]],[[11269,11269],"mapped",[11317]],[[11270,11270],"mapped",[11318]],[[11271,11271],"mapped",[11319]],[[11272,11272],"mapped",[11320]],[[11273,11273],"mapped",[11321]],[[11274,11274],"mapped",[11322]],[[11275,11275],"mapped",[11323]],[[11276,11276],"mapped",[11324]],[[11277,11277],"mapped",[11325]],[[11278,11278],"mapped",[11326]],[[11279,11279],"mapped",[11327]],[[11280,11280],"mapped",[11328]],[[11281,11281],"mapped",[11329]],[[11282,11282],"mapped",[11330]],[[11283,11283],"mapped",[11331]],[[11284,11284],"mapped",[11332]],[[11285,11285],"mapped",[11333]],[[11286,11286],"mapped",[11334]],[[11287,11287],"mapped",[11335]],[[11288,11288],"mapped",[11336]],[[11289,11289],"mapped",[11337]],[[11290,11290],"mapped",[11338]],[[11291,11291],"mapped",[11339]],[[11292,11292],"mapped",[11340]],[[11293,11293],"mapped",[11341]],[[11294,11294],"mapped",[11342]],[[11295,11295],"mapped",[11343]],[[11296,11296],"mapped",[11344]],[[11297,11297],"mapped",[11345]],[[11298,11298],"mapped",[11346]],[[11299,11299],"mapped",[11347]],[[11300,11300],"mapped",[11348]],[[11301,11301],"mapped",[11349]],[[11302,11302],"mapped",[11350]],[[11303,11303],"mapped",[11351]],[[11304,11304],"mapped",[11352]],[[11305,11305],"mapped",[11353]],[[11306,11306],"mapped",[11354]],[[11307,11307],"mapped",[11355]],[[11308,11308],"mapped",[11356]],[[11309,11309],"mapped",[11357]],[[11310,11310],"mapped",[11358]],[[11311,11311],"disallowed"],[[11312,11358],"valid"],[[11359,11359],"disallowed"],[[11360,11360],"mapped",[11361]],[[11361,11361],"valid"],[[11362,11362],"mapped",[619]],[[11363,11363],"mapped",[7549]],[[11364,11364],"mapped",[637]],[[11365,11366],"valid"],[[11367,11367],"mapped",[11368]],[[11368,11368],"valid"],[[11369,11369],"mapped",[11370]],[[11370,11370],"valid"],[[11371,11371],"mapped",[11372]],[[11372,11372],"valid"],[[11373,11373],"mapped",[593]],[[11374,11374],"mapped",[625]],[[11375,11375],"mapped",[592]],[[11376,11376],"mapped",[594]],[[11377,11377],"valid"],[[11378,11378],"mapped",[11379]],[[11379,11379],"valid"],[[11380,11380],"valid"],[[11381,11381],"mapped",[11382]],[[11382,11383],"valid"],[[11384,11387],"valid"],[[11388,11388],"mapped",[106]],[[11389,11389],"mapped",[118]],[[11390,11390],"mapped",[575]],[[11391,11391],"mapped",[576]],[[11392,11392],"mapped",[11393]],[[11393,11393],"valid"],[[11394,11394],"mapped",[11395]],[[11395,11395],"valid"],[[11396,11396],"mapped",[11397]],[[11397,11397],"valid"],[[11398,11398],"mapped",[11399]],[[11399,11399],"valid"],[[11400,11400],"mapped",[11401]],[[11401,11401],"valid"],[[11402,11402],"mapped",[11403]],[[11403,11403],"valid"],[[11404,11404],"mapped",[11405]],[[11405,11405],"valid"],[[11406,11406],"mapped",[11407]],[[11407,11407],"valid"],[[11408,11408],"mapped",[11409]],[[11409,11409],"valid"],[[11410,11410],"mapped",[11411]],[[11411,11411],"valid"],[[11412,11412],"mapped",[11413]],[[11413,11413],"valid"],[[11414,11414],"mapped",[11415]],[[11415,11415],"valid"],[[11416,11416],"mapped",[11417]],[[11417,11417],"valid"],[[11418,11418],"mapped",[11419]],[[11419,11419],"valid"],[[11420,11420],"mapped",[11421]],[[11421,11421],"valid"],[[11422,11422],"mapped",[11423]],[[11423,11423],"valid"],[[11424,11424],"mapped",[11425]],[[11425,11425],"valid"],[[11426,11426],"mapped",[11427]],[[11427,11427],"valid"],[[11428,11428],"mapped",[11429]],[[11429,11429],"valid"],[[11430,11430],"mapped",[11431]],[[11431,11431],"valid"],[[11432,11432],"mapped",[11433]],[[11433,11433],"valid"],[[11434,11434],"mapped",[11435]],[[11435,11435],"valid"],[[11436,11436],"mapped",[11437]],[[11437,11437],"valid"],[[11438,11438],"mapped",[11439]],[[11439,11439],"valid"],[[11440,11440],"mapped",[11441]],[[11441,11441],"valid"],[[11442,11442],"mapped",[11443]],[[11443,11443],"valid"],[[11444,11444],"mapped",[11445]],[[11445,11445],"valid"],[[11446,11446],"mapped",[11447]],[[11447,11447],"valid"],[[11448,11448],"mapped",[11449]],[[11449,11449],"valid"],[[11450,11450],"mapped",[11451]],[[11451,11451],"valid"],[[11452,11452],"mapped",[11453]],[[11453,11453],"valid"],[[11454,11454],"mapped",[11455]],[[11455,11455],"valid"],[[11456,11456],"mapped",[11457]],[[11457,11457],"valid"],[[11458,11458],"mapped",[11459]],[[11459,11459],"valid"],[[11460,11460],"mapped",[11461]],[[11461,11461],"valid"],[[11462,11462],"mapped",[11463]],[[11463,11463],"valid"],[[11464,11464],"mapped",[11465]],[[11465,11465],"valid"],[[11466,11466],"mapped",[11467]],[[11467,11467],"valid"],[[11468,11468],"mapped",[11469]],[[11469,11469],"valid"],[[11470,11470],"mapped",[11471]],[[11471,11471],"valid"],[[11472,11472],"mapped",[11473]],[[11473,11473],"valid"],[[11474,11474],"mapped",[11475]],[[11475,11475],"valid"],[[11476,11476],"mapped",[11477]],[[11477,11477],"valid"],[[11478,11478],"mapped",[11479]],[[11479,11479],"valid"],[[11480,11480],"mapped",[11481]],[[11481,11481],"valid"],[[11482,11482],"mapped",[11483]],[[11483,11483],"valid"],[[11484,11484],"mapped",[11485]],[[11485,11485],"valid"],[[11486,11486],"mapped",[11487]],[[11487,11487],"valid"],[[11488,11488],"mapped",[11489]],[[11489,11489],"valid"],[[11490,11490],"mapped",[11491]],[[11491,11492],"valid"],[[11493,11498],"valid",[],"NV8"],[[11499,11499],"mapped",[11500]],[[11500,11500],"valid"],[[11501,11501],"mapped",[11502]],[[11502,11505],"valid"],[[11506,11506],"mapped",[11507]],[[11507,11507],"valid"],[[11508,11512],"disallowed"],[[11513,11519],"valid",[],"NV8"],[[11520,11557],"valid"],[[11558,11558],"disallowed"],[[11559,11559],"valid"],[[11560,11564],"disallowed"],[[11565,11565],"valid"],[[11566,11567],"disallowed"],[[11568,11621],"valid"],[[11622,11623],"valid"],[[11624,11630],"disallowed"],[[11631,11631],"mapped",[11617]],[[11632,11632],"valid",[],"NV8"],[[11633,11646],"disallowed"],[[11647,11647],"valid"],[[11648,11670],"valid"],[[11671,11679],"disallowed"],[[11680,11686],"valid"],[[11687,11687],"disallowed"],[[11688,11694],"valid"],[[11695,11695],"disallowed"],[[11696,11702],"valid"],[[11703,11703],"disallowed"],[[11704,11710],"valid"],[[11711,11711],"disallowed"],[[11712,11718],"valid"],[[11719,11719],"disallowed"],[[11720,11726],"valid"],[[11727,11727],"disallowed"],[[11728,11734],"valid"],[[11735,11735],"disallowed"],[[11736,11742],"valid"],[[11743,11743],"disallowed"],[[11744,11775],"valid"],[[11776,11799],"valid",[],"NV8"],[[11800,11803],"valid",[],"NV8"],[[11804,11805],"valid",[],"NV8"],[[11806,11822],"valid",[],"NV8"],[[11823,11823],"valid"],[[11824,11824],"valid",[],"NV8"],[[11825,11825],"valid",[],"NV8"],[[11826,11835],"valid",[],"NV8"],[[11836,11842],"valid",[],"NV8"],[[11843,11903],"disallowed"],[[11904,11929],"valid",[],"NV8"],[[11930,11930],"disallowed"],[[11931,11934],"valid",[],"NV8"],[[11935,11935],"mapped",[27597]],[[11936,12018],"valid",[],"NV8"],[[12019,12019],"mapped",[40863]],[[12020,12031],"disallowed"],[[12032,12032],"mapped",[19968]],[[12033,12033],"mapped",[20008]],[[12034,12034],"mapped",[20022]],[[12035,12035],"mapped",[20031]],[[12036,12036],"mapped",[20057]],[[12037,12037],"mapped",[20101]],[[12038,12038],"mapped",[20108]],[[12039,12039],"mapped",[20128]],[[12040,12040],"mapped",[20154]],[[12041,12041],"mapped",[20799]],[[12042,12042],"mapped",[20837]],[[12043,12043],"mapped",[20843]],[[12044,12044],"mapped",[20866]],[[12045,12045],"mapped",[20886]],[[12046,12046],"mapped",[20907]],[[12047,12047],"mapped",[20960]],[[12048,12048],"mapped",[20981]],[[12049,12049],"mapped",[20992]],[[12050,12050],"mapped",[21147]],[[12051,12051],"mapped",[21241]],[[12052,12052],"mapped",[21269]],[[12053,12053],"mapped",[21274]],[[12054,12054],"mapped",[21304]],[[12055,12055],"mapped",[21313]],[[12056,12056],"mapped",[21340]],[[12057,12057],"mapped",[21353]],[[12058,12058],"mapped",[21378]],[[12059,12059],"mapped",[21430]],[[12060,12060],"mapped",[21448]],[[12061,12061],"mapped",[21475]],[[12062,12062],"mapped",[22231]],[[12063,12063],"mapped",[22303]],[[12064,12064],"mapped",[22763]],[[12065,12065],"mapped",[22786]],[[12066,12066],"mapped",[22794]],[[12067,12067],"mapped",[22805]],[[12068,12068],"mapped",[22823]],[[12069,12069],"mapped",[22899]],[[12070,12070],"mapped",[23376]],[[12071,12071],"mapped",[23424]],[[12072,12072],"mapped",[23544]],[[12073,12073],"mapped",[23567]],[[12074,12074],"mapped",[23586]],[[12075,12075],"mapped",[23608]],[[12076,12076],"mapped",[23662]],[[12077,12077],"mapped",[23665]],[[12078,12078],"mapped",[24027]],[[12079,12079],"mapped",[24037]],[[12080,12080],"mapped",[24049]],[[12081,12081],"mapped",[24062]],[[12082,12082],"mapped",[24178]],[[12083,12083],"mapped",[24186]],[[12084,12084],"mapped",[24191]],[[12085,12085],"mapped",[24308]],[[12086,12086],"mapped",[24318]],[[12087,12087],"mapped",[24331]],[[12088,12088],"mapped",[24339]],[[12089,12089],"mapped",[24400]],[[12090,12090],"mapped",[24417]],[[12091,12091],"mapped",[24435]],[[12092,12092],"mapped",[24515]],[[12093,12093],"mapped",[25096]],[[12094,12094],"mapped",[25142]],[[12095,12095],"mapped",[25163]],[[12096,12096],"mapped",[25903]],[[12097,12097],"mapped",[25908]],[[12098,12098],"mapped",[25991]],[[12099,12099],"mapped",[26007]],[[12100,12100],"mapped",[26020]],[[12101,12101],"mapped",[26041]],[[12102,12102],"mapped",[26080]],[[12103,12103],"mapped",[26085]],[[12104,12104],"mapped",[26352]],[[12105,12105],"mapped",[26376]],[[12106,12106],"mapped",[26408]],[[12107,12107],"mapped",[27424]],[[12108,12108],"mapped",[27490]],[[12109,12109],"mapped",[27513]],[[12110,12110],"mapped",[27571]],[[12111,12111],"mapped",[27595]],[[12112,12112],"mapped",[27604]],[[12113,12113],"mapped",[27611]],[[12114,12114],"mapped",[27663]],[[12115,12115],"mapped",[27668]],[[12116,12116],"mapped",[27700]],[[12117,12117],"mapped",[28779]],[[12118,12118],"mapped",[29226]],[[12119,12119],"mapped",[29238]],[[12120,12120],"mapped",[29243]],[[12121,12121],"mapped",[29247]],[[12122,12122],"mapped",[29255]],[[12123,12123],"mapped",[29273]],[[12124,12124],"mapped",[29275]],[[12125,12125],"mapped",[29356]],[[12126,12126],"mapped",[29572]],[[12127,12127],"mapped",[29577]],[[12128,12128],"mapped",[29916]],[[12129,12129],"mapped",[29926]],[[12130,12130],"mapped",[29976]],[[12131,12131],"mapped",[29983]],[[12132,12132],"mapped",[29992]],[[12133,12133],"mapped",[30000]],[[12134,12134],"mapped",[30091]],[[12135,12135],"mapped",[30098]],[[12136,12136],"mapped",[30326]],[[12137,12137],"mapped",[30333]],[[12138,12138],"mapped",[30382]],[[12139,12139],"mapped",[30399]],[[12140,12140],"mapped",[30446]],[[12141,12141],"mapped",[30683]],[[12142,12142],"mapped",[30690]],[[12143,12143],"mapped",[30707]],[[12144,12144],"mapped",[31034]],[[12145,12145],"mapped",[31160]],[[12146,12146],"mapped",[31166]],[[12147,12147],"mapped",[31348]],[[12148,12148],"mapped",[31435]],[[12149,12149],"mapped",[31481]],[[12150,12150],"mapped",[31859]],[[12151,12151],"mapped",[31992]],[[12152,12152],"mapped",[32566]],[[12153,12153],"mapped",[32593]],[[12154,12154],"mapped",[32650]],[[12155,12155],"mapped",[32701]],[[12156,12156],"mapped",[32769]],[[12157,12157],"mapped",[32780]],[[12158,12158],"mapped",[32786]],[[12159,12159],"mapped",[32819]],[[12160,12160],"mapped",[32895]],[[12161,12161],"mapped",[32905]],[[12162,12162],"mapped",[33251]],[[12163,12163],"mapped",[33258]],[[12164,12164],"mapped",[33267]],[[12165,12165],"mapped",[33276]],[[12166,12166],"mapped",[33292]],[[12167,12167],"mapped",[33307]],[[12168,12168],"mapped",[33311]],[[12169,12169],"mapped",[33390]],[[12170,12170],"mapped",[33394]],[[12171,12171],"mapped",[33400]],[[12172,12172],"mapped",[34381]],[[12173,12173],"mapped",[34411]],[[12174,12174],"mapped",[34880]],[[12175,12175],"mapped",[34892]],[[12176,12176],"mapped",[34915]],[[12177,12177],"mapped",[35198]],[[12178,12178],"mapped",[35211]],[[12179,12179],"mapped",[35282]],[[12180,12180],"mapped",[35328]],[[12181,12181],"mapped",[35895]],[[12182,12182],"mapped",[35910]],[[12183,12183],"mapped",[35925]],[[12184,12184],"mapped",[35960]],[[12185,12185],"mapped",[35997]],[[12186,12186],"mapped",[36196]],[[12187,12187],"mapped",[36208]],[[12188,12188],"mapped",[36275]],[[12189,12189],"mapped",[36523]],[[12190,12190],"mapped",[36554]],[[12191,12191],"mapped",[36763]],[[12192,12192],"mapped",[36784]],[[12193,12193],"mapped",[36789]],[[12194,12194],"mapped",[37009]],[[12195,12195],"mapped",[37193]],[[12196,12196],"mapped",[37318]],[[12197,12197],"mapped",[37324]],[[12198,12198],"mapped",[37329]],[[12199,12199],"mapped",[38263]],[[12200,12200],"mapped",[38272]],[[12201,12201],"mapped",[38428]],[[12202,12202],"mapped",[38582]],[[12203,12203],"mapped",[38585]],[[12204,12204],"mapped",[38632]],[[12205,12205],"mapped",[38737]],[[12206,12206],"mapped",[38750]],[[12207,12207],"mapped",[38754]],[[12208,12208],"mapped",[38761]],[[12209,12209],"mapped",[38859]],[[12210,12210],"mapped",[38893]],[[12211,12211],"mapped",[38899]],[[12212,12212],"mapped",[38913]],[[12213,12213],"mapped",[39080]],[[12214,12214],"mapped",[39131]],[[12215,12215],"mapped",[39135]],[[12216,12216],"mapped",[39318]],[[12217,12217],"mapped",[39321]],[[12218,12218],"mapped",[39340]],[[12219,12219],"mapped",[39592]],[[12220,12220],"mapped",[39640]],[[12221,12221],"mapped",[39647]],[[12222,12222],"mapped",[39717]],[[12223,12223],"mapped",[39727]],[[12224,12224],"mapped",[39730]],[[12225,12225],"mapped",[39740]],[[12226,12226],"mapped",[39770]],[[12227,12227],"mapped",[40165]],[[12228,12228],"mapped",[40565]],[[12229,12229],"mapped",[40575]],[[12230,12230],"mapped",[40613]],[[12231,12231],"mapped",[40635]],[[12232,12232],"mapped",[40643]],[[12233,12233],"mapped",[40653]],[[12234,12234],"mapped",[40657]],[[12235,12235],"mapped",[40697]],[[12236,12236],"mapped",[40701]],[[12237,12237],"mapped",[40718]],[[12238,12238],"mapped",[40723]],[[12239,12239],"mapped",[40736]],[[12240,12240],"mapped",[40763]],[[12241,12241],"mapped",[40778]],[[12242,12242],"mapped",[40786]],[[12243,12243],"mapped",[40845]],[[12244,12244],"mapped",[40860]],[[12245,12245],"mapped",[40864]],[[12246,12271],"disallowed"],[[12272,12283],"disallowed"],[[12284,12287],"disallowed"],[[12288,12288],"disallowed_STD3_mapped",[32]],[[12289,12289],"valid",[],"NV8"],[[12290,12290],"mapped",[46]],[[12291,12292],"valid",[],"NV8"],[[12293,12295],"valid"],[[12296,12329],"valid",[],"NV8"],[[12330,12333],"valid"],[[12334,12341],"valid",[],"NV8"],[[12342,12342],"mapped",[12306]],[[12343,12343],"valid",[],"NV8"],[[12344,12344],"mapped",[21313]],[[12345,12345],"mapped",[21316]],[[12346,12346],"mapped",[21317]],[[12347,12347],"valid",[],"NV8"],[[12348,12348],"valid"],[[12349,12349],"valid",[],"NV8"],[[12350,12350],"valid",[],"NV8"],[[12351,12351],"valid",[],"NV8"],[[12352,12352],"disallowed"],[[12353,12436],"valid"],[[12437,12438],"valid"],[[12439,12440],"disallowed"],[[12441,12442],"valid"],[[12443,12443],"disallowed_STD3_mapped",[32,12441]],[[12444,12444],"disallowed_STD3_mapped",[32,12442]],[[12445,12446],"valid"],[[12447,12447],"mapped",[12424,12426]],[[12448,12448],"valid",[],"NV8"],[[12449,12542],"valid"],[[12543,12543],"mapped",[12467,12488]],[[12544,12548],"disallowed"],[[12549,12588],"valid"],[[12589,12589],"valid"],[[12590,12592],"disallowed"],[[12593,12593],"mapped",[4352]],[[12594,12594],"mapped",[4353]],[[12595,12595],"mapped",[4522]],[[12596,12596],"mapped",[4354]],[[12597,12597],"mapped",[4524]],[[12598,12598],"mapped",[4525]],[[12599,12599],"mapped",[4355]],[[12600,12600],"mapped",[4356]],[[12601,12601],"mapped",[4357]],[[12602,12602],"mapped",[4528]],[[12603,12603],"mapped",[4529]],[[12604,12604],"mapped",[4530]],[[12605,12605],"mapped",[4531]],[[12606,12606],"mapped",[4532]],[[12607,12607],"mapped",[4533]],[[12608,12608],"mapped",[4378]],[[12609,12609],"mapped",[4358]],[[12610,12610],"mapped",[4359]],[[12611,12611],"mapped",[4360]],[[12612,12612],"mapped",[4385]],[[12613,12613],"mapped",[4361]],[[12614,12614],"mapped",[4362]],[[12615,12615],"mapped",[4363]],[[12616,12616],"mapped",[4364]],[[12617,12617],"mapped",[4365]],[[12618,12618],"mapped",[4366]],[[12619,12619],"mapped",[4367]],[[12620,12620],"mapped",[4368]],[[12621,12621],"mapped",[4369]],[[12622,12622],"mapped",[4370]],[[12623,12623],"mapped",[4449]],[[12624,12624],"mapped",[4450]],[[12625,12625],"mapped",[4451]],[[12626,12626],"mapped",[4452]],[[12627,12627],"mapped",[4453]],[[12628,12628],"mapped",[4454]],[[12629,12629],"mapped",[4455]],[[12630,12630],"mapped",[4456]],[[12631,12631],"mapped",[4457]],[[12632,12632],"mapped",[4458]],[[12633,12633],"mapped",[4459]],[[12634,12634],"mapped",[4460]],[[12635,12635],"mapped",[4461]],[[12636,12636],"mapped",[4462]],[[12637,12637],"mapped",[4463]],[[12638,12638],"mapped",[4464]],[[12639,12639],"mapped",[4465]],[[12640,12640],"mapped",[4466]],[[12641,12641],"mapped",[4467]],[[12642,12642],"mapped",[4468]],[[12643,12643],"mapped",[4469]],[[12644,12644],"disallowed"],[[12645,12645],"mapped",[4372]],[[12646,12646],"mapped",[4373]],[[12647,12647],"mapped",[4551]],[[12648,12648],"mapped",[4552]],[[12649,12649],"mapped",[4556]],[[12650,12650],"mapped",[4558]],[[12651,12651],"mapped",[4563]],[[12652,12652],"mapped",[4567]],[[12653,12653],"mapped",[4569]],[[12654,12654],"mapped",[4380]],[[12655,12655],"mapped",[4573]],[[12656,12656],"mapped",[4575]],[[12657,12657],"mapped",[4381]],[[12658,12658],"mapped",[4382]],[[12659,12659],"mapped",[4384]],[[12660,12660],"mapped",[4386]],[[12661,12661],"mapped",[4387]],[[12662,12662],"mapped",[4391]],[[12663,12663],"mapped",[4393]],[[12664,12664],"mapped",[4395]],[[12665,12665],"mapped",[4396]],[[12666,12666],"mapped",[4397]],[[12667,12667],"mapped",[4398]],[[12668,12668],"mapped",[4399]],[[12669,12669],"mapped",[4402]],[[12670,12670],"mapped",[4406]],[[12671,12671],"mapped",[4416]],[[12672,12672],"mapped",[4423]],[[12673,12673],"mapped",[4428]],[[12674,12674],"mapped",[4593]],[[12675,12675],"mapped",[4594]],[[12676,12676],"mapped",[4439]],[[12677,12677],"mapped",[4440]],[[12678,12678],"mapped",[4441]],[[12679,12679],"mapped",[4484]],[[12680,12680],"mapped",[4485]],[[12681,12681],"mapped",[4488]],[[12682,12682],"mapped",[4497]],[[12683,12683],"mapped",[4498]],[[12684,12684],"mapped",[4500]],[[12685,12685],"mapped",[4510]],[[12686,12686],"mapped",[4513]],[[12687,12687],"disallowed"],[[12688,12689],"valid",[],"NV8"],[[12690,12690],"mapped",[19968]],[[12691,12691],"mapped",[20108]],[[12692,12692],"mapped",[19977]],[[12693,12693],"mapped",[22235]],[[12694,12694],"mapped",[19978]],[[12695,12695],"mapped",[20013]],[[12696,12696],"mapped",[19979]],[[12697,12697],"mapped",[30002]],[[12698,12698],"mapped",[20057]],[[12699,12699],"mapped",[19993]],[[12700,12700],"mapped",[19969]],[[12701,12701],"mapped",[22825]],[[12702,12702],"mapped",[22320]],[[12703,12703],"mapped",[20154]],[[12704,12727],"valid"],[[12728,12730],"valid"],[[12731,12735],"disallowed"],[[12736,12751],"valid",[],"NV8"],[[12752,12771],"valid",[],"NV8"],[[12772,12783],"disallowed"],[[12784,12799],"valid"],[[12800,12800],"disallowed_STD3_mapped",[40,4352,41]],[[12801,12801],"disallowed_STD3_mapped",[40,4354,41]],[[12802,12802],"disallowed_STD3_mapped",[40,4355,41]],[[12803,12803],"disallowed_STD3_mapped",[40,4357,41]],[[12804,12804],"disallowed_STD3_mapped",[40,4358,41]],[[12805,12805],"disallowed_STD3_mapped",[40,4359,41]],[[12806,12806],"disallowed_STD3_mapped",[40,4361,41]],[[12807,12807],"disallowed_STD3_mapped",[40,4363,41]],[[12808,12808],"disallowed_STD3_mapped",[40,4364,41]],[[12809,12809],"disallowed_STD3_mapped",[40,4366,41]],[[12810,12810],"disallowed_STD3_mapped",[40,4367,41]],[[12811,12811],"disallowed_STD3_mapped",[40,4368,41]],[[12812,12812],"disallowed_STD3_mapped",[40,4369,41]],[[12813,12813],"disallowed_STD3_mapped",[40,4370,41]],[[12814,12814],"disallowed_STD3_mapped",[40,44032,41]],[[12815,12815],"disallowed_STD3_mapped",[40,45208,41]],[[12816,12816],"disallowed_STD3_mapped",[40,45796,41]],[[12817,12817],"disallowed_STD3_mapped",[40,46972,41]],[[12818,12818],"disallowed_STD3_mapped",[40,47560,41]],[[12819,12819],"disallowed_STD3_mapped",[40,48148,41]],[[12820,12820],"disallowed_STD3_mapped",[40,49324,41]],[[12821,12821],"disallowed_STD3_mapped",[40,50500,41]],[[12822,12822],"disallowed_STD3_mapped",[40,51088,41]],[[12823,12823],"disallowed_STD3_mapped",[40,52264,41]],[[12824,12824],"disallowed_STD3_mapped",[40,52852,41]],[[12825,12825],"disallowed_STD3_mapped",[40,53440,41]],[[12826,12826],"disallowed_STD3_mapped",[40,54028,41]],[[12827,12827],"disallowed_STD3_mapped",[40,54616,41]],[[12828,12828],"disallowed_STD3_mapped",[40,51452,41]],[[12829,12829],"disallowed_STD3_mapped",[40,50724,51204,41]],[[12830,12830],"disallowed_STD3_mapped",[40,50724,54980,41]],[[12831,12831],"disallowed"],[[12832,12832],"disallowed_STD3_mapped",[40,19968,41]],[[12833,12833],"disallowed_STD3_mapped",[40,20108,41]],[[12834,12834],"disallowed_STD3_mapped",[40,19977,41]],[[12835,12835],"disallowed_STD3_mapped",[40,22235,41]],[[12836,12836],"disallowed_STD3_mapped",[40,20116,41]],[[12837,12837],"disallowed_STD3_mapped",[40,20845,41]],[[12838,12838],"disallowed_STD3_mapped",[40,19971,41]],[[12839,12839],"disallowed_STD3_mapped",[40,20843,41]],[[12840,12840],"disallowed_STD3_mapped",[40,20061,41]],[[12841,12841],"disallowed_STD3_mapped",[40,21313,41]],[[12842,12842],"disallowed_STD3_mapped",[40,26376,41]],[[12843,12843],"disallowed_STD3_mapped",[40,28779,41]],[[12844,12844],"disallowed_STD3_mapped",[40,27700,41]],[[12845,12845],"disallowed_STD3_mapped",[40,26408,41]],[[12846,12846],"disallowed_STD3_mapped",[40,37329,41]],[[12847,12847],"disallowed_STD3_mapped",[40,22303,41]],[[12848,12848],"disallowed_STD3_mapped",[40,26085,41]],[[12849,12849],"disallowed_STD3_mapped",[40,26666,41]],[[12850,12850],"disallowed_STD3_mapped",[40,26377,41]],[[12851,12851],"disallowed_STD3_mapped",[40,31038,41]],[[12852,12852],"disallowed_STD3_mapped",[40,21517,41]],[[12853,12853],"disallowed_STD3_mapped",[40,29305,41]],[[12854,12854],"disallowed_STD3_mapped",[40,36001,41]],[[12855,12855],"disallowed_STD3_mapped",[40,31069,41]],[[12856,12856],"disallowed_STD3_mapped",[40,21172,41]],[[12857,12857],"disallowed_STD3_mapped",[40,20195,41]],[[12858,12858],"disallowed_STD3_mapped",[40,21628,41]],[[12859,12859],"disallowed_STD3_mapped",[40,23398,41]],[[12860,12860],"disallowed_STD3_mapped",[40,30435,41]],[[12861,12861],"disallowed_STD3_mapped",[40,20225,41]],[[12862,12862],"disallowed_STD3_mapped",[40,36039,41]],[[12863,12863],"disallowed_STD3_mapped",[40,21332,41]],[[12864,12864],"disallowed_STD3_mapped",[40,31085,41]],[[12865,12865],"disallowed_STD3_mapped",[40,20241,41]],[[12866,12866],"disallowed_STD3_mapped",[40,33258,41]],[[12867,12867],"disallowed_STD3_mapped",[40,33267,41]],[[12868,12868],"mapped",[21839]],[[12869,12869],"mapped",[24188]],[[12870,12870],"mapped",[25991]],[[12871,12871],"mapped",[31631]],[[12872,12879],"valid",[],"NV8"],[[12880,12880],"mapped",[112,116,101]],[[12881,12881],"mapped",[50,49]],[[12882,12882],"mapped",[50,50]],[[12883,12883],"mapped",[50,51]],[[12884,12884],"mapped",[50,52]],[[12885,12885],"mapped",[50,53]],[[12886,12886],"mapped",[50,54]],[[12887,12887],"mapped",[50,55]],[[12888,12888],"mapped",[50,56]],[[12889,12889],"mapped",[50,57]],[[12890,12890],"mapped",[51,48]],[[12891,12891],"mapped",[51,49]],[[12892,12892],"mapped",[51,50]],[[12893,12893],"mapped",[51,51]],[[12894,12894],"mapped",[51,52]],[[12895,12895],"mapped",[51,53]],[[12896,12896],"mapped",[4352]],[[12897,12897],"mapped",[4354]],[[12898,12898],"mapped",[4355]],[[12899,12899],"mapped",[4357]],[[12900,12900],"mapped",[4358]],[[12901,12901],"mapped",[4359]],[[12902,12902],"mapped",[4361]],[[12903,12903],"mapped",[4363]],[[12904,12904],"mapped",[4364]],[[12905,12905],"mapped",[4366]],[[12906,12906],"mapped",[4367]],[[12907,12907],"mapped",[4368]],[[12908,12908],"mapped",[4369]],[[12909,12909],"mapped",[4370]],[[12910,12910],"mapped",[44032]],[[12911,12911],"mapped",[45208]],[[12912,12912],"mapped",[45796]],[[12913,12913],"mapped",[46972]],[[12914,12914],"mapped",[47560]],[[12915,12915],"mapped",[48148]],[[12916,12916],"mapped",[49324]],[[12917,12917],"mapped",[50500]],[[12918,12918],"mapped",[51088]],[[12919,12919],"mapped",[52264]],[[12920,12920],"mapped",[52852]],[[12921,12921],"mapped",[53440]],[[12922,12922],"mapped",[54028]],[[12923,12923],"mapped",[54616]],[[12924,12924],"mapped",[52280,44256]],[[12925,12925],"mapped",[51452,51032]],[[12926,12926],"mapped",[50864]],[[12927,12927],"valid",[],"NV8"],[[12928,12928],"mapped",[19968]],[[12929,12929],"mapped",[20108]],[[12930,12930],"mapped",[19977]],[[12931,12931],"mapped",[22235]],[[12932,12932],"mapped",[20116]],[[12933,12933],"mapped",[20845]],[[12934,12934],"mapped",[19971]],[[12935,12935],"mapped",[20843]],[[12936,12936],"mapped",[20061]],[[12937,12937],"mapped",[21313]],[[12938,12938],"mapped",[26376]],[[12939,12939],"mapped",[28779]],[[12940,12940],"mapped",[27700]],[[12941,12941],"mapped",[26408]],[[12942,12942],"mapped",[37329]],[[12943,12943],"mapped",[22303]],[[12944,12944],"mapped",[26085]],[[12945,12945],"mapped",[26666]],[[12946,12946],"mapped",[26377]],[[12947,12947],"mapped",[31038]],[[12948,12948],"mapped",[21517]],[[12949,12949],"mapped",[29305]],[[12950,12950],"mapped",[36001]],[[12951,12951],"mapped",[31069]],[[12952,12952],"mapped",[21172]],[[12953,12953],"mapped",[31192]],[[12954,12954],"mapped",[30007]],[[12955,12955],"mapped",[22899]],[[12956,12956],"mapped",[36969]],[[12957,12957],"mapped",[20778]],[[12958,12958],"mapped",[21360]],[[12959,12959],"mapped",[27880]],[[12960,12960],"mapped",[38917]],[[12961,12961],"mapped",[20241]],[[12962,12962],"mapped",[20889]],[[12963,12963],"mapped",[27491]],[[12964,12964],"mapped",[19978]],[[12965,12965],"mapped",[20013]],[[12966,12966],"mapped",[19979]],[[12967,12967],"mapped",[24038]],[[12968,12968],"mapped",[21491]],[[12969,12969],"mapped",[21307]],[[12970,12970],"mapped",[23447]],[[12971,12971],"mapped",[23398]],[[12972,12972],"mapped",[30435]],[[12973,12973],"mapped",[20225]],[[12974,12974],"mapped",[36039]],[[12975,12975],"mapped",[21332]],[[12976,12976],"mapped",[22812]],[[12977,12977],"mapped",[51,54]],[[12978,12978],"mapped",[51,55]],[[12979,12979],"mapped",[51,56]],[[12980,12980],"mapped",[51,57]],[[12981,12981],"mapped",[52,48]],[[12982,12982],"mapped",[52,49]],[[12983,12983],"mapped",[52,50]],[[12984,12984],"mapped",[52,51]],[[12985,12985],"mapped",[52,52]],[[12986,12986],"mapped",[52,53]],[[12987,12987],"mapped",[52,54]],[[12988,12988],"mapped",[52,55]],[[12989,12989],"mapped",[52,56]],[[12990,12990],"mapped",[52,57]],[[12991,12991],"mapped",[53,48]],[[12992,12992],"mapped",[49,26376]],[[12993,12993],"mapped",[50,26376]],[[12994,12994],"mapped",[51,26376]],[[12995,12995],"mapped",[52,26376]],[[12996,12996],"mapped",[53,26376]],[[12997,12997],"mapped",[54,26376]],[[12998,12998],"mapped",[55,26376]],[[12999,12999],"mapped",[56,26376]],[[13000,13000],"mapped",[57,26376]],[[13001,13001],"mapped",[49,48,26376]],[[13002,13002],"mapped",[49,49,26376]],[[13003,13003],"mapped",[49,50,26376]],[[13004,13004],"mapped",[104,103]],[[13005,13005],"mapped",[101,114,103]],[[13006,13006],"mapped",[101,118]],[[13007,13007],"mapped",[108,116,100]],[[13008,13008],"mapped",[12450]],[[13009,13009],"mapped",[12452]],[[13010,13010],"mapped",[12454]],[[13011,13011],"mapped",[12456]],[[13012,13012],"mapped",[12458]],[[13013,13013],"mapped",[12459]],[[13014,13014],"mapped",[12461]],[[13015,13015],"mapped",[12463]],[[13016,13016],"mapped",[12465]],[[13017,13017],"mapped",[12467]],[[13018,13018],"mapped",[12469]],[[13019,13019],"mapped",[12471]],[[13020,13020],"mapped",[12473]],[[13021,13021],"mapped",[12475]],[[13022,13022],"mapped",[12477]],[[13023,13023],"mapped",[12479]],[[13024,13024],"mapped",[12481]],[[13025,13025],"mapped",[12484]],[[13026,13026],"mapped",[12486]],[[13027,13027],"mapped",[12488]],[[13028,13028],"mapped",[12490]],[[13029,13029],"mapped",[12491]],[[13030,13030],"mapped",[12492]],[[13031,13031],"mapped",[12493]],[[13032,13032],"mapped",[12494]],[[13033,13033],"mapped",[12495]],[[13034,13034],"mapped",[12498]],[[13035,13035],"mapped",[12501]],[[13036,13036],"mapped",[12504]],[[13037,13037],"mapped",[12507]],[[13038,13038],"mapped",[12510]],[[13039,13039],"mapped",[12511]],[[13040,13040],"mapped",[12512]],[[13041,13041],"mapped",[12513]],[[13042,13042],"mapped",[12514]],[[13043,13043],"mapped",[12516]],[[13044,13044],"mapped",[12518]],[[13045,13045],"mapped",[12520]],[[13046,13046],"mapped",[12521]],[[13047,13047],"mapped",[12522]],[[13048,13048],"mapped",[12523]],[[13049,13049],"mapped",[12524]],[[13050,13050],"mapped",[12525]],[[13051,13051],"mapped",[12527]],[[13052,13052],"mapped",[12528]],[[13053,13053],"mapped",[12529]],[[13054,13054],"mapped",[12530]],[[13055,13055],"disallowed"],[[13056,13056],"mapped",[12450,12497,12540,12488]],[[13057,13057],"mapped",[12450,12523,12501,12449]],[[13058,13058],"mapped",[12450,12531,12506,12450]],[[13059,13059],"mapped",[12450,12540,12523]],[[13060,13060],"mapped",[12452,12491,12531,12464]],[[13061,13061],"mapped",[12452,12531,12481]],[[13062,13062],"mapped",[12454,12457,12531]],[[13063,13063],"mapped",[12456,12473,12463,12540,12489]],[[13064,13064],"mapped",[12456,12540,12459,12540]],[[13065,13065],"mapped",[12458,12531,12473]],[[13066,13066],"mapped",[12458,12540,12512]],[[13067,13067],"mapped",[12459,12452,12522]],[[13068,13068],"mapped",[12459,12521,12483,12488]],[[13069,13069],"mapped",[12459,12525,12522,12540]],[[13070,13070],"mapped",[12460,12525,12531]],[[13071,13071],"mapped",[12460,12531,12510]],[[13072,13072],"mapped",[12462,12460]],[[13073,13073],"mapped",[12462,12491,12540]],[[13074,13074],"mapped",[12461,12517,12522,12540]],[[13075,13075],"mapped",[12462,12523,12480,12540]],[[13076,13076],"mapped",[12461,12525]],[[13077,13077],"mapped",[12461,12525,12464,12521,12512]],[[13078,13078],"mapped",[12461,12525,12513,12540,12488,12523]],[[13079,13079],"mapped",[12461,12525,12527,12483,12488]],[[13080,13080],"mapped",[12464,12521,12512]],[[13081,13081],"mapped",[12464,12521,12512,12488,12531]],[[13082,13082],"mapped",[12463,12523,12476,12452,12525]],[[13083,13083],"mapped",[12463,12525,12540,12493]],[[13084,13084],"mapped",[12465,12540,12473]],[[13085,13085],"mapped",[12467,12523,12490]],[[13086,13086],"mapped",[12467,12540,12509]],[[13087,13087],"mapped",[12469,12452,12463,12523]],[[13088,13088],"mapped",[12469,12531,12481,12540,12512]],[[13089,13089],"mapped",[12471,12522,12531,12464]],[[13090,13090],"mapped",[12475,12531,12481]],[[13091,13091],"mapped",[12475,12531,12488]],[[13092,13092],"mapped",[12480,12540,12473]],[[13093,13093],"mapped",[12487,12471]],[[13094,13094],"mapped",[12489,12523]],[[13095,13095],"mapped",[12488,12531]],[[13096,13096],"mapped",[12490,12494]],[[13097,13097],"mapped",[12494,12483,12488]],[[13098,13098],"mapped",[12495,12452,12484]],[[13099,13099],"mapped",[12497,12540,12475,12531,12488]],[[13100,13100],"mapped",[12497,12540,12484]],[[13101,13101],"mapped",[12496,12540,12524,12523]],[[13102,13102],"mapped",[12500,12450,12473,12488,12523]],[[13103,13103],"mapped",[12500,12463,12523]],[[13104,13104],"mapped",[12500,12467]],[[13105,13105],"mapped",[12499,12523]],[[13106,13106],"mapped",[12501,12449,12521,12483,12489]],[[13107,13107],"mapped",[12501,12451,12540,12488]],[[13108,13108],"mapped",[12502,12483,12471,12455,12523]],[[13109,13109],"mapped",[12501,12521,12531]],[[13110,13110],"mapped",[12504,12463,12479,12540,12523]],[[13111,13111],"mapped",[12506,12477]],[[13112,13112],"mapped",[12506,12491,12498]],[[13113,13113],"mapped",[12504,12523,12484]],[[13114,13114],"mapped",[12506,12531,12473]],[[13115,13115],"mapped",[12506,12540,12472]],[[13116,13116],"mapped",[12505,12540,12479]],[[13117,13117],"mapped",[12509,12452,12531,12488]],[[13118,13118],"mapped",[12508,12523,12488]],[[13119,13119],"mapped",[12507,12531]],[[13120,13120],"mapped",[12509,12531,12489]],[[13121,13121],"mapped",[12507,12540,12523]],[[13122,13122],"mapped",[12507,12540,12531]],[[13123,13123],"mapped",[12510,12452,12463,12525]],[[13124,13124],"mapped",[12510,12452,12523]],[[13125,13125],"mapped",[12510,12483,12495]],[[13126,13126],"mapped",[12510,12523,12463]],[[13127,13127],"mapped",[12510,12531,12471,12519,12531]],[[13128,13128],"mapped",[12511,12463,12525,12531]],[[13129,13129],"mapped",[12511,12522]],[[13130,13130],"mapped",[12511,12522,12496,12540,12523]],[[13131,13131],"mapped",[12513,12460]],[[13132,13132],"mapped",[12513,12460,12488,12531]],[[13133,13133],"mapped",[12513,12540,12488,12523]],[[13134,13134],"mapped",[12516,12540,12489]],[[13135,13135],"mapped",[12516,12540,12523]],[[13136,13136],"mapped",[12518,12450,12531]],[[13137,13137],"mapped",[12522,12483,12488,12523]],[[13138,13138],"mapped",[12522,12521]],[[13139,13139],"mapped",[12523,12500,12540]],[[13140,13140],"mapped",[12523,12540,12502,12523]],[[13141,13141],"mapped",[12524,12512]],[[13142,13142],"mapped",[12524,12531,12488,12466,12531]],[[13143,13143],"mapped",[12527,12483,12488]],[[13144,13144],"mapped",[48,28857]],[[13145,13145],"mapped",[49,28857]],[[13146,13146],"mapped",[50,28857]],[[13147,13147],"mapped",[51,28857]],[[13148,13148],"mapped",[52,28857]],[[13149,13149],"mapped",[53,28857]],[[13150,13150],"mapped",[54,28857]],[[13151,13151],"mapped",[55,28857]],[[13152,13152],"mapped",[56,28857]],[[13153,13153],"mapped",[57,28857]],[[13154,13154],"mapped",[49,48,28857]],[[13155,13155],"mapped",[49,49,28857]],[[13156,13156],"mapped",[49,50,28857]],[[13157,13157],"mapped",[49,51,28857]],[[13158,13158],"mapped",[49,52,28857]],[[13159,13159],"mapped",[49,53,28857]],[[13160,13160],"mapped",[49,54,28857]],[[13161,13161],"mapped",[49,55,28857]],[[13162,13162],"mapped",[49,56,28857]],[[13163,13163],"mapped",[49,57,28857]],[[13164,13164],"mapped",[50,48,28857]],[[13165,13165],"mapped",[50,49,28857]],[[13166,13166],"mapped",[50,50,28857]],[[13167,13167],"mapped",[50,51,28857]],[[13168,13168],"mapped",[50,52,28857]],[[13169,13169],"mapped",[104,112,97]],[[13170,13170],"mapped",[100,97]],[[13171,13171],"mapped",[97,117]],[[13172,13172],"mapped",[98,97,114]],[[13173,13173],"mapped",[111,118]],[[13174,13174],"mapped",[112,99]],[[13175,13175],"mapped",[100,109]],[[13176,13176],"mapped",[100,109,50]],[[13177,13177],"mapped",[100,109,51]],[[13178,13178],"mapped",[105,117]],[[13179,13179],"mapped",[24179,25104]],[[13180,13180],"mapped",[26157,21644]],[[13181,13181],"mapped",[22823,27491]],[[13182,13182],"mapped",[26126,27835]],[[13183,13183],"mapped",[26666,24335,20250,31038]],[[13184,13184],"mapped",[112,97]],[[13185,13185],"mapped",[110,97]],[[13186,13186],"mapped",[956,97]],[[13187,13187],"mapped",[109,97]],[[13188,13188],"mapped",[107,97]],[[13189,13189],"mapped",[107,98]],[[13190,13190],"mapped",[109,98]],[[13191,13191],"mapped",[103,98]],[[13192,13192],"mapped",[99,97,108]],[[13193,13193],"mapped",[107,99,97,108]],[[13194,13194],"mapped",[112,102]],[[13195,13195],"mapped",[110,102]],[[13196,13196],"mapped",[956,102]],[[13197,13197],"mapped",[956,103]],[[13198,13198],"mapped",[109,103]],[[13199,13199],"mapped",[107,103]],[[13200,13200],"mapped",[104,122]],[[13201,13201],"mapped",[107,104,122]],[[13202,13202],"mapped",[109,104,122]],[[13203,13203],"mapped",[103,104,122]],[[13204,13204],"mapped",[116,104,122]],[[13205,13205],"mapped",[956,108]],[[13206,13206],"mapped",[109,108]],[[13207,13207],"mapped",[100,108]],[[13208,13208],"mapped",[107,108]],[[13209,13209],"mapped",[102,109]],[[13210,13210],"mapped",[110,109]],[[13211,13211],"mapped",[956,109]],[[13212,13212],"mapped",[109,109]],[[13213,13213],"mapped",[99,109]],[[13214,13214],"mapped",[107,109]],[[13215,13215],"mapped",[109,109,50]],[[13216,13216],"mapped",[99,109,50]],[[13217,13217],"mapped",[109,50]],[[13218,13218],"mapped",[107,109,50]],[[13219,13219],"mapped",[109,109,51]],[[13220,13220],"mapped",[99,109,51]],[[13221,13221],"mapped",[109,51]],[[13222,13222],"mapped",[107,109,51]],[[13223,13223],"mapped",[109,8725,115]],[[13224,13224],"mapped",[109,8725,115,50]],[[13225,13225],"mapped",[112,97]],[[13226,13226],"mapped",[107,112,97]],[[13227,13227],"mapped",[109,112,97]],[[13228,13228],"mapped",[103,112,97]],[[13229,13229],"mapped",[114,97,100]],[[13230,13230],"mapped",[114,97,100,8725,115]],[[13231,13231],"mapped",[114,97,100,8725,115,50]],[[13232,13232],"mapped",[112,115]],[[13233,13233],"mapped",[110,115]],[[13234,13234],"mapped",[956,115]],[[13235,13235],"mapped",[109,115]],[[13236,13236],"mapped",[112,118]],[[13237,13237],"mapped",[110,118]],[[13238,13238],"mapped",[956,118]],[[13239,13239],"mapped",[109,118]],[[13240,13240],"mapped",[107,118]],[[13241,13241],"mapped",[109,118]],[[13242,13242],"mapped",[112,119]],[[13243,13243],"mapped",[110,119]],[[13244,13244],"mapped",[956,119]],[[13245,13245],"mapped",[109,119]],[[13246,13246],"mapped",[107,119]],[[13247,13247],"mapped",[109,119]],[[13248,13248],"mapped",[107,969]],[[13249,13249],"mapped",[109,969]],[[13250,13250],"disallowed"],[[13251,13251],"mapped",[98,113]],[[13252,13252],"mapped",[99,99]],[[13253,13253],"mapped",[99,100]],[[13254,13254],"mapped",[99,8725,107,103]],[[13255,13255],"disallowed"],[[13256,13256],"mapped",[100,98]],[[13257,13257],"mapped",[103,121]],[[13258,13258],"mapped",[104,97]],[[13259,13259],"mapped",[104,112]],[[13260,13260],"mapped",[105,110]],[[13261,13261],"mapped",[107,107]],[[13262,13262],"mapped",[107,109]],[[13263,13263],"mapped",[107,116]],[[13264,13264],"mapped",[108,109]],[[13265,13265],"mapped",[108,110]],[[13266,13266],"mapped",[108,111,103]],[[13267,13267],"mapped",[108,120]],[[13268,13268],"mapped",[109,98]],[[13269,13269],"mapped",[109,105,108]],[[13270,13270],"mapped",[109,111,108]],[[13271,13271],"mapped",[112,104]],[[13272,13272],"disallowed"],[[13273,13273],"mapped",[112,112,109]],[[13274,13274],"mapped",[112,114]],[[13275,13275],"mapped",[115,114]],[[13276,13276],"mapped",[115,118]],[[13277,13277],"mapped",[119,98]],[[13278,13278],"mapped",[118,8725,109]],[[13279,13279],"mapped",[97,8725,109]],[[13280,13280],"mapped",[49,26085]],[[13281,13281],"mapped",[50,26085]],[[13282,13282],"mapped",[51,26085]],[[13283,13283],"mapped",[52,26085]],[[13284,13284],"mapped",[53,26085]],[[13285,13285],"mapped",[54,26085]],[[13286,13286],"mapped",[55,26085]],[[13287,13287],"mapped",[56,26085]],[[13288,13288],"mapped",[57,26085]],[[13289,13289],"mapped",[49,48,26085]],[[13290,13290],"mapped",[49,49,26085]],[[13291,13291],"mapped",[49,50,26085]],[[13292,13292],"mapped",[49,51,26085]],[[13293,13293],"mapped",[49,52,26085]],[[13294,13294],"mapped",[49,53,26085]],[[13295,13295],"mapped",[49,54,26085]],[[13296,13296],"mapped",[49,55,26085]],[[13297,13297],"mapped",[49,56,26085]],[[13298,13298],"mapped",[49,57,26085]],[[13299,13299],"mapped",[50,48,26085]],[[13300,13300],"mapped",[50,49,26085]],[[13301,13301],"mapped",[50,50,26085]],[[13302,13302],"mapped",[50,51,26085]],[[13303,13303],"mapped",[50,52,26085]],[[13304,13304],"mapped",[50,53,26085]],[[13305,13305],"mapped",[50,54,26085]],[[13306,13306],"mapped",[50,55,26085]],[[13307,13307],"mapped",[50,56,26085]],[[13308,13308],"mapped",[50,57,26085]],[[13309,13309],"mapped",[51,48,26085]],[[13310,13310],"mapped",[51,49,26085]],[[13311,13311],"mapped",[103,97,108]],[[13312,19893],"valid"],[[19894,19903],"disallowed"],[[19904,19967],"valid",[],"NV8"],[[19968,40869],"valid"],[[40870,40891],"valid"],[[40892,40899],"valid"],[[40900,40907],"valid"],[[40908,40908],"valid"],[[40909,40917],"valid"],[[40918,40959],"disallowed"],[[40960,42124],"valid"],[[42125,42127],"disallowed"],[[42128,42145],"valid",[],"NV8"],[[42146,42147],"valid",[],"NV8"],[[42148,42163],"valid",[],"NV8"],[[42164,42164],"valid",[],"NV8"],[[42165,42176],"valid",[],"NV8"],[[42177,42177],"valid",[],"NV8"],[[42178,42180],"valid",[],"NV8"],[[42181,42181],"valid",[],"NV8"],[[42182,42182],"valid",[],"NV8"],[[42183,42191],"disallowed"],[[42192,42237],"valid"],[[42238,42239],"valid",[],"NV8"],[[42240,42508],"valid"],[[42509,42511],"valid",[],"NV8"],[[42512,42539],"valid"],[[42540,42559],"disallowed"],[[42560,42560],"mapped",[42561]],[[42561,42561],"valid"],[[42562,42562],"mapped",[42563]],[[42563,42563],"valid"],[[42564,42564],"mapped",[42565]],[[42565,42565],"valid"],[[42566,42566],"mapped",[42567]],[[42567,42567],"valid"],[[42568,42568],"mapped",[42569]],[[42569,42569],"valid"],[[42570,42570],"mapped",[42571]],[[42571,42571],"valid"],[[42572,42572],"mapped",[42573]],[[42573,42573],"valid"],[[42574,42574],"mapped",[42575]],[[42575,42575],"valid"],[[42576,42576],"mapped",[42577]],[[42577,42577],"valid"],[[42578,42578],"mapped",[42579]],[[42579,42579],"valid"],[[42580,42580],"mapped",[42581]],[[42581,42581],"valid"],[[42582,42582],"mapped",[42583]],[[42583,42583],"valid"],[[42584,42584],"mapped",[42585]],[[42585,42585],"valid"],[[42586,42586],"mapped",[42587]],[[42587,42587],"valid"],[[42588,42588],"mapped",[42589]],[[42589,42589],"valid"],[[42590,42590],"mapped",[42591]],[[42591,42591],"valid"],[[42592,42592],"mapped",[42593]],[[42593,42593],"valid"],[[42594,42594],"mapped",[42595]],[[42595,42595],"valid"],[[42596,42596],"mapped",[42597]],[[42597,42597],"valid"],[[42598,42598],"mapped",[42599]],[[42599,42599],"valid"],[[42600,42600],"mapped",[42601]],[[42601,42601],"valid"],[[42602,42602],"mapped",[42603]],[[42603,42603],"valid"],[[42604,42604],"mapped",[42605]],[[42605,42607],"valid"],[[42608,42611],"valid",[],"NV8"],[[42612,42619],"valid"],[[42620,42621],"valid"],[[42622,42622],"valid",[],"NV8"],[[42623,42623],"valid"],[[42624,42624],"mapped",[42625]],[[42625,42625],"valid"],[[42626,42626],"mapped",[42627]],[[42627,42627],"valid"],[[42628,42628],"mapped",[42629]],[[42629,42629],"valid"],[[42630,42630],"mapped",[42631]],[[42631,42631],"valid"],[[42632,42632],"mapped",[42633]],[[42633,42633],"valid"],[[42634,42634],"mapped",[42635]],[[42635,42635],"valid"],[[42636,42636],"mapped",[42637]],[[42637,42637],"valid"],[[42638,42638],"mapped",[42639]],[[42639,42639],"valid"],[[42640,42640],"mapped",[42641]],[[42641,42641],"valid"],[[42642,42642],"mapped",[42643]],[[42643,42643],"valid"],[[42644,42644],"mapped",[42645]],[[42645,42645],"valid"],[[42646,42646],"mapped",[42647]],[[42647,42647],"valid"],[[42648,42648],"mapped",[42649]],[[42649,42649],"valid"],[[42650,42650],"mapped",[42651]],[[42651,42651],"valid"],[[42652,42652],"mapped",[1098]],[[42653,42653],"mapped",[1100]],[[42654,42654],"valid"],[[42655,42655],"valid"],[[42656,42725],"valid"],[[42726,42735],"valid",[],"NV8"],[[42736,42737],"valid"],[[42738,42743],"valid",[],"NV8"],[[42744,42751],"disallowed"],[[42752,42774],"valid",[],"NV8"],[[42775,42778],"valid"],[[42779,42783],"valid"],[[42784,42785],"valid",[],"NV8"],[[42786,42786],"mapped",[42787]],[[42787,42787],"valid"],[[42788,42788],"mapped",[42789]],[[42789,42789],"valid"],[[42790,42790],"mapped",[42791]],[[42791,42791],"valid"],[[42792,42792],"mapped",[42793]],[[42793,42793],"valid"],[[42794,42794],"mapped",[42795]],[[42795,42795],"valid"],[[42796,42796],"mapped",[42797]],[[42797,42797],"valid"],[[42798,42798],"mapped",[42799]],[[42799,42801],"valid"],[[42802,42802],"mapped",[42803]],[[42803,42803],"valid"],[[42804,42804],"mapped",[42805]],[[42805,42805],"valid"],[[42806,42806],"mapped",[42807]],[[42807,42807],"valid"],[[42808,42808],"mapped",[42809]],[[42809,42809],"valid"],[[42810,42810],"mapped",[42811]],[[42811,42811],"valid"],[[42812,42812],"mapped",[42813]],[[42813,42813],"valid"],[[42814,42814],"mapped",[42815]],[[42815,42815],"valid"],[[42816,42816],"mapped",[42817]],[[42817,42817],"valid"],[[42818,42818],"mapped",[42819]],[[42819,42819],"valid"],[[42820,42820],"mapped",[42821]],[[42821,42821],"valid"],[[42822,42822],"mapped",[42823]],[[42823,42823],"valid"],[[42824,42824],"mapped",[42825]],[[42825,42825],"valid"],[[42826,42826],"mapped",[42827]],[[42827,42827],"valid"],[[42828,42828],"mapped",[42829]],[[42829,42829],"valid"],[[42830,42830],"mapped",[42831]],[[42831,42831],"valid"],[[42832,42832],"mapped",[42833]],[[42833,42833],"valid"],[[42834,42834],"mapped",[42835]],[[42835,42835],"valid"],[[42836,42836],"mapped",[42837]],[[42837,42837],"valid"],[[42838,42838],"mapped",[42839]],[[42839,42839],"valid"],[[42840,42840],"mapped",[42841]],[[42841,42841],"valid"],[[42842,42842],"mapped",[42843]],[[42843,42843],"valid"],[[42844,42844],"mapped",[42845]],[[42845,42845],"valid"],[[42846,42846],"mapped",[42847]],[[42847,42847],"valid"],[[42848,42848],"mapped",[42849]],[[42849,42849],"valid"],[[42850,42850],"mapped",[42851]],[[42851,42851],"valid"],[[42852,42852],"mapped",[42853]],[[42853,42853],"valid"],[[42854,42854],"mapped",[42855]],[[42855,42855],"valid"],[[42856,42856],"mapped",[42857]],[[42857,42857],"valid"],[[42858,42858],"mapped",[42859]],[[42859,42859],"valid"],[[42860,42860],"mapped",[42861]],[[42861,42861],"valid"],[[42862,42862],"mapped",[42863]],[[42863,42863],"valid"],[[42864,42864],"mapped",[42863]],[[42865,42872],"valid"],[[42873,42873],"mapped",[42874]],[[42874,42874],"valid"],[[42875,42875],"mapped",[42876]],[[42876,42876],"valid"],[[42877,42877],"mapped",[7545]],[[42878,42878],"mapped",[42879]],[[42879,42879],"valid"],[[42880,42880],"mapped",[42881]],[[42881,42881],"valid"],[[42882,42882],"mapped",[42883]],[[42883,42883],"valid"],[[42884,42884],"mapped",[42885]],[[42885,42885],"valid"],[[42886,42886],"mapped",[42887]],[[42887,42888],"valid"],[[42889,42890],"valid",[],"NV8"],[[42891,42891],"mapped",[42892]],[[42892,42892],"valid"],[[42893,42893],"mapped",[613]],[[42894,42894],"valid"],[[42895,42895],"valid"],[[42896,42896],"mapped",[42897]],[[42897,42897],"valid"],[[42898,42898],"mapped",[42899]],[[42899,42899],"valid"],[[42900,42901],"valid"],[[42902,42902],"mapped",[42903]],[[42903,42903],"valid"],[[42904,42904],"mapped",[42905]],[[42905,42905],"valid"],[[42906,42906],"mapped",[42907]],[[42907,42907],"valid"],[[42908,42908],"mapped",[42909]],[[42909,42909],"valid"],[[42910,42910],"mapped",[42911]],[[42911,42911],"valid"],[[42912,42912],"mapped",[42913]],[[42913,42913],"valid"],[[42914,42914],"mapped",[42915]],[[42915,42915],"valid"],[[42916,42916],"mapped",[42917]],[[42917,42917],"valid"],[[42918,42918],"mapped",[42919]],[[42919,42919],"valid"],[[42920,42920],"mapped",[42921]],[[42921,42921],"valid"],[[42922,42922],"mapped",[614]],[[42923,42923],"mapped",[604]],[[42924,42924],"mapped",[609]],[[42925,42925],"mapped",[620]],[[42926,42927],"disallowed"],[[42928,42928],"mapped",[670]],[[42929,42929],"mapped",[647]],[[42930,42930],"mapped",[669]],[[42931,42931],"mapped",[43859]],[[42932,42932],"mapped",[42933]],[[42933,42933],"valid"],[[42934,42934],"mapped",[42935]],[[42935,42935],"valid"],[[42936,42998],"disallowed"],[[42999,42999],"valid"],[[43000,43000],"mapped",[295]],[[43001,43001],"mapped",[339]],[[43002,43002],"valid"],[[43003,43007],"valid"],[[43008,43047],"valid"],[[43048,43051],"valid",[],"NV8"],[[43052,43055],"disallowed"],[[43056,43065],"valid",[],"NV8"],[[43066,43071],"disallowed"],[[43072,43123],"valid"],[[43124,43127],"valid",[],"NV8"],[[43128,43135],"disallowed"],[[43136,43204],"valid"],[[43205,43213],"disallowed"],[[43214,43215],"valid",[],"NV8"],[[43216,43225],"valid"],[[43226,43231],"disallowed"],[[43232,43255],"valid"],[[43256,43258],"valid",[],"NV8"],[[43259,43259],"valid"],[[43260,43260],"valid",[],"NV8"],[[43261,43261],"valid"],[[43262,43263],"disallowed"],[[43264,43309],"valid"],[[43310,43311],"valid",[],"NV8"],[[43312,43347],"valid"],[[43348,43358],"disallowed"],[[43359,43359],"valid",[],"NV8"],[[43360,43388],"valid",[],"NV8"],[[43389,43391],"disallowed"],[[43392,43456],"valid"],[[43457,43469],"valid",[],"NV8"],[[43470,43470],"disallowed"],[[43471,43481],"valid"],[[43482,43485],"disallowed"],[[43486,43487],"valid",[],"NV8"],[[43488,43518],"valid"],[[43519,43519],"disallowed"],[[43520,43574],"valid"],[[43575,43583],"disallowed"],[[43584,43597],"valid"],[[43598,43599],"disallowed"],[[43600,43609],"valid"],[[43610,43611],"disallowed"],[[43612,43615],"valid",[],"NV8"],[[43616,43638],"valid"],[[43639,43641],"valid",[],"NV8"],[[43642,43643],"valid"],[[43644,43647],"valid"],[[43648,43714],"valid"],[[43715,43738],"disallowed"],[[43739,43741],"valid"],[[43742,43743],"valid",[],"NV8"],[[43744,43759],"valid"],[[43760,43761],"valid",[],"NV8"],[[43762,43766],"valid"],[[43767,43776],"disallowed"],[[43777,43782],"valid"],[[43783,43784],"disallowed"],[[43785,43790],"valid"],[[43791,43792],"disallowed"],[[43793,43798],"valid"],[[43799,43807],"disallowed"],[[43808,43814],"valid"],[[43815,43815],"disallowed"],[[43816,43822],"valid"],[[43823,43823],"disallowed"],[[43824,43866],"valid"],[[43867,43867],"valid",[],"NV8"],[[43868,43868],"mapped",[42791]],[[43869,43869],"mapped",[43831]],[[43870,43870],"mapped",[619]],[[43871,43871],"mapped",[43858]],[[43872,43875],"valid"],[[43876,43877],"valid"],[[43878,43887],"disallowed"],[[43888,43888],"mapped",[5024]],[[43889,43889],"mapped",[5025]],[[43890,43890],"mapped",[5026]],[[43891,43891],"mapped",[5027]],[[43892,43892],"mapped",[5028]],[[43893,43893],"mapped",[5029]],[[43894,43894],"mapped",[5030]],[[43895,43895],"mapped",[5031]],[[43896,43896],"mapped",[5032]],[[43897,43897],"mapped",[5033]],[[43898,43898],"mapped",[5034]],[[43899,43899],"mapped",[5035]],[[43900,43900],"mapped",[5036]],[[43901,43901],"mapped",[5037]],[[43902,43902],"mapped",[5038]],[[43903,43903],"mapped",[5039]],[[43904,43904],"mapped",[5040]],[[43905,43905],"mapped",[5041]],[[43906,43906],"mapped",[5042]],[[43907,43907],"mapped",[5043]],[[43908,43908],"mapped",[5044]],[[43909,43909],"mapped",[5045]],[[43910,43910],"mapped",[5046]],[[43911,43911],"mapped",[5047]],[[43912,43912],"mapped",[5048]],[[43913,43913],"mapped",[5049]],[[43914,43914],"mapped",[5050]],[[43915,43915],"mapped",[5051]],[[43916,43916],"mapped",[5052]],[[43917,43917],"mapped",[5053]],[[43918,43918],"mapped",[5054]],[[43919,43919],"mapped",[5055]],[[43920,43920],"mapped",[5056]],[[43921,43921],"mapped",[5057]],[[43922,43922],"mapped",[5058]],[[43923,43923],"mapped",[5059]],[[43924,43924],"mapped",[5060]],[[43925,43925],"mapped",[5061]],[[43926,43926],"mapped",[5062]],[[43927,43927],"mapped",[5063]],[[43928,43928],"mapped",[5064]],[[43929,43929],"mapped",[5065]],[[43930,43930],"mapped",[5066]],[[43931,43931],"mapped",[5067]],[[43932,43932],"mapped",[5068]],[[43933,43933],"mapped",[5069]],[[43934,43934],"mapped",[5070]],[[43935,43935],"mapped",[5071]],[[43936,43936],"mapped",[5072]],[[43937,43937],"mapped",[5073]],[[43938,43938],"mapped",[5074]],[[43939,43939],"mapped",[5075]],[[43940,43940],"mapped",[5076]],[[43941,43941],"mapped",[5077]],[[43942,43942],"mapped",[5078]],[[43943,43943],"mapped",[5079]],[[43944,43944],"mapped",[5080]],[[43945,43945],"mapped",[5081]],[[43946,43946],"mapped",[5082]],[[43947,43947],"mapped",[5083]],[[43948,43948],"mapped",[5084]],[[43949,43949],"mapped",[5085]],[[43950,43950],"mapped",[5086]],[[43951,43951],"mapped",[5087]],[[43952,43952],"mapped",[5088]],[[43953,43953],"mapped",[5089]],[[43954,43954],"mapped",[5090]],[[43955,43955],"mapped",[5091]],[[43956,43956],"mapped",[5092]],[[43957,43957],"mapped",[5093]],[[43958,43958],"mapped",[5094]],[[43959,43959],"mapped",[5095]],[[43960,43960],"mapped",[5096]],[[43961,43961],"mapped",[5097]],[[43962,43962],"mapped",[5098]],[[43963,43963],"mapped",[5099]],[[43964,43964],"mapped",[5100]],[[43965,43965],"mapped",[5101]],[[43966,43966],"mapped",[5102]],[[43967,43967],"mapped",[5103]],[[43968,44010],"valid"],[[44011,44011],"valid",[],"NV8"],[[44012,44013],"valid"],[[44014,44015],"disallowed"],[[44016,44025],"valid"],[[44026,44031],"disallowed"],[[44032,55203],"valid"],[[55204,55215],"disallowed"],[[55216,55238],"valid",[],"NV8"],[[55239,55242],"disallowed"],[[55243,55291],"valid",[],"NV8"],[[55292,55295],"disallowed"],[[55296,57343],"disallowed"],[[57344,63743],"disallowed"],[[63744,63744],"mapped",[35912]],[[63745,63745],"mapped",[26356]],[[63746,63746],"mapped",[36554]],[[63747,63747],"mapped",[36040]],[[63748,63748],"mapped",[28369]],[[63749,63749],"mapped",[20018]],[[63750,63750],"mapped",[21477]],[[63751,63752],"mapped",[40860]],[[63753,63753],"mapped",[22865]],[[63754,63754],"mapped",[37329]],[[63755,63755],"mapped",[21895]],[[63756,63756],"mapped",[22856]],[[63757,63757],"mapped",[25078]],[[63758,63758],"mapped",[30313]],[[63759,63759],"mapped",[32645]],[[63760,63760],"mapped",[34367]],[[63761,63761],"mapped",[34746]],[[63762,63762],"mapped",[35064]],[[63763,63763],"mapped",[37007]],[[63764,63764],"mapped",[27138]],[[63765,63765],"mapped",[27931]],[[63766,63766],"mapped",[28889]],[[63767,63767],"mapped",[29662]],[[63768,63768],"mapped",[33853]],[[63769,63769],"mapped",[37226]],[[63770,63770],"mapped",[39409]],[[63771,63771],"mapped",[20098]],[[63772,63772],"mapped",[21365]],[[63773,63773],"mapped",[27396]],[[63774,63774],"mapped",[29211]],[[63775,63775],"mapped",[34349]],[[63776,63776],"mapped",[40478]],[[63777,63777],"mapped",[23888]],[[63778,63778],"mapped",[28651]],[[63779,63779],"mapped",[34253]],[[63780,63780],"mapped",[35172]],[[63781,63781],"mapped",[25289]],[[63782,63782],"mapped",[33240]],[[63783,63783],"mapped",[34847]],[[63784,63784],"mapped",[24266]],[[63785,63785],"mapped",[26391]],[[63786,63786],"mapped",[28010]],[[63787,63787],"mapped",[29436]],[[63788,63788],"mapped",[37070]],[[63789,63789],"mapped",[20358]],[[63790,63790],"mapped",[20919]],[[63791,63791],"mapped",[21214]],[[63792,63792],"mapped",[25796]],[[63793,63793],"mapped",[27347]],[[63794,63794],"mapped",[29200]],[[63795,63795],"mapped",[30439]],[[63796,63796],"mapped",[32769]],[[63797,63797],"mapped",[34310]],[[63798,63798],"mapped",[34396]],[[63799,63799],"mapped",[36335]],[[63800,63800],"mapped",[38706]],[[63801,63801],"mapped",[39791]],[[63802,63802],"mapped",[40442]],[[63803,63803],"mapped",[30860]],[[63804,63804],"mapped",[31103]],[[63805,63805],"mapped",[32160]],[[63806,63806],"mapped",[33737]],[[63807,63807],"mapped",[37636]],[[63808,63808],"mapped",[40575]],[[63809,63809],"mapped",[35542]],[[63810,63810],"mapped",[22751]],[[63811,63811],"mapped",[24324]],[[63812,63812],"mapped",[31840]],[[63813,63813],"mapped",[32894]],[[63814,63814],"mapped",[29282]],[[63815,63815],"mapped",[30922]],[[63816,63816],"mapped",[36034]],[[63817,63817],"mapped",[38647]],[[63818,63818],"mapped",[22744]],[[63819,63819],"mapped",[23650]],[[63820,63820],"mapped",[27155]],[[63821,63821],"mapped",[28122]],[[63822,63822],"mapped",[28431]],[[63823,63823],"mapped",[32047]],[[63824,63824],"mapped",[32311]],[[63825,63825],"mapped",[38475]],[[63826,63826],"mapped",[21202]],[[63827,63827],"mapped",[32907]],[[63828,63828],"mapped",[20956]],[[63829,63829],"mapped",[20940]],[[63830,63830],"mapped",[31260]],[[63831,63831],"mapped",[32190]],[[63832,63832],"mapped",[33777]],[[63833,63833],"mapped",[38517]],[[63834,63834],"mapped",[35712]],[[63835,63835],"mapped",[25295]],[[63836,63836],"mapped",[27138]],[[63837,63837],"mapped",[35582]],[[63838,63838],"mapped",[20025]],[[63839,63839],"mapped",[23527]],[[63840,63840],"mapped",[24594]],[[63841,63841],"mapped",[29575]],[[63842,63842],"mapped",[30064]],[[63843,63843],"mapped",[21271]],[[63844,63844],"mapped",[30971]],[[63845,63845],"mapped",[20415]],[[63846,63846],"mapped",[24489]],[[63847,63847],"mapped",[19981]],[[63848,63848],"mapped",[27852]],[[63849,63849],"mapped",[25976]],[[63850,63850],"mapped",[32034]],[[63851,63851],"mapped",[21443]],[[63852,63852],"mapped",[22622]],[[63853,63853],"mapped",[30465]],[[63854,63854],"mapped",[33865]],[[63855,63855],"mapped",[35498]],[[63856,63856],"mapped",[27578]],[[63857,63857],"mapped",[36784]],[[63858,63858],"mapped",[27784]],[[63859,63859],"mapped",[25342]],[[63860,63860],"mapped",[33509]],[[63861,63861],"mapped",[25504]],[[63862,63862],"mapped",[30053]],[[63863,63863],"mapped",[20142]],[[63864,63864],"mapped",[20841]],[[63865,63865],"mapped",[20937]],[[63866,63866],"mapped",[26753]],[[63867,63867],"mapped",[31975]],[[63868,63868],"mapped",[33391]],[[63869,63869],"mapped",[35538]],[[63870,63870],"mapped",[37327]],[[63871,63871],"mapped",[21237]],[[63872,63872],"mapped",[21570]],[[63873,63873],"mapped",[22899]],[[63874,63874],"mapped",[24300]],[[63875,63875],"mapped",[26053]],[[63876,63876],"mapped",[28670]],[[63877,63877],"mapped",[31018]],[[63878,63878],"mapped",[38317]],[[63879,63879],"mapped",[39530]],[[63880,63880],"mapped",[40599]],[[63881,63881],"mapped",[40654]],[[63882,63882],"mapped",[21147]],[[63883,63883],"mapped",[26310]],[[63884,63884],"mapped",[27511]],[[63885,63885],"mapped",[36706]],[[63886,63886],"mapped",[24180]],[[63887,63887],"mapped",[24976]],[[63888,63888],"mapped",[25088]],[[63889,63889],"mapped",[25754]],[[63890,63890],"mapped",[28451]],[[63891,63891],"mapped",[29001]],[[63892,63892],"mapped",[29833]],[[63893,63893],"mapped",[31178]],[[63894,63894],"mapped",[32244]],[[63895,63895],"mapped",[32879]],[[63896,63896],"mapped",[36646]],[[63897,63897],"mapped",[34030]],[[63898,63898],"mapped",[36899]],[[63899,63899],"mapped",[37706]],[[63900,63900],"mapped",[21015]],[[63901,63901],"mapped",[21155]],[[63902,63902],"mapped",[21693]],[[63903,63903],"mapped",[28872]],[[63904,63904],"mapped",[35010]],[[63905,63905],"mapped",[35498]],[[63906,63906],"mapped",[24265]],[[63907,63907],"mapped",[24565]],[[63908,63908],"mapped",[25467]],[[63909,63909],"mapped",[27566]],[[63910,63910],"mapped",[31806]],[[63911,63911],"mapped",[29557]],[[63912,63912],"mapped",[20196]],[[63913,63913],"mapped",[22265]],[[63914,63914],"mapped",[23527]],[[63915,63915],"mapped",[23994]],[[63916,63916],"mapped",[24604]],[[63917,63917],"mapped",[29618]],[[63918,63918],"mapped",[29801]],[[63919,63919],"mapped",[32666]],[[63920,63920],"mapped",[32838]],[[63921,63921],"mapped",[37428]],[[63922,63922],"mapped",[38646]],[[63923,63923],"mapped",[38728]],[[63924,63924],"mapped",[38936]],[[63925,63925],"mapped",[20363]],[[63926,63926],"mapped",[31150]],[[63927,63927],"mapped",[37300]],[[63928,63928],"mapped",[38584]],[[63929,63929],"mapped",[24801]],[[63930,63930],"mapped",[20102]],[[63931,63931],"mapped",[20698]],[[63932,63932],"mapped",[23534]],[[63933,63933],"mapped",[23615]],[[63934,63934],"mapped",[26009]],[[63935,63935],"mapped",[27138]],[[63936,63936],"mapped",[29134]],[[63937,63937],"mapped",[30274]],[[63938,63938],"mapped",[34044]],[[63939,63939],"mapped",[36988]],[[63940,63940],"mapped",[40845]],[[63941,63941],"mapped",[26248]],[[63942,63942],"mapped",[38446]],[[63943,63943],"mapped",[21129]],[[63944,63944],"mapped",[26491]],[[63945,63945],"mapped",[26611]],[[63946,63946],"mapped",[27969]],[[63947,63947],"mapped",[28316]],[[63948,63948],"mapped",[29705]],[[63949,63949],"mapped",[30041]],[[63950,63950],"mapped",[30827]],[[63951,63951],"mapped",[32016]],[[63952,63952],"mapped",[39006]],[[63953,63953],"mapped",[20845]],[[63954,63954],"mapped",[25134]],[[63955,63955],"mapped",[38520]],[[63956,63956],"mapped",[20523]],[[63957,63957],"mapped",[23833]],[[63958,63958],"mapped",[28138]],[[63959,63959],"mapped",[36650]],[[63960,63960],"mapped",[24459]],[[63961,63961],"mapped",[24900]],[[63962,63962],"mapped",[26647]],[[63963,63963],"mapped",[29575]],[[63964,63964],"mapped",[38534]],[[63965,63965],"mapped",[21033]],[[63966,63966],"mapped",[21519]],[[63967,63967],"mapped",[23653]],[[63968,63968],"mapped",[26131]],[[63969,63969],"mapped",[26446]],[[63970,63970],"mapped",[26792]],[[63971,63971],"mapped",[27877]],[[63972,63972],"mapped",[29702]],[[63973,63973],"mapped",[30178]],[[63974,63974],"mapped",[32633]],[[63975,63975],"mapped",[35023]],[[63976,63976],"mapped",[35041]],[[63977,63977],"mapped",[37324]],[[63978,63978],"mapped",[38626]],[[63979,63979],"mapped",[21311]],[[63980,63980],"mapped",[28346]],[[63981,63981],"mapped",[21533]],[[63982,63982],"mapped",[29136]],[[63983,63983],"mapped",[29848]],[[63984,63984],"mapped",[34298]],[[63985,63985],"mapped",[38563]],[[63986,63986],"mapped",[40023]],[[63987,63987],"mapped",[40607]],[[63988,63988],"mapped",[26519]],[[63989,63989],"mapped",[28107]],[[63990,63990],"mapped",[33256]],[[63991,63991],"mapped",[31435]],[[63992,63992],"mapped",[31520]],[[63993,63993],"mapped",[31890]],[[63994,63994],"mapped",[29376]],[[63995,63995],"mapped",[28825]],[[63996,63996],"mapped",[35672]],[[63997,63997],"mapped",[20160]],[[63998,63998],"mapped",[33590]],[[63999,63999],"mapped",[21050]],[[64000,64000],"mapped",[20999]],[[64001,64001],"mapped",[24230]],[[64002,64002],"mapped",[25299]],[[64003,64003],"mapped",[31958]],[[64004,64004],"mapped",[23429]],[[64005,64005],"mapped",[27934]],[[64006,64006],"mapped",[26292]],[[64007,64007],"mapped",[36667]],[[64008,64008],"mapped",[34892]],[[64009,64009],"mapped",[38477]],[[64010,64010],"mapped",[35211]],[[64011,64011],"mapped",[24275]],[[64012,64012],"mapped",[20800]],[[64013,64013],"mapped",[21952]],[[64014,64015],"valid"],[[64016,64016],"mapped",[22618]],[[64017,64017],"valid"],[[64018,64018],"mapped",[26228]],[[64019,64020],"valid"],[[64021,64021],"mapped",[20958]],[[64022,64022],"mapped",[29482]],[[64023,64023],"mapped",[30410]],[[64024,64024],"mapped",[31036]],[[64025,64025],"mapped",[31070]],[[64026,64026],"mapped",[31077]],[[64027,64027],"mapped",[31119]],[[64028,64028],"mapped",[38742]],[[64029,64029],"mapped",[31934]],[[64030,64030],"mapped",[32701]],[[64031,64031],"valid"],[[64032,64032],"mapped",[34322]],[[64033,64033],"valid"],[[64034,64034],"mapped",[35576]],[[64035,64036],"valid"],[[64037,64037],"mapped",[36920]],[[64038,64038],"mapped",[37117]],[[64039,64041],"valid"],[[64042,64042],"mapped",[39151]],[[64043,64043],"mapped",[39164]],[[64044,64044],"mapped",[39208]],[[64045,64045],"mapped",[40372]],[[64046,64046],"mapped",[37086]],[[64047,64047],"mapped",[38583]],[[64048,64048],"mapped",[20398]],[[64049,64049],"mapped",[20711]],[[64050,64050],"mapped",[20813]],[[64051,64051],"mapped",[21193]],[[64052,64052],"mapped",[21220]],[[64053,64053],"mapped",[21329]],[[64054,64054],"mapped",[21917]],[[64055,64055],"mapped",[22022]],[[64056,64056],"mapped",[22120]],[[64057,64057],"mapped",[22592]],[[64058,64058],"mapped",[22696]],[[64059,64059],"mapped",[23652]],[[64060,64060],"mapped",[23662]],[[64061,64061],"mapped",[24724]],[[64062,64062],"mapped",[24936]],[[64063,64063],"mapped",[24974]],[[64064,64064],"mapped",[25074]],[[64065,64065],"mapped",[25935]],[[64066,64066],"mapped",[26082]],[[64067,64067],"mapped",[26257]],[[64068,64068],"mapped",[26757]],[[64069,64069],"mapped",[28023]],[[64070,64070],"mapped",[28186]],[[64071,64071],"mapped",[28450]],[[64072,64072],"mapped",[29038]],[[64073,64073],"mapped",[29227]],[[64074,64074],"mapped",[29730]],[[64075,64075],"mapped",[30865]],[[64076,64076],"mapped",[31038]],[[64077,64077],"mapped",[31049]],[[64078,64078],"mapped",[31048]],[[64079,64079],"mapped",[31056]],[[64080,64080],"mapped",[31062]],[[64081,64081],"mapped",[31069]],[[64082,64082],"mapped",[31117]],[[64083,64083],"mapped",[31118]],[[64084,64084],"mapped",[31296]],[[64085,64085],"mapped",[31361]],[[64086,64086],"mapped",[31680]],[[64087,64087],"mapped",[32244]],[[64088,64088],"mapped",[32265]],[[64089,64089],"mapped",[32321]],[[64090,64090],"mapped",[32626]],[[64091,64091],"mapped",[32773]],[[64092,64092],"mapped",[33261]],[[64093,64094],"mapped",[33401]],[[64095,64095],"mapped",[33879]],[[64096,64096],"mapped",[35088]],[[64097,64097],"mapped",[35222]],[[64098,64098],"mapped",[35585]],[[64099,64099],"mapped",[35641]],[[64100,64100],"mapped",[36051]],[[64101,64101],"mapped",[36104]],[[64102,64102],"mapped",[36790]],[[64103,64103],"mapped",[36920]],[[64104,64104],"mapped",[38627]],[[64105,64105],"mapped",[38911]],[[64106,64106],"mapped",[38971]],[[64107,64107],"mapped",[24693]],[[64108,64108],"mapped",[148206]],[[64109,64109],"mapped",[33304]],[[64110,64111],"disallowed"],[[64112,64112],"mapped",[20006]],[[64113,64113],"mapped",[20917]],[[64114,64114],"mapped",[20840]],[[64115,64115],"mapped",[20352]],[[64116,64116],"mapped",[20805]],[[64117,64117],"mapped",[20864]],[[64118,64118],"mapped",[21191]],[[64119,64119],"mapped",[21242]],[[64120,64120],"mapped",[21917]],[[64121,64121],"mapped",[21845]],[[64122,64122],"mapped",[21913]],[[64123,64123],"mapped",[21986]],[[64124,64124],"mapped",[22618]],[[64125,64125],"mapped",[22707]],[[64126,64126],"mapped",[22852]],[[64127,64127],"mapped",[22868]],[[64128,64128],"mapped",[23138]],[[64129,64129],"mapped",[23336]],[[64130,64130],"mapped",[24274]],[[64131,64131],"mapped",[24281]],[[64132,64132],"mapped",[24425]],[[64133,64133],"mapped",[24493]],[[64134,64134],"mapped",[24792]],[[64135,64135],"mapped",[24910]],[[64136,64136],"mapped",[24840]],[[64137,64137],"mapped",[24974]],[[64138,64138],"mapped",[24928]],[[64139,64139],"mapped",[25074]],[[64140,64140],"mapped",[25140]],[[64141,64141],"mapped",[25540]],[[64142,64142],"mapped",[25628]],[[64143,64143],"mapped",[25682]],[[64144,64144],"mapped",[25942]],[[64145,64145],"mapped",[26228]],[[64146,64146],"mapped",[26391]],[[64147,64147],"mapped",[26395]],[[64148,64148],"mapped",[26454]],[[64149,64149],"mapped",[27513]],[[64150,64150],"mapped",[27578]],[[64151,64151],"mapped",[27969]],[[64152,64152],"mapped",[28379]],[[64153,64153],"mapped",[28363]],[[64154,64154],"mapped",[28450]],[[64155,64155],"mapped",[28702]],[[64156,64156],"mapped",[29038]],[[64157,64157],"mapped",[30631]],[[64158,64158],"mapped",[29237]],[[64159,64159],"mapped",[29359]],[[64160,64160],"mapped",[29482]],[[64161,64161],"mapped",[29809]],[[64162,64162],"mapped",[29958]],[[64163,64163],"mapped",[30011]],[[64164,64164],"mapped",[30237]],[[64165,64165],"mapped",[30239]],[[64166,64166],"mapped",[30410]],[[64167,64167],"mapped",[30427]],[[64168,64168],"mapped",[30452]],[[64169,64169],"mapped",[30538]],[[64170,64170],"mapped",[30528]],[[64171,64171],"mapped",[30924]],[[64172,64172],"mapped",[31409]],[[64173,64173],"mapped",[31680]],[[64174,64174],"mapped",[31867]],[[64175,64175],"mapped",[32091]],[[64176,64176],"mapped",[32244]],[[64177,64177],"mapped",[32574]],[[64178,64178],"mapped",[32773]],[[64179,64179],"mapped",[33618]],[[64180,64180],"mapped",[33775]],[[64181,64181],"mapped",[34681]],[[64182,64182],"mapped",[35137]],[[64183,64183],"mapped",[35206]],[[64184,64184],"mapped",[35222]],[[64185,64185],"mapped",[35519]],[[64186,64186],"mapped",[35576]],[[64187,64187],"mapped",[35531]],[[64188,64188],"mapped",[35585]],[[64189,64189],"mapped",[35582]],[[64190,64190],"mapped",[35565]],[[64191,64191],"mapped",[35641]],[[64192,64192],"mapped",[35722]],[[64193,64193],"mapped",[36104]],[[64194,64194],"mapped",[36664]],[[64195,64195],"mapped",[36978]],[[64196,64196],"mapped",[37273]],[[64197,64197],"mapped",[37494]],[[64198,64198],"mapped",[38524]],[[64199,64199],"mapped",[38627]],[[64200,64200],"mapped",[38742]],[[64201,64201],"mapped",[38875]],[[64202,64202],"mapped",[38911]],[[64203,64203],"mapped",[38923]],[[64204,64204],"mapped",[38971]],[[64205,64205],"mapped",[39698]],[[64206,64206],"mapped",[40860]],[[64207,64207],"mapped",[141386]],[[64208,64208],"mapped",[141380]],[[64209,64209],"mapped",[144341]],[[64210,64210],"mapped",[15261]],[[64211,64211],"mapped",[16408]],[[64212,64212],"mapped",[16441]],[[64213,64213],"mapped",[152137]],[[64214,64214],"mapped",[154832]],[[64215,64215],"mapped",[163539]],[[64216,64216],"mapped",[40771]],[[64217,64217],"mapped",[40846]],[[64218,64255],"disallowed"],[[64256,64256],"mapped",[102,102]],[[64257,64257],"mapped",[102,105]],[[64258,64258],"mapped",[102,108]],[[64259,64259],"mapped",[102,102,105]],[[64260,64260],"mapped",[102,102,108]],[[64261,64262],"mapped",[115,116]],[[64263,64274],"disallowed"],[[64275,64275],"mapped",[1396,1398]],[[64276,64276],"mapped",[1396,1381]],[[64277,64277],"mapped",[1396,1387]],[[64278,64278],"mapped",[1406,1398]],[[64279,64279],"mapped",[1396,1389]],[[64280,64284],"disallowed"],[[64285,64285],"mapped",[1497,1460]],[[64286,64286],"valid"],[[64287,64287],"mapped",[1522,1463]],[[64288,64288],"mapped",[1506]],[[64289,64289],"mapped",[1488]],[[64290,64290],"mapped",[1491]],[[64291,64291],"mapped",[1492]],[[64292,64292],"mapped",[1499]],[[64293,64293],"mapped",[1500]],[[64294,64294],"mapped",[1501]],[[64295,64295],"mapped",[1512]],[[64296,64296],"mapped",[1514]],[[64297,64297],"disallowed_STD3_mapped",[43]],[[64298,64298],"mapped",[1513,1473]],[[64299,64299],"mapped",[1513,1474]],[[64300,64300],"mapped",[1513,1468,1473]],[[64301,64301],"mapped",[1513,1468,1474]],[[64302,64302],"mapped",[1488,1463]],[[64303,64303],"mapped",[1488,1464]],[[64304,64304],"mapped",[1488,1468]],[[64305,64305],"mapped",[1489,1468]],[[64306,64306],"mapped",[1490,1468]],[[64307,64307],"mapped",[1491,1468]],[[64308,64308],"mapped",[1492,1468]],[[64309,64309],"mapped",[1493,1468]],[[64310,64310],"mapped",[1494,1468]],[[64311,64311],"disallowed"],[[64312,64312],"mapped",[1496,1468]],[[64313,64313],"mapped",[1497,1468]],[[64314,64314],"mapped",[1498,1468]],[[64315,64315],"mapped",[1499,1468]],[[64316,64316],"mapped",[1500,1468]],[[64317,64317],"disallowed"],[[64318,64318],"mapped",[1502,1468]],[[64319,64319],"disallowed"],[[64320,64320],"mapped",[1504,1468]],[[64321,64321],"mapped",[1505,1468]],[[64322,64322],"disallowed"],[[64323,64323],"mapped",[1507,1468]],[[64324,64324],"mapped",[1508,1468]],[[64325,64325],"disallowed"],[[64326,64326],"mapped",[1510,1468]],[[64327,64327],"mapped",[1511,1468]],[[64328,64328],"mapped",[1512,1468]],[[64329,64329],"mapped",[1513,1468]],[[64330,64330],"mapped",[1514,1468]],[[64331,64331],"mapped",[1493,1465]],[[64332,64332],"mapped",[1489,1471]],[[64333,64333],"mapped",[1499,1471]],[[64334,64334],"mapped",[1508,1471]],[[64335,64335],"mapped",[1488,1500]],[[64336,64337],"mapped",[1649]],[[64338,64341],"mapped",[1659]],[[64342,64345],"mapped",[1662]],[[64346,64349],"mapped",[1664]],[[64350,64353],"mapped",[1658]],[[64354,64357],"mapped",[1663]],[[64358,64361],"mapped",[1657]],[[64362,64365],"mapped",[1700]],[[64366,64369],"mapped",[1702]],[[64370,64373],"mapped",[1668]],[[64374,64377],"mapped",[1667]],[[64378,64381],"mapped",[1670]],[[64382,64385],"mapped",[1671]],[[64386,64387],"mapped",[1677]],[[64388,64389],"mapped",[1676]],[[64390,64391],"mapped",[1678]],[[64392,64393],"mapped",[1672]],[[64394,64395],"mapped",[1688]],[[64396,64397],"mapped",[1681]],[[64398,64401],"mapped",[1705]],[[64402,64405],"mapped",[1711]],[[64406,64409],"mapped",[1715]],[[64410,64413],"mapped",[1713]],[[64414,64415],"mapped",[1722]],[[64416,64419],"mapped",[1723]],[[64420,64421],"mapped",[1728]],[[64422,64425],"mapped",[1729]],[[64426,64429],"mapped",[1726]],[[64430,64431],"mapped",[1746]],[[64432,64433],"mapped",[1747]],[[64434,64449],"valid",[],"NV8"],[[64450,64466],"disallowed"],[[64467,64470],"mapped",[1709]],[[64471,64472],"mapped",[1735]],[[64473,64474],"mapped",[1734]],[[64475,64476],"mapped",[1736]],[[64477,64477],"mapped",[1735,1652]],[[64478,64479],"mapped",[1739]],[[64480,64481],"mapped",[1733]],[[64482,64483],"mapped",[1737]],[[64484,64487],"mapped",[1744]],[[64488,64489],"mapped",[1609]],[[64490,64491],"mapped",[1574,1575]],[[64492,64493],"mapped",[1574,1749]],[[64494,64495],"mapped",[1574,1608]],[[64496,64497],"mapped",[1574,1735]],[[64498,64499],"mapped",[1574,1734]],[[64500,64501],"mapped",[1574,1736]],[[64502,64504],"mapped",[1574,1744]],[[64505,64507],"mapped",[1574,1609]],[[64508,64511],"mapped",[1740]],[[64512,64512],"mapped",[1574,1580]],[[64513,64513],"mapped",[1574,1581]],[[64514,64514],"mapped",[1574,1605]],[[64515,64515],"mapped",[1574,1609]],[[64516,64516],"mapped",[1574,1610]],[[64517,64517],"mapped",[1576,1580]],[[64518,64518],"mapped",[1576,1581]],[[64519,64519],"mapped",[1576,1582]],[[64520,64520],"mapped",[1576,1605]],[[64521,64521],"mapped",[1576,1609]],[[64522,64522],"mapped",[1576,1610]],[[64523,64523],"mapped",[1578,1580]],[[64524,64524],"mapped",[1578,1581]],[[64525,64525],"mapped",[1578,1582]],[[64526,64526],"mapped",[1578,1605]],[[64527,64527],"mapped",[1578,1609]],[[64528,64528],"mapped",[1578,1610]],[[64529,64529],"mapped",[1579,1580]],[[64530,64530],"mapped",[1579,1605]],[[64531,64531],"mapped",[1579,1609]],[[64532,64532],"mapped",[1579,1610]],[[64533,64533],"mapped",[1580,1581]],[[64534,64534],"mapped",[1580,1605]],[[64535,64535],"mapped",[1581,1580]],[[64536,64536],"mapped",[1581,1605]],[[64537,64537],"mapped",[1582,1580]],[[64538,64538],"mapped",[1582,1581]],[[64539,64539],"mapped",[1582,1605]],[[64540,64540],"mapped",[1587,1580]],[[64541,64541],"mapped",[1587,1581]],[[64542,64542],"mapped",[1587,1582]],[[64543,64543],"mapped",[1587,1605]],[[64544,64544],"mapped",[1589,1581]],[[64545,64545],"mapped",[1589,1605]],[[64546,64546],"mapped",[1590,1580]],[[64547,64547],"mapped",[1590,1581]],[[64548,64548],"mapped",[1590,1582]],[[64549,64549],"mapped",[1590,1605]],[[64550,64550],"mapped",[1591,1581]],[[64551,64551],"mapped",[1591,1605]],[[64552,64552],"mapped",[1592,1605]],[[64553,64553],"mapped",[1593,1580]],[[64554,64554],"mapped",[1593,1605]],[[64555,64555],"mapped",[1594,1580]],[[64556,64556],"mapped",[1594,1605]],[[64557,64557],"mapped",[1601,1580]],[[64558,64558],"mapped",[1601,1581]],[[64559,64559],"mapped",[1601,1582]],[[64560,64560],"mapped",[1601,1605]],[[64561,64561],"mapped",[1601,1609]],[[64562,64562],"mapped",[1601,1610]],[[64563,64563],"mapped",[1602,1581]],[[64564,64564],"mapped",[1602,1605]],[[64565,64565],"mapped",[1602,1609]],[[64566,64566],"mapped",[1602,1610]],[[64567,64567],"mapped",[1603,1575]],[[64568,64568],"mapped",[1603,1580]],[[64569,64569],"mapped",[1603,1581]],[[64570,64570],"mapped",[1603,1582]],[[64571,64571],"mapped",[1603,1604]],[[64572,64572],"mapped",[1603,1605]],[[64573,64573],"mapped",[1603,1609]],[[64574,64574],"mapped",[1603,1610]],[[64575,64575],"mapped",[1604,1580]],[[64576,64576],"mapped",[1604,1581]],[[64577,64577],"mapped",[1604,1582]],[[64578,64578],"mapped",[1604,1605]],[[64579,64579],"mapped",[1604,1609]],[[64580,64580],"mapped",[1604,1610]],[[64581,64581],"mapped",[1605,1580]],[[64582,64582],"mapped",[1605,1581]],[[64583,64583],"mapped",[1605,1582]],[[64584,64584],"mapped",[1605,1605]],[[64585,64585],"mapped",[1605,1609]],[[64586,64586],"mapped",[1605,1610]],[[64587,64587],"mapped",[1606,1580]],[[64588,64588],"mapped",[1606,1581]],[[64589,64589],"mapped",[1606,1582]],[[64590,64590],"mapped",[1606,1605]],[[64591,64591],"mapped",[1606,1609]],[[64592,64592],"mapped",[1606,1610]],[[64593,64593],"mapped",[1607,1580]],[[64594,64594],"mapped",[1607,1605]],[[64595,64595],"mapped",[1607,1609]],[[64596,64596],"mapped",[1607,1610]],[[64597,64597],"mapped",[1610,1580]],[[64598,64598],"mapped",[1610,1581]],[[64599,64599],"mapped",[1610,1582]],[[64600,64600],"mapped",[1610,1605]],[[64601,64601],"mapped",[1610,1609]],[[64602,64602],"mapped",[1610,1610]],[[64603,64603],"mapped",[1584,1648]],[[64604,64604],"mapped",[1585,1648]],[[64605,64605],"mapped",[1609,1648]],[[64606,64606],"disallowed_STD3_mapped",[32,1612,1617]],[[64607,64607],"disallowed_STD3_mapped",[32,1613,1617]],[[64608,64608],"disallowed_STD3_mapped",[32,1614,1617]],[[64609,64609],"disallowed_STD3_mapped",[32,1615,1617]],[[64610,64610],"disallowed_STD3_mapped",[32,1616,1617]],[[64611,64611],"disallowed_STD3_mapped",[32,1617,1648]],[[64612,64612],"mapped",[1574,1585]],[[64613,64613],"mapped",[1574,1586]],[[64614,64614],"mapped",[1574,1605]],[[64615,64615],"mapped",[1574,1606]],[[64616,64616],"mapped",[1574,1609]],[[64617,64617],"mapped",[1574,1610]],[[64618,64618],"mapped",[1576,1585]],[[64619,64619],"mapped",[1576,1586]],[[64620,64620],"mapped",[1576,1605]],[[64621,64621],"mapped",[1576,1606]],[[64622,64622],"mapped",[1576,1609]],[[64623,64623],"mapped",[1576,1610]],[[64624,64624],"mapped",[1578,1585]],[[64625,64625],"mapped",[1578,1586]],[[64626,64626],"mapped",[1578,1605]],[[64627,64627],"mapped",[1578,1606]],[[64628,64628],"mapped",[1578,1609]],[[64629,64629],"mapped",[1578,1610]],[[64630,64630],"mapped",[1579,1585]],[[64631,64631],"mapped",[1579,1586]],[[64632,64632],"mapped",[1579,1605]],[[64633,64633],"mapped",[1579,1606]],[[64634,64634],"mapped",[1579,1609]],[[64635,64635],"mapped",[1579,1610]],[[64636,64636],"mapped",[1601,1609]],[[64637,64637],"mapped",[1601,1610]],[[64638,64638],"mapped",[1602,1609]],[[64639,64639],"mapped",[1602,1610]],[[64640,64640],"mapped",[1603,1575]],[[64641,64641],"mapped",[1603,1604]],[[64642,64642],"mapped",[1603,1605]],[[64643,64643],"mapped",[1603,1609]],[[64644,64644],"mapped",[1603,1610]],[[64645,64645],"mapped",[1604,1605]],[[64646,64646],"mapped",[1604,1609]],[[64647,64647],"mapped",[1604,1610]],[[64648,64648],"mapped",[1605,1575]],[[64649,64649],"mapped",[1605,1605]],[[64650,64650],"mapped",[1606,1585]],[[64651,64651],"mapped",[1606,1586]],[[64652,64652],"mapped",[1606,1605]],[[64653,64653],"mapped",[1606,1606]],[[64654,64654],"mapped",[1606,1609]],[[64655,64655],"mapped",[1606,1610]],[[64656,64656],"mapped",[1609,1648]],[[64657,64657],"mapped",[1610,1585]],[[64658,64658],"mapped",[1610,1586]],[[64659,64659],"mapped",[1610,1605]],[[64660,64660],"mapped",[1610,1606]],[[64661,64661],"mapped",[1610,1609]],[[64662,64662],"mapped",[1610,1610]],[[64663,64663],"mapped",[1574,1580]],[[64664,64664],"mapped",[1574,1581]],[[64665,64665],"mapped",[1574,1582]],[[64666,64666],"mapped",[1574,1605]],[[64667,64667],"mapped",[1574,1607]],[[64668,64668],"mapped",[1576,1580]],[[64669,64669],"mapped",[1576,1581]],[[64670,64670],"mapped",[1576,1582]],[[64671,64671],"mapped",[1576,1605]],[[64672,64672],"mapped",[1576,1607]],[[64673,64673],"mapped",[1578,1580]],[[64674,64674],"mapped",[1578,1581]],[[64675,64675],"mapped",[1578,1582]],[[64676,64676],"mapped",[1578,1605]],[[64677,64677],"mapped",[1578,1607]],[[64678,64678],"mapped",[1579,1605]],[[64679,64679],"mapped",[1580,1581]],[[64680,64680],"mapped",[1580,1605]],[[64681,64681],"mapped",[1581,1580]],[[64682,64682],"mapped",[1581,1605]],[[64683,64683],"mapped",[1582,1580]],[[64684,64684],"mapped",[1582,1605]],[[64685,64685],"mapped",[1587,1580]],[[64686,64686],"mapped",[1587,1581]],[[64687,64687],"mapped",[1587,1582]],[[64688,64688],"mapped",[1587,1605]],[[64689,64689],"mapped",[1589,1581]],[[64690,64690],"mapped",[1589,1582]],[[64691,64691],"mapped",[1589,1605]],[[64692,64692],"mapped",[1590,1580]],[[64693,64693],"mapped",[1590,1581]],[[64694,64694],"mapped",[1590,1582]],[[64695,64695],"mapped",[1590,1605]],[[64696,64696],"mapped",[1591,1581]],[[64697,64697],"mapped",[1592,1605]],[[64698,64698],"mapped",[1593,1580]],[[64699,64699],"mapped",[1593,1605]],[[64700,64700],"mapped",[1594,1580]],[[64701,64701],"mapped",[1594,1605]],[[64702,64702],"mapped",[1601,1580]],[[64703,64703],"mapped",[1601,1581]],[[64704,64704],"mapped",[1601,1582]],[[64705,64705],"mapped",[1601,1605]],[[64706,64706],"mapped",[1602,1581]],[[64707,64707],"mapped",[1602,1605]],[[64708,64708],"mapped",[1603,1580]],[[64709,64709],"mapped",[1603,1581]],[[64710,64710],"mapped",[1603,1582]],[[64711,64711],"mapped",[1603,1604]],[[64712,64712],"mapped",[1603,1605]],[[64713,64713],"mapped",[1604,1580]],[[64714,64714],"mapped",[1604,1581]],[[64715,64715],"mapped",[1604,1582]],[[64716,64716],"mapped",[1604,1605]],[[64717,64717],"mapped",[1604,1607]],[[64718,64718],"mapped",[1605,1580]],[[64719,64719],"mapped",[1605,1581]],[[64720,64720],"mapped",[1605,1582]],[[64721,64721],"mapped",[1605,1605]],[[64722,64722],"mapped",[1606,1580]],[[64723,64723],"mapped",[1606,1581]],[[64724,64724],"mapped",[1606,1582]],[[64725,64725],"mapped",[1606,1605]],[[64726,64726],"mapped",[1606,1607]],[[64727,64727],"mapped",[1607,1580]],[[64728,64728],"mapped",[1607,1605]],[[64729,64729],"mapped",[1607,1648]],[[64730,64730],"mapped",[1610,1580]],[[64731,64731],"mapped",[1610,1581]],[[64732,64732],"mapped",[1610,1582]],[[64733,64733],"mapped",[1610,1605]],[[64734,64734],"mapped",[1610,1607]],[[64735,64735],"mapped",[1574,1605]],[[64736,64736],"mapped",[1574,1607]],[[64737,64737],"mapped",[1576,1605]],[[64738,64738],"mapped",[1576,1607]],[[64739,64739],"mapped",[1578,1605]],[[64740,64740],"mapped",[1578,1607]],[[64741,64741],"mapped",[1579,1605]],[[64742,64742],"mapped",[1579,1607]],[[64743,64743],"mapped",[1587,1605]],[[64744,64744],"mapped",[1587,1607]],[[64745,64745],"mapped",[1588,1605]],[[64746,64746],"mapped",[1588,1607]],[[64747,64747],"mapped",[1603,1604]],[[64748,64748],"mapped",[1603,1605]],[[64749,64749],"mapped",[1604,1605]],[[64750,64750],"mapped",[1606,1605]],[[64751,64751],"mapped",[1606,1607]],[[64752,64752],"mapped",[1610,1605]],[[64753,64753],"mapped",[1610,1607]],[[64754,64754],"mapped",[1600,1614,1617]],[[64755,64755],"mapped",[1600,1615,1617]],[[64756,64756],"mapped",[1600,1616,1617]],[[64757,64757],"mapped",[1591,1609]],[[64758,64758],"mapped",[1591,1610]],[[64759,64759],"mapped",[1593,1609]],[[64760,64760],"mapped",[1593,1610]],[[64761,64761],"mapped",[1594,1609]],[[64762,64762],"mapped",[1594,1610]],[[64763,64763],"mapped",[1587,1609]],[[64764,64764],"mapped",[1587,1610]],[[64765,64765],"mapped",[1588,1609]],[[64766,64766],"mapped",[1588,1610]],[[64767,64767],"mapped",[1581,1609]],[[64768,64768],"mapped",[1581,1610]],[[64769,64769],"mapped",[1580,1609]],[[64770,64770],"mapped",[1580,1610]],[[64771,64771],"mapped",[1582,1609]],[[64772,64772],"mapped",[1582,1610]],[[64773,64773],"mapped",[1589,1609]],[[64774,64774],"mapped",[1589,1610]],[[64775,64775],"mapped",[1590,1609]],[[64776,64776],"mapped",[1590,1610]],[[64777,64777],"mapped",[1588,1580]],[[64778,64778],"mapped",[1588,1581]],[[64779,64779],"mapped",[1588,1582]],[[64780,64780],"mapped",[1588,1605]],[[64781,64781],"mapped",[1588,1585]],[[64782,64782],"mapped",[1587,1585]],[[64783,64783],"mapped",[1589,1585]],[[64784,64784],"mapped",[1590,1585]],[[64785,64785],"mapped",[1591,1609]],[[64786,64786],"mapped",[1591,1610]],[[64787,64787],"mapped",[1593,1609]],[[64788,64788],"mapped",[1593,1610]],[[64789,64789],"mapped",[1594,1609]],[[64790,64790],"mapped",[1594,1610]],[[64791,64791],"mapped",[1587,1609]],[[64792,64792],"mapped",[1587,1610]],[[64793,64793],"mapped",[1588,1609]],[[64794,64794],"mapped",[1588,1610]],[[64795,64795],"mapped",[1581,1609]],[[64796,64796],"mapped",[1581,1610]],[[64797,64797],"mapped",[1580,1609]],[[64798,64798],"mapped",[1580,1610]],[[64799,64799],"mapped",[1582,1609]],[[64800,64800],"mapped",[1582,1610]],[[64801,64801],"mapped",[1589,1609]],[[64802,64802],"mapped",[1589,1610]],[[64803,64803],"mapped",[1590,1609]],[[64804,64804],"mapped",[1590,1610]],[[64805,64805],"mapped",[1588,1580]],[[64806,64806],"mapped",[1588,1581]],[[64807,64807],"mapped",[1588,1582]],[[64808,64808],"mapped",[1588,1605]],[[64809,64809],"mapped",[1588,1585]],[[64810,64810],"mapped",[1587,1585]],[[64811,64811],"mapped",[1589,1585]],[[64812,64812],"mapped",[1590,1585]],[[64813,64813],"mapped",[1588,1580]],[[64814,64814],"mapped",[1588,1581]],[[64815,64815],"mapped",[1588,1582]],[[64816,64816],"mapped",[1588,1605]],[[64817,64817],"mapped",[1587,1607]],[[64818,64818],"mapped",[1588,1607]],[[64819,64819],"mapped",[1591,1605]],[[64820,64820],"mapped",[1587,1580]],[[64821,64821],"mapped",[1587,1581]],[[64822,64822],"mapped",[1587,1582]],[[64823,64823],"mapped",[1588,1580]],[[64824,64824],"mapped",[1588,1581]],[[64825,64825],"mapped",[1588,1582]],[[64826,64826],"mapped",[1591,1605]],[[64827,64827],"mapped",[1592,1605]],[[64828,64829],"mapped",[1575,1611]],[[64830,64831],"valid",[],"NV8"],[[64832,64847],"disallowed"],[[64848,64848],"mapped",[1578,1580,1605]],[[64849,64850],"mapped",[1578,1581,1580]],[[64851,64851],"mapped",[1578,1581,1605]],[[64852,64852],"mapped",[1578,1582,1605]],[[64853,64853],"mapped",[1578,1605,1580]],[[64854,64854],"mapped",[1578,1605,1581]],[[64855,64855],"mapped",[1578,1605,1582]],[[64856,64857],"mapped",[1580,1605,1581]],[[64858,64858],"mapped",[1581,1605,1610]],[[64859,64859],"mapped",[1581,1605,1609]],[[64860,64860],"mapped",[1587,1581,1580]],[[64861,64861],"mapped",[1587,1580,1581]],[[64862,64862],"mapped",[1587,1580,1609]],[[64863,64864],"mapped",[1587,1605,1581]],[[64865,64865],"mapped",[1587,1605,1580]],[[64866,64867],"mapped",[1587,1605,1605]],[[64868,64869],"mapped",[1589,1581,1581]],[[64870,64870],"mapped",[1589,1605,1605]],[[64871,64872],"mapped",[1588,1581,1605]],[[64873,64873],"mapped",[1588,1580,1610]],[[64874,64875],"mapped",[1588,1605,1582]],[[64876,64877],"mapped",[1588,1605,1605]],[[64878,64878],"mapped",[1590,1581,1609]],[[64879,64880],"mapped",[1590,1582,1605]],[[64881,64882],"mapped",[1591,1605,1581]],[[64883,64883],"mapped",[1591,1605,1605]],[[64884,64884],"mapped",[1591,1605,1610]],[[64885,64885],"mapped",[1593,1580,1605]],[[64886,64887],"mapped",[1593,1605,1605]],[[64888,64888],"mapped",[1593,1605,1609]],[[64889,64889],"mapped",[1594,1605,1605]],[[64890,64890],"mapped",[1594,1605,1610]],[[64891,64891],"mapped",[1594,1605,1609]],[[64892,64893],"mapped",[1601,1582,1605]],[[64894,64894],"mapped",[1602,1605,1581]],[[64895,64895],"mapped",[1602,1605,1605]],[[64896,64896],"mapped",[1604,1581,1605]],[[64897,64897],"mapped",[1604,1581,1610]],[[64898,64898],"mapped",[1604,1581,1609]],[[64899,64900],"mapped",[1604,1580,1580]],[[64901,64902],"mapped",[1604,1582,1605]],[[64903,64904],"mapped",[1604,1605,1581]],[[64905,64905],"mapped",[1605,1581,1580]],[[64906,64906],"mapped",[1605,1581,1605]],[[64907,64907],"mapped",[1605,1581,1610]],[[64908,64908],"mapped",[1605,1580,1581]],[[64909,64909],"mapped",[1605,1580,1605]],[[64910,64910],"mapped",[1605,1582,1580]],[[64911,64911],"mapped",[1605,1582,1605]],[[64912,64913],"disallowed"],[[64914,64914],"mapped",[1605,1580,1582]],[[64915,64915],"mapped",[1607,1605,1580]],[[64916,64916],"mapped",[1607,1605,1605]],[[64917,64917],"mapped",[1606,1581,1605]],[[64918,64918],"mapped",[1606,1581,1609]],[[64919,64920],"mapped",[1606,1580,1605]],[[64921,64921],"mapped",[1606,1580,1609]],[[64922,64922],"mapped",[1606,1605,1610]],[[64923,64923],"mapped",[1606,1605,1609]],[[64924,64925],"mapped",[1610,1605,1605]],[[64926,64926],"mapped",[1576,1582,1610]],[[64927,64927],"mapped",[1578,1580,1610]],[[64928,64928],"mapped",[1578,1580,1609]],[[64929,64929],"mapped",[1578,1582,1610]],[[64930,64930],"mapped",[1578,1582,1609]],[[64931,64931],"mapped",[1578,1605,1610]],[[64932,64932],"mapped",[1578,1605,1609]],[[64933,64933],"mapped",[1580,1605,1610]],[[64934,64934],"mapped",[1580,1581,1609]],[[64935,64935],"mapped",[1580,1605,1609]],[[64936,64936],"mapped",[1587,1582,1609]],[[64937,64937],"mapped",[1589,1581,1610]],[[64938,64938],"mapped",[1588,1581,1610]],[[64939,64939],"mapped",[1590,1581,1610]],[[64940,64940],"mapped",[1604,1580,1610]],[[64941,64941],"mapped",[1604,1605,1610]],[[64942,64942],"mapped",[1610,1581,1610]],[[64943,64943],"mapped",[1610,1580,1610]],[[64944,64944],"mapped",[1610,1605,1610]],[[64945,64945],"mapped",[1605,1605,1610]],[[64946,64946],"mapped",[1602,1605,1610]],[[64947,64947],"mapped",[1606,1581,1610]],[[64948,64948],"mapped",[1602,1605,1581]],[[64949,64949],"mapped",[1604,1581,1605]],[[64950,64950],"mapped",[1593,1605,1610]],[[64951,64951],"mapped",[1603,1605,1610]],[[64952,64952],"mapped",[1606,1580,1581]],[[64953,64953],"mapped",[1605,1582,1610]],[[64954,64954],"mapped",[1604,1580,1605]],[[64955,64955],"mapped",[1603,1605,1605]],[[64956,64956],"mapped",[1604,1580,1605]],[[64957,64957],"mapped",[1606,1580,1581]],[[64958,64958],"mapped",[1580,1581,1610]],[[64959,64959],"mapped",[1581,1580,1610]],[[64960,64960],"mapped",[1605,1580,1610]],[[64961,64961],"mapped",[1601,1605,1610]],[[64962,64962],"mapped",[1576,1581,1610]],[[64963,64963],"mapped",[1603,1605,1605]],[[64964,64964],"mapped",[1593,1580,1605]],[[64965,64965],"mapped",[1589,1605,1605]],[[64966,64966],"mapped",[1587,1582,1610]],[[64967,64967],"mapped",[1606,1580,1610]],[[64968,64975],"disallowed"],[[64976,65007],"disallowed"],[[65008,65008],"mapped",[1589,1604,1746]],[[65009,65009],"mapped",[1602,1604,1746]],[[65010,65010],"mapped",[1575,1604,1604,1607]],[[65011,65011],"mapped",[1575,1603,1576,1585]],[[65012,65012],"mapped",[1605,1581,1605,1583]],[[65013,65013],"mapped",[1589,1604,1593,1605]],[[65014,65014],"mapped",[1585,1587,1608,1604]],[[65015,65015],"mapped",[1593,1604,1610,1607]],[[65016,65016],"mapped",[1608,1587,1604,1605]],[[65017,65017],"mapped",[1589,1604,1609]],[[65018,65018],"disallowed_STD3_mapped",[1589,1604,1609,32,1575,1604,1604,1607,32,1593,1604,1610,1607,32,1608,1587,1604,1605]],[[65019,65019],"disallowed_STD3_mapped",[1580,1604,32,1580,1604,1575,1604,1607]],[[65020,65020],"mapped",[1585,1740,1575,1604]],[[65021,65021],"valid",[],"NV8"],[[65022,65023],"disallowed"],[[65024,65039],"ignored"],[[65040,65040],"disallowed_STD3_mapped",[44]],[[65041,65041],"mapped",[12289]],[[65042,65042],"disallowed"],[[65043,65043],"disallowed_STD3_mapped",[58]],[[65044,65044],"disallowed_STD3_mapped",[59]],[[65045,65045],"disallowed_STD3_mapped",[33]],[[65046,65046],"disallowed_STD3_mapped",[63]],[[65047,65047],"mapped",[12310]],[[65048,65048],"mapped",[12311]],[[65049,65049],"disallowed"],[[65050,65055],"disallowed"],[[65056,65059],"valid"],[[65060,65062],"valid"],[[65063,65069],"valid"],[[65070,65071],"valid"],[[65072,65072],"disallowed"],[[65073,65073],"mapped",[8212]],[[65074,65074],"mapped",[8211]],[[65075,65076],"disallowed_STD3_mapped",[95]],[[65077,65077],"disallowed_STD3_mapped",[40]],[[65078,65078],"disallowed_STD3_mapped",[41]],[[65079,65079],"disallowed_STD3_mapped",[123]],[[65080,65080],"disallowed_STD3_mapped",[125]],[[65081,65081],"mapped",[12308]],[[65082,65082],"mapped",[12309]],[[65083,65083],"mapped",[12304]],[[65084,65084],"mapped",[12305]],[[65085,65085],"mapped",[12298]],[[65086,65086],"mapped",[12299]],[[65087,65087],"mapped",[12296]],[[65088,65088],"mapped",[12297]],[[65089,65089],"mapped",[12300]],[[65090,65090],"mapped",[12301]],[[65091,65091],"mapped",[12302]],[[65092,65092],"mapped",[12303]],[[65093,65094],"valid",[],"NV8"],[[65095,65095],"disallowed_STD3_mapped",[91]],[[65096,65096],"disallowed_STD3_mapped",[93]],[[65097,65100],"disallowed_STD3_mapped",[32,773]],[[65101,65103],"disallowed_STD3_mapped",[95]],[[65104,65104],"disallowed_STD3_mapped",[44]],[[65105,65105],"mapped",[12289]],[[65106,65106],"disallowed"],[[65107,65107],"disallowed"],[[65108,65108],"disallowed_STD3_mapped",[59]],[[65109,65109],"disallowed_STD3_mapped",[58]],[[65110,65110],"disallowed_STD3_mapped",[63]],[[65111,65111],"disallowed_STD3_mapped",[33]],[[65112,65112],"mapped",[8212]],[[65113,65113],"disallowed_STD3_mapped",[40]],[[65114,65114],"disallowed_STD3_mapped",[41]],[[65115,65115],"disallowed_STD3_mapped",[123]],[[65116,65116],"disallowed_STD3_mapped",[125]],[[65117,65117],"mapped",[12308]],[[65118,65118],"mapped",[12309]],[[65119,65119],"disallowed_STD3_mapped",[35]],[[65120,65120],"disallowed_STD3_mapped",[38]],[[65121,65121],"disallowed_STD3_mapped",[42]],[[65122,65122],"disallowed_STD3_mapped",[43]],[[65123,65123],"mapped",[45]],[[65124,65124],"disallowed_STD3_mapped",[60]],[[65125,65125],"disallowed_STD3_mapped",[62]],[[65126,65126],"disallowed_STD3_mapped",[61]],[[65127,65127],"disallowed"],[[65128,65128],"disallowed_STD3_mapped",[92]],[[65129,65129],"disallowed_STD3_mapped",[36]],[[65130,65130],"disallowed_STD3_mapped",[37]],[[65131,65131],"disallowed_STD3_mapped",[64]],[[65132,65135],"disallowed"],[[65136,65136],"disallowed_STD3_mapped",[32,1611]],[[65137,65137],"mapped",[1600,1611]],[[65138,65138],"disallowed_STD3_mapped",[32,1612]],[[65139,65139],"valid"],[[65140,65140],"disallowed_STD3_mapped",[32,1613]],[[65141,65141],"disallowed"],[[65142,65142],"disallowed_STD3_mapped",[32,1614]],[[65143,65143],"mapped",[1600,1614]],[[65144,65144],"disallowed_STD3_mapped",[32,1615]],[[65145,65145],"mapped",[1600,1615]],[[65146,65146],"disallowed_STD3_mapped",[32,1616]],[[65147,65147],"mapped",[1600,1616]],[[65148,65148],"disallowed_STD3_mapped",[32,1617]],[[65149,65149],"mapped",[1600,1617]],[[65150,65150],"disallowed_STD3_mapped",[32,1618]],[[65151,65151],"mapped",[1600,1618]],[[65152,65152],"mapped",[1569]],[[65153,65154],"mapped",[1570]],[[65155,65156],"mapped",[1571]],[[65157,65158],"mapped",[1572]],[[65159,65160],"mapped",[1573]],[[65161,65164],"mapped",[1574]],[[65165,65166],"mapped",[1575]],[[65167,65170],"mapped",[1576]],[[65171,65172],"mapped",[1577]],[[65173,65176],"mapped",[1578]],[[65177,65180],"mapped",[1579]],[[65181,65184],"mapped",[1580]],[[65185,65188],"mapped",[1581]],[[65189,65192],"mapped",[1582]],[[65193,65194],"mapped",[1583]],[[65195,65196],"mapped",[1584]],[[65197,65198],"mapped",[1585]],[[65199,65200],"mapped",[1586]],[[65201,65204],"mapped",[1587]],[[65205,65208],"mapped",[1588]],[[65209,65212],"mapped",[1589]],[[65213,65216],"mapped",[1590]],[[65217,65220],"mapped",[1591]],[[65221,65224],"mapped",[1592]],[[65225,65228],"mapped",[1593]],[[65229,65232],"mapped",[1594]],[[65233,65236],"mapped",[1601]],[[65237,65240],"mapped",[1602]],[[65241,65244],"mapped",[1603]],[[65245,65248],"mapped",[1604]],[[65249,65252],"mapped",[1605]],[[65253,65256],"mapped",[1606]],[[65257,65260],"mapped",[1607]],[[65261,65262],"mapped",[1608]],[[65263,65264],"mapped",[1609]],[[65265,65268],"mapped",[1610]],[[65269,65270],"mapped",[1604,1570]],[[65271,65272],"mapped",[1604,1571]],[[65273,65274],"mapped",[1604,1573]],[[65275,65276],"mapped",[1604,1575]],[[65277,65278],"disallowed"],[[65279,65279],"ignored"],[[65280,65280],"disallowed"],[[65281,65281],"disallowed_STD3_mapped",[33]],[[65282,65282],"disallowed_STD3_mapped",[34]],[[65283,65283],"disallowed_STD3_mapped",[35]],[[65284,65284],"disallowed_STD3_mapped",[36]],[[65285,65285],"disallowed_STD3_mapped",[37]],[[65286,65286],"disallowed_STD3_mapped",[38]],[[65287,65287],"disallowed_STD3_mapped",[39]],[[65288,65288],"disallowed_STD3_mapped",[40]],[[65289,65289],"disallowed_STD3_mapped",[41]],[[65290,65290],"disallowed_STD3_mapped",[42]],[[65291,65291],"disallowed_STD3_mapped",[43]],[[65292,65292],"disallowed_STD3_mapped",[44]],[[65293,65293],"mapped",[45]],[[65294,65294],"mapped",[46]],[[65295,65295],"disallowed_STD3_mapped",[47]],[[65296,65296],"mapped",[48]],[[65297,65297],"mapped",[49]],[[65298,65298],"mapped",[50]],[[65299,65299],"mapped",[51]],[[65300,65300],"mapped",[52]],[[65301,65301],"mapped",[53]],[[65302,65302],"mapped",[54]],[[65303,65303],"mapped",[55]],[[65304,65304],"mapped",[56]],[[65305,65305],"mapped",[57]],[[65306,65306],"disallowed_STD3_mapped",[58]],[[65307,65307],"disallowed_STD3_mapped",[59]],[[65308,65308],"disallowed_STD3_mapped",[60]],[[65309,65309],"disallowed_STD3_mapped",[61]],[[65310,65310],"disallowed_STD3_mapped",[62]],[[65311,65311],"disallowed_STD3_mapped",[63]],[[65312,65312],"disallowed_STD3_mapped",[64]],[[65313,65313],"mapped",[97]],[[65314,65314],"mapped",[98]],[[65315,65315],"mapped",[99]],[[65316,65316],"mapped",[100]],[[65317,65317],"mapped",[101]],[[65318,65318],"mapped",[102]],[[65319,65319],"mapped",[103]],[[65320,65320],"mapped",[104]],[[65321,65321],"mapped",[105]],[[65322,65322],"mapped",[106]],[[65323,65323],"mapped",[107]],[[65324,65324],"mapped",[108]],[[65325,65325],"mapped",[109]],[[65326,65326],"mapped",[110]],[[65327,65327],"mapped",[111]],[[65328,65328],"mapped",[112]],[[65329,65329],"mapped",[113]],[[65330,65330],"mapped",[114]],[[65331,65331],"mapped",[115]],[[65332,65332],"mapped",[116]],[[65333,65333],"mapped",[117]],[[65334,65334],"mapped",[118]],[[65335,65335],"mapped",[119]],[[65336,65336],"mapped",[120]],[[65337,65337],"mapped",[121]],[[65338,65338],"mapped",[122]],[[65339,65339],"disallowed_STD3_mapped",[91]],[[65340,65340],"disallowed_STD3_mapped",[92]],[[65341,65341],"disallowed_STD3_mapped",[93]],[[65342,65342],"disallowed_STD3_mapped",[94]],[[65343,65343],"disallowed_STD3_mapped",[95]],[[65344,65344],"disallowed_STD3_mapped",[96]],[[65345,65345],"mapped",[97]],[[65346,65346],"mapped",[98]],[[65347,65347],"mapped",[99]],[[65348,65348],"mapped",[100]],[[65349,65349],"mapped",[101]],[[65350,65350],"mapped",[102]],[[65351,65351],"mapped",[103]],[[65352,65352],"mapped",[104]],[[65353,65353],"mapped",[105]],[[65354,65354],"mapped",[106]],[[65355,65355],"mapped",[107]],[[65356,65356],"mapped",[108]],[[65357,65357],"mapped",[109]],[[65358,65358],"mapped",[110]],[[65359,65359],"mapped",[111]],[[65360,65360],"mapped",[112]],[[65361,65361],"mapped",[113]],[[65362,65362],"mapped",[114]],[[65363,65363],"mapped",[115]],[[65364,65364],"mapped",[116]],[[65365,65365],"mapped",[117]],[[65366,65366],"mapped",[118]],[[65367,65367],"mapped",[119]],[[65368,65368],"mapped",[120]],[[65369,65369],"mapped",[121]],[[65370,65370],"mapped",[122]],[[65371,65371],"disallowed_STD3_mapped",[123]],[[65372,65372],"disallowed_STD3_mapped",[124]],[[65373,65373],"disallowed_STD3_mapped",[125]],[[65374,65374],"disallowed_STD3_mapped",[126]],[[65375,65375],"mapped",[10629]],[[65376,65376],"mapped",[10630]],[[65377,65377],"mapped",[46]],[[65378,65378],"mapped",[12300]],[[65379,65379],"mapped",[12301]],[[65380,65380],"mapped",[12289]],[[65381,65381],"mapped",[12539]],[[65382,65382],"mapped",[12530]],[[65383,65383],"mapped",[12449]],[[65384,65384],"mapped",[12451]],[[65385,65385],"mapped",[12453]],[[65386,65386],"mapped",[12455]],[[65387,65387],"mapped",[12457]],[[65388,65388],"mapped",[12515]],[[65389,65389],"mapped",[12517]],[[65390,65390],"mapped",[12519]],[[65391,65391],"mapped",[12483]],[[65392,65392],"mapped",[12540]],[[65393,65393],"mapped",[12450]],[[65394,65394],"mapped",[12452]],[[65395,65395],"mapped",[12454]],[[65396,65396],"mapped",[12456]],[[65397,65397],"mapped",[12458]],[[65398,65398],"mapped",[12459]],[[65399,65399],"mapped",[12461]],[[65400,65400],"mapped",[12463]],[[65401,65401],"mapped",[12465]],[[65402,65402],"mapped",[12467]],[[65403,65403],"mapped",[12469]],[[65404,65404],"mapped",[12471]],[[65405,65405],"mapped",[12473]],[[65406,65406],"mapped",[12475]],[[65407,65407],"mapped",[12477]],[[65408,65408],"mapped",[12479]],[[65409,65409],"mapped",[12481]],[[65410,65410],"mapped",[12484]],[[65411,65411],"mapped",[12486]],[[65412,65412],"mapped",[12488]],[[65413,65413],"mapped",[12490]],[[65414,65414],"mapped",[12491]],[[65415,65415],"mapped",[12492]],[[65416,65416],"mapped",[12493]],[[65417,65417],"mapped",[12494]],[[65418,65418],"mapped",[12495]],[[65419,65419],"mapped",[12498]],[[65420,65420],"mapped",[12501]],[[65421,65421],"mapped",[12504]],[[65422,65422],"mapped",[12507]],[[65423,65423],"mapped",[12510]],[[65424,65424],"mapped",[12511]],[[65425,65425],"mapped",[12512]],[[65426,65426],"mapped",[12513]],[[65427,65427],"mapped",[12514]],[[65428,65428],"mapped",[12516]],[[65429,65429],"mapped",[12518]],[[65430,65430],"mapped",[12520]],[[65431,65431],"mapped",[12521]],[[65432,65432],"mapped",[12522]],[[65433,65433],"mapped",[12523]],[[65434,65434],"mapped",[12524]],[[65435,65435],"mapped",[12525]],[[65436,65436],"mapped",[12527]],[[65437,65437],"mapped",[12531]],[[65438,65438],"mapped",[12441]],[[65439,65439],"mapped",[12442]],[[65440,65440],"disallowed"],[[65441,65441],"mapped",[4352]],[[65442,65442],"mapped",[4353]],[[65443,65443],"mapped",[4522]],[[65444,65444],"mapped",[4354]],[[65445,65445],"mapped",[4524]],[[65446,65446],"mapped",[4525]],[[65447,65447],"mapped",[4355]],[[65448,65448],"mapped",[4356]],[[65449,65449],"mapped",[4357]],[[65450,65450],"mapped",[4528]],[[65451,65451],"mapped",[4529]],[[65452,65452],"mapped",[4530]],[[65453,65453],"mapped",[4531]],[[65454,65454],"mapped",[4532]],[[65455,65455],"mapped",[4533]],[[65456,65456],"mapped",[4378]],[[65457,65457],"mapped",[4358]],[[65458,65458],"mapped",[4359]],[[65459,65459],"mapped",[4360]],[[65460,65460],"mapped",[4385]],[[65461,65461],"mapped",[4361]],[[65462,65462],"mapped",[4362]],[[65463,65463],"mapped",[4363]],[[65464,65464],"mapped",[4364]],[[65465,65465],"mapped",[4365]],[[65466,65466],"mapped",[4366]],[[65467,65467],"mapped",[4367]],[[65468,65468],"mapped",[4368]],[[65469,65469],"mapped",[4369]],[[65470,65470],"mapped",[4370]],[[65471,65473],"disallowed"],[[65474,65474],"mapped",[4449]],[[65475,65475],"mapped",[4450]],[[65476,65476],"mapped",[4451]],[[65477,65477],"mapped",[4452]],[[65478,65478],"mapped",[4453]],[[65479,65479],"mapped",[4454]],[[65480,65481],"disallowed"],[[65482,65482],"mapped",[4455]],[[65483,65483],"mapped",[4456]],[[65484,65484],"mapped",[4457]],[[65485,65485],"mapped",[4458]],[[65486,65486],"mapped",[4459]],[[65487,65487],"mapped",[4460]],[[65488,65489],"disallowed"],[[65490,65490],"mapped",[4461]],[[65491,65491],"mapped",[4462]],[[65492,65492],"mapped",[4463]],[[65493,65493],"mapped",[4464]],[[65494,65494],"mapped",[4465]],[[65495,65495],"mapped",[4466]],[[65496,65497],"disallowed"],[[65498,65498],"mapped",[4467]],[[65499,65499],"mapped",[4468]],[[65500,65500],"mapped",[4469]],[[65501,65503],"disallowed"],[[65504,65504],"mapped",[162]],[[65505,65505],"mapped",[163]],[[65506,65506],"mapped",[172]],[[65507,65507],"disallowed_STD3_mapped",[32,772]],[[65508,65508],"mapped",[166]],[[65509,65509],"mapped",[165]],[[65510,65510],"mapped",[8361]],[[65511,65511],"disallowed"],[[65512,65512],"mapped",[9474]],[[65513,65513],"mapped",[8592]],[[65514,65514],"mapped",[8593]],[[65515,65515],"mapped",[8594]],[[65516,65516],"mapped",[8595]],[[65517,65517],"mapped",[9632]],[[65518,65518],"mapped",[9675]],[[65519,65528],"disallowed"],[[65529,65531],"disallowed"],[[65532,65532],"disallowed"],[[65533,65533],"disallowed"],[[65534,65535],"disallowed"],[[65536,65547],"valid"],[[65548,65548],"disallowed"],[[65549,65574],"valid"],[[65575,65575],"disallowed"],[[65576,65594],"valid"],[[65595,65595],"disallowed"],[[65596,65597],"valid"],[[65598,65598],"disallowed"],[[65599,65613],"valid"],[[65614,65615],"disallowed"],[[65616,65629],"valid"],[[65630,65663],"disallowed"],[[65664,65786],"valid"],[[65787,65791],"disallowed"],[[65792,65794],"valid",[],"NV8"],[[65795,65798],"disallowed"],[[65799,65843],"valid",[],"NV8"],[[65844,65846],"disallowed"],[[65847,65855],"valid",[],"NV8"],[[65856,65930],"valid",[],"NV8"],[[65931,65932],"valid",[],"NV8"],[[65933,65935],"disallowed"],[[65936,65947],"valid",[],"NV8"],[[65948,65951],"disallowed"],[[65952,65952],"valid",[],"NV8"],[[65953,65999],"disallowed"],[[66000,66044],"valid",[],"NV8"],[[66045,66045],"valid"],[[66046,66175],"disallowed"],[[66176,66204],"valid"],[[66205,66207],"disallowed"],[[66208,66256],"valid"],[[66257,66271],"disallowed"],[[66272,66272],"valid"],[[66273,66299],"valid",[],"NV8"],[[66300,66303],"disallowed"],[[66304,66334],"valid"],[[66335,66335],"valid"],[[66336,66339],"valid",[],"NV8"],[[66340,66351],"disallowed"],[[66352,66368],"valid"],[[66369,66369],"valid",[],"NV8"],[[66370,66377],"valid"],[[66378,66378],"valid",[],"NV8"],[[66379,66383],"disallowed"],[[66384,66426],"valid"],[[66427,66431],"disallowed"],[[66432,66461],"valid"],[[66462,66462],"disallowed"],[[66463,66463],"valid",[],"NV8"],[[66464,66499],"valid"],[[66500,66503],"disallowed"],[[66504,66511],"valid"],[[66512,66517],"valid",[],"NV8"],[[66518,66559],"disallowed"],[[66560,66560],"mapped",[66600]],[[66561,66561],"mapped",[66601]],[[66562,66562],"mapped",[66602]],[[66563,66563],"mapped",[66603]],[[66564,66564],"mapped",[66604]],[[66565,66565],"mapped",[66605]],[[66566,66566],"mapped",[66606]],[[66567,66567],"mapped",[66607]],[[66568,66568],"mapped",[66608]],[[66569,66569],"mapped",[66609]],[[66570,66570],"mapped",[66610]],[[66571,66571],"mapped",[66611]],[[66572,66572],"mapped",[66612]],[[66573,66573],"mapped",[66613]],[[66574,66574],"mapped",[66614]],[[66575,66575],"mapped",[66615]],[[66576,66576],"mapped",[66616]],[[66577,66577],"mapped",[66617]],[[66578,66578],"mapped",[66618]],[[66579,66579],"mapped",[66619]],[[66580,66580],"mapped",[66620]],[[66581,66581],"mapped",[66621]],[[66582,66582],"mapped",[66622]],[[66583,66583],"mapped",[66623]],[[66584,66584],"mapped",[66624]],[[66585,66585],"mapped",[66625]],[[66586,66586],"mapped",[66626]],[[66587,66587],"mapped",[66627]],[[66588,66588],"mapped",[66628]],[[66589,66589],"mapped",[66629]],[[66590,66590],"mapped",[66630]],[[66591,66591],"mapped",[66631]],[[66592,66592],"mapped",[66632]],[[66593,66593],"mapped",[66633]],[[66594,66594],"mapped",[66634]],[[66595,66595],"mapped",[66635]],[[66596,66596],"mapped",[66636]],[[66597,66597],"mapped",[66637]],[[66598,66598],"mapped",[66638]],[[66599,66599],"mapped",[66639]],[[66600,66637],"valid"],[[66638,66717],"valid"],[[66718,66719],"disallowed"],[[66720,66729],"valid"],[[66730,66815],"disallowed"],[[66816,66855],"valid"],[[66856,66863],"disallowed"],[[66864,66915],"valid"],[[66916,66926],"disallowed"],[[66927,66927],"valid",[],"NV8"],[[66928,67071],"disallowed"],[[67072,67382],"valid"],[[67383,67391],"disallowed"],[[67392,67413],"valid"],[[67414,67423],"disallowed"],[[67424,67431],"valid"],[[67432,67583],"disallowed"],[[67584,67589],"valid"],[[67590,67591],"disallowed"],[[67592,67592],"valid"],[[67593,67593],"disallowed"],[[67594,67637],"valid"],[[67638,67638],"disallowed"],[[67639,67640],"valid"],[[67641,67643],"disallowed"],[[67644,67644],"valid"],[[67645,67646],"disallowed"],[[67647,67647],"valid"],[[67648,67669],"valid"],[[67670,67670],"disallowed"],[[67671,67679],"valid",[],"NV8"],[[67680,67702],"valid"],[[67703,67711],"valid",[],"NV8"],[[67712,67742],"valid"],[[67743,67750],"disallowed"],[[67751,67759],"valid",[],"NV8"],[[67760,67807],"disallowed"],[[67808,67826],"valid"],[[67827,67827],"disallowed"],[[67828,67829],"valid"],[[67830,67834],"disallowed"],[[67835,67839],"valid",[],"NV8"],[[67840,67861],"valid"],[[67862,67865],"valid",[],"NV8"],[[67866,67867],"valid",[],"NV8"],[[67868,67870],"disallowed"],[[67871,67871],"valid",[],"NV8"],[[67872,67897],"valid"],[[67898,67902],"disallowed"],[[67903,67903],"valid",[],"NV8"],[[67904,67967],"disallowed"],[[67968,68023],"valid"],[[68024,68027],"disallowed"],[[68028,68029],"valid",[],"NV8"],[[68030,68031],"valid"],[[68032,68047],"valid",[],"NV8"],[[68048,68049],"disallowed"],[[68050,68095],"valid",[],"NV8"],[[68096,68099],"valid"],[[68100,68100],"disallowed"],[[68101,68102],"valid"],[[68103,68107],"disallowed"],[[68108,68115],"valid"],[[68116,68116],"disallowed"],[[68117,68119],"valid"],[[68120,68120],"disallowed"],[[68121,68147],"valid"],[[68148,68151],"disallowed"],[[68152,68154],"valid"],[[68155,68158],"disallowed"],[[68159,68159],"valid"],[[68160,68167],"valid",[],"NV8"],[[68168,68175],"disallowed"],[[68176,68184],"valid",[],"NV8"],[[68185,68191],"disallowed"],[[68192,68220],"valid"],[[68221,68223],"valid",[],"NV8"],[[68224,68252],"valid"],[[68253,68255],"valid",[],"NV8"],[[68256,68287],"disallowed"],[[68288,68295],"valid"],[[68296,68296],"valid",[],"NV8"],[[68297,68326],"valid"],[[68327,68330],"disallowed"],[[68331,68342],"valid",[],"NV8"],[[68343,68351],"disallowed"],[[68352,68405],"valid"],[[68406,68408],"disallowed"],[[68409,68415],"valid",[],"NV8"],[[68416,68437],"valid"],[[68438,68439],"disallowed"],[[68440,68447],"valid",[],"NV8"],[[68448,68466],"valid"],[[68467,68471],"disallowed"],[[68472,68479],"valid",[],"NV8"],[[68480,68497],"valid"],[[68498,68504],"disallowed"],[[68505,68508],"valid",[],"NV8"],[[68509,68520],"disallowed"],[[68521,68527],"valid",[],"NV8"],[[68528,68607],"disallowed"],[[68608,68680],"valid"],[[68681,68735],"disallowed"],[[68736,68736],"mapped",[68800]],[[68737,68737],"mapped",[68801]],[[68738,68738],"mapped",[68802]],[[68739,68739],"mapped",[68803]],[[68740,68740],"mapped",[68804]],[[68741,68741],"mapped",[68805]],[[68742,68742],"mapped",[68806]],[[68743,68743],"mapped",[68807]],[[68744,68744],"mapped",[68808]],[[68745,68745],"mapped",[68809]],[[68746,68746],"mapped",[68810]],[[68747,68747],"mapped",[68811]],[[68748,68748],"mapped",[68812]],[[68749,68749],"mapped",[68813]],[[68750,68750],"mapped",[68814]],[[68751,68751],"mapped",[68815]],[[68752,68752],"mapped",[68816]],[[68753,68753],"mapped",[68817]],[[68754,68754],"mapped",[68818]],[[68755,68755],"mapped",[68819]],[[68756,68756],"mapped",[68820]],[[68757,68757],"mapped",[68821]],[[68758,68758],"mapped",[68822]],[[68759,68759],"mapped",[68823]],[[68760,68760],"mapped",[68824]],[[68761,68761],"mapped",[68825]],[[68762,68762],"mapped",[68826]],[[68763,68763],"mapped",[68827]],[[68764,68764],"mapped",[68828]],[[68765,68765],"mapped",[68829]],[[68766,68766],"mapped",[68830]],[[68767,68767],"mapped",[68831]],[[68768,68768],"mapped",[68832]],[[68769,68769],"mapped",[68833]],[[68770,68770],"mapped",[68834]],[[68771,68771],"mapped",[68835]],[[68772,68772],"mapped",[68836]],[[68773,68773],"mapped",[68837]],[[68774,68774],"mapped",[68838]],[[68775,68775],"mapped",[68839]],[[68776,68776],"mapped",[68840]],[[68777,68777],"mapped",[68841]],[[68778,68778],"mapped",[68842]],[[68779,68779],"mapped",[68843]],[[68780,68780],"mapped",[68844]],[[68781,68781],"mapped",[68845]],[[68782,68782],"mapped",[68846]],[[68783,68783],"mapped",[68847]],[[68784,68784],"mapped",[68848]],[[68785,68785],"mapped",[68849]],[[68786,68786],"mapped",[68850]],[[68787,68799],"disallowed"],[[68800,68850],"valid"],[[68851,68857],"disallowed"],[[68858,68863],"valid",[],"NV8"],[[68864,69215],"disallowed"],[[69216,69246],"valid",[],"NV8"],[[69247,69631],"disallowed"],[[69632,69702],"valid"],[[69703,69709],"valid",[],"NV8"],[[69710,69713],"disallowed"],[[69714,69733],"valid",[],"NV8"],[[69734,69743],"valid"],[[69744,69758],"disallowed"],[[69759,69759],"valid"],[[69760,69818],"valid"],[[69819,69820],"valid",[],"NV8"],[[69821,69821],"disallowed"],[[69822,69825],"valid",[],"NV8"],[[69826,69839],"disallowed"],[[69840,69864],"valid"],[[69865,69871],"disallowed"],[[69872,69881],"valid"],[[69882,69887],"disallowed"],[[69888,69940],"valid"],[[69941,69941],"disallowed"],[[69942,69951],"valid"],[[69952,69955],"valid",[],"NV8"],[[69956,69967],"disallowed"],[[69968,70003],"valid"],[[70004,70005],"valid",[],"NV8"],[[70006,70006],"valid"],[[70007,70015],"disallowed"],[[70016,70084],"valid"],[[70085,70088],"valid",[],"NV8"],[[70089,70089],"valid",[],"NV8"],[[70090,70092],"valid"],[[70093,70093],"valid",[],"NV8"],[[70094,70095],"disallowed"],[[70096,70105],"valid"],[[70106,70106],"valid"],[[70107,70107],"valid",[],"NV8"],[[70108,70108],"valid"],[[70109,70111],"valid",[],"NV8"],[[70112,70112],"disallowed"],[[70113,70132],"valid",[],"NV8"],[[70133,70143],"disallowed"],[[70144,70161],"valid"],[[70162,70162],"disallowed"],[[70163,70199],"valid"],[[70200,70205],"valid",[],"NV8"],[[70206,70271],"disallowed"],[[70272,70278],"valid"],[[70279,70279],"disallowed"],[[70280,70280],"valid"],[[70281,70281],"disallowed"],[[70282,70285],"valid"],[[70286,70286],"disallowed"],[[70287,70301],"valid"],[[70302,70302],"disallowed"],[[70303,70312],"valid"],[[70313,70313],"valid",[],"NV8"],[[70314,70319],"disallowed"],[[70320,70378],"valid"],[[70379,70383],"disallowed"],[[70384,70393],"valid"],[[70394,70399],"disallowed"],[[70400,70400],"valid"],[[70401,70403],"valid"],[[70404,70404],"disallowed"],[[70405,70412],"valid"],[[70413,70414],"disallowed"],[[70415,70416],"valid"],[[70417,70418],"disallowed"],[[70419,70440],"valid"],[[70441,70441],"disallowed"],[[70442,70448],"valid"],[[70449,70449],"disallowed"],[[70450,70451],"valid"],[[70452,70452],"disallowed"],[[70453,70457],"valid"],[[70458,70459],"disallowed"],[[70460,70468],"valid"],[[70469,70470],"disallowed"],[[70471,70472],"valid"],[[70473,70474],"disallowed"],[[70475,70477],"valid"],[[70478,70479],"disallowed"],[[70480,70480],"valid"],[[70481,70486],"disallowed"],[[70487,70487],"valid"],[[70488,70492],"disallowed"],[[70493,70499],"valid"],[[70500,70501],"disallowed"],[[70502,70508],"valid"],[[70509,70511],"disallowed"],[[70512,70516],"valid"],[[70517,70783],"disallowed"],[[70784,70853],"valid"],[[70854,70854],"valid",[],"NV8"],[[70855,70855],"valid"],[[70856,70863],"disallowed"],[[70864,70873],"valid"],[[70874,71039],"disallowed"],[[71040,71093],"valid"],[[71094,71095],"disallowed"],[[71096,71104],"valid"],[[71105,71113],"valid",[],"NV8"],[[71114,71127],"valid",[],"NV8"],[[71128,71133],"valid"],[[71134,71167],"disallowed"],[[71168,71232],"valid"],[[71233,71235],"valid",[],"NV8"],[[71236,71236],"valid"],[[71237,71247],"disallowed"],[[71248,71257],"valid"],[[71258,71295],"disallowed"],[[71296,71351],"valid"],[[71352,71359],"disallowed"],[[71360,71369],"valid"],[[71370,71423],"disallowed"],[[71424,71449],"valid"],[[71450,71452],"disallowed"],[[71453,71467],"valid"],[[71468,71471],"disallowed"],[[71472,71481],"valid"],[[71482,71487],"valid",[],"NV8"],[[71488,71839],"disallowed"],[[71840,71840],"mapped",[71872]],[[71841,71841],"mapped",[71873]],[[71842,71842],"mapped",[71874]],[[71843,71843],"mapped",[71875]],[[71844,71844],"mapped",[71876]],[[71845,71845],"mapped",[71877]],[[71846,71846],"mapped",[71878]],[[71847,71847],"mapped",[71879]],[[71848,71848],"mapped",[71880]],[[71849,71849],"mapped",[71881]],[[71850,71850],"mapped",[71882]],[[71851,71851],"mapped",[71883]],[[71852,71852],"mapped",[71884]],[[71853,71853],"mapped",[71885]],[[71854,71854],"mapped",[71886]],[[71855,71855],"mapped",[71887]],[[71856,71856],"mapped",[71888]],[[71857,71857],"mapped",[71889]],[[71858,71858],"mapped",[71890]],[[71859,71859],"mapped",[71891]],[[71860,71860],"mapped",[71892]],[[71861,71861],"mapped",[71893]],[[71862,71862],"mapped",[71894]],[[71863,71863],"mapped",[71895]],[[71864,71864],"mapped",[71896]],[[71865,71865],"mapped",[71897]],[[71866,71866],"mapped",[71898]],[[71867,71867],"mapped",[71899]],[[71868,71868],"mapped",[71900]],[[71869,71869],"mapped",[71901]],[[71870,71870],"mapped",[71902]],[[71871,71871],"mapped",[71903]],[[71872,71913],"valid"],[[71914,71922],"valid",[],"NV8"],[[71923,71934],"disallowed"],[[71935,71935],"valid"],[[71936,72383],"disallowed"],[[72384,72440],"valid"],[[72441,73727],"disallowed"],[[73728,74606],"valid"],[[74607,74648],"valid"],[[74649,74649],"valid"],[[74650,74751],"disallowed"],[[74752,74850],"valid",[],"NV8"],[[74851,74862],"valid",[],"NV8"],[[74863,74863],"disallowed"],[[74864,74867],"valid",[],"NV8"],[[74868,74868],"valid",[],"NV8"],[[74869,74879],"disallowed"],[[74880,75075],"valid"],[[75076,77823],"disallowed"],[[77824,78894],"valid"],[[78895,82943],"disallowed"],[[82944,83526],"valid"],[[83527,92159],"disallowed"],[[92160,92728],"valid"],[[92729,92735],"disallowed"],[[92736,92766],"valid"],[[92767,92767],"disallowed"],[[92768,92777],"valid"],[[92778,92781],"disallowed"],[[92782,92783],"valid",[],"NV8"],[[92784,92879],"disallowed"],[[92880,92909],"valid"],[[92910,92911],"disallowed"],[[92912,92916],"valid"],[[92917,92917],"valid",[],"NV8"],[[92918,92927],"disallowed"],[[92928,92982],"valid"],[[92983,92991],"valid",[],"NV8"],[[92992,92995],"valid"],[[92996,92997],"valid",[],"NV8"],[[92998,93007],"disallowed"],[[93008,93017],"valid"],[[93018,93018],"disallowed"],[[93019,93025],"valid",[],"NV8"],[[93026,93026],"disallowed"],[[93027,93047],"valid"],[[93048,93052],"disallowed"],[[93053,93071],"valid"],[[93072,93951],"disallowed"],[[93952,94020],"valid"],[[94021,94031],"disallowed"],[[94032,94078],"valid"],[[94079,94094],"disallowed"],[[94095,94111],"valid"],[[94112,110591],"disallowed"],[[110592,110593],"valid"],[[110594,113663],"disallowed"],[[113664,113770],"valid"],[[113771,113775],"disallowed"],[[113776,113788],"valid"],[[113789,113791],"disallowed"],[[113792,113800],"valid"],[[113801,113807],"disallowed"],[[113808,113817],"valid"],[[113818,113819],"disallowed"],[[113820,113820],"valid",[],"NV8"],[[113821,113822],"valid"],[[113823,113823],"valid",[],"NV8"],[[113824,113827],"ignored"],[[113828,118783],"disallowed"],[[118784,119029],"valid",[],"NV8"],[[119030,119039],"disallowed"],[[119040,119078],"valid",[],"NV8"],[[119079,119080],"disallowed"],[[119081,119081],"valid",[],"NV8"],[[119082,119133],"valid",[],"NV8"],[[119134,119134],"mapped",[119127,119141]],[[119135,119135],"mapped",[119128,119141]],[[119136,119136],"mapped",[119128,119141,119150]],[[119137,119137],"mapped",[119128,119141,119151]],[[119138,119138],"mapped",[119128,119141,119152]],[[119139,119139],"mapped",[119128,119141,119153]],[[119140,119140],"mapped",[119128,119141,119154]],[[119141,119154],"valid",[],"NV8"],[[119155,119162],"disallowed"],[[119163,119226],"valid",[],"NV8"],[[119227,119227],"mapped",[119225,119141]],[[119228,119228],"mapped",[119226,119141]],[[119229,119229],"mapped",[119225,119141,119150]],[[119230,119230],"mapped",[119226,119141,119150]],[[119231,119231],"mapped",[119225,119141,119151]],[[119232,119232],"mapped",[119226,119141,119151]],[[119233,119261],"valid",[],"NV8"],[[119262,119272],"valid",[],"NV8"],[[119273,119295],"disallowed"],[[119296,119365],"valid",[],"NV8"],[[119366,119551],"disallowed"],[[119552,119638],"valid",[],"NV8"],[[119639,119647],"disallowed"],[[119648,119665],"valid",[],"NV8"],[[119666,119807],"disallowed"],[[119808,119808],"mapped",[97]],[[119809,119809],"mapped",[98]],[[119810,119810],"mapped",[99]],[[119811,119811],"mapped",[100]],[[119812,119812],"mapped",[101]],[[119813,119813],"mapped",[102]],[[119814,119814],"mapped",[103]],[[119815,119815],"mapped",[104]],[[119816,119816],"mapped",[105]],[[119817,119817],"mapped",[106]],[[119818,119818],"mapped",[107]],[[119819,119819],"mapped",[108]],[[119820,119820],"mapped",[109]],[[119821,119821],"mapped",[110]],[[119822,119822],"mapped",[111]],[[119823,119823],"mapped",[112]],[[119824,119824],"mapped",[113]],[[119825,119825],"mapped",[114]],[[119826,119826],"mapped",[115]],[[119827,119827],"mapped",[116]],[[119828,119828],"mapped",[117]],[[119829,119829],"mapped",[118]],[[119830,119830],"mapped",[119]],[[119831,119831],"mapped",[120]],[[119832,119832],"mapped",[121]],[[119833,119833],"mapped",[122]],[[119834,119834],"mapped",[97]],[[119835,119835],"mapped",[98]],[[119836,119836],"mapped",[99]],[[119837,119837],"mapped",[100]],[[119838,119838],"mapped",[101]],[[119839,119839],"mapped",[102]],[[119840,119840],"mapped",[103]],[[119841,119841],"mapped",[104]],[[119842,119842],"mapped",[105]],[[119843,119843],"mapped",[106]],[[119844,119844],"mapped",[107]],[[119845,119845],"mapped",[108]],[[119846,119846],"mapped",[109]],[[119847,119847],"mapped",[110]],[[119848,119848],"mapped",[111]],[[119849,119849],"mapped",[112]],[[119850,119850],"mapped",[113]],[[119851,119851],"mapped",[114]],[[119852,119852],"mapped",[115]],[[119853,119853],"mapped",[116]],[[119854,119854],"mapped",[117]],[[119855,119855],"mapped",[118]],[[119856,119856],"mapped",[119]],[[119857,119857],"mapped",[120]],[[119858,119858],"mapped",[121]],[[119859,119859],"mapped",[122]],[[119860,119860],"mapped",[97]],[[119861,119861],"mapped",[98]],[[119862,119862],"mapped",[99]],[[119863,119863],"mapped",[100]],[[119864,119864],"mapped",[101]],[[119865,119865],"mapped",[102]],[[119866,119866],"mapped",[103]],[[119867,119867],"mapped",[104]],[[119868,119868],"mapped",[105]],[[119869,119869],"mapped",[106]],[[119870,119870],"mapped",[107]],[[119871,119871],"mapped",[108]],[[119872,119872],"mapped",[109]],[[119873,119873],"mapped",[110]],[[119874,119874],"mapped",[111]],[[119875,119875],"mapped",[112]],[[119876,119876],"mapped",[113]],[[119877,119877],"mapped",[114]],[[119878,119878],"mapped",[115]],[[119879,119879],"mapped",[116]],[[119880,119880],"mapped",[117]],[[119881,119881],"mapped",[118]],[[119882,119882],"mapped",[119]],[[119883,119883],"mapped",[120]],[[119884,119884],"mapped",[121]],[[119885,119885],"mapped",[122]],[[119886,119886],"mapped",[97]],[[119887,119887],"mapped",[98]],[[119888,119888],"mapped",[99]],[[119889,119889],"mapped",[100]],[[119890,119890],"mapped",[101]],[[119891,119891],"mapped",[102]],[[119892,119892],"mapped",[103]],[[119893,119893],"disallowed"],[[119894,119894],"mapped",[105]],[[119895,119895],"mapped",[106]],[[119896,119896],"mapped",[107]],[[119897,119897],"mapped",[108]],[[119898,119898],"mapped",[109]],[[119899,119899],"mapped",[110]],[[119900,119900],"mapped",[111]],[[119901,119901],"mapped",[112]],[[119902,119902],"mapped",[113]],[[119903,119903],"mapped",[114]],[[119904,119904],"mapped",[115]],[[119905,119905],"mapped",[116]],[[119906,119906],"mapped",[117]],[[119907,119907],"mapped",[118]],[[119908,119908],"mapped",[119]],[[119909,119909],"mapped",[120]],[[119910,119910],"mapped",[121]],[[119911,119911],"mapped",[122]],[[119912,119912],"mapped",[97]],[[119913,119913],"mapped",[98]],[[119914,119914],"mapped",[99]],[[119915,119915],"mapped",[100]],[[119916,119916],"mapped",[101]],[[119917,119917],"mapped",[102]],[[119918,119918],"mapped",[103]],[[119919,119919],"mapped",[104]],[[119920,119920],"mapped",[105]],[[119921,119921],"mapped",[106]],[[119922,119922],"mapped",[107]],[[119923,119923],"mapped",[108]],[[119924,119924],"mapped",[109]],[[119925,119925],"mapped",[110]],[[119926,119926],"mapped",[111]],[[119927,119927],"mapped",[112]],[[119928,119928],"mapped",[113]],[[119929,119929],"mapped",[114]],[[119930,119930],"mapped",[115]],[[119931,119931],"mapped",[116]],[[119932,119932],"mapped",[117]],[[119933,119933],"mapped",[118]],[[119934,119934],"mapped",[119]],[[119935,119935],"mapped",[120]],[[119936,119936],"mapped",[121]],[[119937,119937],"mapped",[122]],[[119938,119938],"mapped",[97]],[[119939,119939],"mapped",[98]],[[119940,119940],"mapped",[99]],[[119941,119941],"mapped",[100]],[[119942,119942],"mapped",[101]],[[119943,119943],"mapped",[102]],[[119944,119944],"mapped",[103]],[[119945,119945],"mapped",[104]],[[119946,119946],"mapped",[105]],[[119947,119947],"mapped",[106]],[[119948,119948],"mapped",[107]],[[119949,119949],"mapped",[108]],[[119950,119950],"mapped",[109]],[[119951,119951],"mapped",[110]],[[119952,119952],"mapped",[111]],[[119953,119953],"mapped",[112]],[[119954,119954],"mapped",[113]],[[119955,119955],"mapped",[114]],[[119956,119956],"mapped",[115]],[[119957,119957],"mapped",[116]],[[119958,119958],"mapped",[117]],[[119959,119959],"mapped",[118]],[[119960,119960],"mapped",[119]],[[119961,119961],"mapped",[120]],[[119962,119962],"mapped",[121]],[[119963,119963],"mapped",[122]],[[119964,119964],"mapped",[97]],[[119965,119965],"disallowed"],[[119966,119966],"mapped",[99]],[[119967,119967],"mapped",[100]],[[119968,119969],"disallowed"],[[119970,119970],"mapped",[103]],[[119971,119972],"disallowed"],[[119973,119973],"mapped",[106]],[[119974,119974],"mapped",[107]],[[119975,119976],"disallowed"],[[119977,119977],"mapped",[110]],[[119978,119978],"mapped",[111]],[[119979,119979],"mapped",[112]],[[119980,119980],"mapped",[113]],[[119981,119981],"disallowed"],[[119982,119982],"mapped",[115]],[[119983,119983],"mapped",[116]],[[119984,119984],"mapped",[117]],[[119985,119985],"mapped",[118]],[[119986,119986],"mapped",[119]],[[119987,119987],"mapped",[120]],[[119988,119988],"mapped",[121]],[[119989,119989],"mapped",[122]],[[119990,119990],"mapped",[97]],[[119991,119991],"mapped",[98]],[[119992,119992],"mapped",[99]],[[119993,119993],"mapped",[100]],[[119994,119994],"disallowed"],[[119995,119995],"mapped",[102]],[[119996,119996],"disallowed"],[[119997,119997],"mapped",[104]],[[119998,119998],"mapped",[105]],[[119999,119999],"mapped",[106]],[[120000,120000],"mapped",[107]],[[120001,120001],"mapped",[108]],[[120002,120002],"mapped",[109]],[[120003,120003],"mapped",[110]],[[120004,120004],"disallowed"],[[120005,120005],"mapped",[112]],[[120006,120006],"mapped",[113]],[[120007,120007],"mapped",[114]],[[120008,120008],"mapped",[115]],[[120009,120009],"mapped",[116]],[[120010,120010],"mapped",[117]],[[120011,120011],"mapped",[118]],[[120012,120012],"mapped",[119]],[[120013,120013],"mapped",[120]],[[120014,120014],"mapped",[121]],[[120015,120015],"mapped",[122]],[[120016,120016],"mapped",[97]],[[120017,120017],"mapped",[98]],[[120018,120018],"mapped",[99]],[[120019,120019],"mapped",[100]],[[120020,120020],"mapped",[101]],[[120021,120021],"mapped",[102]],[[120022,120022],"mapped",[103]],[[120023,120023],"mapped",[104]],[[120024,120024],"mapped",[105]],[[120025,120025],"mapped",[106]],[[120026,120026],"mapped",[107]],[[120027,120027],"mapped",[108]],[[120028,120028],"mapped",[109]],[[120029,120029],"mapped",[110]],[[120030,120030],"mapped",[111]],[[120031,120031],"mapped",[112]],[[120032,120032],"mapped",[113]],[[120033,120033],"mapped",[114]],[[120034,120034],"mapped",[115]],[[120035,120035],"mapped",[116]],[[120036,120036],"mapped",[117]],[[120037,120037],"mapped",[118]],[[120038,120038],"mapped",[119]],[[120039,120039],"mapped",[120]],[[120040,120040],"mapped",[121]],[[120041,120041],"mapped",[122]],[[120042,120042],"mapped",[97]],[[120043,120043],"mapped",[98]],[[120044,120044],"mapped",[99]],[[120045,120045],"mapped",[100]],[[120046,120046],"mapped",[101]],[[120047,120047],"mapped",[102]],[[120048,120048],"mapped",[103]],[[120049,120049],"mapped",[104]],[[120050,120050],"mapped",[105]],[[120051,120051],"mapped",[106]],[[120052,120052],"mapped",[107]],[[120053,120053],"mapped",[108]],[[120054,120054],"mapped",[109]],[[120055,120055],"mapped",[110]],[[120056,120056],"mapped",[111]],[[120057,120057],"mapped",[112]],[[120058,120058],"mapped",[113]],[[120059,120059],"mapped",[114]],[[120060,120060],"mapped",[115]],[[120061,120061],"mapped",[116]],[[120062,120062],"mapped",[117]],[[120063,120063],"mapped",[118]],[[120064,120064],"mapped",[119]],[[120065,120065],"mapped",[120]],[[120066,120066],"mapped",[121]],[[120067,120067],"mapped",[122]],[[120068,120068],"mapped",[97]],[[120069,120069],"mapped",[98]],[[120070,120070],"disallowed"],[[120071,120071],"mapped",[100]],[[120072,120072],"mapped",[101]],[[120073,120073],"mapped",[102]],[[120074,120074],"mapped",[103]],[[120075,120076],"disallowed"],[[120077,120077],"mapped",[106]],[[120078,120078],"mapped",[107]],[[120079,120079],"mapped",[108]],[[120080,120080],"mapped",[109]],[[120081,120081],"mapped",[110]],[[120082,120082],"mapped",[111]],[[120083,120083],"mapped",[112]],[[120084,120084],"mapped",[113]],[[120085,120085],"disallowed"],[[120086,120086],"mapped",[115]],[[120087,120087],"mapped",[116]],[[120088,120088],"mapped",[117]],[[120089,120089],"mapped",[118]],[[120090,120090],"mapped",[119]],[[120091,120091],"mapped",[120]],[[120092,120092],"mapped",[121]],[[120093,120093],"disallowed"],[[120094,120094],"mapped",[97]],[[120095,120095],"mapped",[98]],[[120096,120096],"mapped",[99]],[[120097,120097],"mapped",[100]],[[120098,120098],"mapped",[101]],[[120099,120099],"mapped",[102]],[[120100,120100],"mapped",[103]],[[120101,120101],"mapped",[104]],[[120102,120102],"mapped",[105]],[[120103,120103],"mapped",[106]],[[120104,120104],"mapped",[107]],[[120105,120105],"mapped",[108]],[[120106,120106],"mapped",[109]],[[120107,120107],"mapped",[110]],[[120108,120108],"mapped",[111]],[[120109,120109],"mapped",[112]],[[120110,120110],"mapped",[113]],[[120111,120111],"mapped",[114]],[[120112,120112],"mapped",[115]],[[120113,120113],"mapped",[116]],[[120114,120114],"mapped",[117]],[[120115,120115],"mapped",[118]],[[120116,120116],"mapped",[119]],[[120117,120117],"mapped",[120]],[[120118,120118],"mapped",[121]],[[120119,120119],"mapped",[122]],[[120120,120120],"mapped",[97]],[[120121,120121],"mapped",[98]],[[120122,120122],"disallowed"],[[120123,120123],"mapped",[100]],[[120124,120124],"mapped",[101]],[[120125,120125],"mapped",[102]],[[120126,120126],"mapped",[103]],[[120127,120127],"disallowed"],[[120128,120128],"mapped",[105]],[[120129,120129],"mapped",[106]],[[120130,120130],"mapped",[107]],[[120131,120131],"mapped",[108]],[[120132,120132],"mapped",[109]],[[120133,120133],"disallowed"],[[120134,120134],"mapped",[111]],[[120135,120137],"disallowed"],[[120138,120138],"mapped",[115]],[[120139,120139],"mapped",[116]],[[120140,120140],"mapped",[117]],[[120141,120141],"mapped",[118]],[[120142,120142],"mapped",[119]],[[120143,120143],"mapped",[120]],[[120144,120144],"mapped",[121]],[[120145,120145],"disallowed"],[[120146,120146],"mapped",[97]],[[120147,120147],"mapped",[98]],[[120148,120148],"mapped",[99]],[[120149,120149],"mapped",[100]],[[120150,120150],"mapped",[101]],[[120151,120151],"mapped",[102]],[[120152,120152],"mapped",[103]],[[120153,120153],"mapped",[104]],[[120154,120154],"mapped",[105]],[[120155,120155],"mapped",[106]],[[120156,120156],"mapped",[107]],[[120157,120157],"mapped",[108]],[[120158,120158],"mapped",[109]],[[120159,120159],"mapped",[110]],[[120160,120160],"mapped",[111]],[[120161,120161],"mapped",[112]],[[120162,120162],"mapped",[113]],[[120163,120163],"mapped",[114]],[[120164,120164],"mapped",[115]],[[120165,120165],"mapped",[116]],[[120166,120166],"mapped",[117]],[[120167,120167],"mapped",[118]],[[120168,120168],"mapped",[119]],[[120169,120169],"mapped",[120]],[[120170,120170],"mapped",[121]],[[120171,120171],"mapped",[122]],[[120172,120172],"mapped",[97]],[[120173,120173],"mapped",[98]],[[120174,120174],"mapped",[99]],[[120175,120175],"mapped",[100]],[[120176,120176],"mapped",[101]],[[120177,120177],"mapped",[102]],[[120178,120178],"mapped",[103]],[[120179,120179],"mapped",[104]],[[120180,120180],"mapped",[105]],[[120181,120181],"mapped",[106]],[[120182,120182],"mapped",[107]],[[120183,120183],"mapped",[108]],[[120184,120184],"mapped",[109]],[[120185,120185],"mapped",[110]],[[120186,120186],"mapped",[111]],[[120187,120187],"mapped",[112]],[[120188,120188],"mapped",[113]],[[120189,120189],"mapped",[114]],[[120190,120190],"mapped",[115]],[[120191,120191],"mapped",[116]],[[120192,120192],"mapped",[117]],[[120193,120193],"mapped",[118]],[[120194,120194],"mapped",[119]],[[120195,120195],"mapped",[120]],[[120196,120196],"mapped",[121]],[[120197,120197],"mapped",[122]],[[120198,120198],"mapped",[97]],[[120199,120199],"mapped",[98]],[[120200,120200],"mapped",[99]],[[120201,120201],"mapped",[100]],[[120202,120202],"mapped",[101]],[[120203,120203],"mapped",[102]],[[120204,120204],"mapped",[103]],[[120205,120205],"mapped",[104]],[[120206,120206],"mapped",[105]],[[120207,120207],"mapped",[106]],[[120208,120208],"mapped",[107]],[[120209,120209],"mapped",[108]],[[120210,120210],"mapped",[109]],[[120211,120211],"mapped",[110]],[[120212,120212],"mapped",[111]],[[120213,120213],"mapped",[112]],[[120214,120214],"mapped",[113]],[[120215,120215],"mapped",[114]],[[120216,120216],"mapped",[115]],[[120217,120217],"mapped",[116]],[[120218,120218],"mapped",[117]],[[120219,120219],"mapped",[118]],[[120220,120220],"mapped",[119]],[[120221,120221],"mapped",[120]],[[120222,120222],"mapped",[121]],[[120223,120223],"mapped",[122]],[[120224,120224],"mapped",[97]],[[120225,120225],"mapped",[98]],[[120226,120226],"mapped",[99]],[[120227,120227],"mapped",[100]],[[120228,120228],"mapped",[101]],[[120229,120229],"mapped",[102]],[[120230,120230],"mapped",[103]],[[120231,120231],"mapped",[104]],[[120232,120232],"mapped",[105]],[[120233,120233],"mapped",[106]],[[120234,120234],"mapped",[107]],[[120235,120235],"mapped",[108]],[[120236,120236],"mapped",[109]],[[120237,120237],"mapped",[110]],[[120238,120238],"mapped",[111]],[[120239,120239],"mapped",[112]],[[120240,120240],"mapped",[113]],[[120241,120241],"mapped",[114]],[[120242,120242],"mapped",[115]],[[120243,120243],"mapped",[116]],[[120244,120244],"mapped",[117]],[[120245,120245],"mapped",[118]],[[120246,120246],"mapped",[119]],[[120247,120247],"mapped",[120]],[[120248,120248],"mapped",[121]],[[120249,120249],"mapped",[122]],[[120250,120250],"mapped",[97]],[[120251,120251],"mapped",[98]],[[120252,120252],"mapped",[99]],[[120253,120253],"mapped",[100]],[[120254,120254],"mapped",[101]],[[120255,120255],"mapped",[102]],[[120256,120256],"mapped",[103]],[[120257,120257],"mapped",[104]],[[120258,120258],"mapped",[105]],[[120259,120259],"mapped",[106]],[[120260,120260],"mapped",[107]],[[120261,120261],"mapped",[108]],[[120262,120262],"mapped",[109]],[[120263,120263],"mapped",[110]],[[120264,120264],"mapped",[111]],[[120265,120265],"mapped",[112]],[[120266,120266],"mapped",[113]],[[120267,120267],"mapped",[114]],[[120268,120268],"mapped",[115]],[[120269,120269],"mapped",[116]],[[120270,120270],"mapped",[117]],[[120271,120271],"mapped",[118]],[[120272,120272],"mapped",[119]],[[120273,120273],"mapped",[120]],[[120274,120274],"mapped",[121]],[[120275,120275],"mapped",[122]],[[120276,120276],"mapped",[97]],[[120277,120277],"mapped",[98]],[[120278,120278],"mapped",[99]],[[120279,120279],"mapped",[100]],[[120280,120280],"mapped",[101]],[[120281,120281],"mapped",[102]],[[120282,120282],"mapped",[103]],[[120283,120283],"mapped",[104]],[[120284,120284],"mapped",[105]],[[120285,120285],"mapped",[106]],[[120286,120286],"mapped",[107]],[[120287,120287],"mapped",[108]],[[120288,120288],"mapped",[109]],[[120289,120289],"mapped",[110]],[[120290,120290],"mapped",[111]],[[120291,120291],"mapped",[112]],[[120292,120292],"mapped",[113]],[[120293,120293],"mapped",[114]],[[120294,120294],"mapped",[115]],[[120295,120295],"mapped",[116]],[[120296,120296],"mapped",[117]],[[120297,120297],"mapped",[118]],[[120298,120298],"mapped",[119]],[[120299,120299],"mapped",[120]],[[120300,120300],"mapped",[121]],[[120301,120301],"mapped",[122]],[[120302,120302],"mapped",[97]],[[120303,120303],"mapped",[98]],[[120304,120304],"mapped",[99]],[[120305,120305],"mapped",[100]],[[120306,120306],"mapped",[101]],[[120307,120307],"mapped",[102]],[[120308,120308],"mapped",[103]],[[120309,120309],"mapped",[104]],[[120310,120310],"mapped",[105]],[[120311,120311],"mapped",[106]],[[120312,120312],"mapped",[107]],[[120313,120313],"mapped",[108]],[[120314,120314],"mapped",[109]],[[120315,120315],"mapped",[110]],[[120316,120316],"mapped",[111]],[[120317,120317],"mapped",[112]],[[120318,120318],"mapped",[113]],[[120319,120319],"mapped",[114]],[[120320,120320],"mapped",[115]],[[120321,120321],"mapped",[116]],[[120322,120322],"mapped",[117]],[[120323,120323],"mapped",[118]],[[120324,120324],"mapped",[119]],[[120325,120325],"mapped",[120]],[[120326,120326],"mapped",[121]],[[120327,120327],"mapped",[122]],[[120328,120328],"mapped",[97]],[[120329,120329],"mapped",[98]],[[120330,120330],"mapped",[99]],[[120331,120331],"mapped",[100]],[[120332,120332],"mapped",[101]],[[120333,120333],"mapped",[102]],[[120334,120334],"mapped",[103]],[[120335,120335],"mapped",[104]],[[120336,120336],"mapped",[105]],[[120337,120337],"mapped",[106]],[[120338,120338],"mapped",[107]],[[120339,120339],"mapped",[108]],[[120340,120340],"mapped",[109]],[[120341,120341],"mapped",[110]],[[120342,120342],"mapped",[111]],[[120343,120343],"mapped",[112]],[[120344,120344],"mapped",[113]],[[120345,120345],"mapped",[114]],[[120346,120346],"mapped",[115]],[[120347,120347],"mapped",[116]],[[120348,120348],"mapped",[117]],[[120349,120349],"mapped",[118]],[[120350,120350],"mapped",[119]],[[120351,120351],"mapped",[120]],[[120352,120352],"mapped",[121]],[[120353,120353],"mapped",[122]],[[120354,120354],"mapped",[97]],[[120355,120355],"mapped",[98]],[[120356,120356],"mapped",[99]],[[120357,120357],"mapped",[100]],[[120358,120358],"mapped",[101]],[[120359,120359],"mapped",[102]],[[120360,120360],"mapped",[103]],[[120361,120361],"mapped",[104]],[[120362,120362],"mapped",[105]],[[120363,120363],"mapped",[106]],[[120364,120364],"mapped",[107]],[[120365,120365],"mapped",[108]],[[120366,120366],"mapped",[109]],[[120367,120367],"mapped",[110]],[[120368,120368],"mapped",[111]],[[120369,120369],"mapped",[112]],[[120370,120370],"mapped",[113]],[[120371,120371],"mapped",[114]],[[120372,120372],"mapped",[115]],[[120373,120373],"mapped",[116]],[[120374,120374],"mapped",[117]],[[120375,120375],"mapped",[118]],[[120376,120376],"mapped",[119]],[[120377,120377],"mapped",[120]],[[120378,120378],"mapped",[121]],[[120379,120379],"mapped",[122]],[[120380,120380],"mapped",[97]],[[120381,120381],"mapped",[98]],[[120382,120382],"mapped",[99]],[[120383,120383],"mapped",[100]],[[120384,120384],"mapped",[101]],[[120385,120385],"mapped",[102]],[[120386,120386],"mapped",[103]],[[120387,120387],"mapped",[104]],[[120388,120388],"mapped",[105]],[[120389,120389],"mapped",[106]],[[120390,120390],"mapped",[107]],[[120391,120391],"mapped",[108]],[[120392,120392],"mapped",[109]],[[120393,120393],"mapped",[110]],[[120394,120394],"mapped",[111]],[[120395,120395],"mapped",[112]],[[120396,120396],"mapped",[113]],[[120397,120397],"mapped",[114]],[[120398,120398],"mapped",[115]],[[120399,120399],"mapped",[116]],[[120400,120400],"mapped",[117]],[[120401,120401],"mapped",[118]],[[120402,120402],"mapped",[119]],[[120403,120403],"mapped",[120]],[[120404,120404],"mapped",[121]],[[120405,120405],"mapped",[122]],[[120406,120406],"mapped",[97]],[[120407,120407],"mapped",[98]],[[120408,120408],"mapped",[99]],[[120409,120409],"mapped",[100]],[[120410,120410],"mapped",[101]],[[120411,120411],"mapped",[102]],[[120412,120412],"mapped",[103]],[[120413,120413],"mapped",[104]],[[120414,120414],"mapped",[105]],[[120415,120415],"mapped",[106]],[[120416,120416],"mapped",[107]],[[120417,120417],"mapped",[108]],[[120418,120418],"mapped",[109]],[[120419,120419],"mapped",[110]],[[120420,120420],"mapped",[111]],[[120421,120421],"mapped",[112]],[[120422,120422],"mapped",[113]],[[120423,120423],"mapped",[114]],[[120424,120424],"mapped",[115]],[[120425,120425],"mapped",[116]],[[120426,120426],"mapped",[117]],[[120427,120427],"mapped",[118]],[[120428,120428],"mapped",[119]],[[120429,120429],"mapped",[120]],[[120430,120430],"mapped",[121]],[[120431,120431],"mapped",[122]],[[120432,120432],"mapped",[97]],[[120433,120433],"mapped",[98]],[[120434,120434],"mapped",[99]],[[120435,120435],"mapped",[100]],[[120436,120436],"mapped",[101]],[[120437,120437],"mapped",[102]],[[120438,120438],"mapped",[103]],[[120439,120439],"mapped",[104]],[[120440,120440],"mapped",[105]],[[120441,120441],"mapped",[106]],[[120442,120442],"mapped",[107]],[[120443,120443],"mapped",[108]],[[120444,120444],"mapped",[109]],[[120445,120445],"mapped",[110]],[[120446,120446],"mapped",[111]],[[120447,120447],"mapped",[112]],[[120448,120448],"mapped",[113]],[[120449,120449],"mapped",[114]],[[120450,120450],"mapped",[115]],[[120451,120451],"mapped",[116]],[[120452,120452],"mapped",[117]],[[120453,120453],"mapped",[118]],[[120454,120454],"mapped",[119]],[[120455,120455],"mapped",[120]],[[120456,120456],"mapped",[121]],[[120457,120457],"mapped",[122]],[[120458,120458],"mapped",[97]],[[120459,120459],"mapped",[98]],[[120460,120460],"mapped",[99]],[[120461,120461],"mapped",[100]],[[120462,120462],"mapped",[101]],[[120463,120463],"mapped",[102]],[[120464,120464],"mapped",[103]],[[120465,120465],"mapped",[104]],[[120466,120466],"mapped",[105]],[[120467,120467],"mapped",[106]],[[120468,120468],"mapped",[107]],[[120469,120469],"mapped",[108]],[[120470,120470],"mapped",[109]],[[120471,120471],"mapped",[110]],[[120472,120472],"mapped",[111]],[[120473,120473],"mapped",[112]],[[120474,120474],"mapped",[113]],[[120475,120475],"mapped",[114]],[[120476,120476],"mapped",[115]],[[120477,120477],"mapped",[116]],[[120478,120478],"mapped",[117]],[[120479,120479],"mapped",[118]],[[120480,120480],"mapped",[119]],[[120481,120481],"mapped",[120]],[[120482,120482],"mapped",[121]],[[120483,120483],"mapped",[122]],[[120484,120484],"mapped",[305]],[[120485,120485],"mapped",[567]],[[120486,120487],"disallowed"],[[120488,120488],"mapped",[945]],[[120489,120489],"mapped",[946]],[[120490,120490],"mapped",[947]],[[120491,120491],"mapped",[948]],[[120492,120492],"mapped",[949]],[[120493,120493],"mapped",[950]],[[120494,120494],"mapped",[951]],[[120495,120495],"mapped",[952]],[[120496,120496],"mapped",[953]],[[120497,120497],"mapped",[954]],[[120498,120498],"mapped",[955]],[[120499,120499],"mapped",[956]],[[120500,120500],"mapped",[957]],[[120501,120501],"mapped",[958]],[[120502,120502],"mapped",[959]],[[120503,120503],"mapped",[960]],[[120504,120504],"mapped",[961]],[[120505,120505],"mapped",[952]],[[120506,120506],"mapped",[963]],[[120507,120507],"mapped",[964]],[[120508,120508],"mapped",[965]],[[120509,120509],"mapped",[966]],[[120510,120510],"mapped",[967]],[[120511,120511],"mapped",[968]],[[120512,120512],"mapped",[969]],[[120513,120513],"mapped",[8711]],[[120514,120514],"mapped",[945]],[[120515,120515],"mapped",[946]],[[120516,120516],"mapped",[947]],[[120517,120517],"mapped",[948]],[[120518,120518],"mapped",[949]],[[120519,120519],"mapped",[950]],[[120520,120520],"mapped",[951]],[[120521,120521],"mapped",[952]],[[120522,120522],"mapped",[953]],[[120523,120523],"mapped",[954]],[[120524,120524],"mapped",[955]],[[120525,120525],"mapped",[956]],[[120526,120526],"mapped",[957]],[[120527,120527],"mapped",[958]],[[120528,120528],"mapped",[959]],[[120529,120529],"mapped",[960]],[[120530,120530],"mapped",[961]],[[120531,120532],"mapped",[963]],[[120533,120533],"mapped",[964]],[[120534,120534],"mapped",[965]],[[120535,120535],"mapped",[966]],[[120536,120536],"mapped",[967]],[[120537,120537],"mapped",[968]],[[120538,120538],"mapped",[969]],[[120539,120539],"mapped",[8706]],[[120540,120540],"mapped",[949]],[[120541,120541],"mapped",[952]],[[120542,120542],"mapped",[954]],[[120543,120543],"mapped",[966]],[[120544,120544],"mapped",[961]],[[120545,120545],"mapped",[960]],[[120546,120546],"mapped",[945]],[[120547,120547],"mapped",[946]],[[120548,120548],"mapped",[947]],[[120549,120549],"mapped",[948]],[[120550,120550],"mapped",[949]],[[120551,120551],"mapped",[950]],[[120552,120552],"mapped",[951]],[[120553,120553],"mapped",[952]],[[120554,120554],"mapped",[953]],[[120555,120555],"mapped",[954]],[[120556,120556],"mapped",[955]],[[120557,120557],"mapped",[956]],[[120558,120558],"mapped",[957]],[[120559,120559],"mapped",[958]],[[120560,120560],"mapped",[959]],[[120561,120561],"mapped",[960]],[[120562,120562],"mapped",[961]],[[120563,120563],"mapped",[952]],[[120564,120564],"mapped",[963]],[[120565,120565],"mapped",[964]],[[120566,120566],"mapped",[965]],[[120567,120567],"mapped",[966]],[[120568,120568],"mapped",[967]],[[120569,120569],"mapped",[968]],[[120570,120570],"mapped",[969]],[[120571,120571],"mapped",[8711]],[[120572,120572],"mapped",[945]],[[120573,120573],"mapped",[946]],[[120574,120574],"mapped",[947]],[[120575,120575],"mapped",[948]],[[120576,120576],"mapped",[949]],[[120577,120577],"mapped",[950]],[[120578,120578],"mapped",[951]],[[120579,120579],"mapped",[952]],[[120580,120580],"mapped",[953]],[[120581,120581],"mapped",[954]],[[120582,120582],"mapped",[955]],[[120583,120583],"mapped",[956]],[[120584,120584],"mapped",[957]],[[120585,120585],"mapped",[958]],[[120586,120586],"mapped",[959]],[[120587,120587],"mapped",[960]],[[120588,120588],"mapped",[961]],[[120589,120590],"mapped",[963]],[[120591,120591],"mapped",[964]],[[120592,120592],"mapped",[965]],[[120593,120593],"mapped",[966]],[[120594,120594],"mapped",[967]],[[120595,120595],"mapped",[968]],[[120596,120596],"mapped",[969]],[[120597,120597],"mapped",[8706]],[[120598,120598],"mapped",[949]],[[120599,120599],"mapped",[952]],[[120600,120600],"mapped",[954]],[[120601,120601],"mapped",[966]],[[120602,120602],"mapped",[961]],[[120603,120603],"mapped",[960]],[[120604,120604],"mapped",[945]],[[120605,120605],"mapped",[946]],[[120606,120606],"mapped",[947]],[[120607,120607],"mapped",[948]],[[120608,120608],"mapped",[949]],[[120609,120609],"mapped",[950]],[[120610,120610],"mapped",[951]],[[120611,120611],"mapped",[952]],[[120612,120612],"mapped",[953]],[[120613,120613],"mapped",[954]],[[120614,120614],"mapped",[955]],[[120615,120615],"mapped",[956]],[[120616,120616],"mapped",[957]],[[120617,120617],"mapped",[958]],[[120618,120618],"mapped",[959]],[[120619,120619],"mapped",[960]],[[120620,120620],"mapped",[961]],[[120621,120621],"mapped",[952]],[[120622,120622],"mapped",[963]],[[120623,120623],"mapped",[964]],[[120624,120624],"mapped",[965]],[[120625,120625],"mapped",[966]],[[120626,120626],"mapped",[967]],[[120627,120627],"mapped",[968]],[[120628,120628],"mapped",[969]],[[120629,120629],"mapped",[8711]],[[120630,120630],"mapped",[945]],[[120631,120631],"mapped",[946]],[[120632,120632],"mapped",[947]],[[120633,120633],"mapped",[948]],[[120634,120634],"mapped",[949]],[[120635,120635],"mapped",[950]],[[120636,120636],"mapped",[951]],[[120637,120637],"mapped",[952]],[[120638,120638],"mapped",[953]],[[120639,120639],"mapped",[954]],[[120640,120640],"mapped",[955]],[[120641,120641],"mapped",[956]],[[120642,120642],"mapped",[957]],[[120643,120643],"mapped",[958]],[[120644,120644],"mapped",[959]],[[120645,120645],"mapped",[960]],[[120646,120646],"mapped",[961]],[[120647,120648],"mapped",[963]],[[120649,120649],"mapped",[964]],[[120650,120650],"mapped",[965]],[[120651,120651],"mapped",[966]],[[120652,120652],"mapped",[967]],[[120653,120653],"mapped",[968]],[[120654,120654],"mapped",[969]],[[120655,120655],"mapped",[8706]],[[120656,120656],"mapped",[949]],[[120657,120657],"mapped",[952]],[[120658,120658],"mapped",[954]],[[120659,120659],"mapped",[966]],[[120660,120660],"mapped",[961]],[[120661,120661],"mapped",[960]],[[120662,120662],"mapped",[945]],[[120663,120663],"mapped",[946]],[[120664,120664],"mapped",[947]],[[120665,120665],"mapped",[948]],[[120666,120666],"mapped",[949]],[[120667,120667],"mapped",[950]],[[120668,120668],"mapped",[951]],[[120669,120669],"mapped",[952]],[[120670,120670],"mapped",[953]],[[120671,120671],"mapped",[954]],[[120672,120672],"mapped",[955]],[[120673,120673],"mapped",[956]],[[120674,120674],"mapped",[957]],[[120675,120675],"mapped",[958]],[[120676,120676],"mapped",[959]],[[120677,120677],"mapped",[960]],[[120678,120678],"mapped",[961]],[[120679,120679],"mapped",[952]],[[120680,120680],"mapped",[963]],[[120681,120681],"mapped",[964]],[[120682,120682],"mapped",[965]],[[120683,120683],"mapped",[966]],[[120684,120684],"mapped",[967]],[[120685,120685],"mapped",[968]],[[120686,120686],"mapped",[969]],[[120687,120687],"mapped",[8711]],[[120688,120688],"mapped",[945]],[[120689,120689],"mapped",[946]],[[120690,120690],"mapped",[947]],[[120691,120691],"mapped",[948]],[[120692,120692],"mapped",[949]],[[120693,120693],"mapped",[950]],[[120694,120694],"mapped",[951]],[[120695,120695],"mapped",[952]],[[120696,120696],"mapped",[953]],[[120697,120697],"mapped",[954]],[[120698,120698],"mapped",[955]],[[120699,120699],"mapped",[956]],[[120700,120700],"mapped",[957]],[[120701,120701],"mapped",[958]],[[120702,120702],"mapped",[959]],[[120703,120703],"mapped",[960]],[[120704,120704],"mapped",[961]],[[120705,120706],"mapped",[963]],[[120707,120707],"mapped",[964]],[[120708,120708],"mapped",[965]],[[120709,120709],"mapped",[966]],[[120710,120710],"mapped",[967]],[[120711,120711],"mapped",[968]],[[120712,120712],"mapped",[969]],[[120713,120713],"mapped",[8706]],[[120714,120714],"mapped",[949]],[[120715,120715],"mapped",[952]],[[120716,120716],"mapped",[954]],[[120717,120717],"mapped",[966]],[[120718,120718],"mapped",[961]],[[120719,120719],"mapped",[960]],[[120720,120720],"mapped",[945]],[[120721,120721],"mapped",[946]],[[120722,120722],"mapped",[947]],[[120723,120723],"mapped",[948]],[[120724,120724],"mapped",[949]],[[120725,120725],"mapped",[950]],[[120726,120726],"mapped",[951]],[[120727,120727],"mapped",[952]],[[120728,120728],"mapped",[953]],[[120729,120729],"mapped",[954]],[[120730,120730],"mapped",[955]],[[120731,120731],"mapped",[956]],[[120732,120732],"mapped",[957]],[[120733,120733],"mapped",[958]],[[120734,120734],"mapped",[959]],[[120735,120735],"mapped",[960]],[[120736,120736],"mapped",[961]],[[120737,120737],"mapped",[952]],[[120738,120738],"mapped",[963]],[[120739,120739],"mapped",[964]],[[120740,120740],"mapped",[965]],[[120741,120741],"mapped",[966]],[[120742,120742],"mapped",[967]],[[120743,120743],"mapped",[968]],[[120744,120744],"mapped",[969]],[[120745,120745],"mapped",[8711]],[[120746,120746],"mapped",[945]],[[120747,120747],"mapped",[946]],[[120748,120748],"mapped",[947]],[[120749,120749],"mapped",[948]],[[120750,120750],"mapped",[949]],[[120751,120751],"mapped",[950]],[[120752,120752],"mapped",[951]],[[120753,120753],"mapped",[952]],[[120754,120754],"mapped",[953]],[[120755,120755],"mapped",[954]],[[120756,120756],"mapped",[955]],[[120757,120757],"mapped",[956]],[[120758,120758],"mapped",[957]],[[120759,120759],"mapped",[958]],[[120760,120760],"mapped",[959]],[[120761,120761],"mapped",[960]],[[120762,120762],"mapped",[961]],[[120763,120764],"mapped",[963]],[[120765,120765],"mapped",[964]],[[120766,120766],"mapped",[965]],[[120767,120767],"mapped",[966]],[[120768,120768],"mapped",[967]],[[120769,120769],"mapped",[968]],[[120770,120770],"mapped",[969]],[[120771,120771],"mapped",[8706]],[[120772,120772],"mapped",[949]],[[120773,120773],"mapped",[952]],[[120774,120774],"mapped",[954]],[[120775,120775],"mapped",[966]],[[120776,120776],"mapped",[961]],[[120777,120777],"mapped",[960]],[[120778,120779],"mapped",[989]],[[120780,120781],"disallowed"],[[120782,120782],"mapped",[48]],[[120783,120783],"mapped",[49]],[[120784,120784],"mapped",[50]],[[120785,120785],"mapped",[51]],[[120786,120786],"mapped",[52]],[[120787,120787],"mapped",[53]],[[120788,120788],"mapped",[54]],[[120789,120789],"mapped",[55]],[[120790,120790],"mapped",[56]],[[120791,120791],"mapped",[57]],[[120792,120792],"mapped",[48]],[[120793,120793],"mapped",[49]],[[120794,120794],"mapped",[50]],[[120795,120795],"mapped",[51]],[[120796,120796],"mapped",[52]],[[120797,120797],"mapped",[53]],[[120798,120798],"mapped",[54]],[[120799,120799],"mapped",[55]],[[120800,120800],"mapped",[56]],[[120801,120801],"mapped",[57]],[[120802,120802],"mapped",[48]],[[120803,120803],"mapped",[49]],[[120804,120804],"mapped",[50]],[[120805,120805],"mapped",[51]],[[120806,120806],"mapped",[52]],[[120807,120807],"mapped",[53]],[[120808,120808],"mapped",[54]],[[120809,120809],"mapped",[55]],[[120810,120810],"mapped",[56]],[[120811,120811],"mapped",[57]],[[120812,120812],"mapped",[48]],[[120813,120813],"mapped",[49]],[[120814,120814],"mapped",[50]],[[120815,120815],"mapped",[51]],[[120816,120816],"mapped",[52]],[[120817,120817],"mapped",[53]],[[120818,120818],"mapped",[54]],[[120819,120819],"mapped",[55]],[[120820,120820],"mapped",[56]],[[120821,120821],"mapped",[57]],[[120822,120822],"mapped",[48]],[[120823,120823],"mapped",[49]],[[120824,120824],"mapped",[50]],[[120825,120825],"mapped",[51]],[[120826,120826],"mapped",[52]],[[120827,120827],"mapped",[53]],[[120828,120828],"mapped",[54]],[[120829,120829],"mapped",[55]],[[120830,120830],"mapped",[56]],[[120831,120831],"mapped",[57]],[[120832,121343],"valid",[],"NV8"],[[121344,121398],"valid"],[[121399,121402],"valid",[],"NV8"],[[121403,121452],"valid"],[[121453,121460],"valid",[],"NV8"],[[121461,121461],"valid"],[[121462,121475],"valid",[],"NV8"],[[121476,121476],"valid"],[[121477,121483],"valid",[],"NV8"],[[121484,121498],"disallowed"],[[121499,121503],"valid"],[[121504,121504],"disallowed"],[[121505,121519],"valid"],[[121520,124927],"disallowed"],[[124928,125124],"valid"],[[125125,125126],"disallowed"],[[125127,125135],"valid",[],"NV8"],[[125136,125142],"valid"],[[125143,126463],"disallowed"],[[126464,126464],"mapped",[1575]],[[126465,126465],"mapped",[1576]],[[126466,126466],"mapped",[1580]],[[126467,126467],"mapped",[1583]],[[126468,126468],"disallowed"],[[126469,126469],"mapped",[1608]],[[126470,126470],"mapped",[1586]],[[126471,126471],"mapped",[1581]],[[126472,126472],"mapped",[1591]],[[126473,126473],"mapped",[1610]],[[126474,126474],"mapped",[1603]],[[126475,126475],"mapped",[1604]],[[126476,126476],"mapped",[1605]],[[126477,126477],"mapped",[1606]],[[126478,126478],"mapped",[1587]],[[126479,126479],"mapped",[1593]],[[126480,126480],"mapped",[1601]],[[126481,126481],"mapped",[1589]],[[126482,126482],"mapped",[1602]],[[126483,126483],"mapped",[1585]],[[126484,126484],"mapped",[1588]],[[126485,126485],"mapped",[1578]],[[126486,126486],"mapped",[1579]],[[126487,126487],"mapped",[1582]],[[126488,126488],"mapped",[1584]],[[126489,126489],"mapped",[1590]],[[126490,126490],"mapped",[1592]],[[126491,126491],"mapped",[1594]],[[126492,126492],"mapped",[1646]],[[126493,126493],"mapped",[1722]],[[126494,126494],"mapped",[1697]],[[126495,126495],"mapped",[1647]],[[126496,126496],"disallowed"],[[126497,126497],"mapped",[1576]],[[126498,126498],"mapped",[1580]],[[126499,126499],"disallowed"],[[126500,126500],"mapped",[1607]],[[126501,126502],"disallowed"],[[126503,126503],"mapped",[1581]],[[126504,126504],"disallowed"],[[126505,126505],"mapped",[1610]],[[126506,126506],"mapped",[1603]],[[126507,126507],"mapped",[1604]],[[126508,126508],"mapped",[1605]],[[126509,126509],"mapped",[1606]],[[126510,126510],"mapped",[1587]],[[126511,126511],"mapped",[1593]],[[126512,126512],"mapped",[1601]],[[126513,126513],"mapped",[1589]],[[126514,126514],"mapped",[1602]],[[126515,126515],"disallowed"],[[126516,126516],"mapped",[1588]],[[126517,126517],"mapped",[1578]],[[126518,126518],"mapped",[1579]],[[126519,126519],"mapped",[1582]],[[126520,126520],"disallowed"],[[126521,126521],"mapped",[1590]],[[126522,126522],"disallowed"],[[126523,126523],"mapped",[1594]],[[126524,126529],"disallowed"],[[126530,126530],"mapped",[1580]],[[126531,126534],"disallowed"],[[126535,126535],"mapped",[1581]],[[126536,126536],"disallowed"],[[126537,126537],"mapped",[1610]],[[126538,126538],"disallowed"],[[126539,126539],"mapped",[1604]],[[126540,126540],"disallowed"],[[126541,126541],"mapped",[1606]],[[126542,126542],"mapped",[1587]],[[126543,126543],"mapped",[1593]],[[126544,126544],"disallowed"],[[126545,126545],"mapped",[1589]],[[126546,126546],"mapped",[1602]],[[126547,126547],"disallowed"],[[126548,126548],"mapped",[1588]],[[126549,126550],"disallowed"],[[126551,126551],"mapped",[1582]],[[126552,126552],"disallowed"],[[126553,126553],"mapped",[1590]],[[126554,126554],"disallowed"],[[126555,126555],"mapped",[1594]],[[126556,126556],"disallowed"],[[126557,126557],"mapped",[1722]],[[126558,126558],"disallowed"],[[126559,126559],"mapped",[1647]],[[126560,126560],"disallowed"],[[126561,126561],"mapped",[1576]],[[126562,126562],"mapped",[1580]],[[126563,126563],"disallowed"],[[126564,126564],"mapped",[1607]],[[126565,126566],"disallowed"],[[126567,126567],"mapped",[1581]],[[126568,126568],"mapped",[1591]],[[126569,126569],"mapped",[1610]],[[126570,126570],"mapped",[1603]],[[126571,126571],"disallowed"],[[126572,126572],"mapped",[1605]],[[126573,126573],"mapped",[1606]],[[126574,126574],"mapped",[1587]],[[126575,126575],"mapped",[1593]],[[126576,126576],"mapped",[1601]],[[126577,126577],"mapped",[1589]],[[126578,126578],"mapped",[1602]],[[126579,126579],"disallowed"],[[126580,126580],"mapped",[1588]],[[126581,126581],"mapped",[1578]],[[126582,126582],"mapped",[1579]],[[126583,126583],"mapped",[1582]],[[126584,126584],"disallowed"],[[126585,126585],"mapped",[1590]],[[126586,126586],"mapped",[1592]],[[126587,126587],"mapped",[1594]],[[126588,126588],"mapped",[1646]],[[126589,126589],"disallowed"],[[126590,126590],"mapped",[1697]],[[126591,126591],"disallowed"],[[126592,126592],"mapped",[1575]],[[126593,126593],"mapped",[1576]],[[126594,126594],"mapped",[1580]],[[126595,126595],"mapped",[1583]],[[126596,126596],"mapped",[1607]],[[126597,126597],"mapped",[1608]],[[126598,126598],"mapped",[1586]],[[126599,126599],"mapped",[1581]],[[126600,126600],"mapped",[1591]],[[126601,126601],"mapped",[1610]],[[126602,126602],"disallowed"],[[126603,126603],"mapped",[1604]],[[126604,126604],"mapped",[1605]],[[126605,126605],"mapped",[1606]],[[126606,126606],"mapped",[1587]],[[126607,126607],"mapped",[1593]],[[126608,126608],"mapped",[1601]],[[126609,126609],"mapped",[1589]],[[126610,126610],"mapped",[1602]],[[126611,126611],"mapped",[1585]],[[126612,126612],"mapped",[1588]],[[126613,126613],"mapped",[1578]],[[126614,126614],"mapped",[1579]],[[126615,126615],"mapped",[1582]],[[126616,126616],"mapped",[1584]],[[126617,126617],"mapped",[1590]],[[126618,126618],"mapped",[1592]],[[126619,126619],"mapped",[1594]],[[126620,126624],"disallowed"],[[126625,126625],"mapped",[1576]],[[126626,126626],"mapped",[1580]],[[126627,126627],"mapped",[1583]],[[126628,126628],"disallowed"],[[126629,126629],"mapped",[1608]],[[126630,126630],"mapped",[1586]],[[126631,126631],"mapped",[1581]],[[126632,126632],"mapped",[1591]],[[126633,126633],"mapped",[1610]],[[126634,126634],"disallowed"],[[126635,126635],"mapped",[1604]],[[126636,126636],"mapped",[1605]],[[126637,126637],"mapped",[1606]],[[126638,126638],"mapped",[1587]],[[126639,126639],"mapped",[1593]],[[126640,126640],"mapped",[1601]],[[126641,126641],"mapped",[1589]],[[126642,126642],"mapped",[1602]],[[126643,126643],"mapped",[1585]],[[126644,126644],"mapped",[1588]],[[126645,126645],"mapped",[1578]],[[126646,126646],"mapped",[1579]],[[126647,126647],"mapped",[1582]],[[126648,126648],"mapped",[1584]],[[126649,126649],"mapped",[1590]],[[126650,126650],"mapped",[1592]],[[126651,126651],"mapped",[1594]],[[126652,126703],"disallowed"],[[126704,126705],"valid",[],"NV8"],[[126706,126975],"disallowed"],[[126976,127019],"valid",[],"NV8"],[[127020,127023],"disallowed"],[[127024,127123],"valid",[],"NV8"],[[127124,127135],"disallowed"],[[127136,127150],"valid",[],"NV8"],[[127151,127152],"disallowed"],[[127153,127166],"valid",[],"NV8"],[[127167,127167],"valid",[],"NV8"],[[127168,127168],"disallowed"],[[127169,127183],"valid",[],"NV8"],[[127184,127184],"disallowed"],[[127185,127199],"valid",[],"NV8"],[[127200,127221],"valid",[],"NV8"],[[127222,127231],"disallowed"],[[127232,127232],"disallowed"],[[127233,127233],"disallowed_STD3_mapped",[48,44]],[[127234,127234],"disallowed_STD3_mapped",[49,44]],[[127235,127235],"disallowed_STD3_mapped",[50,44]],[[127236,127236],"disallowed_STD3_mapped",[51,44]],[[127237,127237],"disallowed_STD3_mapped",[52,44]],[[127238,127238],"disallowed_STD3_mapped",[53,44]],[[127239,127239],"disallowed_STD3_mapped",[54,44]],[[127240,127240],"disallowed_STD3_mapped",[55,44]],[[127241,127241],"disallowed_STD3_mapped",[56,44]],[[127242,127242],"disallowed_STD3_mapped",[57,44]],[[127243,127244],"valid",[],"NV8"],[[127245,127247],"disallowed"],[[127248,127248],"disallowed_STD3_mapped",[40,97,41]],[[127249,127249],"disallowed_STD3_mapped",[40,98,41]],[[127250,127250],"disallowed_STD3_mapped",[40,99,41]],[[127251,127251],"disallowed_STD3_mapped",[40,100,41]],[[127252,127252],"disallowed_STD3_mapped",[40,101,41]],[[127253,127253],"disallowed_STD3_mapped",[40,102,41]],[[127254,127254],"disallowed_STD3_mapped",[40,103,41]],[[127255,127255],"disallowed_STD3_mapped",[40,104,41]],[[127256,127256],"disallowed_STD3_mapped",[40,105,41]],[[127257,127257],"disallowed_STD3_mapped",[40,106,41]],[[127258,127258],"disallowed_STD3_mapped",[40,107,41]],[[127259,127259],"disallowed_STD3_mapped",[40,108,41]],[[127260,127260],"disallowed_STD3_mapped",[40,109,41]],[[127261,127261],"disallowed_STD3_mapped",[40,110,41]],[[127262,127262],"disallowed_STD3_mapped",[40,111,41]],[[127263,127263],"disallowed_STD3_mapped",[40,112,41]],[[127264,127264],"disallowed_STD3_mapped",[40,113,41]],[[127265,127265],"disallowed_STD3_mapped",[40,114,41]],[[127266,127266],"disallowed_STD3_mapped",[40,115,41]],[[127267,127267],"disallowed_STD3_mapped",[40,116,41]],[[127268,127268],"disallowed_STD3_mapped",[40,117,41]],[[127269,127269],"disallowed_STD3_mapped",[40,118,41]],[[127270,127270],"disallowed_STD3_mapped",[40,119,41]],[[127271,127271],"disallowed_STD3_mapped",[40,120,41]],[[127272,127272],"disallowed_STD3_mapped",[40,121,41]],[[127273,127273],"disallowed_STD3_mapped",[40,122,41]],[[127274,127274],"mapped",[12308,115,12309]],[[127275,127275],"mapped",[99]],[[127276,127276],"mapped",[114]],[[127277,127277],"mapped",[99,100]],[[127278,127278],"mapped",[119,122]],[[127279,127279],"disallowed"],[[127280,127280],"mapped",[97]],[[127281,127281],"mapped",[98]],[[127282,127282],"mapped",[99]],[[127283,127283],"mapped",[100]],[[127284,127284],"mapped",[101]],[[127285,127285],"mapped",[102]],[[127286,127286],"mapped",[103]],[[127287,127287],"mapped",[104]],[[127288,127288],"mapped",[105]],[[127289,127289],"mapped",[106]],[[127290,127290],"mapped",[107]],[[127291,127291],"mapped",[108]],[[127292,127292],"mapped",[109]],[[127293,127293],"mapped",[110]],[[127294,127294],"mapped",[111]],[[127295,127295],"mapped",[112]],[[127296,127296],"mapped",[113]],[[127297,127297],"mapped",[114]],[[127298,127298],"mapped",[115]],[[127299,127299],"mapped",[116]],[[127300,127300],"mapped",[117]],[[127301,127301],"mapped",[118]],[[127302,127302],"mapped",[119]],[[127303,127303],"mapped",[120]],[[127304,127304],"mapped",[121]],[[127305,127305],"mapped",[122]],[[127306,127306],"mapped",[104,118]],[[127307,127307],"mapped",[109,118]],[[127308,127308],"mapped",[115,100]],[[127309,127309],"mapped",[115,115]],[[127310,127310],"mapped",[112,112,118]],[[127311,127311],"mapped",[119,99]],[[127312,127318],"valid",[],"NV8"],[[127319,127319],"valid",[],"NV8"],[[127320,127326],"valid",[],"NV8"],[[127327,127327],"valid",[],"NV8"],[[127328,127337],"valid",[],"NV8"],[[127338,127338],"mapped",[109,99]],[[127339,127339],"mapped",[109,100]],[[127340,127343],"disallowed"],[[127344,127352],"valid",[],"NV8"],[[127353,127353],"valid",[],"NV8"],[[127354,127354],"valid",[],"NV8"],[[127355,127356],"valid",[],"NV8"],[[127357,127358],"valid",[],"NV8"],[[127359,127359],"valid",[],"NV8"],[[127360,127369],"valid",[],"NV8"],[[127370,127373],"valid",[],"NV8"],[[127374,127375],"valid",[],"NV8"],[[127376,127376],"mapped",[100,106]],[[127377,127386],"valid",[],"NV8"],[[127387,127461],"disallowed"],[[127462,127487],"valid",[],"NV8"],[[127488,127488],"mapped",[12411,12363]],[[127489,127489],"mapped",[12467,12467]],[[127490,127490],"mapped",[12469]],[[127491,127503],"disallowed"],[[127504,127504],"mapped",[25163]],[[127505,127505],"mapped",[23383]],[[127506,127506],"mapped",[21452]],[[127507,127507],"mapped",[12487]],[[127508,127508],"mapped",[20108]],[[127509,127509],"mapped",[22810]],[[127510,127510],"mapped",[35299]],[[127511,127511],"mapped",[22825]],[[127512,127512],"mapped",[20132]],[[127513,127513],"mapped",[26144]],[[127514,127514],"mapped",[28961]],[[127515,127515],"mapped",[26009]],[[127516,127516],"mapped",[21069]],[[127517,127517],"mapped",[24460]],[[127518,127518],"mapped",[20877]],[[127519,127519],"mapped",[26032]],[[127520,127520],"mapped",[21021]],[[127521,127521],"mapped",[32066]],[[127522,127522],"mapped",[29983]],[[127523,127523],"mapped",[36009]],[[127524,127524],"mapped",[22768]],[[127525,127525],"mapped",[21561]],[[127526,127526],"mapped",[28436]],[[127527,127527],"mapped",[25237]],[[127528,127528],"mapped",[25429]],[[127529,127529],"mapped",[19968]],[[127530,127530],"mapped",[19977]],[[127531,127531],"mapped",[36938]],[[127532,127532],"mapped",[24038]],[[127533,127533],"mapped",[20013]],[[127534,127534],"mapped",[21491]],[[127535,127535],"mapped",[25351]],[[127536,127536],"mapped",[36208]],[[127537,127537],"mapped",[25171]],[[127538,127538],"mapped",[31105]],[[127539,127539],"mapped",[31354]],[[127540,127540],"mapped",[21512]],[[127541,127541],"mapped",[28288]],[[127542,127542],"mapped",[26377]],[[127543,127543],"mapped",[26376]],[[127544,127544],"mapped",[30003]],[[127545,127545],"mapped",[21106]],[[127546,127546],"mapped",[21942]],[[127547,127551],"disallowed"],[[127552,127552],"mapped",[12308,26412,12309]],[[127553,127553],"mapped",[12308,19977,12309]],[[127554,127554],"mapped",[12308,20108,12309]],[[127555,127555],"mapped",[12308,23433,12309]],[[127556,127556],"mapped",[12308,28857,12309]],[[127557,127557],"mapped",[12308,25171,12309]],[[127558,127558],"mapped",[12308,30423,12309]],[[127559,127559],"mapped",[12308,21213,12309]],[[127560,127560],"mapped",[12308,25943,12309]],[[127561,127567],"disallowed"],[[127568,127568],"mapped",[24471]],[[127569,127569],"mapped",[21487]],[[127570,127743],"disallowed"],[[127744,127776],"valid",[],"NV8"],[[127777,127788],"valid",[],"NV8"],[[127789,127791],"valid",[],"NV8"],[[127792,127797],"valid",[],"NV8"],[[127798,127798],"valid",[],"NV8"],[[127799,127868],"valid",[],"NV8"],[[127869,127869],"valid",[],"NV8"],[[127870,127871],"valid",[],"NV8"],[[127872,127891],"valid",[],"NV8"],[[127892,127903],"valid",[],"NV8"],[[127904,127940],"valid",[],"NV8"],[[127941,127941],"valid",[],"NV8"],[[127942,127946],"valid",[],"NV8"],[[127947,127950],"valid",[],"NV8"],[[127951,127955],"valid",[],"NV8"],[[127956,127967],"valid",[],"NV8"],[[127968,127984],"valid",[],"NV8"],[[127985,127991],"valid",[],"NV8"],[[127992,127999],"valid",[],"NV8"],[[128000,128062],"valid",[],"NV8"],[[128063,128063],"valid",[],"NV8"],[[128064,128064],"valid",[],"NV8"],[[128065,128065],"valid",[],"NV8"],[[128066,128247],"valid",[],"NV8"],[[128248,128248],"valid",[],"NV8"],[[128249,128252],"valid",[],"NV8"],[[128253,128254],"valid",[],"NV8"],[[128255,128255],"valid",[],"NV8"],[[128256,128317],"valid",[],"NV8"],[[128318,128319],"valid",[],"NV8"],[[128320,128323],"valid",[],"NV8"],[[128324,128330],"valid",[],"NV8"],[[128331,128335],"valid",[],"NV8"],[[128336,128359],"valid",[],"NV8"],[[128360,128377],"valid",[],"NV8"],[[128378,128378],"disallowed"],[[128379,128419],"valid",[],"NV8"],[[128420,128420],"disallowed"],[[128421,128506],"valid",[],"NV8"],[[128507,128511],"valid",[],"NV8"],[[128512,128512],"valid",[],"NV8"],[[128513,128528],"valid",[],"NV8"],[[128529,128529],"valid",[],"NV8"],[[128530,128532],"valid",[],"NV8"],[[128533,128533],"valid",[],"NV8"],[[128534,128534],"valid",[],"NV8"],[[128535,128535],"valid",[],"NV8"],[[128536,128536],"valid",[],"NV8"],[[128537,128537],"valid",[],"NV8"],[[128538,128538],"valid",[],"NV8"],[[128539,128539],"valid",[],"NV8"],[[128540,128542],"valid",[],"NV8"],[[128543,128543],"valid",[],"NV8"],[[128544,128549],"valid",[],"NV8"],[[128550,128551],"valid",[],"NV8"],[[128552,128555],"valid",[],"NV8"],[[128556,128556],"valid",[],"NV8"],[[128557,128557],"valid",[],"NV8"],[[128558,128559],"valid",[],"NV8"],[[128560,128563],"valid",[],"NV8"],[[128564,128564],"valid",[],"NV8"],[[128565,128576],"valid",[],"NV8"],[[128577,128578],"valid",[],"NV8"],[[128579,128580],"valid",[],"NV8"],[[128581,128591],"valid",[],"NV8"],[[128592,128639],"valid",[],"NV8"],[[128640,128709],"valid",[],"NV8"],[[128710,128719],"valid",[],"NV8"],[[128720,128720],"valid",[],"NV8"],[[128721,128735],"disallowed"],[[128736,128748],"valid",[],"NV8"],[[128749,128751],"disallowed"],[[128752,128755],"valid",[],"NV8"],[[128756,128767],"disallowed"],[[128768,128883],"valid",[],"NV8"],[[128884,128895],"disallowed"],[[128896,128980],"valid",[],"NV8"],[[128981,129023],"disallowed"],[[129024,129035],"valid",[],"NV8"],[[129036,129039],"disallowed"],[[129040,129095],"valid",[],"NV8"],[[129096,129103],"disallowed"],[[129104,129113],"valid",[],"NV8"],[[129114,129119],"disallowed"],[[129120,129159],"valid",[],"NV8"],[[129160,129167],"disallowed"],[[129168,129197],"valid",[],"NV8"],[[129198,129295],"disallowed"],[[129296,129304],"valid",[],"NV8"],[[129305,129407],"disallowed"],[[129408,129412],"valid",[],"NV8"],[[129413,129471],"disallowed"],[[129472,129472],"valid",[],"NV8"],[[129473,131069],"disallowed"],[[131070,131071],"disallowed"],[[131072,173782],"valid"],[[173783,173823],"disallowed"],[[173824,177972],"valid"],[[177973,177983],"disallowed"],[[177984,178205],"valid"],[[178206,178207],"disallowed"],[[178208,183969],"valid"],[[183970,194559],"disallowed"],[[194560,194560],"mapped",[20029]],[[194561,194561],"mapped",[20024]],[[194562,194562],"mapped",[20033]],[[194563,194563],"mapped",[131362]],[[194564,194564],"mapped",[20320]],[[194565,194565],"mapped",[20398]],[[194566,194566],"mapped",[20411]],[[194567,194567],"mapped",[20482]],[[194568,194568],"mapped",[20602]],[[194569,194569],"mapped",[20633]],[[194570,194570],"mapped",[20711]],[[194571,194571],"mapped",[20687]],[[194572,194572],"mapped",[13470]],[[194573,194573],"mapped",[132666]],[[194574,194574],"mapped",[20813]],[[194575,194575],"mapped",[20820]],[[194576,194576],"mapped",[20836]],[[194577,194577],"mapped",[20855]],[[194578,194578],"mapped",[132380]],[[194579,194579],"mapped",[13497]],[[194580,194580],"mapped",[20839]],[[194581,194581],"mapped",[20877]],[[194582,194582],"mapped",[132427]],[[194583,194583],"mapped",[20887]],[[194584,194584],"mapped",[20900]],[[194585,194585],"mapped",[20172]],[[194586,194586],"mapped",[20908]],[[194587,194587],"mapped",[20917]],[[194588,194588],"mapped",[168415]],[[194589,194589],"mapped",[20981]],[[194590,194590],"mapped",[20995]],[[194591,194591],"mapped",[13535]],[[194592,194592],"mapped",[21051]],[[194593,194593],"mapped",[21062]],[[194594,194594],"mapped",[21106]],[[194595,194595],"mapped",[21111]],[[194596,194596],"mapped",[13589]],[[194597,194597],"mapped",[21191]],[[194598,194598],"mapped",[21193]],[[194599,194599],"mapped",[21220]],[[194600,194600],"mapped",[21242]],[[194601,194601],"mapped",[21253]],[[194602,194602],"mapped",[21254]],[[194603,194603],"mapped",[21271]],[[194604,194604],"mapped",[21321]],[[194605,194605],"mapped",[21329]],[[194606,194606],"mapped",[21338]],[[194607,194607],"mapped",[21363]],[[194608,194608],"mapped",[21373]],[[194609,194611],"mapped",[21375]],[[194612,194612],"mapped",[133676]],[[194613,194613],"mapped",[28784]],[[194614,194614],"mapped",[21450]],[[194615,194615],"mapped",[21471]],[[194616,194616],"mapped",[133987]],[[194617,194617],"mapped",[21483]],[[194618,194618],"mapped",[21489]],[[194619,194619],"mapped",[21510]],[[194620,194620],"mapped",[21662]],[[194621,194621],"mapped",[21560]],[[194622,194622],"mapped",[21576]],[[194623,194623],"mapped",[21608]],[[194624,194624],"mapped",[21666]],[[194625,194625],"mapped",[21750]],[[194626,194626],"mapped",[21776]],[[194627,194627],"mapped",[21843]],[[194628,194628],"mapped",[21859]],[[194629,194630],"mapped",[21892]],[[194631,194631],"mapped",[21913]],[[194632,194632],"mapped",[21931]],[[194633,194633],"mapped",[21939]],[[194634,194634],"mapped",[21954]],[[194635,194635],"mapped",[22294]],[[194636,194636],"mapped",[22022]],[[194637,194637],"mapped",[22295]],[[194638,194638],"mapped",[22097]],[[194639,194639],"mapped",[22132]],[[194640,194640],"mapped",[20999]],[[194641,194641],"mapped",[22766]],[[194642,194642],"mapped",[22478]],[[194643,194643],"mapped",[22516]],[[194644,194644],"mapped",[22541]],[[194645,194645],"mapped",[22411]],[[194646,194646],"mapped",[22578]],[[194647,194647],"mapped",[22577]],[[194648,194648],"mapped",[22700]],[[194649,194649],"mapped",[136420]],[[194650,194650],"mapped",[22770]],[[194651,194651],"mapped",[22775]],[[194652,194652],"mapped",[22790]],[[194653,194653],"mapped",[22810]],[[194654,194654],"mapped",[22818]],[[194655,194655],"mapped",[22882]],[[194656,194656],"mapped",[136872]],[[194657,194657],"mapped",[136938]],[[194658,194658],"mapped",[23020]],[[194659,194659],"mapped",[23067]],[[194660,194660],"mapped",[23079]],[[194661,194661],"mapped",[23000]],[[194662,194662],"mapped",[23142]],[[194663,194663],"mapped",[14062]],[[194664,194664],"disallowed"],[[194665,194665],"mapped",[23304]],[[194666,194667],"mapped",[23358]],[[194668,194668],"mapped",[137672]],[[194669,194669],"mapped",[23491]],[[194670,194670],"mapped",[23512]],[[194671,194671],"mapped",[23527]],[[194672,194672],"mapped",[23539]],[[194673,194673],"mapped",[138008]],[[194674,194674],"mapped",[23551]],[[194675,194675],"mapped",[23558]],[[194676,194676],"disallowed"],[[194677,194677],"mapped",[23586]],[[194678,194678],"mapped",[14209]],[[194679,194679],"mapped",[23648]],[[194680,194680],"mapped",[23662]],[[194681,194681],"mapped",[23744]],[[194682,194682],"mapped",[23693]],[[194683,194683],"mapped",[138724]],[[194684,194684],"mapped",[23875]],[[194685,194685],"mapped",[138726]],[[194686,194686],"mapped",[23918]],[[194687,194687],"mapped",[23915]],[[194688,194688],"mapped",[23932]],[[194689,194689],"mapped",[24033]],[[194690,194690],"mapped",[24034]],[[194691,194691],"mapped",[14383]],[[194692,194692],"mapped",[24061]],[[194693,194693],"mapped",[24104]],[[194694,194694],"mapped",[24125]],[[194695,194695],"mapped",[24169]],[[194696,194696],"mapped",[14434]],[[194697,194697],"mapped",[139651]],[[194698,194698],"mapped",[14460]],[[194699,194699],"mapped",[24240]],[[194700,194700],"mapped",[24243]],[[194701,194701],"mapped",[24246]],[[194702,194702],"mapped",[24266]],[[194703,194703],"mapped",[172946]],[[194704,194704],"mapped",[24318]],[[194705,194706],"mapped",[140081]],[[194707,194707],"mapped",[33281]],[[194708,194709],"mapped",[24354]],[[194710,194710],"mapped",[14535]],[[194711,194711],"mapped",[144056]],[[194712,194712],"mapped",[156122]],[[194713,194713],"mapped",[24418]],[[194714,194714],"mapped",[24427]],[[194715,194715],"mapped",[14563]],[[194716,194716],"mapped",[24474]],[[194717,194717],"mapped",[24525]],[[194718,194718],"mapped",[24535]],[[194719,194719],"mapped",[24569]],[[194720,194720],"mapped",[24705]],[[194721,194721],"mapped",[14650]],[[194722,194722],"mapped",[14620]],[[194723,194723],"mapped",[24724]],[[194724,194724],"mapped",[141012]],[[194725,194725],"mapped",[24775]],[[194726,194726],"mapped",[24904]],[[194727,194727],"mapped",[24908]],[[194728,194728],"mapped",[24910]],[[194729,194729],"mapped",[24908]],[[194730,194730],"mapped",[24954]],[[194731,194731],"mapped",[24974]],[[194732,194732],"mapped",[25010]],[[194733,194733],"mapped",[24996]],[[194734,194734],"mapped",[25007]],[[194735,194735],"mapped",[25054]],[[194736,194736],"mapped",[25074]],[[194737,194737],"mapped",[25078]],[[194738,194738],"mapped",[25104]],[[194739,194739],"mapped",[25115]],[[194740,194740],"mapped",[25181]],[[194741,194741],"mapped",[25265]],[[194742,194742],"mapped",[25300]],[[194743,194743],"mapped",[25424]],[[194744,194744],"mapped",[142092]],[[194745,194745],"mapped",[25405]],[[194746,194746],"mapped",[25340]],[[194747,194747],"mapped",[25448]],[[194748,194748],"mapped",[25475]],[[194749,194749],"mapped",[25572]],[[194750,194750],"mapped",[142321]],[[194751,194751],"mapped",[25634]],[[194752,194752],"mapped",[25541]],[[194753,194753],"mapped",[25513]],[[194754,194754],"mapped",[14894]],[[194755,194755],"mapped",[25705]],[[194756,194756],"mapped",[25726]],[[194757,194757],"mapped",[25757]],[[194758,194758],"mapped",[25719]],[[194759,194759],"mapped",[14956]],[[194760,194760],"mapped",[25935]],[[194761,194761],"mapped",[25964]],[[194762,194762],"mapped",[143370]],[[194763,194763],"mapped",[26083]],[[194764,194764],"mapped",[26360]],[[194765,194765],"mapped",[26185]],[[194766,194766],"mapped",[15129]],[[194767,194767],"mapped",[26257]],[[194768,194768],"mapped",[15112]],[[194769,194769],"mapped",[15076]],[[194770,194770],"mapped",[20882]],[[194771,194771],"mapped",[20885]],[[194772,194772],"mapped",[26368]],[[194773,194773],"mapped",[26268]],[[194774,194774],"mapped",[32941]],[[194775,194775],"mapped",[17369]],[[194776,194776],"mapped",[26391]],[[194777,194777],"mapped",[26395]],[[194778,194778],"mapped",[26401]],[[194779,194779],"mapped",[26462]],[[194780,194780],"mapped",[26451]],[[194781,194781],"mapped",[144323]],[[194782,194782],"mapped",[15177]],[[194783,194783],"mapped",[26618]],[[194784,194784],"mapped",[26501]],[[194785,194785],"mapped",[26706]],[[194786,194786],"mapped",[26757]],[[194787,194787],"mapped",[144493]],[[194788,194788],"mapped",[26766]],[[194789,194789],"mapped",[26655]],[[194790,194790],"mapped",[26900]],[[194791,194791],"mapped",[15261]],[[194792,194792],"mapped",[26946]],[[194793,194793],"mapped",[27043]],[[194794,194794],"mapped",[27114]],[[194795,194795],"mapped",[27304]],[[194796,194796],"mapped",[145059]],[[194797,194797],"mapped",[27355]],[[194798,194798],"mapped",[15384]],[[194799,194799],"mapped",[27425]],[[194800,194800],"mapped",[145575]],[[194801,194801],"mapped",[27476]],[[194802,194802],"mapped",[15438]],[[194803,194803],"mapped",[27506]],[[194804,194804],"mapped",[27551]],[[194805,194805],"mapped",[27578]],[[194806,194806],"mapped",[27579]],[[194807,194807],"mapped",[146061]],[[194808,194808],"mapped",[138507]],[[194809,194809],"mapped",[146170]],[[194810,194810],"mapped",[27726]],[[194811,194811],"mapped",[146620]],[[194812,194812],"mapped",[27839]],[[194813,194813],"mapped",[27853]],[[194814,194814],"mapped",[27751]],[[194815,194815],"mapped",[27926]],[[194816,194816],"mapped",[27966]],[[194817,194817],"mapped",[28023]],[[194818,194818],"mapped",[27969]],[[194819,194819],"mapped",[28009]],[[194820,194820],"mapped",[28024]],[[194821,194821],"mapped",[28037]],[[194822,194822],"mapped",[146718]],[[194823,194823],"mapped",[27956]],[[194824,194824],"mapped",[28207]],[[194825,194825],"mapped",[28270]],[[194826,194826],"mapped",[15667]],[[194827,194827],"mapped",[28363]],[[194828,194828],"mapped",[28359]],[[194829,194829],"mapped",[147153]],[[194830,194830],"mapped",[28153]],[[194831,194831],"mapped",[28526]],[[194832,194832],"mapped",[147294]],[[194833,194833],"mapped",[147342]],[[194834,194834],"mapped",[28614]],[[194835,194835],"mapped",[28729]],[[194836,194836],"mapped",[28702]],[[194837,194837],"mapped",[28699]],[[194838,194838],"mapped",[15766]],[[194839,194839],"mapped",[28746]],[[194840,194840],"mapped",[28797]],[[194841,194841],"mapped",[28791]],[[194842,194842],"mapped",[28845]],[[194843,194843],"mapped",[132389]],[[194844,194844],"mapped",[28997]],[[194845,194845],"mapped",[148067]],[[194846,194846],"mapped",[29084]],[[194847,194847],"disallowed"],[[194848,194848],"mapped",[29224]],[[194849,194849],"mapped",[29237]],[[194850,194850],"mapped",[29264]],[[194851,194851],"mapped",[149000]],[[194852,194852],"mapped",[29312]],[[194853,194853],"mapped",[29333]],[[194854,194854],"mapped",[149301]],[[194855,194855],"mapped",[149524]],[[194856,194856],"mapped",[29562]],[[194857,194857],"mapped",[29579]],[[194858,194858],"mapped",[16044]],[[194859,194859],"mapped",[29605]],[[194860,194861],"mapped",[16056]],[[194862,194862],"mapped",[29767]],[[194863,194863],"mapped",[29788]],[[194864,194864],"mapped",[29809]],[[194865,194865],"mapped",[29829]],[[194866,194866],"mapped",[29898]],[[194867,194867],"mapped",[16155]],[[194868,194868],"mapped",[29988]],[[194869,194869],"mapped",[150582]],[[194870,194870],"mapped",[30014]],[[194871,194871],"mapped",[150674]],[[194872,194872],"mapped",[30064]],[[194873,194873],"mapped",[139679]],[[194874,194874],"mapped",[30224]],[[194875,194875],"mapped",[151457]],[[194876,194876],"mapped",[151480]],[[194877,194877],"mapped",[151620]],[[194878,194878],"mapped",[16380]],[[194879,194879],"mapped",[16392]],[[194880,194880],"mapped",[30452]],[[194881,194881],"mapped",[151795]],[[194882,194882],"mapped",[151794]],[[194883,194883],"mapped",[151833]],[[194884,194884],"mapped",[151859]],[[194885,194885],"mapped",[30494]],[[194886,194887],"mapped",[30495]],[[194888,194888],"mapped",[30538]],[[194889,194889],"mapped",[16441]],[[194890,194890],"mapped",[30603]],[[194891,194891],"mapped",[16454]],[[194892,194892],"mapped",[16534]],[[194893,194893],"mapped",[152605]],[[194894,194894],"mapped",[30798]],[[194895,194895],"mapped",[30860]],[[194896,194896],"mapped",[30924]],[[194897,194897],"mapped",[16611]],[[194898,194898],"mapped",[153126]],[[194899,194899],"mapped",[31062]],[[194900,194900],"mapped",[153242]],[[194901,194901],"mapped",[153285]],[[194902,194902],"mapped",[31119]],[[194903,194903],"mapped",[31211]],[[194904,194904],"mapped",[16687]],[[194905,194905],"mapped",[31296]],[[194906,194906],"mapped",[31306]],[[194907,194907],"mapped",[31311]],[[194908,194908],"mapped",[153980]],[[194909,194910],"mapped",[154279]],[[194911,194911],"disallowed"],[[194912,194912],"mapped",[16898]],[[194913,194913],"mapped",[154539]],[[194914,194914],"mapped",[31686]],[[194915,194915],"mapped",[31689]],[[194916,194916],"mapped",[16935]],[[194917,194917],"mapped",[154752]],[[194918,194918],"mapped",[31954]],[[194919,194919],"mapped",[17056]],[[194920,194920],"mapped",[31976]],[[194921,194921],"mapped",[31971]],[[194922,194922],"mapped",[32000]],[[194923,194923],"mapped",[155526]],[[194924,194924],"mapped",[32099]],[[194925,194925],"mapped",[17153]],[[194926,194926],"mapped",[32199]],[[194927,194927],"mapped",[32258]],[[194928,194928],"mapped",[32325]],[[194929,194929],"mapped",[17204]],[[194930,194930],"mapped",[156200]],[[194931,194931],"mapped",[156231]],[[194932,194932],"mapped",[17241]],[[194933,194933],"mapped",[156377]],[[194934,194934],"mapped",[32634]],[[194935,194935],"mapped",[156478]],[[194936,194936],"mapped",[32661]],[[194937,194937],"mapped",[32762]],[[194938,194938],"mapped",[32773]],[[194939,194939],"mapped",[156890]],[[194940,194940],"mapped",[156963]],[[194941,194941],"mapped",[32864]],[[194942,194942],"mapped",[157096]],[[194943,194943],"mapped",[32880]],[[194944,194944],"mapped",[144223]],[[194945,194945],"mapped",[17365]],[[194946,194946],"mapped",[32946]],[[194947,194947],"mapped",[33027]],[[194948,194948],"mapped",[17419]],[[194949,194949],"mapped",[33086]],[[194950,194950],"mapped",[23221]],[[194951,194951],"mapped",[157607]],[[194952,194952],"mapped",[157621]],[[194953,194953],"mapped",[144275]],[[194954,194954],"mapped",[144284]],[[194955,194955],"mapped",[33281]],[[194956,194956],"mapped",[33284]],[[194957,194957],"mapped",[36766]],[[194958,194958],"mapped",[17515]],[[194959,194959],"mapped",[33425]],[[194960,194960],"mapped",[33419]],[[194961,194961],"mapped",[33437]],[[194962,194962],"mapped",[21171]],[[194963,194963],"mapped",[33457]],[[194964,194964],"mapped",[33459]],[[194965,194965],"mapped",[33469]],[[194966,194966],"mapped",[33510]],[[194967,194967],"mapped",[158524]],[[194968,194968],"mapped",[33509]],[[194969,194969],"mapped",[33565]],[[194970,194970],"mapped",[33635]],[[194971,194971],"mapped",[33709]],[[194972,194972],"mapped",[33571]],[[194973,194973],"mapped",[33725]],[[194974,194974],"mapped",[33767]],[[194975,194975],"mapped",[33879]],[[194976,194976],"mapped",[33619]],[[194977,194977],"mapped",[33738]],[[194978,194978],"mapped",[33740]],[[194979,194979],"mapped",[33756]],[[194980,194980],"mapped",[158774]],[[194981,194981],"mapped",[159083]],[[194982,194982],"mapped",[158933]],[[194983,194983],"mapped",[17707]],[[194984,194984],"mapped",[34033]],[[194985,194985],"mapped",[34035]],[[194986,194986],"mapped",[34070]],[[194987,194987],"mapped",[160714]],[[194988,194988],"mapped",[34148]],[[194989,194989],"mapped",[159532]],[[194990,194990],"mapped",[17757]],[[194991,194991],"mapped",[17761]],[[194992,194992],"mapped",[159665]],[[194993,194993],"mapped",[159954]],[[194994,194994],"mapped",[17771]],[[194995,194995],"mapped",[34384]],[[194996,194996],"mapped",[34396]],[[194997,194997],"mapped",[34407]],[[194998,194998],"mapped",[34409]],[[194999,194999],"mapped",[34473]],[[195000,195000],"mapped",[34440]],[[195001,195001],"mapped",[34574]],[[195002,195002],"mapped",[34530]],[[195003,195003],"mapped",[34681]],[[195004,195004],"mapped",[34600]],[[195005,195005],"mapped",[34667]],[[195006,195006],"mapped",[34694]],[[195007,195007],"disallowed"],[[195008,195008],"mapped",[34785]],[[195009,195009],"mapped",[34817]],[[195010,195010],"mapped",[17913]],[[195011,195011],"mapped",[34912]],[[195012,195012],"mapped",[34915]],[[195013,195013],"mapped",[161383]],[[195014,195014],"mapped",[35031]],[[195015,195015],"mapped",[35038]],[[195016,195016],"mapped",[17973]],[[195017,195017],"mapped",[35066]],[[195018,195018],"mapped",[13499]],[[195019,195019],"mapped",[161966]],[[195020,195020],"mapped",[162150]],[[195021,195021],"mapped",[18110]],[[195022,195022],"mapped",[18119]],[[195023,195023],"mapped",[35488]],[[195024,195024],"mapped",[35565]],[[195025,195025],"mapped",[35722]],[[195026,195026],"mapped",[35925]],[[195027,195027],"mapped",[162984]],[[195028,195028],"mapped",[36011]],[[195029,195029],"mapped",[36033]],[[195030,195030],"mapped",[36123]],[[195031,195031],"mapped",[36215]],[[195032,195032],"mapped",[163631]],[[195033,195033],"mapped",[133124]],[[195034,195034],"mapped",[36299]],[[195035,195035],"mapped",[36284]],[[195036,195036],"mapped",[36336]],[[195037,195037],"mapped",[133342]],[[195038,195038],"mapped",[36564]],[[195039,195039],"mapped",[36664]],[[195040,195040],"mapped",[165330]],[[195041,195041],"mapped",[165357]],[[195042,195042],"mapped",[37012]],[[195043,195043],"mapped",[37105]],[[195044,195044],"mapped",[37137]],[[195045,195045],"mapped",[165678]],[[195046,195046],"mapped",[37147]],[[195047,195047],"mapped",[37432]],[[195048,195048],"mapped",[37591]],[[195049,195049],"mapped",[37592]],[[195050,195050],"mapped",[37500]],[[195051,195051],"mapped",[37881]],[[195052,195052],"mapped",[37909]],[[195053,195053],"mapped",[166906]],[[195054,195054],"mapped",[38283]],[[195055,195055],"mapped",[18837]],[[195056,195056],"mapped",[38327]],[[195057,195057],"mapped",[167287]],[[195058,195058],"mapped",[18918]],[[195059,195059],"mapped",[38595]],[[195060,195060],"mapped",[23986]],[[195061,195061],"mapped",[38691]],[[195062,195062],"mapped",[168261]],[[195063,195063],"mapped",[168474]],[[195064,195064],"mapped",[19054]],[[195065,195065],"mapped",[19062]],[[195066,195066],"mapped",[38880]],[[195067,195067],"mapped",[168970]],[[195068,195068],"mapped",[19122]],[[195069,195069],"mapped",[169110]],[[195070,195071],"mapped",[38923]],[[195072,195072],"mapped",[38953]],[[195073,195073],"mapped",[169398]],[[195074,195074],"mapped",[39138]],[[195075,195075],"mapped",[19251]],[[195076,195076],"mapped",[39209]],[[195077,195077],"mapped",[39335]],[[195078,195078],"mapped",[39362]],[[195079,195079],"mapped",[39422]],[[195080,195080],"mapped",[19406]],[[195081,195081],"mapped",[170800]],[[195082,195082],"mapped",[39698]],[[195083,195083],"mapped",[40000]],[[195084,195084],"mapped",[40189]],[[195085,195085],"mapped",[19662]],[[195086,195086],"mapped",[19693]],[[195087,195087],"mapped",[40295]],[[195088,195088],"mapped",[172238]],[[195089,195089],"mapped",[19704]],[[195090,195090],"mapped",[172293]],[[195091,195091],"mapped",[172558]],[[195092,195092],"mapped",[172689]],[[195093,195093],"mapped",[40635]],[[195094,195094],"mapped",[19798]],[[195095,195095],"mapped",[40697]],[[195096,195096],"mapped",[40702]],[[195097,195097],"mapped",[40709]],[[195098,195098],"mapped",[40719]],[[195099,195099],"mapped",[40726]],[[195100,195100],"mapped",[40763]],[[195101,195101],"mapped",[173568]],[[195102,196605],"disallowed"],[[196606,196607],"disallowed"],[[196608,262141],"disallowed"],[[262142,262143],"disallowed"],[[262144,327677],"disallowed"],[[327678,327679],"disallowed"],[[327680,393213],"disallowed"],[[393214,393215],"disallowed"],[[393216,458749],"disallowed"],[[458750,458751],"disallowed"],[[458752,524285],"disallowed"],[[524286,524287],"disallowed"],[[524288,589821],"disallowed"],[[589822,589823],"disallowed"],[[589824,655357],"disallowed"],[[655358,655359],"disallowed"],[[655360,720893],"disallowed"],[[720894,720895],"disallowed"],[[720896,786429],"disallowed"],[[786430,786431],"disallowed"],[[786432,851965],"disallowed"],[[851966,851967],"disallowed"],[[851968,917501],"disallowed"],[[917502,917503],"disallowed"],[[917504,917504],"disallowed"],[[917505,917505],"disallowed"],[[917506,917535],"disallowed"],[[917536,917631],"disallowed"],[[917632,917759],"disallowed"],[[917760,917999],"ignored"],[[918000,983037],"disallowed"],[[983038,983039],"disallowed"],[[983040,1048573],"disallowed"],[[1048574,1048575],"disallowed"],[[1048576,1114109],"disallowed"],[[1114110,1114111],"disallowed"]]'); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __nccwpck_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ var threw = true; -/******/ try { -/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __nccwpck_require__); -/******/ threw = false; -/******/ } finally { -/******/ if(threw) delete __webpack_module_cache__[moduleId]; -/******/ } -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat */ -/******/ -/******/ if (typeof __nccwpck_require__ !== 'undefined') __nccwpck_require__.ab = __dirname + "/"; -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module is referenced by other modules so it can't be inlined -/******/ var __webpack_exports__ = __nccwpck_require__(3571); -/******/ module.exports = __webpack_exports__; -/******/ -/******/ })() -; diff --git a/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts b/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts deleted file mode 100644 index cbbe75f35e59..000000000000 --- a/.github/actions/javascript/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts +++ /dev/null @@ -1,114 +0,0 @@ -import {context, getOctokit} from '@actions/github'; -import InitOpenAI from 'openai'; -import CONST from '@github/libs/CONST'; -import type {GitHubType} from '@github/libs/GithubUtils'; - -const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); - -async function processIssueCommentEdit(octokit: InstanceType) { - const payload = context.payload; - const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; - - // check if the issue is open and the has labels - if (payload.issue?.state !== 'open' && !payload.issue?.labels.some((issueLabel: {name: string}) => issueLabel.name === CONST.LABELS.HELP_WANTED)) { - return; - } - - if (!OPENAI_ASSISTANT_ID) { - console.log('OPENAI_ASSISTANT_ID missing from the environment variables'); - return; - } - - // You need to adapt this part to fit the Edit Use Case as in the original function - const content = `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "NO_ACTION" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body?.from}.\n\nEdited comment content: ${payload.comment?.body}`; - - // create thread with first user message and run it - const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ - /* eslint-disable @typescript-eslint/naming-convention */ - assistant_id: OPENAI_ASSISTANT_ID ?? '', - thread: {messages: [{role: 'user', content}]}, - }); - - // count calls for debug purposes - let count = 0; - // poll for run completion - const intervalID = setInterval(() => { - OpenAI.beta.threads.runs - .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) - .then((threadRun) => { - // return if run is not completed yet - if (threadRun.status !== 'completed') { - console.log('issue_comment.edited - run pending completion'); - return; - } - - // get assistant response - OpenAI.beta.threads.messages - .list(createAndRunResponse.thread_id) - .then((threadMessages) => { - // list thread messages content - threadMessages.data.forEach((message, index) => { - // @ts-expect-error - we do have `text` in content[0] but typescript doesn't know that this is a 'openai' package type issue - const assistantResponse = message.content?.[index]?.text?.value; - console.log('issue_comment.edited - assistantResponse', assistantResponse); - - if (!assistantResponse) { - return console.log('issue_comment.edited - assistantResponse is empty'); - } - - // check if assistant response is either NO_ACTION or "NO_ACTION" strings - // as sometimes the assistant response varies - const isNoAction = assistantResponse === 'NO_ACTION' || assistantResponse === '"NO_ACTION"'; - // if assistant response is NO_ACTION or message role is 'user', do nothing - if (isNoAction || threadMessages.data?.[index]?.role === 'user') { - if (threadMessages.data?.[index]?.role === 'user') { - return; - } - return console.log('issue_comment.edited - NO_ACTION'); - } - - // edit comment if assistant detected substantial changes and if the comment was not edited already by the bot - if (assistantResponse.includes('[EDIT_COMMENT]') && !payload.comment?.body.includes('Edited by **proposal-police**')) { - // extract the text after [EDIT_COMMENT] from assistantResponse since this is a - // bot related action keyword - let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); - // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC - const date = new Date((payload.comment?.updated_at as string) ?? ''); - const formattedDate = `${date.toISOString()?.split('.')?.[0]?.replace('T', ' ')} UTC`; - extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); - - console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment?.id}`); - octokit.issues.updateComment({ - ...context.repo, - /* eslint-disable @typescript-eslint/naming-convention */ - comment_id: payload.comment?.id ?? -1, - body: `${extractedNotice}\n\n${payload.comment?.body}`, - }); - } - - return false; - }); - }) - .catch((error) => console.log('threads.messages.list - error', error)); - - // stop polling - clearInterval(intervalID); - }) - .catch((error) => console.log('threads.runs.retrieve - error', error)); - - // increment count for every threads.runs.retrieve call - count++; - console.log('threads.runs.retrieve - called:', count); - }, 1500); -} - -async function run() { - // @ts-expect-error - process is not imported - const octokit: InstanceType = getOctokit(process.env.GITHUB_TOKEN); - await processIssueCommentEdit(octokit); -} - -run().catch((error) => { - console.error(error); - process.exit(1); -}); diff --git a/.github/actions/javascript/reopenIssueWithComment/index.js b/.github/actions/javascript/reopenIssueWithComment/index.js index 6e2504ab30e2..2bbc7cb7522e 100644 --- a/.github/actions/javascript/reopenIssueWithComment/index.js +++ b/.github/actions/javascript/reopenIssueWithComment/index.js @@ -11513,6 +11513,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -11520,6 +11524,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; diff --git a/.github/actions/javascript/reviewerChecklist/index.js b/.github/actions/javascript/reviewerChecklist/index.js index 1173dae0557f..45b40e81887e 100644 --- a/.github/actions/javascript/reviewerChecklist/index.js +++ b/.github/actions/javascript/reviewerChecklist/index.js @@ -11605,6 +11605,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -11612,6 +11616,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; diff --git a/.github/actions/javascript/verifySignedCommits/index.js b/.github/actions/javascript/verifySignedCommits/index.js index 032c4b34547e..38157a6bf2ca 100644 --- a/.github/actions/javascript/verifySignedCommits/index.js +++ b/.github/actions/javascript/verifySignedCommits/index.js @@ -11545,6 +11545,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -11552,6 +11556,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, }; exports["default"] = CONST; diff --git a/.github/libs/CONST.ts b/.github/libs/CONST.ts index b1e38a18a4a1..f2d704a41ace 100644 --- a/.github/libs/CONST.ts +++ b/.github/libs/CONST.ts @@ -15,6 +15,10 @@ const CONST = { INTERNAL_QA: 'InternalQA', HELP_WANTED: 'Help Wanted', }, + ACTIONS: { + CREATED: 'created', + EDIT: 'edited', + }, DATE_FORMAT_STRING: 'yyyy-MM-dd', PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), @@ -22,6 +26,8 @@ const CONST = { POLL_RATE: 10000, APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, } as const; export default CONST; diff --git a/.github/libs/OpenAIUtils.ts b/.github/libs/OpenAIUtils.ts new file mode 100644 index 000000000000..d173ab30cc60 --- /dev/null +++ b/.github/libs/OpenAIUtils.ts @@ -0,0 +1,198 @@ +import {context} from '@actions/github'; +import InitOpenAI from 'openai'; +import CONST from './CONST'; +import type {GitHubType} from '@github/libs/GithubUtils'; + +const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); + +type OpenAIUtilsPrompt = { + createAndRunResponse: InitOpenAI.Beta.Threads.Runs.Run; + payload: typeof context.payload; + octokit: InstanceType; +} + +async function prompt({createAndRunResponse, payload, octokit}: OpenAIUtilsPrompt) { + return new Promise((resolve, reject) => { + // count calls for debug purposes + let count = 0; + // poll for run completion + const intervalID = setInterval(() => { + OpenAI.beta.threads.runs + .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) + .then((threadRun) => { + // return if run is not completed + if (threadRun.status !== 'completed') { + return; + } + + // get assistant response + OpenAI.beta.threads.messages + .list(createAndRunResponse.thread_id) + .then((threadMessages) => { + // list thread messages content + threadMessages.data.forEach((message, index) => { + // @ts-expect-error - we do have `text` in content[0] but typescript doesn't know that this is an 'openai' package type issue + let assistantResponse = message.content?.[index]?.text?.value as string; + console.log('issue_comment.created - assistantResponse', assistantResponse); + + if (!assistantResponse) { + return console.log('issue_comment.created - assistantResponse is empty'); + } + + // check if assistant response is either NO_ACTION or "NO_ACTION" strings + // as sometimes the assistant response varies + const isNoAction = assistantResponse.replaceAll('"', '').toUpperCase() === CONST.NO_ACTION; + // If assistant response is NO_ACTION, do nothing + if (isNoAction) { + console.log('Detected NO_ACTION for comment, returning early'); + return; + } + // If thread message role is 'user', do nothing + if (threadMessages.data?.[index]?.role === 'user') { + console.log('Detected message role "user", returning early...'); + return; + } + + // if the assistant responded with no action but there's some context in the response + if (assistantResponse.includes(`[${CONST.NO_ACTION}]`)) { + // extract the text after [NO_ACTION] from assistantResponse since this is a + // bot related action keyword + const noActionContext = assistantResponse.split(`[${CONST.NO_ACTION}] `)?.[1]?.replace('"', ''); + console.log('issue_comment.created - [NO_ACTION] w/ context: ', noActionContext); + return; + } + // replace {user} from response template with @username + assistantResponse = assistantResponse.replace('{user}', `@${payload.comment?.user.login}`); + // replace {proposalLink} from response template with the link to the comment + assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment?.html_url); + + // remove any double quotes from the final comment because sometimes the assistant's + // response contains double quotes / sometimes it doesn't + assistantResponse = assistantResponse.replace('"', '').replace(/^"|"$/g, ''); + // create a comment with the assistant's response + console.log('issue_comment.created - proposal-police posts comment'); + octokit.issues.createComment({ + ...context.repo, + /* eslint-disable @typescript-eslint/naming-convention */ + issue_number: payload.issue?.number ?? -1, + body: assistantResponse, + }); + + // resolve the Promise with the response + resolve({ response: assistantResponse }); + // stop polling + clearInterval(intervalID); + }); + }) + .catch((error) => { + console.error('threads.messages.list - error', error); + reject(error); + clearInterval(intervalID); + }); + + // stop polling + clearInterval(intervalID); + }) + .catch((error) => { + console.error('threads.runs.retrieve - error', error); + reject(error); + clearInterval(intervalID); + }); + + // increment count for every threads.runs.retrieve call + count++; + console.log('threads.runs.retrieve - called:', count); + }, CONST.OPENAI_POLL_RATE); + }); +} + +async function promptEdit({createAndRunResponse, payload, octokit}: OpenAIUtilsPrompt) { + return new Promise((resolve, reject) => { + // count calls for debug purposes + let count = 0; + + // poll for run completion + const intervalID = setInterval(() => { + OpenAI.beta.threads.runs + .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) + .then((threadRun) => { + // return if run is not completed yet + if (threadRun.status !== 'completed') { + console.log('issue_comment.edited - run pending completion'); + return; + } + + // get assistant response + OpenAI.beta.threads.messages + .list(createAndRunResponse.thread_id) + .then((threadMessages) => { + // list thread messages content + threadMessages.data.forEach((message, index) => { + // @ts-expect-error - we do have `text` in content[0] but typescript doesn't know that this is a 'openai' package type issue + const assistantResponse = message.content?.[index]?.text?.value as string; + console.log('issue_comment.edited - assistantResponse', assistantResponse); + + if (!assistantResponse) { + return console.log('issue_comment.edited - assistantResponse is empty'); + } + + // check if assistant response is either NO_ACTION or "NO_ACTION" strings + // as sometimes the assistant response varies + const isNoAction = assistantResponse.replaceAll('"', '').toUpperCase() === CONST.NO_ACTION; + // If assistant response is NO_ACTION, do nothing + if (isNoAction) { + console.log('Detected NO_ACTION for comment, returning early'); + return; + } + // If thread message role is 'user', do nothing + if (threadMessages.data?.[index]?.role === 'user') { + console.log('Detected message role "user", returning early...'); + return; + } + + // edit comment if assistant detected substantial changes and if the comment was not edited already by the bot + if (assistantResponse.includes('[EDIT_COMMENT]') && !payload.comment?.body.includes('Edited by **proposal-police**')) { + // extract the text after [EDIT_COMMENT] from assistantResponse since this is a + // bot related action keyword + let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); + // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC + const date = new Date((payload.comment?.updated_at as string) ?? ''); + const formattedDate = `${date.toISOString()?.split('.')?.[0]?.replace('T', ' ')} UTC`; + extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); + + console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment?.id}`); + octokit.issues.updateComment({ + ...context.repo, + /* eslint-disable @typescript-eslint/naming-convention */ + comment_id: payload.comment?.id ?? -1, + body: `${extractedNotice}\n\n${payload.comment?.body}`, + }); + } + + // resolve the Promise with the response + resolve({ response: assistantResponse }); + clearInterval(intervalID); + }); + }) + .catch((error) => { + console.error('threads.messages.list - error', error); + reject(error); + clearInterval(intervalID); + }); + + clearInterval(intervalID); + }) + .catch((error) => { + console.error('threads.runs.retrieve - error', error); + reject(error); + clearInterval(intervalID); + }); + + // increment count for every threads.runs.retrieve call + count++; + console.log('threads.runs.retrieve - called:', count); + }, CONST.OPENAI_POLL_RATE); + }); +} + +export {prompt, promptEdit}; diff --git a/.github/scripts/buildActions.sh b/.github/scripts/buildActions.sh index b533c404447d..4c9698554085 100755 --- a/.github/scripts/buildActions.sh +++ b/.github/scripts/buildActions.sh @@ -28,7 +28,6 @@ declare -r GITHUB_ACTIONS=( "$ACTIONS_DIR/getGraphiteString/getGraphiteString.ts" "$ACTIONS_DIR/getArtifactInfo/getArtifactInfo.ts" "$ACTIONS_DIR/proposalPoliceComment/proposalPoliceComment.ts" - "$ACTIONS_DIR/proposalPoliceCommentEdit/proposalPoliceCommentEdit.ts" ) # This will be inserted at the top of all compiled files as a warning to devs. diff --git a/.github/workflows/proposalPolice.yml b/.github/workflows/proposalPolice.yml index c01ef2d504d6..37d40db3721d 100644 --- a/.github/workflows/proposalPolice.yml +++ b/.github/workflows/proposalPolice.yml @@ -14,9 +14,10 @@ jobs: with: node-version: "20" - # Check comment created and if it's a proposal make sure it follows the template - - name: ProposalPolice™ Comment Check - if: github.event.action == 'created' + # Checks if the comment is created and follows the template OR + # if the comment is edited and if proposal template is followed. + # Action type logic can be found in the script files. + - name: Run ProposalPolice™ Comment Check Script env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} @@ -24,14 +25,3 @@ jobs: ISSUE: ${{ toJson(github.event.issue) }} COMMENT: ${{ toJson(github.event.comment) }} run: node .github/actions/javascript/proposalPoliceComment/index.js - - # Checks if the comment is edited and if proposal template is followed - - name: ProposalPolice™ Edited Comment Check - if: github.event.action == 'edited' - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} - OPENAI_ASSISTANT_ID: ${{ secrets.OPENAI_ASSISTANT_ID }} - ISSUE: ${{ toJson(github.event.issue) }} - COMMENT: ${{ toJson(github.event.comment) }} - run: node .github/actions/javascript/proposalPoliceCommentEdit/index.js diff --git a/package-lock.json b/package-lock.json index 59a25db3d667..7a7e2b035c1b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -157,7 +157,7 @@ "@octokit/core": "4.0.4", "@octokit/plugin-paginate-rest": "3.1.0", "@octokit/plugin-throttling": "4.1.0", - "@octokit/rest": "^18.0.0", + "@octokit/rest": "^20.1.1", "@react-native-community/eslint-config": "3.0.0", "@react-native/babel-preset": "^0.73.21", "@react-native/metro-config": "^0.73.5", @@ -227,7 +227,7 @@ "jest-transformer-svg": "^2.0.1", "memfs": "^4.6.0", "onchange": "^7.1.0", - "openai": "^4.24.7", + "openai": "^4.47.2", "patch-package": "^8.0.0", "portfinder": "^1.0.28", "prettier": "^2.8.8", @@ -7562,15 +7562,6 @@ "@octokit/core": ">=4" } }, - "node_modules/@octokit/plugin-request-log": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", - "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", - "dev": true, - "peerDependencies": { - "@octokit/core": ">=3" - } - }, "node_modules/@octokit/plugin-rest-endpoint-methods": { "version": "5.16.2", "dev": true, @@ -7654,98 +7645,158 @@ } }, "node_modules/@octokit/rest": { - "version": "18.12.0", - "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-18.12.0.tgz", - "integrity": "sha512-gDPiOHlyGavxr72y0guQEhLsemgVjwRePayJ+FcKc2SJqKUbxbkvf5kAZEWA/MKvsfYlQAMVzNJE3ezQcxMJ2Q==", + "version": "20.1.1", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-20.1.1.tgz", + "integrity": "sha512-MB4AYDsM5jhIHro/dq4ix1iWTLGToIGk6cWF5L6vanFaMble5jTX/UBQyiv05HsWnwUtY8JrfHy2LWfKwihqMw==", "dev": true, "dependencies": { - "@octokit/core": "^3.5.1", - "@octokit/plugin-paginate-rest": "^2.16.8", - "@octokit/plugin-request-log": "^1.0.4", - "@octokit/plugin-rest-endpoint-methods": "^5.12.0" + "@octokit/core": "^5.0.2", + "@octokit/plugin-paginate-rest": "11.3.1", + "@octokit/plugin-request-log": "^4.0.0", + "@octokit/plugin-rest-endpoint-methods": "13.2.2" + }, + "engines": { + "node": ">= 18" } }, "node_modules/@octokit/rest/node_modules/@octokit/auth-token": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", - "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-4.0.0.tgz", + "integrity": "sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==", "dev": true, - "dependencies": { - "@octokit/types": "^6.0.3" + "engines": { + "node": ">= 18" } }, "node_modules/@octokit/rest/node_modules/@octokit/core": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", - "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-5.2.0.tgz", + "integrity": "sha512-1LFfa/qnMQvEOAdzlQymH0ulepxbxnCYAKJZfMci/5XJyIHWgEYnDmgnKakbTh7CH2tFQ5O60oYDvns4i9RAIg==", "dev": true, "dependencies": { - "@octokit/auth-token": "^2.4.4", - "@octokit/graphql": "^4.5.8", - "@octokit/request": "^5.6.3", - "@octokit/request-error": "^2.0.5", - "@octokit/types": "^6.0.3", + "@octokit/auth-token": "^4.0.0", + "@octokit/graphql": "^7.1.0", + "@octokit/request": "^8.3.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.0.0", "before-after-hook": "^2.2.0", "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" } }, "node_modules/@octokit/rest/node_modules/@octokit/endpoint": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", - "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-9.0.5.tgz", + "integrity": "sha512-ekqR4/+PCLkEBF6qgj8WqJfvDq65RH85OAgrtnVp1mSxaXF03u2xW/hUdweGS5654IlC0wkNYC18Z50tSYTAFw==", "dev": true, "dependencies": { - "@octokit/types": "^6.0.3", - "is-plain-object": "^5.0.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" } }, "node_modules/@octokit/rest/node_modules/@octokit/graphql": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", - "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-7.1.0.tgz", + "integrity": "sha512-r+oZUH7aMFui1ypZnAvZmn0KSqAUgE1/tUXIWaqUCa1758ts/Jio84GZuzsvUkme98kv0WFY8//n0J1Z+vsIsQ==", "dev": true, "dependencies": { - "@octokit/request": "^5.6.0", - "@octokit/types": "^6.0.3", + "@octokit/request": "^8.3.0", + "@octokit/types": "^13.0.0", "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" } }, + "node_modules/@octokit/rest/node_modules/@octokit/openapi-types": { + "version": "22.2.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-22.2.0.tgz", + "integrity": "sha512-QBhVjcUa9W7Wwhm6DBFu6ZZ+1/t/oYxqc2tp81Pi41YNuJinbFRx8B133qVOrAaBbF7D/m0Et6f9/pZt9Rc+tg==", + "dev": true + }, "node_modules/@octokit/rest/node_modules/@octokit/plugin-paginate-rest": { - "version": "2.21.3", - "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", - "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-11.3.1.tgz", + "integrity": "sha512-ryqobs26cLtM1kQxqeZui4v8FeznirUsksiA+RYemMPJ7Micju0WSkv50dBksTuZks9O5cg4wp+t8fZ/cLY56g==", "dev": true, "dependencies": { - "@octokit/types": "^6.40.0" + "@octokit/types": "^13.5.0" + }, + "engines": { + "node": ">= 18" }, "peerDependencies": { - "@octokit/core": ">=2" + "@octokit/core": "5" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/plugin-request-log": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-4.0.1.tgz", + "integrity": "sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==", + "dev": true, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "5" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-13.2.2.tgz", + "integrity": "sha512-EI7kXWidkt3Xlok5uN43suK99VWqc8OaIMktY9d9+RNKl69juoTyxmLoWPIZgJYzi41qj/9zU7G/ljnNOJ5AFA==", + "dev": true, + "dependencies": { + "@octokit/types": "^13.5.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "@octokit/core": "^5" } }, "node_modules/@octokit/rest/node_modules/@octokit/request": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", - "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-8.4.0.tgz", + "integrity": "sha512-9Bb014e+m2TgBeEJGEbdplMVWwPmL1FPtggHQRkV+WVsMggPtEkLKPlcVYm/o8xKLkpJ7B+6N8WfQMtDLX2Dpw==", "dev": true, "dependencies": { - "@octokit/endpoint": "^6.0.1", - "@octokit/request-error": "^2.1.0", - "@octokit/types": "^6.16.1", - "is-plain-object": "^5.0.0", - "node-fetch": "^2.6.7", + "@octokit/endpoint": "^9.0.1", + "@octokit/request-error": "^5.1.0", + "@octokit/types": "^13.1.0", "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 18" } }, "node_modules/@octokit/rest/node_modules/@octokit/request-error": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", - "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-5.1.0.tgz", + "integrity": "sha512-GETXfE05J0+7H2STzekpKObFe765O5dlAKUTLNGeH+x47z7JjXHfsHKo5z21D/o/IOZTUEI6nyWyR+bZVP/n5Q==", "dev": true, "dependencies": { - "@octokit/types": "^6.0.3", + "@octokit/types": "^13.1.0", "deprecation": "^2.0.0", "once": "^1.4.0" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@octokit/rest/node_modules/@octokit/types": { + "version": "13.5.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-13.5.0.tgz", + "integrity": "sha512-HdqWTf5Z3qwDVlzCrP8UJquMwunpDiMPt5er+QjGzL4hqr/vBVY/MauQgS1xWxCDT1oMx1EULyqxncdCY/NVSQ==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^22.2.0" } }, "node_modules/@octokit/types": { @@ -29681,9 +29732,9 @@ } }, "node_modules/openai": { - "version": "4.38.5", - "resolved": "https://registry.npmjs.org/openai/-/openai-4.38.5.tgz", - "integrity": "sha512-Ym5GJL98ZhLJJ7enBx53jjG3vwN/fsB+Ozh46nnRZZS9W1NiYqbwkJ+sXd3dkCIiWIgcyyOPL2Zr8SQAzbpj3g==", + "version": "4.47.2", + "resolved": "https://registry.npmjs.org/openai/-/openai-4.47.2.tgz", + "integrity": "sha512-E3Wq9mYdDSLajmcJm9RO/lCegTKrQ7ilAkMbhob4UgGhTjHwIHI+mXNDNPl5+sGIUp2iVUkpoi772FjYa7JlqA==", "dev": true, "dependencies": { "@types/node": "^18.11.18", diff --git a/package.json b/package.json index 1d5ca6711bf7..1493e9fb48dc 100644 --- a/package.json +++ b/package.json @@ -191,8 +191,6 @@ "devDependencies": { "@actions/core": "1.10.0", "@actions/github": "5.1.1", - "@octokit/rest": "^18.0.0", - "openai": "^4.24.7", "@babel/core": "^7.20.0", "@babel/parser": "^7.22.16", "@babel/plugin-proposal-class-properties": "^7.12.1", @@ -211,6 +209,7 @@ "@octokit/core": "4.0.4", "@octokit/plugin-paginate-rest": "3.1.0", "@octokit/plugin-throttling": "4.1.0", + "@octokit/rest": "^20.1.1", "@react-native-community/eslint-config": "3.0.0", "@react-native/babel-preset": "^0.73.21", "@react-native/metro-config": "^0.73.5", @@ -280,6 +279,7 @@ "jest-transformer-svg": "^2.0.1", "memfs": "^4.6.0", "onchange": "^7.1.0", + "openai": "^4.47.2", "patch-package": "^8.0.0", "portfinder": "^1.0.28", "prettier": "^2.8.8", From df9ef9c1aae3fbb89ee1907bf88f11f0c349db79 Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Thu, 30 May 2024 17:48:04 -0700 Subject: [PATCH 12/22] refactoring 3.1: lint --- .github/libs/OpenAIUtils.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/libs/OpenAIUtils.ts b/.github/libs/OpenAIUtils.ts index d173ab30cc60..a494a6b8d2ef 100644 --- a/.github/libs/OpenAIUtils.ts +++ b/.github/libs/OpenAIUtils.ts @@ -1,7 +1,7 @@ import {context} from '@actions/github'; import InitOpenAI from 'openai'; -import CONST from './CONST'; import type {GitHubType} from '@github/libs/GithubUtils'; +import CONST from './CONST'; const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); @@ -9,7 +9,7 @@ type OpenAIUtilsPrompt = { createAndRunResponse: InitOpenAI.Beta.Threads.Runs.Run; payload: typeof context.payload; octokit: InstanceType; -} +}; async function prompt({createAndRunResponse, payload, octokit}: OpenAIUtilsPrompt) { return new Promise((resolve, reject) => { @@ -62,9 +62,9 @@ async function prompt({createAndRunResponse, payload, octokit}: OpenAIUtilsPromp return; } // replace {user} from response template with @username - assistantResponse = assistantResponse.replace('{user}', `@${payload.comment?.user.login}`); + assistantResponse = assistantResponse.replace('{user}', `@${payload.comment?.user.login as string}`); // replace {proposalLink} from response template with the link to the comment - assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment?.html_url); + assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment?.html_url as string); // remove any double quotes from the final comment because sometimes the assistant's // response contains double quotes / sometimes it doesn't @@ -79,7 +79,7 @@ async function prompt({createAndRunResponse, payload, octokit}: OpenAIUtilsPromp }); // resolve the Promise with the response - resolve({ response: assistantResponse }); + resolve({response: assistantResponse}); // stop polling clearInterval(intervalID); }); @@ -170,7 +170,7 @@ async function promptEdit({createAndRunResponse, payload, octokit}: OpenAIUtilsP } // resolve the Promise with the response - resolve({ response: assistantResponse }); + resolve({response: assistantResponse}); clearInterval(intervalID); }); }) From 623ca4d8ef48f5f65959820021980a7d63cb25f5 Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Thu, 30 May 2024 20:55:09 -0700 Subject: [PATCH 13/22] refactoring 3.2: lint import --- .github/libs/OpenAIUtils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/libs/OpenAIUtils.ts b/.github/libs/OpenAIUtils.ts index a494a6b8d2ef..dca95dbc7480 100644 --- a/.github/libs/OpenAIUtils.ts +++ b/.github/libs/OpenAIUtils.ts @@ -1,7 +1,7 @@ import {context} from '@actions/github'; import InitOpenAI from 'openai'; -import type {GitHubType} from '@github/libs/GithubUtils'; import CONST from './CONST'; +import type {GitHubType} from './GithubUtils'; const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); From 4ffbd422296227ae003bfe0b5e584188bae5d68d Mon Sep 17 00:00:00 2001 From: Kevin Brian Bader Date: Sat, 22 Jun 2024 12:47:33 -0700 Subject: [PATCH 14/22] Merge branch 'main' of https://github.com/Expensify/App into feat/proposal-police --- .env.example | 1 - .env.production | 1 - .env.staging | 3 +- .eslintignore | 1 + .eslintrc.js | 32 +- .../javascript/authorChecklist/index.js | 60 +- .../javascript/awaitStagingDeploys/index.js | 60 +- .../javascript/bumpVersion/bumpVersion.ts | 5 +- .../actions/javascript/bumpVersion/index.js | 8 +- .../javascript/checkDeployBlockers/index.js | 60 +- .../createOrUpdateStagingDeploy/index.js | 134 +- .../javascript/getArtifactInfo/index.js | 60 +- .../getDeployPullRequestList/index.js | 134 +- .../getGraphiteString/getGraphiteString.ts | 13 +- .../getPreviousVersion/getPreviousVersion.ts | 28 +- .../javascript/getPreviousVersion/index.js | 326 ++- .../javascript/getPullRequestDetails/index.js | 60 +- .../javascript/getReleaseBody/index.js | 60 +- .../javascript/isStagingDeployLocked/index.js | 60 +- .../markPullRequestsAsDeployed/index.js | 88 +- .../markPullRequestsAsDeployed.ts | 29 +- .../javascript/postTestBuildComment/index.js | 60 +- .../reopenIssueWithComment/index.js | 60 +- .../javascript/reviewerChecklist/index.js | 60 +- .../javascript/verifySignedCommits/index.js | 60 +- .github/libs/GitUtils.ts | 70 +- .github/libs/GithubUtils.ts | 50 +- .github/libs/versionUpdater.ts | 13 +- .github/scripts/buildActions.sh | 2 +- .github/scripts/enforceRedirect.sh | 35 + .github/scripts/printPodspec.rb | 35 + .github/scripts/verifyActions.sh | 2 +- .github/scripts/verifyPodfile.sh | 54 +- .github/workflows/deploy.yml | 7 +- .github/workflows/deployExpensifyHelp.yml | 6 + .github/workflows/platformDeploy.yml | 22 +- .github/workflows/test.yml | 19 +- .github/workflows/testBuild.yml | 2 +- .../workflows/testGithubActionsWorkflows.yml | 7 + .gitignore | 8 + .nvmrc | 2 +- .storybook/preview.tsx | 2 +- .storybook/public/favicon.svg | 12 +- .storybook/webpack.config.ts | 9 +- CODE_OF_CONDUCT.md | 2 + Gemfile | 2 +- Gemfile.lock | 102 +- README.md | 33 +- __mocks__/react-native-permissions.ts | 36 +- android/app/build.gradle | 4 +- android/build.gradle | 2 +- assets/animations/Abracadabra.lottie | Bin 0 -> 15694 bytes assets/images/all.svg | 2 +- assets/images/arrow-down-long.svg | 1 + assets/images/arrow-right.svg | 11 +- assets/images/arrow-up-long.svg | 1 + assets/images/avatars/fallback-avatar.svg | 11 +- .../images/avatars/group/default-avatar_1.svg | 8 +- .../avatars/group/default-avatar_10.svg | 8 +- .../avatars/group/default-avatar_11.svg | 8 +- .../avatars/group/default-avatar_12.svg | 8 +- .../avatars/group/default-avatar_13.svg | 8 +- .../avatars/group/default-avatar_14.svg | 8 +- .../avatars/group/default-avatar_15.svg | 8 +- .../avatars/group/default-avatar_16.svg | 8 +- .../avatars/group/default-avatar_17.svg | 8 +- .../avatars/group/default-avatar_18.svg | 8 +- .../images/avatars/group/default-avatar_2.svg | 8 +- .../images/avatars/group/default-avatar_3.svg | 8 +- .../images/avatars/group/default-avatar_4.svg | 8 +- .../images/avatars/group/default-avatar_5.svg | 8 +- .../images/avatars/group/default-avatar_6.svg | 8 +- .../images/avatars/group/default-avatar_7.svg | 8 +- .../images/avatars/group/default-avatar_8.svg | 8 +- .../images/avatars/group/default-avatar_9.svg | 8 +- assets/images/back-left.svg | 11 +- assets/images/bed.svg | 1 + assets/images/car-with-key.svg | 1 + assets/images/check-circle.svg | 1 + assets/images/checkmark-circle.svg | 1 + assets/images/coins.svg | 9 +- assets/images/comment-bubbles.svg | 1 + assets/images/connection-complete.svg | 331 +-- assets/images/credit-card-exclamation.svg | 1 + assets/images/credit-card-hourglass.svg | 20 +- assets/images/crosshair.svg | 1 + assets/images/document-plus.svg | 6 +- assets/images/document-slash.svg | 2 +- assets/images/emptystate__routepending.svg | 2 +- assets/images/inbox.svg | 1 + .../integrationicons/qbo-icon-square.svg | 15 +- .../integrationicons/xero-icon-square.svg | 33 +- assets/images/invoice-generic.svg | 16 +- assets/images/money-search.svg | 1 + assets/images/money-waving.svg | 82 +- assets/images/new-expensify-adhoc.svg | 32 +- assets/images/new-expensify-dev.svg | 28 +- assets/images/new-expensify-stg.svg | 36 +- assets/images/plane.svg | 1 + assets/images/play.svg | 7 +- .../emptystate__travel.svg | 1 + assets/images/qrcode.svg | 15 +- assets/images/receipt-plus.svg | 13 +- assets/images/receipt-scan.svg | 15 +- assets/images/receipt-slash.svg | 1 + .../simple-illustration__abacus.svg | 44 +- .../simple-illustration__accounting.svg | 33 +- .../simple-illustration__alert.svg | 16 +- .../simple-illustration__binoculars.svg | 51 +- .../simple-illustration__car-ice.svg | 54 +- .../simple-illustration__car.svg | 26 +- .../simple-illustration__checkmarkcircle.svg | 1 + .../simple-illustration__coins.svg | 27 +- .../simple-illustration__company-card.svg | 39 +- .../simple-illustration__creditcardeyes.svg | 1 + .../simple-illustration__lightbulb.svg | 34 +- .../simple-illustration__pencil.svg | 21 +- .../simple-illustration__piggybank.svg | 51 +- .../simple-illustration__receiptupload.svg | 23 +- .../simple-illustration__sendmoney.svg | 1 + .../simple-illustration__splitbill.svg | 56 +- ...mple-illustration__subscription-annual.svg | 1 + .../simple-illustration__subscription-ppu.svg | 1 + .../simple-illustration__tag.svg | 34 +- .../simple-illustration__teachers-unite.svg | 50 +- .../simple-illustration__treasurechest.svg | 2 +- .../simple-illustration__workflows.svg | 154 +- assets/images/stopwatch.svg | 2 +- ...scription-details__approvedlogo--light.svg | 1 + .../subscription-details__approvedlogo.svg | 1 + assets/images/suitcase.svg | 4 +- assets/images/tag.svg | 13 +- assets/images/thread.svg | 4 +- assets/images/x-circle.svg | 13 +- babel.config.js | 16 +- config/electronBuilder.config.js | 6 + config/webpack/webpack.common.ts | 17 +- contributingGuides/APPLE_GOOGLE_SIGNIN.md | 171 +- contributingGuides/CONTRIBUTING.md | 2 +- contributingGuides/STYLE.md | 65 +- desktop/createDownloadQueue.ts | 8 +- desktop/main.ts | 5 +- docs/Hidden/Instructions | 1 + .../Manually-submit-reports-for-approval.md | 0 docs/README.md | 9 + docs/_data/_routes.yml | 4 +- docs/_sass/_main.scss | 8 +- .../company-cards/Troubleshooting.md | 7 +- ...ok-For-Small-To-Medium-Sized-Businesses.md | 13 +- ...laybook-For-US-Based-VC-Backed-Startups.md | 11 +- ...d-custom-fields-to-reports-and-invoices.md | 27 + .../reports/Set-default-report-title.md | 17 + .../travel/Approve-travel-expenses.md | 37 + .../travel/Book-with-Expensify-Travel.md | 89 + ...Configure-travel-policy-and-preferences.md | 65 + .../Edit-or-cancel-travel-arrangements.md | 28 + .../reports/Report-Fields-And-Titles.md | 43 - .../workspaces/reports/Scheduled-Submit.md | 43 - .../chat/Expensify-Chat-For-Admins.md | 27 - .../Connect-a-Business-Bank-Account.md | 92 +- .../expenses/Set-up-your-wallet.md | 52 + ...d-Expensify-Card-to-Apple-or-Google-Pay.md | 32 + .../Dispute-Expensify-Card-transaction.md | 73 + ...ate-your-Expensify-Card-mailing-address.md | 29 + ...ade-to-the-new-Expensify-Card-from-Visa.md | 2 +- .../settings/Add-profile-photo.md | 21 + .../travel/Approve-travel-expenses.md | 37 + .../travel/Book-with-Expensify-Travel.md | 89 + .../new-expensify/travel/Coming-Soon.md | 6 - ...Configure-travel-policy-and-preferences.md | 65 + .../Edit-or-cancel-travel-arrangements.md | 28 + .../assets/images/AdminissuedVirtualCards.png | Bin 157289 -> 153606 bytes ...pensifyHelp_ConnectBankAccount_1_Light.png | Bin 0 -> 140089 bytes ...pensifyHelp_ConnectBankAccount_2_Light.png | Bin 0 -> 138986 bytes .../ExpensifyHelp_R1_CreateWorkspace_1.png | Bin 0 -> 248297 bytes .../ExpensifyHelp_R1_CreateWorkspace_2.png | Bin 0 -> 216090 bytes .../ExpensifyHelp_R1_CreateWorkspace_3.png | Bin 0 -> 184644 bytes .../ExpensifyHelp_R1_InviteMembers_1.png | Bin 0 -> 77840 bytes .../ExpensifyHelp_R1_InviteMembers_2.png | Bin 0 -> 109703 bytes .../ExpensifyHelp_R1_InviteMembers_3.png | Bin 0 -> 153513 bytes .../images/ExpensifyHelp_R2_Profile_1.png | Bin 0 -> 170078 bytes .../images/ExpensifyHelp_R3_Categories_1.png | Bin 0 -> 121363 bytes .../assets/images/ExpensifyHelp_R4_Tags_1.png | Bin 0 -> 162915 bytes .../assets/images/ExpensifyHelp_R4_Tags_2.png | Bin 0 -> 112397 bytes .../images/ExpensifyHelp_R5_Wallet_1.png | Bin 0 -> 160199 bytes docs/assets/images/domains.svg | 45 +- docs/assets/images/plane.svg | 35 +- ...imple-illustration__monitor-remotesync.svg | 1 + docs/assets/js/main.js | 51 +- docs/redirects.csv | 27 +- ios/.xcode.env | 5 + ios/NewExpensify/Info.plist | 4 +- ios/NewExpensifyTests/Info.plist | 4 +- ios/NotificationServiceExtension/Info.plist | 4 +- ios/Podfile | 2 +- ios/Podfile.lock | 59 +- jest/setup.ts | 7 +- package-lock.json | 1668 ++++++------ package.json | 46 +- ...fy+react-native-live-markdown+0.1.85.patch | 13 + patches/@react-navigation+native+6.1.12.patch | 11 +- patches/@shopify+flash-list+1.6.3.patch | 30 +- ...t-native+0.73.4+016+fixClippedEmojis.patch | 47 + ...3.4+016+iOS-textinput-onscroll-event.patch | 70 + ...iOS-fix-whitespace-support-sourcemap.patch | 37 + ...ive-keyboard-controller+1.12.2.patch.patch | 39 + patches/react-native-modal+13.0.1.patch | 14 +- ...eact-native-web+0.19.12+001+initial.patch} | 16 +- ...ative-web+0.19.12+002+fixLastSpacer.patch} | 0 ...eb+0.19.12+003+image-header-support.patch} | 12 +- ...web+0.19.12+004+fixPointerEventDown.patch} | 0 ...ive-web+0.19.12+005+osr-improvement.patch} | 0 ....12+006+remove focus trap from modal.patch | 20 + ...ative-web+0.19.9+002+measureInWindow.patch | 13 - ...-pdf+7.7.1.patch => react-pdf+7.7.3.patch} | 2 +- police.diff | 889 ++++++ scripts/.eslintrc.js | 10 + scripts/release-profile.ts | 16 +- scripts/shellUtils.sh | 16 +- scripts/symbolicate-profile.ts | 174 ++ scripts/tsconfig.json | 6 + scripts/utils/Logger.ts | 37 + scripts/utils/parseCommandLineArguments.ts | 19 + src/App.tsx | 4 +- src/CONST.ts | 174 +- src/Expensify.tsx | 20 +- src/ONYXKEYS.ts | 54 +- src/ROUTES.ts | 150 +- src/SCREENS.ts | 37 +- src/TIMEZONES.ts | 15 +- .../index.tsx} | 4 +- .../ActiveWorkspaceProvider/index.website.tsx | 29 + .../PaymentCardCurrencyModal.tsx} | 13 +- .../AddPaymentCard/PaymentCardForm.tsx | 322 +++ src/components/AddPaymentMethodMenu.tsx | 2 +- src/components/AddPlaidBankAccount.tsx | 72 +- src/components/AddressForm.tsx | 76 +- src/components/AddressSearch/types.ts | 3 +- src/components/AmountForm.tsx | 7 +- src/components/AmountPicker/index.tsx | 6 - src/components/AmountPicker/types.ts | 3 +- .../BaseAnchorForAttachmentsOnly.tsx | 2 +- .../BaseAnchorForCommentsOnly.tsx | 8 +- src/components/ArchivedReportFooter.tsx | 10 +- src/components/AttachmentContext.ts | 22 + src/components/AttachmentModal.tsx | 122 +- .../AttachmentPicker/index.native.tsx | 10 +- .../AttachmentCarousel/CarouselButtons.tsx | 8 +- ...ntsFromReport.ts => extractAttachments.ts} | 32 +- .../AttachmentCarousel/index.native.tsx | 20 +- .../Attachments/AttachmentCarousel/index.tsx | 27 +- .../Attachments/AttachmentCarousel/types.ts | 8 + .../AttachmentViewVideo/index.tsx | 6 +- .../Attachments/AttachmentView/index.tsx | 2 +- .../getBottomSuggestionPadding/index.ios.ts | 5 + .../getBottomSuggestionPadding/index.ts | 5 + .../index.native.tsx | 33 + .../AutoCompleteSuggestionsPortal/index.tsx | 43 + .../AutoCompleteSuggestionsPortal/types.ts | 13 + .../BaseAutoCompleteSuggestions.tsx | 71 +- .../AutoCompleteSuggestions/index.native.tsx | 17 - .../AutoCompleteSuggestions/index.tsx | 138 +- .../AutoCompleteSuggestions/types.ts | 17 +- src/components/AutoEmailLink.tsx | 6 +- src/components/Avatar.tsx | 12 +- .../AvatarCropModal/AvatarCropModal.tsx | 21 +- src/components/AvatarWithDisplayName.tsx | 23 +- src/components/AvatarWithImagePicker.tsx | 5 +- src/components/AvatarWithIndicator.tsx | 1 + src/components/Banner.tsx | 23 +- src/components/BigNumberPad.tsx | 4 +- src/components/BlockedReportFooter.tsx | 2 +- src/components/BlockingViews/BlockingView.tsx | 22 +- src/components/Breadcrumbs.tsx | 2 +- src/components/Button/index.tsx | 8 +- src/components/CaretWrapper.tsx | 29 + src/components/ChatDetailsQuickActionsBar.tsx | 64 - src/components/CheckboxWithLabel.tsx | 3 +- src/components/Composer/index.native.tsx | 11 +- src/components/Composer/index.tsx | 27 +- src/components/Composer/types.ts | 13 +- src/components/ConfirmModal.tsx | 18 +- src/components/ConfirmedRoute.tsx | 25 +- .../index.native.tsx | 4 +- .../ConnectToQuickbooksOnlineButton/index.tsx | 5 +- .../ConnectToXeroButton/index.native.tsx | 2 +- src/components/ConnectionLayout.tsx | 47 +- src/components/ContextMenuItem.tsx | 5 + src/components/CountrySelector.tsx | 3 +- .../CurrencySelectionList/index.tsx | 3 +- .../CustomStatusBarAndBackground/index.tsx | 5 - .../CustomStylesForChildrenProvider.tsx | 21 + .../DatePicker/CalendarPicker/index.tsx | 4 +- src/components/DatePicker/index.tsx | 6 +- .../DeeplinkWrapper/index.website.tsx | 2 +- .../DisplayNames/DisplayNamesWithTooltip.tsx | 2 +- .../DistanceMapView/index.android.tsx | 3 + src/components/DotIndicatorMessage.tsx | 11 +- src/components/DragAndDrop/Provider/index.tsx | 2 +- src/components/EReceipt.tsx | 4 +- src/components/EmojiPicker/EmojiPicker.tsx | 8 +- .../EmojiPickerMenu/BaseEmojiPickerMenu.tsx | 6 +- .../EmojiPickerMenu/index.native.tsx | 6 +- .../EmojiPicker/EmojiPickerMenu/index.tsx | 17 +- src/components/EmojiSuggestions.tsx | 19 +- src/components/FeatureList.tsx | 25 +- src/components/FeedbackSurvey.tsx | 106 + .../FocusTrap/BOTTOM_TAB_SCREENS.ts | 6 + .../FocusTrapForModalProps.ts | 6 + .../FocusTrap/FocusTrapForModal/index.tsx | 9 + .../FocusTrap/FocusTrapForModal/index.web.tsx | 24 + .../FocusTrapForScreen/FocusTrapProps.ts | 5 + .../FocusTrap/FocusTrapForScreen/index.tsx | 9 + .../FocusTrapForScreen/index.web.tsx | 72 + .../FocusTrap/SCREENS_WITH_AUTOFOCUS.ts | 15 + src/components/FocusTrap/TOP_TAB_SCREENS.ts | 5 + .../FocusTrap/WIDE_LAYOUT_INACTIVE_SCREENS.ts | 37 + src/components/FocusTrap/sharedTrapStack.ts | 6 + src/components/FocusableMenuItem.tsx | 2 +- src/components/Form/FormProvider.tsx | 15 +- src/components/Form/types.ts | 3 +- src/components/FormAlertWithSubmitButton.tsx | 3 +- src/components/FormAlertWrapper.tsx | 3 +- src/components/FormHelpMessage.tsx | 7 +- .../GrowlNotificationContainer/index.tsx | 6 +- .../BaseHTMLEngineProvider.tsx | 7 +- .../HTMLRenderers/AnchorRenderer.tsx | 4 +- .../HTMLRenderers/EditedRenderer.tsx | 6 +- .../HTMLRenderers/ImageRenderer.tsx | 39 +- .../HTMLRenderers/MentionReportRenderer.tsx | 9 +- .../HTMLRenderers/MentionUserRenderer.tsx | 6 +- .../HTMLRenderers/PreRenderer.tsx | 2 +- .../HTMLRenderers/VideoRenderer.tsx | 6 +- src/components/HTMLEngineProvider/index.tsx | 6 +- src/components/Header.tsx | 4 +- src/components/HeaderPageLayout.tsx | 6 +- src/components/HeaderWithBackButton/index.tsx | 4 +- src/components/Hoverable/ActiveHoverable.tsx | 13 +- src/components/Icon/Expensicons.ts | 26 + src/components/Icon/Illustrations.ts | 16 + src/components/Icon/__mocks__/Expensicons.ts | 5 +- .../Image/ImageBehaviorContextProvider.tsx | 18 + src/components/Image/index.tsx | 13 +- src/components/Image/sourcePropTypes/index.js | 13 - .../Image/sourcePropTypes/index.native.js | 12 - src/components/ImageView/index.tsx | 11 +- src/components/InitialURLContextProvider.tsx | 15 +- .../BaseInvertedFlatList/index.e2e.tsx | 8 +- .../CellRendererComponent.tsx | 2 +- src/components/KYCWall/BaseKYCWall.tsx | 2 +- .../LHNOptionsList/LHNOptionsList.tsx | 163 +- .../LHNOptionsList/OptionRowLHN.tsx | 35 +- .../LHNOptionsList/OptionRowLHNData.tsx | 2 +- src/components/LHNOptionsList/types.ts | 30 +- src/components/Lightbox/index.tsx | 7 +- src/components/LocaleContextProvider.tsx | 12 +- src/components/LottieAnimations/index.tsx | 5 + src/components/MagicCodeInput.tsx | 3 +- src/components/MapView/MapView.tsx | 131 +- src/components/MapView/MapView.website.tsx | 87 +- src/components/MapView/MapViewTypes.ts | 3 + src/components/MapView/PendingMapView.tsx | 12 +- src/components/MapView/utils.ts | 26 + src/components/MentionSuggestions.tsx | 12 +- src/components/MenuItem.tsx | 551 ++-- src/components/MenuItemGroup.tsx | 2 +- src/components/MessagesRow.tsx | 3 +- src/components/Modal/BaseModal.tsx | 136 +- src/components/Modal/ModalContext.ts | 15 + src/components/Modal/index.tsx | 2 +- src/components/Modal/types.ts | 3 + src/components/MoneyReportHeader.tsx | 78 +- src/components/MoneyRequestAmountInput.tsx | 53 +- .../MoneyRequestConfirmationList.tsx | 272 +- src/components/MoneyRequestHeader.tsx | 91 +- src/components/MultiGestureCanvas/utils.ts | 19 +- src/components/OfflineIndicator.tsx | 31 +- src/components/OfflineWithFeedback.tsx | 13 +- src/components/OnboardingWelcomeVideo.tsx | 2 +- src/components/OptionListContextProvider.tsx | 37 +- src/components/OptionsPicker/OptionItem.tsx | 78 + src/components/OptionsPicker/index.tsx | 82 + .../PDFThumbnail/PDFThumbnailError.tsx | 25 + src/components/PDFThumbnail/index.native.tsx | 20 +- src/components/PDFThumbnail/index.tsx | 25 +- src/components/PDFThumbnail/types.ts | 3 + src/components/PDFView/PDFPasswordForm.tsx | 12 +- src/components/PDFView/index.native.tsx | 6 +- src/components/PDFView/index.tsx | 11 +- src/components/ParentNavigationSubtitle.tsx | 8 +- src/components/Picker/types.ts | 3 +- src/components/Popover/index.tsx | 6 +- src/components/PopoverMenu.tsx | 120 +- src/components/PopoverWithMeasuredContent.tsx | 9 + .../GenericPressable/BaseGenericPressable.tsx | 23 +- .../Pressable/PressableWithFeedback.tsx | 2 +- src/components/ProcessMoneyReportHoldMenu.tsx | 11 +- .../BaseProfilingToolMenu.tsx | 1 + src/components/PromotedActionsBar.tsx | 116 + src/components/RadioButtonWithLabel.tsx | 5 +- src/components/RadioButtons.tsx | 3 +- .../Reactions/EmojiReactionBubble.tsx | 6 +- src/components/ReceiptImage.tsx | 7 +- .../ChronosOOOListActions.tsx | 9 +- .../ReportActionItem/MoneyReportView.tsx | 8 +- .../ReportActionItem/MoneyRequestAction.tsx | 12 +- .../MoneyRequestPreviewContent.tsx | 101 +- .../MoneyRequestPreview/index.tsx | 2 +- .../MoneyRequestPreview/types.ts | 3 + .../ReportActionItem/MoneyRequestView.tsx | 230 +- .../ReportActionItem/RenameAction.tsx | 8 +- .../ReportActionItemImage.tsx | 29 +- .../ReportActionItemImages.tsx | 48 +- .../ReportActionItem/ReportPreview.tsx | 76 +- .../ReportActionItem/TaskPreview.tsx | 36 +- .../ReportActionItem/TripDetailsView.tsx | 173 ++ .../ReportActionItem/TripRoomPreview.tsx | 201 ++ src/components/ReportHeaderSkeletonView.tsx | 12 +- src/components/ReportWelcomeText.tsx | 26 +- src/components/RoomHeaderAvatars.tsx | 4 +- src/components/RoomNameInput/types.ts | 3 +- src/components/ScreenWrapper.tsx | 95 +- src/components/Search.tsx | 125 +- src/components/Section/IconSection.tsx | 12 +- src/components/Section/index.tsx | 79 +- src/components/SectionList/index.android.tsx | 2 +- src/components/SelectionList/BaseListItem.tsx | 17 +- .../SelectionList/BaseSelectionList.tsx | 160 +- .../SelectionList/InviteMemberListItem.tsx | 4 +- .../SelectionList/RadioListItem.tsx | 3 +- .../Search/ExpenseItemHeaderNarrow.tsx | 18 +- .../SelectionList/Search/ReportListItem.tsx | 161 +- .../SelectionList/Search/TextWithIconCell.tsx | 6 +- .../Search/TransactionListItem.tsx | 19 +- .../Search/TransactionListItemRow.tsx | 270 +- .../SelectionList/Search/UserInfoCell.tsx | 12 +- .../SelectionList/SearchTableHeader.tsx | 162 +- .../SelectionList/SearchTableHeaderColumn.tsx | 31 - .../SelectionList/SortableHeaderText.tsx | 76 + .../SelectionList/TableListItem.tsx | 2 - src/components/SelectionList/UserListItem.tsx | 6 +- src/components/SelectionList/types.ts | 98 +- src/components/SelectionScreen.tsx | 23 +- src/components/SettlementButton.tsx | 42 +- src/components/ShowContextMenuContext.ts | 9 +- .../AppleSignIn/index.android.tsx | 8 +- .../SignInButtons/AppleSignIn/index.ios.tsx | 8 +- .../SignInButtons/AppleSignIn/index.tsx | 3 + .../GoogleSignIn/index.native.tsx | 8 +- .../SignInButtons/GoogleSignIn/index.tsx | 3 + src/components/SingleChoiceQuestion.tsx | 3 +- src/components/SingleOptionSelector.tsx | 25 +- src/components/StateSelector.tsx | 5 +- src/components/SubscriptAvatar.tsx | 4 +- src/components/Switch.tsx | 7 +- src/components/TagPicker/index.tsx | 2 + src/components/TaskHeaderActionButton.tsx | 2 +- src/components/TaxPicker.tsx | 38 +- src/components/TestToolMenu.tsx | 22 +- src/components/TestToolsModal.tsx | 24 +- src/components/Text.tsx | 5 +- src/components/TextBlock.tsx | 39 + .../TextInput/BaseTextInput/index.native.tsx | 4 +- .../TextInput/BaseTextInput/index.tsx | 12 +- .../BaseTextInput/isTextInputFocused.ts | 7 + .../TextInput/BaseTextInput/types.ts | 5 +- src/components/TextInput/index.tsx | 2 +- .../TextInputWithCurrencySymbol/types.ts | 7 +- src/components/TextPicker/index.tsx | 6 - src/components/TextPicker/types.ts | 3 +- src/components/ThreeDotsMenu/index.tsx | 1 + src/components/ThumbnailImage.tsx | 8 +- src/components/TimePicker/TimePicker.tsx | 10 +- .../BaseGenericTooltip/index.native.tsx | 132 + .../index.tsx} | 54 +- .../Tooltip/BaseGenericTooltip/types.ts | 33 + src/components/Tooltip/BaseTooltip/index.tsx | 178 +- .../BaseEducationalTooltip.tsx | 58 + .../getBounds/index.native.ts | 6 + .../EducationalTooltip/getBounds/index.ts | 6 + .../EducationalTooltip/getBounds/types.ts | 5 + .../Tooltip/EducationalTooltip/index.tsx | 22 + src/components/Tooltip/GenericTooltip.tsx | 178 ++ .../Tooltip/PopoverAnchorTooltip.tsx | 10 +- src/components/Tooltip/types.ts | 45 +- src/components/UnitPicker.tsx | 2 +- .../BaseUserDetailsTooltip/index.tsx | 4 +- .../ValidateCode/JustSignedInModal.tsx | 13 +- src/components/ValuePicker/types.ts | 3 +- .../VideoPlayer/BaseVideoPlayer.tsx | 4 +- .../VideoPlayerContexts/PlaybackContext.tsx | 4 +- .../VideoPopoverMenuContext.tsx | 4 +- src/components/VideoPlayerContexts/types.ts | 3 +- .../VideoPlayerThumbnail.tsx | 4 +- src/components/VideoPlayerPreview/index.tsx | 8 +- src/components/WalletStatementModal/index.tsx | 4 +- src/components/WalletStatementModal/types.ts | 7 +- src/components/WorkspaceEmptyStateSection.tsx | 24 +- src/components/WorkspaceSwitcherButton.tsx | 10 +- src/components/avatarPropTypes.js | 11 - src/components/categoryPropTypes.js | 9 - src/components/createOnyxContext.tsx | 2 +- src/components/optionPropTypes.js | 65 - src/components/participantPropTypes.js | 28 - src/components/tagPropTypes.js | 21 - src/components/withCurrentReportID.tsx | 14 +- src/components/withKeyboardState.tsx | 13 +- src/components/withLocalize.tsx | 29 - src/components/withStyleUtils.tsx | 6 +- src/components/withTheme.tsx | 5 - src/components/withThemeStyles.tsx | 5 - .../withWindowDimensions/index.native.tsx | 22 +- src/components/withWindowDimensions/index.tsx | 22 +- src/hooks/useArrowKeyFocusManager.ts | 11 +- src/hooks/useAutoFocusInput.ts | 3 + src/hooks/useBasePopoverReactionList/index.ts | 2 + src/hooks/useCancelSearchOnModalClose.ts | 17 + src/hooks/useCopySelectionHelper.ts | 7 +- src/hooks/useCurrentUserPersonalDetails.ts | 2 +- src/hooks/useDeepCompareRef.ts | 24 + src/hooks/useGeographicalStateFromRoute.ts | 2 +- src/hooks/useHtmlPaste/index.ts | 25 +- src/hooks/useMarkdownStyle.ts | 43 +- src/hooks/useMouseContext.tsx | 33 + src/hooks/useNetwork.ts | 9 +- src/hooks/usePreferredCurrency.ts | 33 + src/hooks/useReportIDs.tsx | 40 +- .../useReportScrollManager/index.native.ts | 17 +- src/hooks/useReportScrollManager/index.ts | 15 +- src/hooks/useResponsiveLayout.ts | 75 +- src/hooks/useStepFormSubmit.ts | 15 +- src/hooks/useSubscriptionPlan.ts | 32 + src/hooks/useSubscriptionPrice.ts | 62 + src/hooks/useSyncFocus/index.ts | 10 +- src/hooks/useViolations.ts | 26 +- src/languages/en.ts | 460 +++- src/languages/es.ts | 388 ++- src/languages/types.ts | 13 +- src/libs/API/index.ts | 17 + .../AddSubscriptionPaymentCardParams.ts | 11 + src/libs/API/parameters/BeginSignInParams.ts | 1 + .../CompleteEngagementModalParams.ts | 10 - .../parameters/CompleteGuidedSetupParams.ts | 1 + .../API/parameters/CompleteSplitBillParams.ts | 2 + .../API/parameters/DismissViolationParams.ts | 6 + .../parameters/GenerateSpotnanaTokenParams.ts | 5 + src/libs/API/parameters/PayInvoiceParams.ts | 9 + .../API/parameters/RenamePolicyTaglist.ts | 7 - .../parameters/RenamePolicyTaglistParams.ts | 8 + .../API/parameters/RenamePolicyTagsParams.ts | 1 + src/libs/API/parameters/Search.ts | 6 +- .../API/parameters/SearchForReportsParams.ts | 1 + src/libs/API/parameters/SendInvoiceParams.ts | 41 +- .../API/parameters/SetPolicyTagsEnabled.ts | 5 + .../API/parameters/SetPolicyTagsRequired.ts | 7 + .../SetWorkspaceAutoReportingParams.ts | 6 - src/libs/API/parameters/SignUpUserParams.ts | 9 + src/libs/API/parameters/SplitBillParams.ts | 2 + .../API/parameters/StartSplitBillParams.ts | 2 + .../API/parameters/SyncPolicyToXeroParams.ts | 6 + src/libs/API/parameters/TrackExpenseParams.ts | 1 + ...scriptionAddNewUsersAutomaticallyParams.ts | 5 + .../UpdateSubscriptionAutoRenewParams.ts | 9 + .../UpdateSubscriptionSizeParams.ts | 5 + .../UpdateSubscriptionTypeParams.ts | 7 + src/libs/API/parameters/index.ts | 15 +- src/libs/API/types.ts | 35 +- src/libs/AccountUtils.ts | 5 +- src/libs/ActiveClientManager/index.ts | 2 +- src/libs/BankAccountUtils.ts | 2 +- src/libs/ComposerFocusManager.ts | 5 +- src/libs/ComposerUtils/index.ts | 3 +- src/libs/CurrencyUtils.ts | 54 +- src/libs/DateUtils.ts | 102 +- src/libs/DistanceRequestUtils.ts | 110 +- src/libs/E2E/client.ts | 3 +- src/libs/E2E/tests/linkingTest.e2e.ts | 53 +- src/libs/E2E/utils/NetworkInterceptor.ts | 40 + src/libs/EmojiTrie.ts | 33 +- src/libs/EmojiUtils.ts | 40 +- src/libs/Environment/Environment.ts | 24 +- .../Environment/betaChecker/index.android.ts | 4 +- src/libs/Environment/betaChecker/index.ios.ts | 2 +- src/libs/Environment/betaChecker/index.ts | 2 +- src/libs/Environment/betaChecker/types.ts | 6 +- src/libs/ErrorUtils.ts | 48 +- src/libs/Fullstory/index.native.ts | 11 +- src/libs/Fullstory/index.ts | 6 +- src/libs/GetStyledTextArray.ts | 7 +- src/libs/HeaderUtils.ts | 11 + src/libs/HttpUtils.ts | 33 +- src/libs/IOUUtils.ts | 5 +- src/libs/IntlPolyfill/index.ts | 2 - .../IntlPolyfill/polyfillDateTimeFormat.ts | 27 +- src/libs/KeyboardShortcut/index.ts | 2 +- src/libs/LocalePhoneNumber.ts | 5 +- src/libs/LocaleUtils.ts | 4 +- src/libs/Localize/index.ts | 42 +- src/libs/Log.ts | 5 +- src/libs/LoginUtils.ts | 3 +- .../Middleware/HandleUnusedOptimisticID.ts | 10 + src/libs/ModifiedExpenseMessage.ts | 24 +- src/libs/MoneyRequestUtils.ts | 21 +- .../Navigation/AppNavigator/AuthScreens.tsx | 30 +- .../ModalNavigatorScreenOptions.ts | 5 +- .../ModalStackNavigators/index.tsx | 43 +- .../BaseCentralPaneNavigator.tsx | 5 +- .../Navigators/FullScreenNavigator.tsx | 34 +- .../Navigators/LeftModalNavigator.tsx | 9 +- .../Navigators/OnboardingModalNavigator.tsx | 71 +- .../Navigators/RightModalNavigator.tsx | 19 +- .../index.tsx} | 50 +- .../BottomTabBar/index.website.tsx | 135 + .../createCustomStackNavigator/index.tsx | 20 +- .../AppNavigator/getPartialStateDiff.ts | 4 +- .../Navigation/AppNavigator/index.native.tsx | 38 + src/libs/Navigation/AppNavigator/index.tsx | 24 +- src/libs/Navigation/Navigation.ts | 22 +- src/libs/Navigation/NavigationRoot.tsx | 7 +- src/libs/Navigation/dismissModal.ts | 2 +- src/libs/Navigation/dismissModalWithReport.ts | 2 +- src/libs/Navigation/linkTo/index.ts | 48 +- .../CENTRAL_PANE_TO_RHP_MAPPING.ts | 1 + .../FULL_SCREEN_TO_RHP_MAPPING.ts | 6 +- .../TAB_TO_CENTRAL_PANE_MAPPING.ts | 1 + src/libs/Navigation/linkingConfig/config.ts | 87 +- .../linkingConfig/getAdaptedStateFromPath.ts | 34 +- .../getMatchingBottomTabRouteForState.ts | 9 + .../index.android.ts | 74 + .../setupCustomAndroidBackHandler/index.ts | 4 + src/libs/Navigation/switchPolicyID.ts | 2 +- src/libs/Navigation/types.ts | 78 +- src/libs/Network/NetworkStore.ts | 12 +- src/libs/Network/SequentialQueue.ts | 31 +- src/libs/Network/enhanceParameters.ts | 2 +- src/libs/NetworkConnection.ts | 141 +- src/libs/NextStepUtils.ts | 2 +- .../LocalNotification/BrowserNotifications.ts | 10 +- .../subscribePushNotification/index.ts | 16 +- src/libs/OnyxAwareParser.ts | 52 + src/libs/OptionsListUtils.ts | 423 ++- src/libs/Performance.tsx | 4 +- src/libs/Permissions.ts | 15 + src/libs/PersonalDetailsUtils.ts | 6 +- src/libs/PhoneNumber.ts | 2 +- src/libs/PolicyDistanceRatesUtils.ts | 18 +- src/libs/PolicyUtils.ts | 127 +- src/libs/Pusher/pusher.ts | 4 +- src/libs/PusherUtils.ts | 1 + src/libs/ReceiptUtils.ts | 4 +- src/libs/ReportActionComposeFocusManager.ts | 2 +- src/libs/ReportActionsUtils.ts | 503 ++-- src/libs/ReportUtils.ts | 1277 +++++---- src/libs/SearchUtils.ts | 234 +- src/libs/SelectionScraper/index.ts | 2 +- src/libs/SessionUtils.ts | 2 +- src/libs/SidebarUtils.ts | 91 +- src/libs/StringUtils.ts | 11 +- src/libs/SubscriptionUtils.ts | 135 + src/libs/TaskUtils.ts | 7 +- src/libs/TooltipRefManager.tsx | 16 + src/libs/TransactionUtils.ts | 147 +- src/libs/Trie/index.ts | 2 +- src/libs/TripReservationUtils.ts | 27 + src/libs/UnreadIndicatorUpdater/index.ts | 15 +- src/libs/Url.ts | 9 +- src/libs/UserUtils.ts | 3 +- src/libs/ValidationUtils.ts | 43 +- src/libs/Violations/ViolationsUtils.ts | 73 +- src/libs/Violations/propTypes.ts | 32 - src/libs/actions/App.ts | 14 +- src/libs/actions/BankAccounts.ts | 23 +- src/libs/actions/Card.ts | 6 +- .../Device/generateDeviceID/index.android.ts | 2 +- .../actions/Device/generateDeviceID/index.ts | 2 +- .../getOSAndName/index.native.ts | 2 +- .../getDeviceInfo/getOSAndName/index.ts | 2 +- src/libs/actions/Device/index.ts | 4 +- src/libs/actions/ExitSurvey.ts | 3 +- src/libs/actions/IOU.ts | 781 ++++-- src/libs/actions/Link.ts | 40 +- src/libs/actions/MapboxToken.ts | 8 +- src/libs/actions/Network.ts | 15 +- .../utils/DeferredOnyxUpdates.ts | 13 +- .../actions/OnyxUpdateManager/utils/index.ts | 14 +- src/libs/actions/OnyxUpdates.ts | 25 +- src/libs/actions/PaymentMethods.ts | 60 + src/libs/actions/PersonalDetails.ts | 2 +- src/libs/actions/Policy/Category.ts | 71 +- src/libs/actions/Policy/DistanceRate.ts | 681 +++++ src/libs/actions/Policy/Member.ts | 805 ++++++ src/libs/actions/Policy/Policy.ts | 2417 +++-------------- src/libs/actions/Policy/Tag.ts | 709 +++++ src/libs/actions/PriorityMode.ts | 8 +- src/libs/actions/PushNotification.ts | 4 +- .../resetFreePlanBankAccount.ts | 1 - .../actions/ReimbursementAccount/store.ts | 2 +- src/libs/actions/Report.ts | 412 ++- src/libs/actions/ReportActions.ts | 36 +- src/libs/actions/Search.ts | 38 +- src/libs/actions/Session/index.ts | 55 +- src/libs/actions/SignInRedirect.ts | 2 +- src/libs/actions/Subscription.ts | 234 ++ src/libs/actions/Task.ts | 60 +- src/libs/actions/TaxRate.ts | 27 +- src/libs/actions/TeachersUnite.ts | 2 +- src/libs/actions/Transaction.ts | 116 +- src/libs/actions/TransactionEdit.ts | 2 +- src/libs/actions/User.ts | 28 +- src/libs/actions/Wallet.ts | 7 +- src/libs/actions/Welcome.ts | 15 +- src/libs/actions/connections/ConnectToXero.ts | 20 +- .../actions/connections/QuickBooksOnline.ts | 39 +- src/libs/actions/connections/index.ts | 77 +- .../index.android.ts | 15 - src/libs/checkInternetReachability/index.ts | 5 - src/libs/checkInternetReachability/types.ts | 3 - src/libs/compose.ts | 71 - src/libs/fileDownload/FileUtils.ts | 10 +- src/libs/getReportPolicyID.ts | 33 - .../getSplashBackgroundColor/index.native.ts | 7 - src/libs/getSplashBackgroundColor/index.ts | 7 - src/libs/isPdfFilePasswordProtected/index.tsx | 39 + src/libs/isPublicScreenRoute.ts | 8 + src/libs/isReportMessageAttachment.ts | 2 +- .../KeyReportActionsDraftByReportActionID.ts | 4 +- src/libs/migrations/NVPMigration.ts | 3 +- src/libs/migrations/PronounsMigration.ts | 4 +- .../RemoveEmptyReportActionsDrafts.ts | 4 +- src/libs/migrations/RenameCardIsVirtual.ts | 20 +- src/libs/migrations/RenameReceiptFilename.ts | 16 +- .../TransactionBackupsToCollection.ts | 4 +- src/libs/models/BankAccount.ts | 8 +- .../index.android.tsx | 5 + .../index.tsx | 5 + .../types.ts | 3 + src/libs/updateMultilineInputRange/index.ts | 4 +- src/pages/AddPersonalBankAccountPage.tsx | 4 +- src/pages/ChatFinderPage/index.tsx | 11 +- src/pages/DetailsPage.tsx | 189 -- src/pages/EditReportFieldDate.tsx | 4 +- src/pages/EditReportFieldDropdown.tsx | 2 + src/pages/EditReportFieldPage.tsx | 10 +- src/pages/EditReportFieldText.tsx | 4 +- .../AddBankAccount/AddBankAccount.tsx | 10 +- .../AddBankAccount/SetupMethod.tsx | 6 +- .../substeps/ConfirmationStep.tsx | 22 +- .../EnablePayments/AdditionalDetailsStep.tsx | 14 +- src/pages/EnablePayments/EnablePayments.tsx | 70 + .../FeesAndTerms/FeesAndTerms.tsx | 18 +- .../FeesAndTerms/substeps/FeesStep.tsx | 2 +- .../FeesAndTerms/substeps/TermsStep.tsx | 43 +- src/pages/EnablePayments/OnfidoPrivacy.tsx | 2 +- .../PersonalInfo/PersonalInfo.tsx | 36 +- .../PersonalInfo/substeps/AddressStep.tsx | 35 +- .../substeps/ConfirmationStep.tsx | 2 +- .../PersonalInfo/substeps/DateOfBirthStep.tsx | 33 +- .../PersonalInfo/substeps/FullNameStep.tsx | 29 +- .../PersonalInfo/substeps/PhoneNumberStep.tsx | 22 +- .../substeps/SocialSecurityNumberStep.tsx | 24 +- .../TermsPage/LongTermsForm.tsx | 4 +- .../TermsPage/ShortTermsForm.tsx | 6 +- src/pages/EnablePayments/TermsStep.tsx | 6 +- .../VerifyIdentity/VerifyIdentity.tsx | 111 + .../EnablePayments/utils/getSubstepValues.ts | 13 +- src/pages/FlagCommentPage.tsx | 12 +- src/pages/GetAssistancePage.tsx | 4 +- src/pages/GroupChatNameEditPage.tsx | 30 +- src/pages/InviteReportParticipantsPage.tsx | 67 +- src/pages/NewChatConfirmPage.tsx | 74 +- src/pages/NewChatPage.tsx | 14 +- .../BaseOnboardingPersonalDetails.tsx | 21 +- src/pages/OnboardingPersonalDetails/index.tsx | 19 +- .../BaseOnboardingPurpose.tsx | 12 +- src/pages/OnboardingPurpose/index.native.tsx | 16 +- src/pages/OnboardingPurpose/index.tsx | 21 +- .../OnboardingWork/BaseOnboardingWork.tsx | 4 +- src/pages/OnboardingWork/index.tsx | 18 +- .../PrivateNotes/PrivateNotesEditPage.tsx | 9 +- .../PrivateNotes/PrivateNotesListPage.tsx | 34 +- src/pages/ProcessMoneyRequestHoldPage.tsx | 2 +- src/pages/ProfilePage.tsx | 86 +- .../AddressFormFields.tsx | 10 +- .../ReimbursementAccount/BankAccountStep.tsx | 21 +- .../BankInfo/BankInfo.tsx | 2 +- .../BankInfo/substeps/Confirmation.tsx | 2 +- .../BankInfo/substeps/Manual.tsx | 46 +- .../BankInfo/substeps/Plaid.tsx | 3 +- .../AddressUBO.tsx | 4 +- .../DateOfBirthUBO.tsx | 4 +- .../SocialSecurityNumberUBO.tsx | 2 +- .../substeps/CompanyOwnersListUBO.tsx | 2 +- .../BeneficialOwnersStep.tsx | 17 +- .../BusinessInfo/BusinessInfo.tsx | 4 +- .../BusinessInfo/substeps/AddressBusiness.tsx | 37 +- .../substeps/ConfirmationBusiness.tsx | 27 +- .../substeps/IncorporationDateBusiness.tsx | 29 +- .../BusinessInfo/substeps/NameBusiness.tsx | 27 +- .../substeps/PhoneNumberBusiness.tsx | 25 +- .../BusinessInfo/substeps/TaxIdBusiness.tsx | 30 +- .../BusinessTypeSelectorModal.tsx | 1 + .../BusinessInfo/substeps/WebsiteBusiness.tsx | 24 +- .../CompleteVerification.tsx | 4 +- .../substeps/ConfirmAgreements.tsx | 40 +- .../components/BankAccountValidationForm.tsx | 8 +- .../components/FinishChatCard.tsx | 2 +- .../PersonalInfo/PersonalInfo.tsx | 4 +- .../PersonalInfo/substeps/Address.tsx | 33 +- .../PersonalInfo/substeps/DateOfBirth.tsx | 33 +- .../PersonalInfo/substeps/FullName.tsx | 30 +- .../substeps/SocialSecurityNumber.tsx | 24 +- .../ReimbursementAccountPage.tsx | 6 +- .../RequestorOnfidoStep.tsx | 4 +- .../VerifyIdentity/VerifyIdentity.tsx | 6 +- .../utils/getSubstepValues.ts | 21 +- src/pages/ReportAvatar.tsx | 8 +- src/pages/ReportDetailsPage.tsx | 551 +++- src/pages/ReportParticipantDetailsPage.tsx | 10 +- .../ReportParticipantRoleSelectionPage.tsx | 5 +- src/pages/ReportParticipantsPage.tsx | 4 +- src/pages/RoomDescriptionPage.tsx | 6 +- src/pages/RoomInvitePage.tsx | 8 +- src/pages/RoomMembersPage.tsx | 90 +- src/pages/Search/SearchFilters.tsx | 32 +- src/pages/Search/SearchPage.tsx | 24 +- src/pages/Search/SearchPageBottomTab.tsx | 34 +- .../useCustomBackHandler/index.android.ts | 34 - .../Search/useCustomBackHandler/index.ts | 3 - src/pages/ShareCodePage.tsx | 4 +- .../IntroSchoolPrincipalPage.tsx | 16 +- src/pages/TeachersUnite/KnowATeacherPage.tsx | 14 +- .../DuplicateTransactionItem.tsx | 45 + .../DuplicateTransactionsList.tsx | 37 + src/pages/TransactionDuplicate/Review.tsx | 59 + src/pages/TransactionReceiptPage.tsx | 12 +- src/pages/Travel/ManageTrips.tsx | 17 +- src/pages/Travel/TravelTerms.tsx | 4 +- .../getTripIllustrationStyle/index.native.ts | 8 - .../Travel/getTripIllustrationStyle/index.ts | 9 - src/pages/ValidateLoginPage/index.website.tsx | 15 +- .../WorkspacesSectionHeader.tsx | 2 +- src/pages/WorkspaceSwitcherPage/index.tsx | 105 +- src/pages/home/HeaderView.tsx | 44 +- src/pages/home/ReportScreen.tsx | 98 +- .../BaseReportActionContextMenu.tsx | 138 +- .../report/ContextMenu/ContextMenuActions.tsx | 84 +- .../PopoverReportActionContextMenu.tsx | 31 +- .../ContextMenu/ReportActionContextMenu.ts | 6 +- .../report/ReactionList/BaseReactionList.tsx | 2 +- .../BasePopoverReactionList.tsx | 5 +- .../PopoverReactionList/index.tsx | 6 +- .../AttachmentPickerWithMenuItems.tsx | 10 +- .../ComposerWithSuggestions.tsx | 151 +- .../ComposerWithSuggestions/index.e2e.tsx | 24 +- .../ReportActionCompose.tsx | 15 +- .../report/ReportActionCompose/SendButton.tsx | 10 +- .../ReportActionCompose/SuggestionEmoji.tsx | 26 +- .../ReportActionCompose/SuggestionMention.tsx | 68 +- .../ReportActionCompose/Suggestions.tsx | 29 +- .../getCursorPosition/index.native.ts | 10 + .../getCursorPosition/index.ts | 9 + .../getCursorPosition/types.ts | 13 + .../getScrollPosition/index.native.ts | 14 + .../getScrollPosition/index.ts | 13 + .../getScrollPosition/types.ts | 10 + src/pages/home/report/ReportActionItem.tsx | 430 ++- .../report/ReportActionItemBasicMessage.tsx | 2 +- .../report/ReportActionItemContentCreated.tsx | 202 ++ .../home/report/ReportActionItemFragment.tsx | 7 +- .../home/report/ReportActionItemMessage.tsx | 20 +- .../report/ReportActionItemMessageEdit.tsx | 38 +- .../report/ReportActionItemParentAction.tsx | 16 +- .../home/report/ReportActionItemSingle.tsx | 13 +- src/pages/home/report/ReportActionsList.tsx | 54 +- .../report/ReportActionsListItemRenderer.tsx | 4 +- src/pages/home/report/ReportActionsView.tsx | 48 +- src/pages/home/report/ReportAttachments.tsx | 17 +- src/pages/home/report/ReportFooter.tsx | 127 +- .../report/SystemChatReportFooterMessage.tsx | 25 +- src/pages/home/report/ThreadDivider.tsx | 6 +- .../report/comment/TextCommentFragment.tsx | 4 +- .../shouldRenderAsText/index.native.ts | 2 +- .../comment/shouldRenderAsText/index.ts | 2 +- .../report/reportActionFragmentPropTypes.js | 32 - .../home/report/reportActionPropTypes.js | 31 - .../withReportAndReportActionOrNotFound.tsx | 16 +- src/pages/home/sidebar/AllSettingsScreen.tsx | 2 +- .../home/sidebar/AvatarWithOptionalStatus.tsx | 14 +- .../sidebar/ProfileAvatarWithIndicator.tsx | 2 +- src/pages/home/sidebar/SidebarLinksData.tsx | 2 +- .../SidebarScreen/BaseSidebarScreen.tsx | 2 +- .../FloatingActionButtonAndPopover.tsx | 23 +- src/pages/iou/HoldReasonPage.tsx | 15 +- src/pages/iou/MoneyRequestAmountForm.tsx | 47 +- src/pages/iou/SplitBillDetailsPage.tsx | 32 +- src/pages/iou/request/IOURequestStartPage.tsx | 46 +- .../MoneyRequestParticipantsSelector.tsx | 134 +- .../iou/request/step/IOURequestStepAmount.tsx | 53 +- .../request/step/IOURequestStepCategory.tsx | 75 +- .../step/IOURequestStepConfirmation.tsx | 44 +- .../request/step/IOURequestStepCurrency.tsx | 2 +- .../iou/request/step/IOURequestStepDate.tsx | 29 +- .../step/IOURequestStepDescription.tsx | 53 +- .../request/step/IOURequestStepDistance.tsx | 25 +- .../step/IOURequestStepDistanceRate.tsx | 31 +- .../request/step/IOURequestStepMerchant.tsx | 16 +- .../step/IOURequestStepParticipants.tsx | 35 +- .../step/IOURequestStepScan/index.native.tsx | 28 +- .../request/step/IOURequestStepScan/index.tsx | 36 +- .../request/step/IOURequestStepSendFrom.tsx | 35 +- .../request/step/IOURequestStepSplitPayer.tsx | 7 +- .../iou/request/step/IOURequestStepTag.tsx | 19 +- .../step/IOURequestStepTaxAmountPage.tsx | 41 +- .../step/IOURequestStepTaxRatePage.tsx | 54 +- .../request/step/IOURequestStepWaypoint.tsx | 16 +- .../step/withFullTransactionOrNotFound.tsx | 2 +- .../step/withWritableReportOrNotFound.tsx | 31 +- src/pages/settings/AboutPage/ConsolePage.tsx | 8 +- .../ShareLogList/BaseShareLogList.tsx | 5 +- .../ExitSurvey/ExitSurveyConfirmPage.tsx | 17 +- .../ExitSurvey/ExitSurveyReasonPage.tsx | 2 +- .../ExitSurvey/ExitSurveyResponsePage.tsx | 2 +- src/pages/settings/InitialSettingsPage.tsx | 8 +- .../settings/Preferences/LanguagePage.tsx | 1 + .../settings/Preferences/PriorityModePage.tsx | 1 + src/pages/settings/Preferences/ThemePage.tsx | 1 + .../Contacts/ContactMethodDetailsPage.tsx | 16 +- .../Profile/Contacts/ContactMethodsPage.tsx | 2 +- .../Profile/Contacts/NewContactMethodPage.tsx | 10 +- .../ValidateCodeForm/BaseValidateCodeForm.tsx | 2 +- .../Profile/CustomStatus/StatusPage.tsx | 24 +- .../settings/Profile/DisplayNamePage.tsx | 12 +- .../PersonalDetails/CountrySelectionPage.tsx | 1 + .../Profile/PersonalDetails/LegalNamePage.tsx | 66 +- .../PersonalDetails/StateSelectionPage.tsx | 7 +- src/pages/settings/Profile/ProfileAvatar.tsx | 2 +- src/pages/settings/Profile/PronounsPage.tsx | 1 + .../settings/Profile/TimezoneSelectPage.tsx | 1 + src/pages/settings/Report/NamePage.tsx | 22 + .../Report/NotificationPreferencePage.tsx | 1 + .../settings/Report/ReportSettingsPage.tsx | 68 +- src/pages/settings/Report/RoomNamePage.tsx | 51 +- src/pages/settings/Report/VisibilityPage.tsx | 1 + .../settings/Report/WriteCapabilityPage.tsx | 3 +- .../settings/Security/CloseAccountPage.tsx | 4 +- .../TwoFactorAuth/Steps/CodesStep.tsx | 10 +- .../TwoFactorAuth/Steps/EnabledStep.tsx | 2 +- .../TwoFactorAuth/Steps/VerifyStep.tsx | 2 +- .../BaseTwoFactorAuthForm.tsx | 8 +- .../BillingBanner/BillingBanner.tsx | 66 + .../BillingBanner/PreTrialBillingBanner.tsx | 49 + .../Subscription/CardSection/CardSection.tsx | 76 + .../CardSectionActions/index.native.tsx | 7 + .../CardSection/CardSectionActions/index.tsx | 67 + .../CardSectionDataEmpty/index.native.tsx | 30 + .../CardSectionDataEmpty/index.tsx | 25 + .../Subscription/CardSection/utils.ts | 25 + .../index.native.tsx | 19 + .../DisableAutoRenewSurveyPage/index.tsx | 46 + .../PaymentCard/AddPaymentCard.tsx | 95 + .../index.native.tsx | 14 + .../ReducedFunctionalityMessage/index.tsx | 7 + .../SaveWithExpensifyButton/index.native.tsx | 8 + .../SaveWithExpensifyButton/index.tsx | 25 + .../SubscriptionDetails/index.native.tsx | 83 + .../SubscriptionDetails/index.tsx | 113 + .../Subscription/SubscriptionPlan.tsx | 107 + .../SubscriptionSettings/index.native.tsx | 5 + .../SubscriptionSettings/index.tsx | 93 + .../Subscription/SubscriptionSettingsPage.tsx | 62 + .../SubscriptionSize/index.native.tsx | 19 + .../Subscription/SubscriptionSize/index.tsx | 68 + .../substeps/Confirmation.tsx | 86 + .../SubscriptionSize/substeps/Size.tsx | 84 + src/pages/settings/Subscription/utils.ts | 22 + .../Troubleshoot/TroubleshootPage.tsx | 6 +- .../index.native.ts | 6 + .../getLightbulbIllustrationStyle/index.ts | 9 + .../Wallet/ActivatePhysicalCardPage.tsx | 8 +- .../settings/Wallet/AddDebitCardPage.tsx | 194 +- .../Wallet/Card/BaseGetPhysicalCard.tsx | 6 +- .../Wallet/Card/GetPhysicalCardName.tsx | 8 +- .../Wallet/Card/GetPhysicalCardPhone.tsx | 4 +- .../settings/Wallet/ExpensifyCardPage.tsx | 10 +- .../settings/Wallet/ReportCardLostPage.tsx | 4 +- .../Wallet/ReportVirtualCardFraudPage.tsx | 2 +- .../settings/Wallet/TransferBalancePage.tsx | 6 +- .../settings/Wallet/WalletPage/WalletPage.tsx | 8 +- src/pages/signin/EmailDeliveryFailurePage.tsx | 2 +- src/pages/signin/LoginForm/BaseLoginForm.tsx | 77 +- src/pages/signin/SignInModal.tsx | 2 + src/pages/signin/SignInPage.tsx | 75 +- src/pages/signin/SignUpWelcomeForm.tsx | 57 + src/pages/signin/UnlinkLoginForm.tsx | 2 +- .../ValidateCodeForm/BaseValidateCodeForm.tsx | 6 +- src/pages/tasks/NewTaskDescriptionPage.tsx | 12 +- src/pages/tasks/NewTaskDetailsPage.tsx | 21 +- src/pages/tasks/NewTaskPage.tsx | 14 +- src/pages/tasks/NewTaskTitlePage.tsx | 4 +- src/pages/tasks/TaskAssigneeSelectorModal.tsx | 18 +- src/pages/tasks/TaskDescriptionPage.tsx | 27 +- .../TaskShareDestinationSelectorModal.tsx | 4 + src/pages/tasks/TaskTitlePage.tsx | 21 +- src/pages/wallet/WalletStatementPage.tsx | 2 +- .../workspace/AccessOrNotFoundWrapper.tsx | 74 +- src/pages/workspace/WorkspaceAvatar.tsx | 2 +- src/pages/workspace/WorkspaceInitialPage.tsx | 10 +- .../workspace/WorkspaceInviteMessagePage.tsx | 10 +- src/pages/workspace/WorkspaceInvitePage.tsx | 12 +- src/pages/workspace/WorkspaceJoinUserPage.tsx | 6 +- src/pages/workspace/WorkspaceMembersPage.tsx | 29 +- .../workspace/WorkspaceMoreFeaturesPage.tsx | 111 +- src/pages/workspace/WorkspaceNamePage.tsx | 29 +- src/pages/workspace/WorkspaceNewRoomPage.tsx | 34 +- .../workspace/WorkspacePageWithSections.tsx | 6 +- .../WorkspaceProfileCurrencyPage.tsx | 4 +- .../WorkspaceProfileDescriptionPage.tsx | 24 +- src/pages/workspace/WorkspaceProfilePage.tsx | 32 +- .../workspace/WorkspaceProfileSharePage.tsx | 2 +- .../WorkspaceResetBankAccountModal.tsx | 2 +- src/pages/workspace/WorkspacesListPage.tsx | 43 +- src/pages/workspace/WorkspacesListRow.tsx | 22 +- .../accounting/PolicyAccountingPage.tsx | 143 +- .../advanced/QuickbooksAccountSelectPage.tsx | 23 +- .../qbo/advanced/QuickbooksAdvancedPage.tsx | 8 +- .../QuickbooksInvoiceAccountSelectPage.tsx | 23 +- ...uickbooksCompanyCardExpenseAccountPage.tsx | 5 +- ...ompanyCardExpenseAccountSelectCardPage.tsx | 5 +- ...oksCompanyCardExpenseAccountSelectPage.tsx | 23 +- .../QuickbooksExportConfigurationPage.tsx | 4 +- .../export/QuickbooksExportDateSelectPage.tsx | 3 +- ...ickbooksExportInvoiceAccountSelectPage.tsx | 23 +- ...NonReimbursableDefaultVendorSelectPage.tsx | 25 +- ...oksOutOfPocketExpenseAccountSelectPage.tsx | 56 +- ...oksOutOfPocketExpenseConfigurationPage.tsx | 65 +- ...ooksOutOfPocketExpenseEntitySelectPage.tsx | 30 +- ...ooksPreferredExporterConfigurationPage.tsx | 3 +- .../import/QuickbooksChartOfAccountsPage.tsx | 3 +- .../qbo/import/QuickbooksClassesPage.tsx | 4 +- .../qbo/import/QuickbooksCustomersPage.tsx | 4 +- .../qbo/import/QuickbooksImportPage.tsx | 12 +- .../qbo/import/QuickbooksLocationsPage.tsx | 19 +- .../qbo/import/QuickbooksTaxesPage.tsx | 4 +- .../accounting/xero/XeroImportPage.tsx | 62 +- .../XeroMapRegionsToConfigurationPage.tsx | 69 - ...oMapTrackingCategoryConfigurationPage.tsx} | 48 +- .../XeroOrganizationConfigurationPage.tsx | 52 +- .../xero/XeroTaxesConfigurationPage.tsx | 3 +- .../XeroTrackingCategoryConfigurationPage.tsx | 35 +- .../xero/advanced/XeroAdvancedPage.tsx | 13 +- .../XeroBillPaymentAccountSelectorPage.tsx | 37 +- .../XeroInvoiceAccountSelectorPage.tsx | 37 +- .../xero/export/XeroBankAccountSelectPage.tsx | 37 +- .../export/XeroExportConfigurationPage.tsx | 7 +- .../XeroPreferredExporterSelectPage.tsx | 37 +- .../export/XeroPurchaseBillDateSelectPage.tsx | 3 +- .../XeroPurchaseBillStatusSelectorPage.tsx | 79 + .../xero/import/XeroChartOfAccountsPage.tsx | 3 +- .../import/XeroCustomerConfigurationPage.tsx | 3 +- .../bills/WorkspaceBillsFirstSection.tsx | 2 +- .../workspace/bills/WorkspaceBillsPage.tsx | 1 + .../workspace/card/WorkspaceCardPage.tsx | 3 +- .../workspace/categories/CategoryForm.tsx | 18 +- .../categories/CategorySettingsPage.tsx | 27 +- .../categories/CreateCategoryPage.tsx | 11 +- .../workspace/categories/EditCategoryPage.tsx | 20 +- .../categories/WorkspaceCategoriesPage.tsx | 47 +- .../WorkspaceCategoriesSettingsPage.tsx | 8 +- .../distanceRates/CreateDistanceRatePage.tsx | 3 +- .../PolicyDistanceRateDetailsPage.tsx | 100 +- .../PolicyDistanceRateEditPage.tsx | 12 +- .../PolicyDistanceRateTaxRateEditPage.tsx | 98 + ...licyDistanceRateTaxReclaimableEditPage.tsx | 106 + .../distanceRates/PolicyDistanceRatesPage.tsx | 47 +- .../PolicyDistanceRatesSettingsPage.tsx | 100 +- .../distanceRates/UnitSelector/index.tsx | 2 +- .../invoices/WorkspaceInvoicesPage.tsx | 1 + .../members/WorkspaceMemberDetailsPage.tsx | 25 +- ...rkspaceMemberDetailsRoleSelectionModal.tsx | 1 + .../members/WorkspaceOwnerChangeCheck.tsx | 8 +- .../members/WorkspaceOwnerChangeErrorPage.tsx | 6 +- .../WorkspaceOwnerChangeSuccessPage.tsx | 6 +- .../WorkspaceOwnerChangeWrapperPage.tsx | 8 +- .../members/WorkspaceOwnerPaymentCardForm.tsx | 290 +- .../WorkspaceRateAndUnitPage/InitialPage.tsx | 41 +- .../WorkspaceRateAndUnitPage/RatePage.tsx | 24 +- .../WorkspaceRateAndUnitPage/UnitPage.tsx | 25 +- .../reimburse/WorkspaceReimbursePage.tsx | 1 - .../reimburse/WorkspaceReimburseSection.tsx | 4 +- .../reimburse/WorkspaceReimburseView.tsx | 10 +- src/pages/workspace/tags/EditTagPage.tsx | 14 +- src/pages/workspace/tags/TagSettingsPage.tsx | 43 +- .../workspace/tags/WorkspaceCreateTagPage.tsx | 12 +- .../workspace/tags/WorkspaceEditTagsPage.tsx | 25 +- .../workspace/tags/WorkspaceTagsPage.tsx | 37 +- .../tags/WorkspaceTagsSettingsPage.tsx | 8 +- .../workspace/tags/WorkspaceViewTagsPage.tsx | 40 +- src/pages/workspace/taxes/NamePage.tsx | 14 +- src/pages/workspace/taxes/ValuePage.tsx | 10 +- .../taxes/WorkspaceCreateTaxPage.tsx | 84 +- .../workspace/taxes/WorkspaceEditTaxPage.tsx | 34 +- .../workspace/taxes/WorkspaceTaxesPage.tsx | 54 +- .../WorkspaceTaxesSettingsCustomTaxName.tsx | 19 +- .../WorkspaceTaxesSettingsForeignCurrency.tsx | 5 + ...orkspaceTaxesSettingsWorkspaceCurrency.tsx | 5 + .../workspace/travel/WorkspaceTravelPage.tsx | 1 + src/pages/workspace/withPolicy.tsx | 101 +- .../withPolicyAndFullscreenLoading.tsx | 8 +- src/pages/workspace/withPolicyConnections.tsx | 2 +- .../workflows/ToggleSettingsOptionRow.tsx | 39 +- .../WorkspaceAutoReportingFrequencyPage.tsx | 50 +- ...orkspaceAutoReportingMonthlyOffsetPage.tsx | 3 +- .../WorkspaceWorkflowsApproverPage.tsx | 13 +- .../workflows/WorkspaceWorkflowsPage.tsx | 128 +- .../workflows/WorkspaceWorkflowsPayerPage.tsx | 3 +- .../ButtonWithDropdownMenu.stories.tsx | 2 +- src/stories/Composer.stories.tsx | 2 +- src/stories/Form.stories.tsx | 5 +- src/stories/PromotedActionBar.stories.tsx | 70 + src/styles/index.ts | 151 +- src/styles/stylePropTypes.js | 5 - src/styles/theme/illustrations/themes/dark.ts | 2 + .../theme/illustrations/themes/light.ts | 2 + src/styles/theme/illustrations/types.ts | 3 + src/styles/theme/themes/dark.ts | 6 +- src/styles/theme/themes/light.ts | 6 +- src/styles/theme/types.ts | 6 +- .../utils/generators/ModalStyleUtils.ts | 18 +- .../ReportActionContextMenuStyleUtils.ts | 2 +- .../TooltipStyleUtils/index.native.ts | 179 ++ .../index.ts} | 77 +- .../generators/TooltipStyleUtils/types.ts | 31 + src/styles/utils/index.ts | 33 +- src/styles/utils/sizing.ts | 4 + src/styles/utils/spacing.ts | 4 + src/styles/variables.ts | 15 +- src/types/form/PersonalBankAccountForm.ts | 6 +- ...icyDistanceRateTaxReclaimableOnEditForm.ts | 18 + src/types/form/SubscriptionSizeForm.ts | 13 + src/types/form/index.ts | 2 + .../modules/react-native-performance.d.ts | 12 + src/types/modules/react-native.d.ts | 30 +- src/types/onyx/Account.ts | 20 + src/types/onyx/AccountData.ts | 16 +- src/types/onyx/Bank.ts | 13 + src/types/onyx/BankAccount.ts | 31 +- src/types/onyx/Beta.ts | 1 + src/types/onyx/BillingGraceEndPeriod.ts | 13 + src/types/onyx/BlockedFromConcierge.ts | 1 + src/types/onyx/Card.ts | 64 +- src/types/onyx/Console.ts | 7 + src/types/onyx/Credentials.ts | 1 + src/types/onyx/Currency.ts | 2 + src/types/onyx/CustomStatusDraft.ts | 1 + src/types/onyx/DismissedReferralBanners.ts | 10 + src/types/onyx/Download.ts | 1 + src/types/onyx/FrequentlyUsedEmoji.ts | 1 + src/types/onyx/Fund.ts | 51 +- src/types/onyx/IOU.ts | 110 +- src/types/onyx/IntroSelected.ts | 1 + src/types/onyx/InvitedEmailsToAccountIDs.ts | 1 + src/types/onyx/LastPaymentMethod.ts | 1 + src/types/onyx/LastSelectedDistanceRates.ts | 1 + src/types/onyx/Locale.ts | 1 + src/types/onyx/Login.ts | 2 + src/types/onyx/MapboxAccessToken.ts | 6 + src/types/onyx/Modal.ts | 2 + src/types/onyx/Network.ts | 4 +- src/types/onyx/NewGroupChatDraft.ts | 16 + src/types/onyx/Onboarding.ts | 1 + src/types/onyx/OnyxCommon.ts | 15 +- src/types/onyx/OnyxInputOrEntry.ts | 8 + src/types/onyx/OnyxUpdatesFromServer.ts | 26 + src/types/onyx/OriginalMessage.ts | 704 +++-- src/types/onyx/PaymentMethod.ts | 12 + src/types/onyx/PersonalBankAccount.ts | 1 + src/types/onyx/PersonalDetails.ts | 10 +- src/types/onyx/PlaidBankAccount.ts | 1 + src/types/onyx/PlaidData.ts | 4 + src/types/onyx/Policy.ts | 780 +++++- src/types/onyx/PolicyCategory.ts | 10 +- src/types/onyx/PolicyEmployee.ts | 2 + src/types/onyx/PolicyJoinMember.ts | 1 + src/types/onyx/PolicyOwnershipChangeChecks.ts | 8 + src/types/onyx/PolicyTag.ts | 21 + src/types/onyx/PreferredTheme.ts | 1 + src/types/onyx/PriorityMode.ts | 1 + src/types/onyx/PrivatePersonalDetails.ts | 34 + src/types/onyx/PrivateSubscription.ts | 37 + src/types/onyx/QuickAction.ts | 2 + src/types/onyx/RecentWaypoint.ts | 1 + src/types/onyx/RecentlyUsedCategories.ts | 1 + src/types/onyx/RecentlyUsedReportFields.ts | 1 + src/types/onyx/RecentlyUsedTags.ts | 1 + src/types/onyx/ReimbursementAccount.ts | 4 + src/types/onyx/Report.ts | 92 +- src/types/onyx/ReportAction.ts | 88 +- src/types/onyx/ReportActionName.ts | 7 + src/types/onyx/ReportActionReactions.ts | 4 + src/types/onyx/ReportActionsDraft.ts | 2 + src/types/onyx/ReportActionsDrafts.ts | 2 + src/types/onyx/ReportMetadata.ts | 1 + src/types/onyx/ReportNameValuePairs.ts | 2 + src/types/onyx/ReportNextStep.ts | 45 +- src/types/onyx/ReportUserIsTyping.ts | 1 + src/types/onyx/Request.ts | 32 + src/types/onyx/Response.ts | 42 + src/types/onyx/ReviewDuplicates.ts | 33 + src/types/onyx/ScreenShareRequest.ts | 1 + src/types/onyx/SearchResults.ts | 88 +- src/types/onyx/SecurityGroup.ts | 2 + src/types/onyx/SelectedTabRequest.ts | 1 + src/types/onyx/Session.ts | 3 + src/types/onyx/Task.ts | 8 +- src/types/onyx/Transaction.ts | 214 +- src/types/onyx/TransactionViolation.ts | 95 +- src/types/onyx/TravelSettings.ts | 2 + src/types/onyx/User.ts | 1 + src/types/onyx/UserLocation.ts | 1 + src/types/onyx/UserMetadata.ts | 11 + src/types/onyx/UserWallet.ts | 4 + src/types/onyx/WalletAdditionalDetails.ts | 32 +- src/types/onyx/WalletOnfido.ts | 1 + src/types/onyx/WalletStatement.ts | 1 + src/types/onyx/WalletTerms.ts | 1 + src/types/onyx/WalletTransfer.ts | 3 + src/types/onyx/WorkspaceRateAndUnit.ts | 4 +- src/types/onyx/index.ts | 11 +- src/types/utils/CollectionDataSet.ts | 6 +- .../EnforceActionExportRestrictions.ts | 18 + tests/actions/IOUTest.ts | 496 ++-- tests/actions/PolicyMemberTest.ts | 19 +- tests/actions/PolicyTagTest.ts | 50 +- tests/actions/ReportTest.ts | 2 +- tests/actions/SessionTest.ts | 4 +- tests/e2e/compare/compare.ts | 6 +- tests/e2e/config.ts | 39 +- tests/e2e/server/index.ts | 11 + tests/e2e/testRunner.ts | 21 +- tests/e2e/utils/execAsync.ts | 2 +- tests/perf-test/ChatFinderPage.perf-test.tsx | 15 +- .../ReportActionCompose.perf-test.tsx | 11 +- .../perf-test/ReportActionsList.perf-test.tsx | 6 +- tests/perf-test/ReportScreen.perf-test.tsx | 7 +- tests/perf-test/SidebarLinks.perf-test.tsx | 11 +- tests/perf-test/SidebarUtils.perf-test.ts | 3 +- tests/ui/UnreadIndicatorsTest.tsx | 50 +- tests/unit/APITest.ts | 38 +- tests/unit/CIGitLogicTest.sh | 429 --- tests/unit/CIGitLogicTest.ts | 478 ++++ tests/unit/CardsSectionUtilsTest.ts | 37 + tests/unit/CurrencyUtilsTest.ts | 47 +- tests/unit/ErrorUtilsTest.ts | 13 +- tests/unit/MigrationTest.ts | 18 +- tests/unit/MoneyRequestUtilsTest.ts | 22 + tests/unit/NetworkTest.ts | 16 +- tests/unit/OnyxUpdatesTest.ts | 79 + tests/unit/OptionsListUtilsTest.ts | 253 +- tests/unit/ReportUtilsTest.ts | 179 +- tests/unit/SidebarFilterTest.ts | 4 +- tests/unit/SidebarOrderTest.ts | 107 +- tests/unit/SidebarTest.ts | 4 +- tests/unit/SubscriptionUtilsTest.ts | 248 ++ tests/unit/TransactionUtilsTest.ts | 6 +- tests/unit/UserUtilsTest.ts | 12 +- tests/unit/ValidationUtilsTest.ts | 11 +- tests/unit/ViolationUtilsTest.ts | 66 +- tests/unit/markPullRequestsAsDeployedTest.ts | 2 +- tests/unit/postTestBuildComment.ts | 16 +- tests/utils/LHNTestUtils.tsx | 41 +- tests/utils/ReportTestUtils.ts | 15 +- tests/utils/TestHelper.ts | 9 +- tests/utils/bumpVersion.ts | 14 - tests/utils/collections/reportActions.ts | 26 +- tests/utils/getIsUsingFakeTimers.ts | 2 +- tests/utils/getPreviousVersion.ts | 14 - tests/utils/getPullRequestsMergedBetween.ts | 17 - web/index.html | 6 +- workflow_tests/assertions/deployAssertions.ts | 5 +- .../assertions/platformDeployAssertions.ts | 8 +- .../assertions/preDeployAssertions.ts | 2 +- workflow_tests/assertions/testAssertions.ts | 18 +- workflow_tests/mocks/deployMocks.ts | 2 +- workflow_tests/mocks/testMocks.ts | 8 +- workflow_tests/test.test.ts | 12 - workflow_tests/utils/ExtendedAct.ts | 7 +- workflow_tests/utils/preGenerateTest.ts | 2 +- 1287 files changed, 32262 insertions(+), 16787 deletions(-) create mode 100755 .github/scripts/enforceRedirect.sh create mode 100755 .github/scripts/printPodspec.rb create mode 100644 assets/animations/Abracadabra.lottie create mode 100644 assets/images/arrow-down-long.svg create mode 100644 assets/images/arrow-up-long.svg create mode 100644 assets/images/bed.svg create mode 100644 assets/images/car-with-key.svg create mode 100644 assets/images/check-circle.svg create mode 100644 assets/images/checkmark-circle.svg create mode 100644 assets/images/comment-bubbles.svg create mode 100644 assets/images/credit-card-exclamation.svg create mode 100644 assets/images/crosshair.svg create mode 100644 assets/images/inbox.svg create mode 100644 assets/images/money-search.svg create mode 100644 assets/images/plane.svg create mode 100644 assets/images/product-illustrations/emptystate__travel.svg create mode 100644 assets/images/receipt-slash.svg create mode 100644 assets/images/simple-illustrations/simple-illustration__checkmarkcircle.svg create mode 100644 assets/images/simple-illustrations/simple-illustration__creditcardeyes.svg create mode 100644 assets/images/simple-illustrations/simple-illustration__sendmoney.svg create mode 100644 assets/images/simple-illustrations/simple-illustration__subscription-annual.svg create mode 100644 assets/images/simple-illustrations/simple-illustration__subscription-ppu.svg create mode 100644 assets/images/subscription-details__approvedlogo--light.svg create mode 100644 assets/images/subscription-details__approvedlogo.svg create mode 100644 docs/Hidden/Instructions rename docs/{articles/new-expensify/expenses => Hidden}/Manually-submit-reports-for-approval.md (100%) create mode 100644 docs/articles/expensify-classic/reports/Add-custom-fields-to-reports-and-invoices.md create mode 100644 docs/articles/expensify-classic/reports/Set-default-report-title.md create mode 100644 docs/articles/expensify-classic/travel/Approve-travel-expenses.md create mode 100644 docs/articles/expensify-classic/travel/Book-with-Expensify-Travel.md create mode 100644 docs/articles/expensify-classic/travel/Configure-travel-policy-and-preferences.md create mode 100644 docs/articles/expensify-classic/travel/Edit-or-cancel-travel-arrangements.md delete mode 100644 docs/articles/expensify-classic/workspaces/reports/Report-Fields-And-Titles.md delete mode 100644 docs/articles/expensify-classic/workspaces/reports/Scheduled-Submit.md delete mode 100644 docs/articles/new-expensify/chat/Expensify-Chat-For-Admins.md create mode 100644 docs/articles/new-expensify/expenses/Set-up-your-wallet.md create mode 100644 docs/articles/new-expensify/expensify-card/Add-Expensify-Card-to-Apple-or-Google-Pay.md create mode 100644 docs/articles/new-expensify/expensify-card/Dispute-Expensify-Card-transaction.md create mode 100644 docs/articles/new-expensify/expensify-card/Update-your-Expensify-Card-mailing-address.md create mode 100644 docs/articles/new-expensify/settings/Add-profile-photo.md create mode 100644 docs/articles/new-expensify/travel/Approve-travel-expenses.md create mode 100644 docs/articles/new-expensify/travel/Book-with-Expensify-Travel.md delete mode 100644 docs/articles/new-expensify/travel/Coming-Soon.md create mode 100644 docs/articles/new-expensify/travel/Configure-travel-policy-and-preferences.md create mode 100644 docs/articles/new-expensify/travel/Edit-or-cancel-travel-arrangements.md create mode 100644 docs/assets/images/ExpensifyHelp_ConnectBankAccount_1_Light.png create mode 100644 docs/assets/images/ExpensifyHelp_ConnectBankAccount_2_Light.png create mode 100644 docs/assets/images/ExpensifyHelp_R1_CreateWorkspace_1.png create mode 100644 docs/assets/images/ExpensifyHelp_R1_CreateWorkspace_2.png create mode 100644 docs/assets/images/ExpensifyHelp_R1_CreateWorkspace_3.png create mode 100644 docs/assets/images/ExpensifyHelp_R1_InviteMembers_1.png create mode 100644 docs/assets/images/ExpensifyHelp_R1_InviteMembers_2.png create mode 100644 docs/assets/images/ExpensifyHelp_R1_InviteMembers_3.png create mode 100644 docs/assets/images/ExpensifyHelp_R2_Profile_1.png create mode 100644 docs/assets/images/ExpensifyHelp_R3_Categories_1.png create mode 100644 docs/assets/images/ExpensifyHelp_R4_Tags_1.png create mode 100644 docs/assets/images/ExpensifyHelp_R4_Tags_2.png create mode 100644 docs/assets/images/ExpensifyHelp_R5_Wallet_1.png create mode 100644 docs/assets/images/simple-illustration__monitor-remotesync.svg create mode 100644 patches/@expensify+react-native-live-markdown+0.1.85.patch create mode 100644 patches/react-native+0.73.4+016+fixClippedEmojis.patch create mode 100644 patches/react-native+0.73.4+016+iOS-textinput-onscroll-event.patch create mode 100644 patches/react-native+0.73.4+017+iOS-fix-whitespace-support-sourcemap.patch create mode 100644 patches/react-native-keyboard-controller+1.12.2.patch.patch rename patches/{react-native-web+0.19.9+001+initial.patch => react-native-web+0.19.12+001+initial.patch} (98%) rename patches/{react-native-web+0.19.9+004+fixLastSpacer.patch => react-native-web+0.19.12+002+fixLastSpacer.patch} (100%) rename patches/{react-native-web+0.19.9+005+image-header-support.patch => react-native-web+0.19.12+003+image-header-support.patch} (95%) rename patches/{react-native-web+0.19.9+006+fixPointerEventDown.patch => react-native-web+0.19.12+004+fixPointerEventDown.patch} (100%) rename patches/{react-native-web+0.19.9+007+osr-improvement.patch => react-native-web+0.19.12+005+osr-improvement.patch} (100%) create mode 100644 patches/react-native-web+0.19.12+006+remove focus trap from modal.patch delete mode 100644 patches/react-native-web+0.19.9+002+measureInWindow.patch rename patches/{react-pdf+7.7.1.patch => react-pdf+7.7.3.patch} (93%) create mode 100644 police.diff create mode 100644 scripts/.eslintrc.js create mode 100755 scripts/symbolicate-profile.ts create mode 100644 scripts/tsconfig.json create mode 100644 scripts/utils/Logger.ts create mode 100644 scripts/utils/parseCommandLineArguments.ts rename src/components/{ActiveWorkspace/ActiveWorkspaceProvider.tsx => ActiveWorkspaceProvider/index.tsx} (80%) create mode 100644 src/components/ActiveWorkspaceProvider/index.website.tsx rename src/{pages/workspace/members/WorkspaceOwnerPaymentCardCurrencyModal.tsx => components/AddPaymentCard/PaymentCardCurrencyModal.tsx} (82%) create mode 100644 src/components/AddPaymentCard/PaymentCardForm.tsx create mode 100644 src/components/AttachmentContext.ts rename src/components/Attachments/AttachmentCarousel/{extractAttachmentsFromReport.ts => extractAttachments.ts} (77%) create mode 100644 src/components/AutoCompleteSuggestions/AutoCompleteSuggestionsPortal/getBottomSuggestionPadding/index.ios.ts create mode 100644 src/components/AutoCompleteSuggestions/AutoCompleteSuggestionsPortal/getBottomSuggestionPadding/index.ts create mode 100644 src/components/AutoCompleteSuggestions/AutoCompleteSuggestionsPortal/index.native.tsx create mode 100644 src/components/AutoCompleteSuggestions/AutoCompleteSuggestionsPortal/index.tsx create mode 100644 src/components/AutoCompleteSuggestions/AutoCompleteSuggestionsPortal/types.ts delete mode 100644 src/components/AutoCompleteSuggestions/index.native.tsx create mode 100644 src/components/CaretWrapper.tsx delete mode 100644 src/components/ChatDetailsQuickActionsBar.tsx create mode 100644 src/components/CustomStylesForChildrenProvider.tsx create mode 100644 src/components/FeedbackSurvey.tsx create mode 100644 src/components/FocusTrap/BOTTOM_TAB_SCREENS.ts create mode 100644 src/components/FocusTrap/FocusTrapForModal/FocusTrapForModalProps.ts create mode 100644 src/components/FocusTrap/FocusTrapForModal/index.tsx create mode 100644 src/components/FocusTrap/FocusTrapForModal/index.web.tsx create mode 100644 src/components/FocusTrap/FocusTrapForScreen/FocusTrapProps.ts create mode 100644 src/components/FocusTrap/FocusTrapForScreen/index.tsx create mode 100644 src/components/FocusTrap/FocusTrapForScreen/index.web.tsx create mode 100644 src/components/FocusTrap/SCREENS_WITH_AUTOFOCUS.ts create mode 100644 src/components/FocusTrap/TOP_TAB_SCREENS.ts create mode 100644 src/components/FocusTrap/WIDE_LAYOUT_INACTIVE_SCREENS.ts create mode 100644 src/components/FocusTrap/sharedTrapStack.ts create mode 100644 src/components/Image/ImageBehaviorContextProvider.tsx delete mode 100644 src/components/Image/sourcePropTypes/index.js delete mode 100644 src/components/Image/sourcePropTypes/index.native.js create mode 100644 src/components/Modal/ModalContext.ts create mode 100644 src/components/OptionsPicker/OptionItem.tsx create mode 100644 src/components/OptionsPicker/index.tsx create mode 100644 src/components/PDFThumbnail/PDFThumbnailError.tsx create mode 100644 src/components/PromotedActionsBar.tsx create mode 100644 src/components/ReportActionItem/TripDetailsView.tsx create mode 100644 src/components/ReportActionItem/TripRoomPreview.tsx create mode 100644 src/components/SelectionList/SortableHeaderText.tsx create mode 100644 src/components/TextBlock.tsx create mode 100644 src/components/TextInput/BaseTextInput/isTextInputFocused.ts create mode 100644 src/components/Tooltip/BaseGenericTooltip/index.native.tsx rename src/components/Tooltip/{TooltipRenderedOnPageBody.tsx => BaseGenericTooltip/index.tsx} (69%) create mode 100644 src/components/Tooltip/BaseGenericTooltip/types.ts create mode 100644 src/components/Tooltip/EducationalTooltip/BaseEducationalTooltip.tsx create mode 100644 src/components/Tooltip/EducationalTooltip/getBounds/index.native.ts create mode 100644 src/components/Tooltip/EducationalTooltip/getBounds/index.ts create mode 100644 src/components/Tooltip/EducationalTooltip/getBounds/types.ts create mode 100644 src/components/Tooltip/EducationalTooltip/index.tsx create mode 100644 src/components/Tooltip/GenericTooltip.tsx delete mode 100644 src/components/avatarPropTypes.js delete mode 100644 src/components/categoryPropTypes.js delete mode 100644 src/components/optionPropTypes.js delete mode 100644 src/components/participantPropTypes.js delete mode 100644 src/components/tagPropTypes.js create mode 100644 src/hooks/useCancelSearchOnModalClose.ts create mode 100644 src/hooks/useDeepCompareRef.ts create mode 100644 src/hooks/useMouseContext.tsx create mode 100644 src/hooks/usePreferredCurrency.ts create mode 100644 src/hooks/useSubscriptionPlan.ts create mode 100644 src/hooks/useSubscriptionPrice.ts create mode 100644 src/libs/API/parameters/AddSubscriptionPaymentCardParams.ts delete mode 100644 src/libs/API/parameters/CompleteEngagementModalParams.ts create mode 100644 src/libs/API/parameters/DismissViolationParams.ts create mode 100644 src/libs/API/parameters/GenerateSpotnanaTokenParams.ts create mode 100644 src/libs/API/parameters/PayInvoiceParams.ts delete mode 100644 src/libs/API/parameters/RenamePolicyTaglist.ts create mode 100644 src/libs/API/parameters/RenamePolicyTaglistParams.ts create mode 100644 src/libs/API/parameters/SetPolicyTagsRequired.ts delete mode 100644 src/libs/API/parameters/SetWorkspaceAutoReportingParams.ts create mode 100644 src/libs/API/parameters/SignUpUserParams.ts create mode 100644 src/libs/API/parameters/SyncPolicyToXeroParams.ts create mode 100644 src/libs/API/parameters/UpdateSubscriptionAddNewUsersAutomaticallyParams.ts create mode 100644 src/libs/API/parameters/UpdateSubscriptionAutoRenewParams.ts create mode 100644 src/libs/API/parameters/UpdateSubscriptionSizeParams.ts create mode 100644 src/libs/API/parameters/UpdateSubscriptionTypeParams.ts rename src/libs/Navigation/AppNavigator/createCustomBottomTabNavigator/{BottomTabBar.tsx => BottomTabBar/index.tsx} (70%) create mode 100644 src/libs/Navigation/AppNavigator/createCustomBottomTabNavigator/BottomTabBar/index.website.tsx create mode 100644 src/libs/Navigation/AppNavigator/index.native.tsx create mode 100644 src/libs/Navigation/setupCustomAndroidBackHandler/index.android.ts create mode 100644 src/libs/Navigation/setupCustomAndroidBackHandler/index.ts create mode 100644 src/libs/OnyxAwareParser.ts create mode 100644 src/libs/SubscriptionUtils.ts create mode 100644 src/libs/TooltipRefManager.tsx create mode 100644 src/libs/TripReservationUtils.ts delete mode 100644 src/libs/Violations/propTypes.ts create mode 100644 src/libs/actions/Policy/DistanceRate.ts create mode 100644 src/libs/actions/Policy/Member.ts create mode 100644 src/libs/actions/Policy/Tag.ts create mode 100644 src/libs/actions/Subscription.ts delete mode 100644 src/libs/checkInternetReachability/index.android.ts delete mode 100644 src/libs/checkInternetReachability/index.ts delete mode 100644 src/libs/checkInternetReachability/types.ts delete mode 100644 src/libs/compose.ts delete mode 100644 src/libs/getReportPolicyID.ts delete mode 100644 src/libs/getSplashBackgroundColor/index.native.ts delete mode 100644 src/libs/getSplashBackgroundColor/index.ts create mode 100644 src/libs/isPdfFilePasswordProtected/index.tsx create mode 100644 src/libs/isPublicScreenRoute.ts create mode 100644 src/libs/shouldIgnoreSelectionWhenUpdatedManually/index.android.tsx create mode 100644 src/libs/shouldIgnoreSelectionWhenUpdatedManually/index.tsx create mode 100644 src/libs/shouldIgnoreSelectionWhenUpdatedManually/types.ts delete mode 100755 src/pages/DetailsPage.tsx create mode 100644 src/pages/EnablePayments/EnablePayments.tsx create mode 100644 src/pages/EnablePayments/VerifyIdentity/VerifyIdentity.tsx delete mode 100644 src/pages/Search/useCustomBackHandler/index.android.ts delete mode 100644 src/pages/Search/useCustomBackHandler/index.ts create mode 100644 src/pages/TransactionDuplicate/DuplicateTransactionItem.tsx create mode 100644 src/pages/TransactionDuplicate/DuplicateTransactionsList.tsx create mode 100644 src/pages/TransactionDuplicate/Review.tsx delete mode 100644 src/pages/Travel/getTripIllustrationStyle/index.native.ts delete mode 100644 src/pages/Travel/getTripIllustrationStyle/index.ts create mode 100644 src/pages/home/report/ReportActionCompose/getCursorPosition/index.native.ts create mode 100644 src/pages/home/report/ReportActionCompose/getCursorPosition/index.ts create mode 100644 src/pages/home/report/ReportActionCompose/getCursorPosition/types.ts create mode 100644 src/pages/home/report/ReportActionCompose/getScrollPosition/index.native.ts create mode 100644 src/pages/home/report/ReportActionCompose/getScrollPosition/index.ts create mode 100644 src/pages/home/report/ReportActionCompose/getScrollPosition/types.ts create mode 100644 src/pages/home/report/ReportActionItemContentCreated.tsx delete mode 100644 src/pages/home/report/reportActionFragmentPropTypes.js delete mode 100644 src/pages/home/report/reportActionPropTypes.js create mode 100644 src/pages/settings/Report/NamePage.tsx create mode 100644 src/pages/settings/Subscription/CardSection/BillingBanner/BillingBanner.tsx create mode 100644 src/pages/settings/Subscription/CardSection/BillingBanner/PreTrialBillingBanner.tsx create mode 100644 src/pages/settings/Subscription/CardSection/CardSection.tsx create mode 100644 src/pages/settings/Subscription/CardSection/CardSectionActions/index.native.tsx create mode 100644 src/pages/settings/Subscription/CardSection/CardSectionActions/index.tsx create mode 100644 src/pages/settings/Subscription/CardSection/CardSectionDataEmpty/index.native.tsx create mode 100644 src/pages/settings/Subscription/CardSection/CardSectionDataEmpty/index.tsx create mode 100644 src/pages/settings/Subscription/CardSection/utils.ts create mode 100644 src/pages/settings/Subscription/DisableAutoRenewSurveyPage/index.native.tsx create mode 100644 src/pages/settings/Subscription/DisableAutoRenewSurveyPage/index.tsx create mode 100644 src/pages/settings/Subscription/PaymentCard/AddPaymentCard.tsx create mode 100644 src/pages/settings/Subscription/ReducedFunctionalityMessage/index.native.tsx create mode 100644 src/pages/settings/Subscription/ReducedFunctionalityMessage/index.tsx create mode 100644 src/pages/settings/Subscription/SaveWithExpensifyButton/index.native.tsx create mode 100644 src/pages/settings/Subscription/SaveWithExpensifyButton/index.tsx create mode 100644 src/pages/settings/Subscription/SubscriptionDetails/index.native.tsx create mode 100644 src/pages/settings/Subscription/SubscriptionDetails/index.tsx create mode 100644 src/pages/settings/Subscription/SubscriptionPlan.tsx create mode 100644 src/pages/settings/Subscription/SubscriptionSettings/index.native.tsx create mode 100644 src/pages/settings/Subscription/SubscriptionSettings/index.tsx create mode 100644 src/pages/settings/Subscription/SubscriptionSettingsPage.tsx create mode 100644 src/pages/settings/Subscription/SubscriptionSize/index.native.tsx create mode 100644 src/pages/settings/Subscription/SubscriptionSize/index.tsx create mode 100644 src/pages/settings/Subscription/SubscriptionSize/substeps/Confirmation.tsx create mode 100644 src/pages/settings/Subscription/SubscriptionSize/substeps/Size.tsx create mode 100644 src/pages/settings/Subscription/utils.ts create mode 100644 src/pages/settings/Troubleshoot/getLightbulbIllustrationStyle/index.native.ts create mode 100644 src/pages/settings/Troubleshoot/getLightbulbIllustrationStyle/index.ts create mode 100644 src/pages/signin/SignUpWelcomeForm.tsx delete mode 100644 src/pages/workspace/accounting/xero/XeroMapRegionsToConfigurationPage.tsx rename src/pages/workspace/accounting/xero/{XeroMapCostCentersToConfigurationPage.tsx => XeroMapTrackingCategoryConfigurationPage.tsx} (51%) create mode 100644 src/pages/workspace/accounting/xero/export/XeroPurchaseBillStatusSelectorPage.tsx create mode 100644 src/pages/workspace/distanceRates/PolicyDistanceRateTaxRateEditPage.tsx create mode 100644 src/pages/workspace/distanceRates/PolicyDistanceRateTaxReclaimableEditPage.tsx create mode 100644 src/stories/PromotedActionBar.stories.tsx delete mode 100644 src/styles/stylePropTypes.js create mode 100644 src/styles/utils/generators/TooltipStyleUtils/index.native.ts rename src/styles/utils/generators/{TooltipStyleUtils.ts => TooltipStyleUtils/index.ts} (84%) create mode 100644 src/styles/utils/generators/TooltipStyleUtils/types.ts create mode 100644 src/types/form/PolicyDistanceRateTaxReclaimableOnEditForm.ts create mode 100644 src/types/form/SubscriptionSizeForm.ts create mode 100644 src/types/modules/react-native-performance.d.ts create mode 100644 src/types/onyx/BillingGraceEndPeriod.ts create mode 100644 src/types/onyx/OnyxInputOrEntry.ts create mode 100644 src/types/onyx/PrivateSubscription.ts create mode 100644 src/types/onyx/ReportActionName.ts create mode 100644 src/types/onyx/ReviewDuplicates.ts delete mode 100755 tests/unit/CIGitLogicTest.sh create mode 100644 tests/unit/CIGitLogicTest.ts create mode 100644 tests/unit/CardsSectionUtilsTest.ts create mode 100644 tests/unit/MoneyRequestUtilsTest.ts create mode 100644 tests/unit/OnyxUpdatesTest.ts create mode 100644 tests/unit/SubscriptionUtilsTest.ts delete mode 100644 tests/utils/bumpVersion.ts delete mode 100644 tests/utils/getPreviousVersion.ts delete mode 100755 tests/utils/getPullRequestsMergedBetween.ts diff --git a/.env.example b/.env.example index bed835645756..944da2aa9296 100644 --- a/.env.example +++ b/.env.example @@ -11,7 +11,6 @@ USE_WEB_PROXY=false USE_WDYR=false CAPTURE_METRICS=false ONYX_METRICS=false -GOOGLE_GEOLOCATION_API_KEY=AIzaSyBqg6bMvQU7cPWDKhhzpYqJrTEnSorpiLI EXPENSIFY_ACCOUNT_ID_ACCOUNTING=-1 EXPENSIFY_ACCOUNT_ID_ADMIN=-1 diff --git a/.env.production b/.env.production index 4b0a98e77557..5e676134d681 100644 --- a/.env.production +++ b/.env.production @@ -7,4 +7,3 @@ PUSHER_APP_KEY=268df511a204fbb60884 USE_WEB_PROXY=false ENVIRONMENT=production SEND_CRASH_REPORTS=true -GOOGLE_GEOLOCATION_API_KEY=AIzaSyBFKujMpzExz0_z2pAGfPUwkmlaUc-uw1Q diff --git a/.env.staging b/.env.staging index 1b3ec15fc172..17d82ac2d136 100644 --- a/.env.staging +++ b/.env.staging @@ -6,5 +6,4 @@ EXPENSIFY_PARTNER_PASSWORD=e21965746fd75f82bb66 PUSHER_APP_KEY=268df511a204fbb60884 USE_WEB_PROXY=false ENVIRONMENT=staging -SEND_CRASH_REPORTS=true -GOOGLE_GEOLOCATION_API_KEY=AIzaSyD2T1mlByThbUN88O8OPOD8vKuMMwLD4-M \ No newline at end of file +SEND_CRASH_REPORTS=true \ No newline at end of file diff --git a/.eslintignore b/.eslintignore index 5338df11c520..aa8b769dfede 100644 --- a/.eslintignore +++ b/.eslintignore @@ -9,3 +9,4 @@ android/**/build/** docs/vendor/** docs/assets/** web/gtm.js +**/.expo/** diff --git a/.eslintrc.js b/.eslintrc.js index 135252825dcf..d8f8c15eb878 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,3 +1,5 @@ +const path = require('path'); + const restrictedImportPaths = [ { name: 'react-native', @@ -55,6 +57,11 @@ const restrictedImportPaths = [ name: 'date-fns/locale', message: "Do not import 'date-fns/locale' directly. Please use the submodule import instead, like 'date-fns/locale/en-GB'.", }, + { + name: 'expensify-common', + importNames: ['Device'], + message: "Do not import Device directly, it's known to make VSCode's IntelliSense crash. Please import the desired module from `expensify-common/dist/Device` instead.", + }, ]; const restrictedImportPatterns = [ @@ -91,7 +98,7 @@ module.exports = { plugins: ['@typescript-eslint', 'jsdoc', 'you-dont-need-lodash-underscore', 'react-native-a11y', 'react', 'testing-library'], parser: '@typescript-eslint/parser', parserOptions: { - project: './tsconfig.json', + project: path.resolve(__dirname, './tsconfig.json'), }, env: { jest: true, @@ -100,11 +107,9 @@ module.exports = { __DEV__: 'readonly', }, rules: { - '@typescript-eslint/no-unsafe-call': 'off', + // TypeScript specific rules '@typescript-eslint/no-unsafe-member-access': 'off', '@typescript-eslint/no-unsafe-assignment': 'off', - - // TypeScript specific rules '@typescript-eslint/prefer-enum-initializers': 'error', '@typescript-eslint/no-var-requires': 'off', '@typescript-eslint/no-non-null-assertion': 'error', @@ -167,6 +172,7 @@ module.exports = { // Rulesdir specific rules 'rulesdir/no-default-props': 'error', + 'rulesdir/prefer-type-fest': 'error', 'rulesdir/no-multiple-onyx-in-file': 'off', 'rulesdir/prefer-underscore-method': 'off', 'rulesdir/prefer-import-module-contents': 'off', @@ -210,6 +216,8 @@ module.exports = { // Other rules curly: 'error', 'you-dont-need-lodash-underscore/throttle': 'off', + // The suggested alternative (structuredClone) is not supported in Hermes:https://github.com/facebook/hermes/issues/684 + 'you-dont-need-lodash-underscore/clone-deep': 'off', 'prefer-regex-literals': 'off', 'valid-jsdoc': 'off', 'jsdoc/no-types': 'error', @@ -235,10 +243,24 @@ module.exports = { ], }, - // Remove once no JS files are left overrides: [ + // Enforces every Onyx type and its properties to have a comment explaining its purpose. + { + files: ['src/types/onyx/**/*.ts'], + rules: { + 'jsdoc/require-jsdoc': [ + 'error', + { + contexts: ['TSInterfaceDeclaration', 'TSTypeAliasDeclaration', 'TSPropertySignature'], + }, + ], + }, + }, + + // Remove once no JS files are left { files: ['*.js', '*.jsx'], + extends: ['plugin:@typescript-eslint/disable-type-checked'], rules: { '@typescript-eslint/prefer-nullish-coalescing': 'off', '@typescript-eslint/no-unsafe-return': 'off', diff --git a/.github/actions/javascript/authorChecklist/index.js b/.github/actions/javascript/authorChecklist/index.js index 9861f3b5d38d..1946063d0264 100644 --- a/.github/actions/javascript/authorChecklist/index.js +++ b/.github/actions/javascript/authorChecklist/index.js @@ -11710,7 +11710,7 @@ FetchError.prototype.name = 'FetchError'; let convert; try { - convert = (__nccwpck_require__(2877).convert); + convert = (__nccwpck_require__(3975).convert); } catch (e) {} const INTERNALS = Symbol('Body internals'); @@ -17081,13 +17081,11 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873)); class GithubUtils { static internalOctokit; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token) { const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_paginate_rest_1.paginateRest); - const token = core.getInput('GITHUB_TOKEN', { required: true }); // Save a copy of octokit used in this class this.internalOctokit = new Octokit((0, utils_1.getOctokitOptions)(token, { throttle: { @@ -17107,6 +17105,15 @@ class GithubUtils { }, })); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', { required: true }); + this.initOctokitWithToken(token); + } /** * Either give an existing instance of Octokit rest or create a new one * @@ -17462,12 +17469,31 @@ class GithubUtils { .then((events) => events.filter((event) => event.event === 'closed')) .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName) { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName) { + return this.octokit.actions + .listArtifactsForRepo({ owner: CONST_1.default.GITHUB_OWNER, repo: CONST_1.default.APP_REPO, - per_page: 100, - }).then((artifacts) => artifacts.find((artifact) => artifact.name === artefactName)); + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId) { + return this.octokit.actions + .downloadArtifact({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } exports["default"] = GithubUtils; @@ -17539,27 +17565,27 @@ exports["default"] = arrayDifference; /***/ }), -/***/ 2877: +/***/ 9491: /***/ ((module) => { -module.exports = eval("require")("encoding"); - +"use strict"; +module.exports = require("assert"); /***/ }), -/***/ 9491: +/***/ 6113: /***/ ((module) => { "use strict"; -module.exports = require("assert"); +module.exports = require("crypto"); /***/ }), -/***/ 6113: +/***/ 3975: /***/ ((module) => { "use strict"; -module.exports = require("crypto"); +module.exports = require("encoding"); /***/ }), diff --git a/.github/actions/javascript/awaitStagingDeploys/index.js b/.github/actions/javascript/awaitStagingDeploys/index.js index e27fb6990074..1ba6a1b7c7d9 100644 --- a/.github/actions/javascript/awaitStagingDeploys/index.js +++ b/.github/actions/javascript/awaitStagingDeploys/index.js @@ -7373,7 +7373,7 @@ FetchError.prototype.name = 'FetchError'; let convert; try { - convert = (__nccwpck_require__(2877).convert); + convert = (__nccwpck_require__(3975).convert); } catch (e) {} const INTERNALS = Symbol('Body internals'); @@ -12322,13 +12322,11 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873)); class GithubUtils { static internalOctokit; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token) { const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_paginate_rest_1.paginateRest); - const token = core.getInput('GITHUB_TOKEN', { required: true }); // Save a copy of octokit used in this class this.internalOctokit = new Octokit((0, utils_1.getOctokitOptions)(token, { throttle: { @@ -12348,6 +12346,15 @@ class GithubUtils { }, })); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', { required: true }); + this.initOctokitWithToken(token); + } /** * Either give an existing instance of Octokit rest or create a new one * @@ -12703,12 +12710,31 @@ class GithubUtils { .then((events) => events.filter((event) => event.event === 'closed')) .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName) { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName) { + return this.octokit.actions + .listArtifactsForRepo({ owner: CONST_1.default.GITHUB_OWNER, repo: CONST_1.default.APP_REPO, - per_page: 100, - }).then((artifacts) => artifacts.find((artifact) => artifact.name === artefactName)); + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId) { + return this.octokit.actions + .downloadArtifact({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } exports["default"] = GithubUtils; @@ -12804,27 +12830,27 @@ exports["default"] = arrayDifference; /***/ }), -/***/ 2877: +/***/ 9491: /***/ ((module) => { -module.exports = eval("require")("encoding"); - +"use strict"; +module.exports = require("assert"); /***/ }), -/***/ 9491: +/***/ 6113: /***/ ((module) => { "use strict"; -module.exports = require("assert"); +module.exports = require("crypto"); /***/ }), -/***/ 6113: +/***/ 3975: /***/ ((module) => { "use strict"; -module.exports = require("crypto"); +module.exports = require("encoding"); /***/ }), diff --git a/.github/actions/javascript/bumpVersion/bumpVersion.ts b/.github/actions/javascript/bumpVersion/bumpVersion.ts index eba79c7c9edb..ff43ab9ee5c5 100644 --- a/.github/actions/javascript/bumpVersion/bumpVersion.ts +++ b/.github/actions/javascript/bumpVersion/bumpVersion.ts @@ -5,6 +5,7 @@ import type {PackageJson} from 'type-fest'; import {promisify} from 'util'; import {generateAndroidVersionCode, updateAndroidVersion, updateiOSVersion} from '@github/libs/nativeVersionUpdater'; import * as versionUpdater from '@github/libs/versionUpdater'; +import type {SemverLevel} from '@github/libs/versionUpdater'; const exec = promisify(originalExec); @@ -43,7 +44,7 @@ function updateNativeVersions(version: string) { } let semanticVersionLevel = core.getInput('SEMVER_LEVEL', {required: true}); -if (!semanticVersionLevel || !Object.keys(versionUpdater.SEMANTIC_VERSION_LEVELS).includes(semanticVersionLevel)) { +if (!semanticVersionLevel || !versionUpdater.isValidSemverLevel(semanticVersionLevel)) { semanticVersionLevel = versionUpdater.SEMANTIC_VERSION_LEVELS.BUILD; console.log(`Invalid input for 'SEMVER_LEVEL': ${semanticVersionLevel}`, `Defaulting to: ${semanticVersionLevel}`); } @@ -53,7 +54,7 @@ if (!previousVersion) { core.setFailed('Error: Could not read package.json'); } -const newVersion = versionUpdater.incrementVersion(previousVersion ?? '', semanticVersionLevel); +const newVersion = versionUpdater.incrementVersion(previousVersion ?? '', semanticVersionLevel as SemverLevel); console.log(`Previous version: ${previousVersion}`, `New version: ${newVersion}`); updateNativeVersions(newVersion); diff --git a/.github/actions/javascript/bumpVersion/index.js b/.github/actions/javascript/bumpVersion/index.js index e1a5cf13a8d9..93ea47bed2ae 100644 --- a/.github/actions/javascript/bumpVersion/index.js +++ b/.github/actions/javascript/bumpVersion/index.js @@ -3473,7 +3473,7 @@ function updateNativeVersions(version) { } } let semanticVersionLevel = core.getInput('SEMVER_LEVEL', { required: true }); -if (!semanticVersionLevel || !Object.keys(versionUpdater.SEMANTIC_VERSION_LEVELS).includes(semanticVersionLevel)) { +if (!semanticVersionLevel || !versionUpdater.isValidSemverLevel(semanticVersionLevel)) { semanticVersionLevel = versionUpdater.SEMANTIC_VERSION_LEVELS.BUILD; console.log(`Invalid input for 'SEMVER_LEVEL': ${semanticVersionLevel}`, `Defaulting to: ${semanticVersionLevel}`); } @@ -3589,7 +3589,7 @@ exports.updateiOSVersion = updateiOSVersion; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getPreviousVersion = exports.incrementPatch = exports.incrementMinor = exports.SEMANTIC_VERSION_LEVELS = exports.MAX_INCREMENTS = exports.incrementVersion = exports.getVersionStringFromNumber = exports.getVersionNumberFromString = void 0; +exports.getPreviousVersion = exports.incrementPatch = exports.incrementMinor = exports.SEMANTIC_VERSION_LEVELS = exports.MAX_INCREMENTS = exports.incrementVersion = exports.getVersionStringFromNumber = exports.getVersionNumberFromString = exports.isValidSemverLevel = void 0; const SEMANTIC_VERSION_LEVELS = { MAJOR: 'MAJOR', MINOR: 'MINOR', @@ -3599,6 +3599,10 @@ const SEMANTIC_VERSION_LEVELS = { exports.SEMANTIC_VERSION_LEVELS = SEMANTIC_VERSION_LEVELS; const MAX_INCREMENTS = 99; exports.MAX_INCREMENTS = MAX_INCREMENTS; +function isValidSemverLevel(str) { + return Object.keys(SEMANTIC_VERSION_LEVELS).includes(str); +} +exports.isValidSemverLevel = isValidSemverLevel; /** * Transforms a versions string into a number */ diff --git a/.github/actions/javascript/checkDeployBlockers/index.js b/.github/actions/javascript/checkDeployBlockers/index.js index 99639a58a9dd..b8897be9d956 100644 --- a/.github/actions/javascript/checkDeployBlockers/index.js +++ b/.github/actions/javascript/checkDeployBlockers/index.js @@ -6679,7 +6679,7 @@ FetchError.prototype.name = 'FetchError'; let convert; try { - convert = (__nccwpck_require__(2877).convert); + convert = (__nccwpck_require__(3975).convert); } catch (e) {} const INTERNALS = Symbol('Body internals'); @@ -11605,13 +11605,11 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873)); class GithubUtils { static internalOctokit; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token) { const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_paginate_rest_1.paginateRest); - const token = core.getInput('GITHUB_TOKEN', { required: true }); // Save a copy of octokit used in this class this.internalOctokit = new Octokit((0, utils_1.getOctokitOptions)(token, { throttle: { @@ -11631,6 +11629,15 @@ class GithubUtils { }, })); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', { required: true }); + this.initOctokitWithToken(token); + } /** * Either give an existing instance of Octokit rest or create a new one * @@ -11986,12 +11993,31 @@ class GithubUtils { .then((events) => events.filter((event) => event.event === 'closed')) .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName) { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName) { + return this.octokit.actions + .listArtifactsForRepo({ owner: CONST_1.default.GITHUB_OWNER, repo: CONST_1.default.APP_REPO, - per_page: 100, - }).then((artifacts) => artifacts.find((artifact) => artifact.name === artefactName)); + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId) { + return this.octokit.actions + .downloadArtifact({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } exports["default"] = GithubUtils; @@ -12032,27 +12058,27 @@ exports["default"] = arrayDifference; /***/ }), -/***/ 2877: +/***/ 9491: /***/ ((module) => { -module.exports = eval("require")("encoding"); - +"use strict"; +module.exports = require("assert"); /***/ }), -/***/ 9491: +/***/ 6113: /***/ ((module) => { "use strict"; -module.exports = require("assert"); +module.exports = require("crypto"); /***/ }), -/***/ 6113: +/***/ 3975: /***/ ((module) => { "use strict"; -module.exports = require("crypto"); +module.exports = require("encoding"); /***/ }), diff --git a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js index 816f8f4d6c57..4e0698b80708 100644 --- a/.github/actions/javascript/createOrUpdateStagingDeploy/index.js +++ b/.github/actions/javascript/createOrUpdateStagingDeploy/index.js @@ -9434,7 +9434,7 @@ FetchError.prototype.name = 'FetchError'; let convert; try { - convert = (__nccwpck_require__(2877).convert); + convert = (__nccwpck_require__(3975).convert); } catch (e) {} const INTERNALS = Symbol('Body internals'); @@ -14408,7 +14408,66 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); const child_process_1 = __nccwpck_require__(2081); const CONST_1 = __importDefault(__nccwpck_require__(9873)); const sanitizeStringForJSONParse_1 = __importDefault(__nccwpck_require__(3902)); -const VERSION_UPDATER = __importStar(__nccwpck_require__(8982)); +const VersionUpdater = __importStar(__nccwpck_require__(8982)); +/** + * Check if a tag exists locally or in the remote. + */ +function tagExists(tag) { + try { + // Check if the tag exists locally + (0, child_process_1.execSync)(`git show-ref --tags ${tag}`, { stdio: 'ignore' }); + return true; // Tag exists locally + } + catch (error) { + // Tag does not exist locally, check in remote + let shouldRetry = true; + let needsRepack = false; + let doesTagExist = false; + while (shouldRetry) { + try { + if (needsRepack) { + // We have seen some scenarios where this fixes the git fetch. + // Why? Who knows... https://github.com/Expensify/App/pull/31459 + (0, child_process_1.execSync)('git repack -d', { stdio: 'inherit' }); + } + (0, child_process_1.execSync)(`git ls-remote --exit-code --tags origin ${tag}`, { stdio: 'ignore' }); + doesTagExist = true; + shouldRetry = false; + } + catch (e) { + if (!needsRepack) { + console.log('Attempting to repack and retry...'); + needsRepack = true; + } + else { + console.error("Repack didn't help, giving up..."); + shouldRetry = false; + } + } + } + return doesTagExist; + } +} +/** + * This essentially just calls getPreviousVersion in a loop, until it finds a version for which a tag exists. + * It's useful if we manually perform a version bump, because in that case a tag may not exist for the previous version. + * + * @param tag the current tag + * @param level the Semver level to step backward by + */ +function getPreviousExistingTag(tag, level) { + let previousVersion = VersionUpdater.getPreviousVersion(tag, level); + let tagExistsForPreviousVersion = false; + while (!tagExistsForPreviousVersion) { + if (tagExists(previousVersion)) { + tagExistsForPreviousVersion = true; + break; + } + console.log(`Tag for previous version ${previousVersion} does not exist. Checking for an older version...`); + previousVersion = VersionUpdater.getPreviousVersion(previousVersion, level); + } + return previousVersion; +} /** * @param [shallowExcludeTag] When fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) */ @@ -14451,8 +14510,8 @@ function fetchTag(tag, shallowExcludeTag = '') { * Get merge logs between two tags (inclusive) as a JavaScript object. */ function getCommitHistoryAsJSON(fromTag, toTag) { - // Fetch tags, exclude commits reachable from the previous patch version (i.e: previous checklist), so that we don't have to fetch the full history - const previousPatchVersion = VERSION_UPDATER.getPreviousVersion(fromTag, VERSION_UPDATER.SEMANTIC_VERSION_LEVELS.PATCH); + // Fetch tags, excluding commits reachable from the previous patch version (i.e: previous checklist), so that we don't have to fetch the full history + const previousPatchVersion = getPreviousExistingTag(fromTag, VersionUpdater.SEMANTIC_VERSION_LEVELS.PATCH); fetchTag(fromTag, previousPatchVersion); fetchTag(toTag, previousPatchVersion); console.log('Getting pull requests merged between the following tags:', fromTag, toTag); @@ -14524,6 +14583,7 @@ async function getPullRequestsMergedBetween(fromTag, toTag) { return pullRequestNumbers; } exports["default"] = { + getPreviousExistingTag, getValidMergedPRs, getPullRequestsMergedBetween, }; @@ -14575,13 +14635,11 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873)); class GithubUtils { static internalOctokit; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token) { const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_paginate_rest_1.paginateRest); - const token = core.getInput('GITHUB_TOKEN', { required: true }); // Save a copy of octokit used in this class this.internalOctokit = new Octokit((0, utils_1.getOctokitOptions)(token, { throttle: { @@ -14601,6 +14659,15 @@ class GithubUtils { }, })); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', { required: true }); + this.initOctokitWithToken(token); + } /** * Either give an existing instance of Octokit rest or create a new one * @@ -14956,12 +15023,31 @@ class GithubUtils { .then((events) => events.filter((event) => event.event === 'closed')) .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName) { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName) { + return this.octokit.actions + .listArtifactsForRepo({ owner: CONST_1.default.GITHUB_OWNER, repo: CONST_1.default.APP_REPO, - per_page: 100, - }).then((artifacts) => artifacts.find((artifact) => artifact.name === artefactName)); + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId) { + return this.octokit.actions + .downloadArtifact({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } exports["default"] = GithubUtils; @@ -15008,7 +15094,7 @@ exports["default"] = sanitizeStringForJSONParse; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getPreviousVersion = exports.incrementPatch = exports.incrementMinor = exports.SEMANTIC_VERSION_LEVELS = exports.MAX_INCREMENTS = exports.incrementVersion = exports.getVersionStringFromNumber = exports.getVersionNumberFromString = void 0; +exports.getPreviousVersion = exports.incrementPatch = exports.incrementMinor = exports.SEMANTIC_VERSION_LEVELS = exports.MAX_INCREMENTS = exports.incrementVersion = exports.getVersionStringFromNumber = exports.getVersionNumberFromString = exports.isValidSemverLevel = void 0; const SEMANTIC_VERSION_LEVELS = { MAJOR: 'MAJOR', MINOR: 'MINOR', @@ -15018,6 +15104,10 @@ const SEMANTIC_VERSION_LEVELS = { exports.SEMANTIC_VERSION_LEVELS = SEMANTIC_VERSION_LEVELS; const MAX_INCREMENTS = 99; exports.MAX_INCREMENTS = MAX_INCREMENTS; +function isValidSemverLevel(str) { + return Object.keys(SEMANTIC_VERSION_LEVELS).includes(str); +} +exports.isValidSemverLevel = isValidSemverLevel; /** * Transforms a versions string into a number */ @@ -15134,14 +15224,6 @@ function arrayDifference(array1, array2) { exports["default"] = arrayDifference; -/***/ }), - -/***/ 2877: -/***/ ((module) => { - -module.exports = eval("require")("encoding"); - - /***/ }), /***/ 9491: @@ -15168,6 +15250,14 @@ module.exports = require("crypto"); /***/ }), +/***/ 3975: +/***/ ((module) => { + +"use strict"; +module.exports = require("encoding"); + +/***/ }), + /***/ 2361: /***/ ((module) => { diff --git a/.github/actions/javascript/getArtifactInfo/index.js b/.github/actions/javascript/getArtifactInfo/index.js index 0036f7fcb0ca..465b1fb901d9 100644 --- a/.github/actions/javascript/getArtifactInfo/index.js +++ b/.github/actions/javascript/getArtifactInfo/index.js @@ -6679,7 +6679,7 @@ FetchError.prototype.name = 'FetchError'; let convert; try { - convert = (__nccwpck_require__(2877).convert); + convert = (__nccwpck_require__(3975).convert); } catch (e) {} const INTERNALS = Symbol('Body internals'); @@ -11566,13 +11566,11 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873)); class GithubUtils { static internalOctokit; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token) { const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_paginate_rest_1.paginateRest); - const token = core.getInput('GITHUB_TOKEN', { required: true }); // Save a copy of octokit used in this class this.internalOctokit = new Octokit((0, utils_1.getOctokitOptions)(token, { throttle: { @@ -11592,6 +11590,15 @@ class GithubUtils { }, })); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', { required: true }); + this.initOctokitWithToken(token); + } /** * Either give an existing instance of Octokit rest or create a new one * @@ -11947,12 +11954,31 @@ class GithubUtils { .then((events) => events.filter((event) => event.event === 'closed')) .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName) { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName) { + return this.octokit.actions + .listArtifactsForRepo({ owner: CONST_1.default.GITHUB_OWNER, repo: CONST_1.default.APP_REPO, - per_page: 100, - }).then((artifacts) => artifacts.find((artifact) => artifact.name === artefactName)); + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId) { + return this.octokit.actions + .downloadArtifact({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } exports["default"] = GithubUtils; @@ -11993,27 +12019,27 @@ exports["default"] = arrayDifference; /***/ }), -/***/ 2877: +/***/ 9491: /***/ ((module) => { -module.exports = eval("require")("encoding"); - +"use strict"; +module.exports = require("assert"); /***/ }), -/***/ 9491: +/***/ 6113: /***/ ((module) => { "use strict"; -module.exports = require("assert"); +module.exports = require("crypto"); /***/ }), -/***/ 6113: +/***/ 3975: /***/ ((module) => { "use strict"; -module.exports = require("crypto"); +module.exports = require("encoding"); /***/ }), diff --git a/.github/actions/javascript/getDeployPullRequestList/index.js b/.github/actions/javascript/getDeployPullRequestList/index.js index 27b3df798f33..5ff707be02d4 100644 --- a/.github/actions/javascript/getDeployPullRequestList/index.js +++ b/.github/actions/javascript/getDeployPullRequestList/index.js @@ -6723,7 +6723,7 @@ FetchError.prototype.name = 'FetchError'; let convert; try { - convert = (__nccwpck_require__(2877).convert); + convert = (__nccwpck_require__(3975).convert); } catch (e) {} const INTERNALS = Symbol('Body internals'); @@ -11672,7 +11672,66 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); const child_process_1 = __nccwpck_require__(2081); const CONST_1 = __importDefault(__nccwpck_require__(9873)); const sanitizeStringForJSONParse_1 = __importDefault(__nccwpck_require__(3902)); -const VERSION_UPDATER = __importStar(__nccwpck_require__(8982)); +const VersionUpdater = __importStar(__nccwpck_require__(8982)); +/** + * Check if a tag exists locally or in the remote. + */ +function tagExists(tag) { + try { + // Check if the tag exists locally + (0, child_process_1.execSync)(`git show-ref --tags ${tag}`, { stdio: 'ignore' }); + return true; // Tag exists locally + } + catch (error) { + // Tag does not exist locally, check in remote + let shouldRetry = true; + let needsRepack = false; + let doesTagExist = false; + while (shouldRetry) { + try { + if (needsRepack) { + // We have seen some scenarios where this fixes the git fetch. + // Why? Who knows... https://github.com/Expensify/App/pull/31459 + (0, child_process_1.execSync)('git repack -d', { stdio: 'inherit' }); + } + (0, child_process_1.execSync)(`git ls-remote --exit-code --tags origin ${tag}`, { stdio: 'ignore' }); + doesTagExist = true; + shouldRetry = false; + } + catch (e) { + if (!needsRepack) { + console.log('Attempting to repack and retry...'); + needsRepack = true; + } + else { + console.error("Repack didn't help, giving up..."); + shouldRetry = false; + } + } + } + return doesTagExist; + } +} +/** + * This essentially just calls getPreviousVersion in a loop, until it finds a version for which a tag exists. + * It's useful if we manually perform a version bump, because in that case a tag may not exist for the previous version. + * + * @param tag the current tag + * @param level the Semver level to step backward by + */ +function getPreviousExistingTag(tag, level) { + let previousVersion = VersionUpdater.getPreviousVersion(tag, level); + let tagExistsForPreviousVersion = false; + while (!tagExistsForPreviousVersion) { + if (tagExists(previousVersion)) { + tagExistsForPreviousVersion = true; + break; + } + console.log(`Tag for previous version ${previousVersion} does not exist. Checking for an older version...`); + previousVersion = VersionUpdater.getPreviousVersion(previousVersion, level); + } + return previousVersion; +} /** * @param [shallowExcludeTag] When fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) */ @@ -11715,8 +11774,8 @@ function fetchTag(tag, shallowExcludeTag = '') { * Get merge logs between two tags (inclusive) as a JavaScript object. */ function getCommitHistoryAsJSON(fromTag, toTag) { - // Fetch tags, exclude commits reachable from the previous patch version (i.e: previous checklist), so that we don't have to fetch the full history - const previousPatchVersion = VERSION_UPDATER.getPreviousVersion(fromTag, VERSION_UPDATER.SEMANTIC_VERSION_LEVELS.PATCH); + // Fetch tags, excluding commits reachable from the previous patch version (i.e: previous checklist), so that we don't have to fetch the full history + const previousPatchVersion = getPreviousExistingTag(fromTag, VersionUpdater.SEMANTIC_VERSION_LEVELS.PATCH); fetchTag(fromTag, previousPatchVersion); fetchTag(toTag, previousPatchVersion); console.log('Getting pull requests merged between the following tags:', fromTag, toTag); @@ -11788,6 +11847,7 @@ async function getPullRequestsMergedBetween(fromTag, toTag) { return pullRequestNumbers; } exports["default"] = { + getPreviousExistingTag, getValidMergedPRs, getPullRequestsMergedBetween, }; @@ -11839,13 +11899,11 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873)); class GithubUtils { static internalOctokit; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token) { const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_paginate_rest_1.paginateRest); - const token = core.getInput('GITHUB_TOKEN', { required: true }); // Save a copy of octokit used in this class this.internalOctokit = new Octokit((0, utils_1.getOctokitOptions)(token, { throttle: { @@ -11865,6 +11923,15 @@ class GithubUtils { }, })); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', { required: true }); + this.initOctokitWithToken(token); + } /** * Either give an existing instance of Octokit rest or create a new one * @@ -12220,12 +12287,31 @@ class GithubUtils { .then((events) => events.filter((event) => event.event === 'closed')) .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName) { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName) { + return this.octokit.actions + .listArtifactsForRepo({ owner: CONST_1.default.GITHUB_OWNER, repo: CONST_1.default.APP_REPO, - per_page: 100, - }).then((artifacts) => artifacts.find((artifact) => artifact.name === artefactName)); + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId) { + return this.octokit.actions + .downloadArtifact({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } exports["default"] = GithubUtils; @@ -12272,7 +12358,7 @@ exports["default"] = sanitizeStringForJSONParse; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getPreviousVersion = exports.incrementPatch = exports.incrementMinor = exports.SEMANTIC_VERSION_LEVELS = exports.MAX_INCREMENTS = exports.incrementVersion = exports.getVersionStringFromNumber = exports.getVersionNumberFromString = void 0; +exports.getPreviousVersion = exports.incrementPatch = exports.incrementMinor = exports.SEMANTIC_VERSION_LEVELS = exports.MAX_INCREMENTS = exports.incrementVersion = exports.getVersionStringFromNumber = exports.getVersionNumberFromString = exports.isValidSemverLevel = void 0; const SEMANTIC_VERSION_LEVELS = { MAJOR: 'MAJOR', MINOR: 'MINOR', @@ -12282,6 +12368,10 @@ const SEMANTIC_VERSION_LEVELS = { exports.SEMANTIC_VERSION_LEVELS = SEMANTIC_VERSION_LEVELS; const MAX_INCREMENTS = 99; exports.MAX_INCREMENTS = MAX_INCREMENTS; +function isValidSemverLevel(str) { + return Object.keys(SEMANTIC_VERSION_LEVELS).includes(str); +} +exports.isValidSemverLevel = isValidSemverLevel; /** * Transforms a versions string into a number */ @@ -12398,14 +12488,6 @@ function arrayDifference(array1, array2) { exports["default"] = arrayDifference; -/***/ }), - -/***/ 2877: -/***/ ((module) => { - -module.exports = eval("require")("encoding"); - - /***/ }), /***/ 9491: @@ -12432,6 +12514,14 @@ module.exports = require("crypto"); /***/ }), +/***/ 3975: +/***/ ((module) => { + +"use strict"; +module.exports = require("encoding"); + +/***/ }), + /***/ 2361: /***/ ((module) => { diff --git a/.github/actions/javascript/getGraphiteString/getGraphiteString.ts b/.github/actions/javascript/getGraphiteString/getGraphiteString.ts index c486fdbd39f3..5231caa79ed5 100644 --- a/.github/actions/javascript/getGraphiteString/getGraphiteString.ts +++ b/.github/actions/javascript/getGraphiteString/getGraphiteString.ts @@ -1,6 +1,15 @@ import * as core from '@actions/core'; import fs from 'fs'; +type RegressionEntry = { + metadata?: { + creationDate: string; + }; + name: string; + meanDuration: number; + meanCount: number; +}; + const run = () => { // Prefix path to the graphite metric const GRAPHITE_PATH = 'reassure'; @@ -24,11 +33,11 @@ const run = () => { } try { - const current = JSON.parse(entry); + const current: RegressionEntry = JSON.parse(entry); // Extract timestamp, Graphite accepts timestamp in seconds if (current.metadata?.creationDate) { - timestamp = Math.floor(new Date(current.metadata.creationDate as string).getTime() / 1000); + timestamp = Math.floor(new Date(current.metadata.creationDate).getTime() / 1000); } if (current.name && current.meanDuration && current.meanCount && timestamp) { diff --git a/.github/actions/javascript/getPreviousVersion/getPreviousVersion.ts b/.github/actions/javascript/getPreviousVersion/getPreviousVersion.ts index 262b603124fa..a178d4073cbb 100644 --- a/.github/actions/javascript/getPreviousVersion/getPreviousVersion.ts +++ b/.github/actions/javascript/getPreviousVersion/getPreviousVersion.ts @@ -1,17 +1,29 @@ import * as core from '@actions/core'; import {readFileSync} from 'fs'; import type {PackageJson} from 'type-fest'; +import GitUtils from '@github/libs/GitUtils'; import * as versionUpdater from '@github/libs/versionUpdater'; +import type {SemverLevel} from '@github/libs/versionUpdater'; -const semverLevel = core.getInput('SEMVER_LEVEL', {required: true}); -if (!semverLevel || !Object.values(versionUpdater.SEMANTIC_VERSION_LEVELS).includes(semverLevel)) { - core.setFailed(`'Error: Invalid input for 'SEMVER_LEVEL': ${semverLevel}`); +function run() { + const semverLevel = core.getInput('SEMVER_LEVEL', {required: true}); + if (!semverLevel || !versionUpdater.isValidSemverLevel(semverLevel)) { + core.setFailed(`'Error: Invalid input for 'SEMVER_LEVEL': ${semverLevel}`); + } + + const {version: currentVersion}: PackageJson = JSON.parse(readFileSync('./package.json', 'utf8')); + if (!currentVersion) { + core.setFailed('Error: Could not read package.json'); + } + + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const previousVersion = GitUtils.getPreviousExistingTag(currentVersion!, semverLevel as SemverLevel); + core.setOutput('PREVIOUS_VERSION', previousVersion); + return previousVersion; } -const {version: currentVersion}: PackageJson = JSON.parse(readFileSync('./package.json', 'utf8')); -if (!currentVersion) { - core.setFailed('Error: Could not read package.json'); +if (require.main === module) { + run(); } -const previousVersion = versionUpdater.getPreviousVersion(currentVersion ?? '', semverLevel); -core.setOutput('PREVIOUS_VERSION', previousVersion); +export default run; diff --git a/.github/actions/javascript/getPreviousVersion/index.js b/.github/actions/javascript/getPreviousVersion/index.js index 8eac2f62f03e..29d02cc4dbac 100644 --- a/.github/actions/javascript/getPreviousVersion/index.js +++ b/.github/actions/javascript/getPreviousVersion/index.js @@ -2719,20 +2719,316 @@ var __importStar = (this && this.__importStar) || function (mod) { __setModuleDefault(result, mod); return result; }; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; Object.defineProperty(exports, "__esModule", ({ value: true })); const core = __importStar(__nccwpck_require__(186)); const fs_1 = __nccwpck_require__(147); +const GitUtils_1 = __importDefault(__nccwpck_require__(547)); const versionUpdater = __importStar(__nccwpck_require__(982)); -const semverLevel = core.getInput('SEMVER_LEVEL', { required: true }); -if (!semverLevel || !Object.values(versionUpdater.SEMANTIC_VERSION_LEVELS).includes(semverLevel)) { - core.setFailed(`'Error: Invalid input for 'SEMVER_LEVEL': ${semverLevel}`); +function run() { + const semverLevel = core.getInput('SEMVER_LEVEL', { required: true }); + if (!semverLevel || !versionUpdater.isValidSemverLevel(semverLevel)) { + core.setFailed(`'Error: Invalid input for 'SEMVER_LEVEL': ${semverLevel}`); + } + const { version: currentVersion } = JSON.parse((0, fs_1.readFileSync)('./package.json', 'utf8')); + if (!currentVersion) { + core.setFailed('Error: Could not read package.json'); + } + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const previousVersion = GitUtils_1.default.getPreviousExistingTag(currentVersion, semverLevel); + core.setOutput('PREVIOUS_VERSION', previousVersion); + return previousVersion; +} +if (require.main === require.cache[eval('__filename')]) { + run(); +} +exports["default"] = run; + + +/***/ }), + +/***/ 873: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +const GITHUB_BASE_URL_REGEX = new RegExp('https?://(?:github\\.com|api\\.github\\.com)'); +const GIT_CONST = { + GITHUB_OWNER: 'Expensify', + APP_REPO: 'App', +}; +const CONST = { + ...GIT_CONST, + APPLAUSE_BOT: 'applausebot', + OS_BOTIFY: 'OSBotify', + LABELS: { + STAGING_DEPLOY: 'StagingDeployCash', + DEPLOY_BLOCKER: 'DeployBlockerCash', + INTERNAL_QA: 'InternalQA', + }, + DATE_FORMAT_STRING: 'yyyy-MM-dd', + PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/pull/([0-9]+).*`), + ISSUE_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/issues/([0-9]+).*`), + ISSUE_OR_PULL_REQUEST_REGEX: new RegExp(`${GITHUB_BASE_URL_REGEX.source}/.*/.*/(?:pull|issues)/([0-9]+).*`), + POLL_RATE: 10000, + APP_REPO_URL: `https://github.com/${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}`, + APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, +}; +exports["default"] = CONST; + + +/***/ }), + +/***/ 547: +/***/ (function(__unused_webpack_module, exports, __nccwpck_require__) { + +"use strict"; + +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +const child_process_1 = __nccwpck_require__(81); +const CONST_1 = __importDefault(__nccwpck_require__(873)); +const sanitizeStringForJSONParse_1 = __importDefault(__nccwpck_require__(902)); +const VersionUpdater = __importStar(__nccwpck_require__(982)); +/** + * Check if a tag exists locally or in the remote. + */ +function tagExists(tag) { + try { + // Check if the tag exists locally + (0, child_process_1.execSync)(`git show-ref --tags ${tag}`, { stdio: 'ignore' }); + return true; // Tag exists locally + } + catch (error) { + // Tag does not exist locally, check in remote + let shouldRetry = true; + let needsRepack = false; + let doesTagExist = false; + while (shouldRetry) { + try { + if (needsRepack) { + // We have seen some scenarios where this fixes the git fetch. + // Why? Who knows... https://github.com/Expensify/App/pull/31459 + (0, child_process_1.execSync)('git repack -d', { stdio: 'inherit' }); + } + (0, child_process_1.execSync)(`git ls-remote --exit-code --tags origin ${tag}`, { stdio: 'ignore' }); + doesTagExist = true; + shouldRetry = false; + } + catch (e) { + if (!needsRepack) { + console.log('Attempting to repack and retry...'); + needsRepack = true; + } + else { + console.error("Repack didn't help, giving up..."); + shouldRetry = false; + } + } + } + return doesTagExist; + } +} +/** + * This essentially just calls getPreviousVersion in a loop, until it finds a version for which a tag exists. + * It's useful if we manually perform a version bump, because in that case a tag may not exist for the previous version. + * + * @param tag the current tag + * @param level the Semver level to step backward by + */ +function getPreviousExistingTag(tag, level) { + let previousVersion = VersionUpdater.getPreviousVersion(tag, level); + let tagExistsForPreviousVersion = false; + while (!tagExistsForPreviousVersion) { + if (tagExists(previousVersion)) { + tagExistsForPreviousVersion = true; + break; + } + console.log(`Tag for previous version ${previousVersion} does not exist. Checking for an older version...`); + previousVersion = VersionUpdater.getPreviousVersion(previousVersion, level); + } + return previousVersion; } -const { version: currentVersion } = JSON.parse((0, fs_1.readFileSync)('./package.json', 'utf8')); -if (!currentVersion) { - core.setFailed('Error: Could not read package.json'); +/** + * @param [shallowExcludeTag] When fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) + */ +function fetchTag(tag, shallowExcludeTag = '') { + let shouldRetry = true; + let needsRepack = false; + while (shouldRetry) { + try { + let command = ''; + if (needsRepack) { + // We have seen some scenarios where this fixes the git fetch. + // Why? Who knows... https://github.com/Expensify/App/pull/31459 + command = 'git repack -d'; + console.log(`Running command: ${command}`); + (0, child_process_1.execSync)(command); + } + command = `git fetch origin tag ${tag} --no-tags`; + // Note that this condition is only ever NOT true in the 1.0.0-0 edge case + if (shallowExcludeTag && shallowExcludeTag !== tag) { + command += ` --shallow-exclude=${shallowExcludeTag}`; + } + console.log(`Running command: ${command}`); + (0, child_process_1.execSync)(command); + shouldRetry = false; + } + catch (e) { + console.error(e); + if (!needsRepack) { + console.log('Attempting to repack and retry...'); + needsRepack = true; + } + else { + console.error("Repack didn't help, giving up..."); + shouldRetry = false; + } + } + } +} +/** + * Get merge logs between two tags (inclusive) as a JavaScript object. + */ +function getCommitHistoryAsJSON(fromTag, toTag) { + // Fetch tags, excluding commits reachable from the previous patch version (i.e: previous checklist), so that we don't have to fetch the full history + const previousPatchVersion = getPreviousExistingTag(fromTag, VersionUpdater.SEMANTIC_VERSION_LEVELS.PATCH); + fetchTag(fromTag, previousPatchVersion); + fetchTag(toTag, previousPatchVersion); + console.log('Getting pull requests merged between the following tags:', fromTag, toTag); + return new Promise((resolve, reject) => { + let stdout = ''; + let stderr = ''; + const args = ['log', '--format={"commit": "%H", "authorName": "%an", "subject": "%s"},', `${fromTag}...${toTag}`]; + console.log(`Running command: git ${args.join(' ')}`); + const spawnedProcess = (0, child_process_1.spawn)('git', args); + spawnedProcess.on('message', console.log); + spawnedProcess.stdout.on('data', (chunk) => { + console.log(chunk.toString()); + stdout += chunk.toString(); + }); + spawnedProcess.stderr.on('data', (chunk) => { + console.error(chunk.toString()); + stderr += chunk.toString(); + }); + spawnedProcess.on('close', (code) => { + if (code !== 0) { + return reject(new Error(`${stderr}`)); + } + resolve(stdout); + }); + spawnedProcess.on('error', (err) => reject(err)); + }).then((stdout) => { + // Sanitize just the text within commit subjects as that's the only potentially un-parseable text. + const sanitizedOutput = stdout.replace(/(?<="subject": ").*?(?="})/g, (subject) => (0, sanitizeStringForJSONParse_1.default)(subject)); + // Then remove newlines, format as JSON and convert to a proper JS object + const json = `[${sanitizedOutput}]`.replace(/(\r\n|\n|\r)/gm, '').replace('},]', '}]'); + return JSON.parse(json); + }); +} +/** + * Parse merged PRs, excluding those from irrelevant branches. + */ +function getValidMergedPRs(commits) { + const mergedPRs = new Set(); + commits.forEach((commit) => { + const author = commit.authorName; + if (author === CONST_1.default.OS_BOTIFY) { + return; + } + const match = commit.subject.match(/Merge pull request #(\d+) from (?!Expensify\/.*-cherry-pick-staging)/); + if (!Array.isArray(match) || match.length < 2) { + return; + } + const pr = Number.parseInt(match[1], 10); + if (mergedPRs.has(pr)) { + // If a PR shows up in the log twice, that means that the PR was deployed in the previous checklist. + // That also means that we don't want to include it in the current checklist, so we remove it now. + mergedPRs.delete(pr); + return; + } + mergedPRs.add(pr); + }); + return Array.from(mergedPRs); } -const previousVersion = versionUpdater.getPreviousVersion(currentVersion ?? '', semverLevel); -core.setOutput('PREVIOUS_VERSION', previousVersion); +/** + * Takes in two git tags and returns a list of PR numbers of all PRs merged between those two tags + */ +async function getPullRequestsMergedBetween(fromTag, toTag) { + console.log(`Looking for commits made between ${fromTag} and ${toTag}...`); + const commitList = await getCommitHistoryAsJSON(fromTag, toTag); + console.log(`Commits made between ${fromTag} and ${toTag}:`, commitList); + // Find which commit messages correspond to merged PR's + const pullRequestNumbers = getValidMergedPRs(commitList).sort((a, b) => a - b); + console.log(`List of pull requests merged between ${fromTag} and ${toTag}`, pullRequestNumbers); + return pullRequestNumbers; +} +exports["default"] = { + getPreviousExistingTag, + getValidMergedPRs, + getPullRequestsMergedBetween, +}; + + +/***/ }), + +/***/ 902: +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +/* eslint-disable @typescript-eslint/naming-convention */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +const replacer = (str) => ({ + '\\': '\\\\', + '\t': '\\t', + '\n': '\\n', + '\r': '\\r', + '\f': '\\f', + '"': '\\"', +}[str] ?? ''); +/** + * Replace any characters in the string that will break JSON.parse for our Git Log output + * + * Solution partly taken from SO user Gabriel Rodríguez Flores 🙇 + * https://stackoverflow.com/questions/52789718/how-to-remove-special-characters-before-json-parse-while-file-reading + */ +const sanitizeStringForJSONParse = (inputString) => { + if (typeof inputString !== 'string') { + throw new TypeError('Input must me of type String'); + } + // Replace any newlines and escape backslashes + return inputString.replace(/\\|\t|\n|\r|\f|"/g, replacer); +}; +exports["default"] = sanitizeStringForJSONParse; /***/ }), @@ -2743,7 +3039,7 @@ core.setOutput('PREVIOUS_VERSION', previousVersion); "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.getPreviousVersion = exports.incrementPatch = exports.incrementMinor = exports.SEMANTIC_VERSION_LEVELS = exports.MAX_INCREMENTS = exports.incrementVersion = exports.getVersionStringFromNumber = exports.getVersionNumberFromString = void 0; +exports.getPreviousVersion = exports.incrementPatch = exports.incrementMinor = exports.SEMANTIC_VERSION_LEVELS = exports.MAX_INCREMENTS = exports.incrementVersion = exports.getVersionStringFromNumber = exports.getVersionNumberFromString = exports.isValidSemverLevel = void 0; const SEMANTIC_VERSION_LEVELS = { MAJOR: 'MAJOR', MINOR: 'MINOR', @@ -2753,6 +3049,10 @@ const SEMANTIC_VERSION_LEVELS = { exports.SEMANTIC_VERSION_LEVELS = SEMANTIC_VERSION_LEVELS; const MAX_INCREMENTS = 99; exports.MAX_INCREMENTS = MAX_INCREMENTS; +function isValidSemverLevel(str) { + return Object.keys(SEMANTIC_VERSION_LEVELS).includes(str); +} +exports.isValidSemverLevel = isValidSemverLevel; /** * Transforms a versions string into a number */ @@ -2846,6 +3146,14 @@ module.exports = require("assert"); /***/ }), +/***/ 81: +/***/ ((module) => { + +"use strict"; +module.exports = require("child_process"); + +/***/ }), + /***/ 113: /***/ ((module) => { diff --git a/.github/actions/javascript/getPullRequestDetails/index.js b/.github/actions/javascript/getPullRequestDetails/index.js index 66507b031164..19d34e24af2c 100644 --- a/.github/actions/javascript/getPullRequestDetails/index.js +++ b/.github/actions/javascript/getPullRequestDetails/index.js @@ -6679,7 +6679,7 @@ FetchError.prototype.name = 'FetchError'; let convert; try { - convert = (__nccwpck_require__(2877).convert); + convert = (__nccwpck_require__(3975).convert); } catch (e) {} const INTERNALS = Symbol('Body internals'); @@ -11668,13 +11668,11 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873)); class GithubUtils { static internalOctokit; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token) { const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_paginate_rest_1.paginateRest); - const token = core.getInput('GITHUB_TOKEN', { required: true }); // Save a copy of octokit used in this class this.internalOctokit = new Octokit((0, utils_1.getOctokitOptions)(token, { throttle: { @@ -11694,6 +11692,15 @@ class GithubUtils { }, })); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', { required: true }); + this.initOctokitWithToken(token); + } /** * Either give an existing instance of Octokit rest or create a new one * @@ -12049,12 +12056,31 @@ class GithubUtils { .then((events) => events.filter((event) => event.event === 'closed')) .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName) { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName) { + return this.octokit.actions + .listArtifactsForRepo({ owner: CONST_1.default.GITHUB_OWNER, repo: CONST_1.default.APP_REPO, - per_page: 100, - }).then((artifacts) => artifacts.find((artifact) => artifact.name === artefactName)); + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId) { + return this.octokit.actions + .downloadArtifact({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } exports["default"] = GithubUtils; @@ -12095,27 +12121,27 @@ exports["default"] = arrayDifference; /***/ }), -/***/ 2877: +/***/ 9491: /***/ ((module) => { -module.exports = eval("require")("encoding"); - +"use strict"; +module.exports = require("assert"); /***/ }), -/***/ 9491: +/***/ 6113: /***/ ((module) => { "use strict"; -module.exports = require("assert"); +module.exports = require("crypto"); /***/ }), -/***/ 6113: +/***/ 3975: /***/ ((module) => { "use strict"; -module.exports = require("crypto"); +module.exports = require("encoding"); /***/ }), diff --git a/.github/actions/javascript/getReleaseBody/index.js b/.github/actions/javascript/getReleaseBody/index.js index afc786066526..5cc713927495 100644 --- a/.github/actions/javascript/getReleaseBody/index.js +++ b/.github/actions/javascript/getReleaseBody/index.js @@ -6679,7 +6679,7 @@ FetchError.prototype.name = 'FetchError'; let convert; try { - convert = (__nccwpck_require__(2877).convert); + convert = (__nccwpck_require__(3975).convert); } catch (e) {} const INTERNALS = Symbol('Body internals'); @@ -11612,13 +11612,11 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873)); class GithubUtils { static internalOctokit; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token) { const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_paginate_rest_1.paginateRest); - const token = core.getInput('GITHUB_TOKEN', { required: true }); // Save a copy of octokit used in this class this.internalOctokit = new Octokit((0, utils_1.getOctokitOptions)(token, { throttle: { @@ -11638,6 +11636,15 @@ class GithubUtils { }, })); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', { required: true }); + this.initOctokitWithToken(token); + } /** * Either give an existing instance of Octokit rest or create a new one * @@ -11993,12 +12000,31 @@ class GithubUtils { .then((events) => events.filter((event) => event.event === 'closed')) .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName) { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName) { + return this.octokit.actions + .listArtifactsForRepo({ owner: CONST_1.default.GITHUB_OWNER, repo: CONST_1.default.APP_REPO, - per_page: 100, - }).then((artifacts) => artifacts.find((artifact) => artifact.name === artefactName)); + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId) { + return this.octokit.actions + .downloadArtifact({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } exports["default"] = GithubUtils; @@ -12039,27 +12065,27 @@ exports["default"] = arrayDifference; /***/ }), -/***/ 2877: +/***/ 9491: /***/ ((module) => { -module.exports = eval("require")("encoding"); - +"use strict"; +module.exports = require("assert"); /***/ }), -/***/ 9491: +/***/ 6113: /***/ ((module) => { "use strict"; -module.exports = require("assert"); +module.exports = require("crypto"); /***/ }), -/***/ 6113: +/***/ 3975: /***/ ((module) => { "use strict"; -module.exports = require("crypto"); +module.exports = require("encoding"); /***/ }), diff --git a/.github/actions/javascript/isStagingDeployLocked/index.js b/.github/actions/javascript/isStagingDeployLocked/index.js index 02c1424c229a..98bef90f3c06 100644 --- a/.github/actions/javascript/isStagingDeployLocked/index.js +++ b/.github/actions/javascript/isStagingDeployLocked/index.js @@ -6679,7 +6679,7 @@ FetchError.prototype.name = 'FetchError'; let convert; try { - convert = (__nccwpck_require__(2877).convert); + convert = (__nccwpck_require__(3975).convert); } catch (e) {} const INTERNALS = Symbol('Body internals'); @@ -11566,13 +11566,11 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873)); class GithubUtils { static internalOctokit; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token) { const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_paginate_rest_1.paginateRest); - const token = core.getInput('GITHUB_TOKEN', { required: true }); // Save a copy of octokit used in this class this.internalOctokit = new Octokit((0, utils_1.getOctokitOptions)(token, { throttle: { @@ -11592,6 +11590,15 @@ class GithubUtils { }, })); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', { required: true }); + this.initOctokitWithToken(token); + } /** * Either give an existing instance of Octokit rest or create a new one * @@ -11947,12 +11954,31 @@ class GithubUtils { .then((events) => events.filter((event) => event.event === 'closed')) .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName) { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName) { + return this.octokit.actions + .listArtifactsForRepo({ owner: CONST_1.default.GITHUB_OWNER, repo: CONST_1.default.APP_REPO, - per_page: 100, - }).then((artifacts) => artifacts.find((artifact) => artifact.name === artefactName)); + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId) { + return this.octokit.actions + .downloadArtifact({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } exports["default"] = GithubUtils; @@ -11993,27 +12019,27 @@ exports["default"] = arrayDifference; /***/ }), -/***/ 2877: +/***/ 9491: /***/ ((module) => { -module.exports = eval("require")("encoding"); - +"use strict"; +module.exports = require("assert"); /***/ }), -/***/ 9491: +/***/ 6113: /***/ ((module) => { "use strict"; -module.exports = require("assert"); +module.exports = require("crypto"); /***/ }), -/***/ 6113: +/***/ 3975: /***/ ((module) => { "use strict"; -module.exports = require("crypto"); +module.exports = require("encoding"); /***/ }), diff --git a/.github/actions/javascript/markPullRequestsAsDeployed/index.js b/.github/actions/javascript/markPullRequestsAsDeployed/index.js index c84eb008e5a2..00f20a20ce33 100644 --- a/.github/actions/javascript/markPullRequestsAsDeployed/index.js +++ b/.github/actions/javascript/markPullRequestsAsDeployed/index.js @@ -6723,7 +6723,7 @@ FetchError.prototype.name = 'FetchError'; let convert; try { - convert = (__nccwpck_require__(2877).convert); + convert = (__nccwpck_require__(3975).convert); } catch (e) {} const INTERNALS = Symbol('Body internals'); @@ -11598,15 +11598,25 @@ async function run() { * 1. For regular staging deploys, the person who merged the PR. * 2. For CPs, the person who committed the cherry-picked commit (not necessarily the author of the commit). */ - const { data: pr } = await GithubUtils_1.default.octokit.pulls.get({ - owner: CONST_1.default.GITHUB_OWNER, - repo: CONST_1.default.APP_REPO, - pull_number: prNumber, - }); - const deployer = isCP ? commit.committer.name : pr.merged_by?.login; - const title = pr.title; - const deployMessage = deployer ? getDeployMessage(deployer, isCP ? 'Cherry-picked' : 'Deployed', title) : ''; - await commentPR(prNumber, deployMessage); + try { + const { data: pr } = await GithubUtils_1.default.octokit.pulls.get({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + pull_number: prNumber, + }); + const deployer = isCP ? commit.committer.name : pr.merged_by?.login; + const title = pr.title; + const deployMessage = deployer ? getDeployMessage(deployer, isCP ? 'Cherry-picked' : 'Deployed', title) : ''; + await commentPR(prNumber, deployMessage); + } + catch (error) { + if (error.status === 404) { + console.log(`Unable to comment on PR #${prNumber}. GitHub responded with 404.`); + } + else { + throw error; + } + } } } if (require.main === require.cache[eval('__filename')]) { @@ -11763,13 +11773,11 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873)); class GithubUtils { static internalOctokit; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token) { const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_paginate_rest_1.paginateRest); - const token = core.getInput('GITHUB_TOKEN', { required: true }); // Save a copy of octokit used in this class this.internalOctokit = new Octokit((0, utils_1.getOctokitOptions)(token, { throttle: { @@ -11789,6 +11797,15 @@ class GithubUtils { }, })); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', { required: true }); + this.initOctokitWithToken(token); + } /** * Either give an existing instance of Octokit rest or create a new one * @@ -12144,12 +12161,31 @@ class GithubUtils { .then((events) => events.filter((event) => event.event === 'closed')) .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName) { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName) { + return this.octokit.actions + .listArtifactsForRepo({ owner: CONST_1.default.GITHUB_OWNER, repo: CONST_1.default.APP_REPO, - per_page: 100, - }).then((artifacts) => artifacts.find((artifact) => artifact.name === artefactName)); + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId) { + return this.octokit.actions + .downloadArtifact({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } exports["default"] = GithubUtils; @@ -12190,27 +12226,27 @@ exports["default"] = arrayDifference; /***/ }), -/***/ 2877: +/***/ 9491: /***/ ((module) => { -module.exports = eval("require")("encoding"); - +"use strict"; +module.exports = require("assert"); /***/ }), -/***/ 9491: +/***/ 6113: /***/ ((module) => { "use strict"; -module.exports = require("assert"); +module.exports = require("crypto"); /***/ }), -/***/ 6113: +/***/ 3975: /***/ ((module) => { "use strict"; -module.exports = require("crypto"); +module.exports = require("encoding"); /***/ }), diff --git a/.github/actions/javascript/markPullRequestsAsDeployed/markPullRequestsAsDeployed.ts b/.github/actions/javascript/markPullRequestsAsDeployed/markPullRequestsAsDeployed.ts index a312bae7e7df..53018cbb035e 100644 --- a/.github/actions/javascript/markPullRequestsAsDeployed/markPullRequestsAsDeployed.ts +++ b/.github/actions/javascript/markPullRequestsAsDeployed/markPullRequestsAsDeployed.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ import * as core from '@actions/core'; import {context} from '@actions/github'; +import type {RequestError} from '@octokit/types'; import * as ActionUtils from '@github/libs/ActionUtils'; import CONST from '@github/libs/CONST'; import GithubUtils from '@github/libs/GithubUtils'; @@ -113,16 +114,24 @@ async function run() { * 1. For regular staging deploys, the person who merged the PR. * 2. For CPs, the person who committed the cherry-picked commit (not necessarily the author of the commit). */ - const {data: pr} = await GithubUtils.octokit.pulls.get({ - owner: CONST.GITHUB_OWNER, - repo: CONST.APP_REPO, - pull_number: prNumber, - }); - const deployer = isCP ? commit.committer.name : pr.merged_by?.login; - - const title = pr.title; - const deployMessage = deployer ? getDeployMessage(deployer, isCP ? 'Cherry-picked' : 'Deployed', title) : ''; - await commentPR(prNumber, deployMessage); + try { + const {data: pr} = await GithubUtils.octokit.pulls.get({ + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + pull_number: prNumber, + }); + const deployer = isCP ? commit.committer.name : pr.merged_by?.login; + + const title = pr.title; + const deployMessage = deployer ? getDeployMessage(deployer, isCP ? 'Cherry-picked' : 'Deployed', title) : ''; + await commentPR(prNumber, deployMessage); + } catch (error) { + if ((error as RequestError).status === 404) { + console.log(`Unable to comment on PR #${prNumber}. GitHub responded with 404.`); + } else { + throw error; + } + } } } diff --git a/.github/actions/javascript/postTestBuildComment/index.js b/.github/actions/javascript/postTestBuildComment/index.js index e9ba6fb92b94..9389b2651427 100644 --- a/.github/actions/javascript/postTestBuildComment/index.js +++ b/.github/actions/javascript/postTestBuildComment/index.js @@ -6723,7 +6723,7 @@ FetchError.prototype.name = 'FetchError'; let convert; try { - convert = (__nccwpck_require__(2877).convert); + convert = (__nccwpck_require__(3975).convert); } catch (e) {} const INTERNALS = Symbol('Body internals'); @@ -11665,13 +11665,11 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873)); class GithubUtils { static internalOctokit; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token) { const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_paginate_rest_1.paginateRest); - const token = core.getInput('GITHUB_TOKEN', { required: true }); // Save a copy of octokit used in this class this.internalOctokit = new Octokit((0, utils_1.getOctokitOptions)(token, { throttle: { @@ -11691,6 +11689,15 @@ class GithubUtils { }, })); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', { required: true }); + this.initOctokitWithToken(token); + } /** * Either give an existing instance of Octokit rest or create a new one * @@ -12046,12 +12053,31 @@ class GithubUtils { .then((events) => events.filter((event) => event.event === 'closed')) .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName) { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName) { + return this.octokit.actions + .listArtifactsForRepo({ owner: CONST_1.default.GITHUB_OWNER, repo: CONST_1.default.APP_REPO, - per_page: 100, - }).then((artifacts) => artifacts.find((artifact) => artifact.name === artefactName)); + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId) { + return this.octokit.actions + .downloadArtifact({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } exports["default"] = GithubUtils; @@ -12092,27 +12118,27 @@ exports["default"] = arrayDifference; /***/ }), -/***/ 2877: +/***/ 9491: /***/ ((module) => { -module.exports = eval("require")("encoding"); - +"use strict"; +module.exports = require("assert"); /***/ }), -/***/ 9491: +/***/ 6113: /***/ ((module) => { "use strict"; -module.exports = require("assert"); +module.exports = require("crypto"); /***/ }), -/***/ 6113: +/***/ 3975: /***/ ((module) => { "use strict"; -module.exports = require("crypto"); +module.exports = require("encoding"); /***/ }), diff --git a/.github/actions/javascript/reopenIssueWithComment/index.js b/.github/actions/javascript/reopenIssueWithComment/index.js index 2bbc7cb7522e..82d95606f338 100644 --- a/.github/actions/javascript/reopenIssueWithComment/index.js +++ b/.github/actions/javascript/reopenIssueWithComment/index.js @@ -6679,7 +6679,7 @@ FetchError.prototype.name = 'FetchError'; let convert; try { - convert = (__nccwpck_require__(2877).convert); + convert = (__nccwpck_require__(3975).convert); } catch (e) {} const INTERNALS = Symbol('Body internals'); @@ -11576,13 +11576,11 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873)); class GithubUtils { static internalOctokit; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token) { const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_paginate_rest_1.paginateRest); - const token = core.getInput('GITHUB_TOKEN', { required: true }); // Save a copy of octokit used in this class this.internalOctokit = new Octokit((0, utils_1.getOctokitOptions)(token, { throttle: { @@ -11602,6 +11600,15 @@ class GithubUtils { }, })); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', { required: true }); + this.initOctokitWithToken(token); + } /** * Either give an existing instance of Octokit rest or create a new one * @@ -11957,12 +11964,31 @@ class GithubUtils { .then((events) => events.filter((event) => event.event === 'closed')) .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName) { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName) { + return this.octokit.actions + .listArtifactsForRepo({ owner: CONST_1.default.GITHUB_OWNER, repo: CONST_1.default.APP_REPO, - per_page: 100, - }).then((artifacts) => artifacts.find((artifact) => artifact.name === artefactName)); + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId) { + return this.octokit.actions + .downloadArtifact({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } exports["default"] = GithubUtils; @@ -12003,27 +12029,27 @@ exports["default"] = arrayDifference; /***/ }), -/***/ 2877: +/***/ 9491: /***/ ((module) => { -module.exports = eval("require")("encoding"); - +"use strict"; +module.exports = require("assert"); /***/ }), -/***/ 9491: +/***/ 6113: /***/ ((module) => { "use strict"; -module.exports = require("assert"); +module.exports = require("crypto"); /***/ }), -/***/ 6113: +/***/ 3975: /***/ ((module) => { "use strict"; -module.exports = require("crypto"); +module.exports = require("encoding"); /***/ }), diff --git a/.github/actions/javascript/reviewerChecklist/index.js b/.github/actions/javascript/reviewerChecklist/index.js index 45b40e81887e..2cbc6c0a390f 100644 --- a/.github/actions/javascript/reviewerChecklist/index.js +++ b/.github/actions/javascript/reviewerChecklist/index.js @@ -6723,7 +6723,7 @@ FetchError.prototype.name = 'FetchError'; let convert; try { - convert = (__nccwpck_require__(2877).convert); + convert = (__nccwpck_require__(3975).convert); } catch (e) {} const INTERNALS = Symbol('Body internals'); @@ -11668,13 +11668,11 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873)); class GithubUtils { static internalOctokit; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token) { const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_paginate_rest_1.paginateRest); - const token = core.getInput('GITHUB_TOKEN', { required: true }); // Save a copy of octokit used in this class this.internalOctokit = new Octokit((0, utils_1.getOctokitOptions)(token, { throttle: { @@ -11694,6 +11692,15 @@ class GithubUtils { }, })); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', { required: true }); + this.initOctokitWithToken(token); + } /** * Either give an existing instance of Octokit rest or create a new one * @@ -12049,12 +12056,31 @@ class GithubUtils { .then((events) => events.filter((event) => event.event === 'closed')) .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName) { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName) { + return this.octokit.actions + .listArtifactsForRepo({ owner: CONST_1.default.GITHUB_OWNER, repo: CONST_1.default.APP_REPO, - per_page: 100, - }).then((artifacts) => artifacts.find((artifact) => artifact.name === artefactName)); + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId) { + return this.octokit.actions + .downloadArtifact({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } exports["default"] = GithubUtils; @@ -12095,27 +12121,27 @@ exports["default"] = arrayDifference; /***/ }), -/***/ 2877: +/***/ 9491: /***/ ((module) => { -module.exports = eval("require")("encoding"); - +"use strict"; +module.exports = require("assert"); /***/ }), -/***/ 9491: +/***/ 6113: /***/ ((module) => { "use strict"; -module.exports = require("assert"); +module.exports = require("crypto"); /***/ }), -/***/ 6113: +/***/ 3975: /***/ ((module) => { "use strict"; -module.exports = require("crypto"); +module.exports = require("encoding"); /***/ }), diff --git a/.github/actions/javascript/verifySignedCommits/index.js b/.github/actions/javascript/verifySignedCommits/index.js index 38157a6bf2ca..c817f4bdd91b 100644 --- a/.github/actions/javascript/verifySignedCommits/index.js +++ b/.github/actions/javascript/verifySignedCommits/index.js @@ -6723,7 +6723,7 @@ FetchError.prototype.name = 'FetchError'; let convert; try { - convert = (__nccwpck_require__(2877).convert); + convert = (__nccwpck_require__(3975).convert); } catch (e) {} const INTERNALS = Symbol('Body internals'); @@ -11608,13 +11608,11 @@ const CONST_1 = __importDefault(__nccwpck_require__(9873)); class GithubUtils { static internalOctokit; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token) { const Octokit = utils_1.GitHub.plugin(plugin_throttling_1.throttling, plugin_paginate_rest_1.paginateRest); - const token = core.getInput('GITHUB_TOKEN', { required: true }); // Save a copy of octokit used in this class this.internalOctokit = new Octokit((0, utils_1.getOctokitOptions)(token, { throttle: { @@ -11634,6 +11632,15 @@ class GithubUtils { }, })); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', { required: true }); + this.initOctokitWithToken(token); + } /** * Either give an existing instance of Octokit rest or create a new one * @@ -11989,12 +11996,31 @@ class GithubUtils { .then((events) => events.filter((event) => event.event === 'closed')) .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName) { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName) { + return this.octokit.actions + .listArtifactsForRepo({ owner: CONST_1.default.GITHUB_OWNER, repo: CONST_1.default.APP_REPO, - per_page: 100, - }).then((artifacts) => artifacts.find((artifact) => artifact.name === artefactName)); + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId) { + return this.octokit.actions + .downloadArtifact({ + owner: CONST_1.default.GITHUB_OWNER, + repo: CONST_1.default.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } exports["default"] = GithubUtils; @@ -12035,27 +12061,27 @@ exports["default"] = arrayDifference; /***/ }), -/***/ 2877: +/***/ 9491: /***/ ((module) => { -module.exports = eval("require")("encoding"); - +"use strict"; +module.exports = require("assert"); /***/ }), -/***/ 9491: +/***/ 6113: /***/ ((module) => { "use strict"; -module.exports = require("assert"); +module.exports = require("crypto"); /***/ }), -/***/ 6113: +/***/ 3975: /***/ ((module) => { "use strict"; -module.exports = require("crypto"); +module.exports = require("encoding"); /***/ }), diff --git a/.github/libs/GitUtils.ts b/.github/libs/GitUtils.ts index 684e7c76aa86..ab4a81f96adf 100644 --- a/.github/libs/GitUtils.ts +++ b/.github/libs/GitUtils.ts @@ -1,7 +1,8 @@ import {execSync, spawn} from 'child_process'; import CONST from './CONST'; import sanitizeStringForJSONParse from './sanitizeStringForJSONParse'; -import * as VERSION_UPDATER from './versionUpdater'; +import * as VersionUpdater from './versionUpdater'; +import type {SemverLevel} from './versionUpdater'; type CommitType = { commit: string; @@ -9,6 +10,64 @@ type CommitType = { authorName: string; }; +/** + * Check if a tag exists locally or in the remote. + */ +function tagExists(tag: string) { + try { + // Check if the tag exists locally + execSync(`git show-ref --tags ${tag}`, {stdio: 'ignore'}); + return true; // Tag exists locally + } catch (error) { + // Tag does not exist locally, check in remote + let shouldRetry = true; + let needsRepack = false; + let doesTagExist = false; + while (shouldRetry) { + try { + if (needsRepack) { + // We have seen some scenarios where this fixes the git fetch. + // Why? Who knows... https://github.com/Expensify/App/pull/31459 + execSync('git repack -d', {stdio: 'inherit'}); + } + execSync(`git ls-remote --exit-code --tags origin ${tag}`, {stdio: 'ignore'}); + doesTagExist = true; + shouldRetry = false; + } catch (e) { + if (!needsRepack) { + console.log('Attempting to repack and retry...'); + needsRepack = true; + } else { + console.error("Repack didn't help, giving up..."); + shouldRetry = false; + } + } + } + return doesTagExist; + } +} + +/** + * This essentially just calls getPreviousVersion in a loop, until it finds a version for which a tag exists. + * It's useful if we manually perform a version bump, because in that case a tag may not exist for the previous version. + * + * @param tag the current tag + * @param level the Semver level to step backward by + */ +function getPreviousExistingTag(tag: string, level: SemverLevel) { + let previousVersion = VersionUpdater.getPreviousVersion(tag, level); + let tagExistsForPreviousVersion = false; + while (!tagExistsForPreviousVersion) { + if (tagExists(previousVersion)) { + tagExistsForPreviousVersion = true; + break; + } + console.log(`Tag for previous version ${previousVersion} does not exist. Checking for an older version...`); + previousVersion = VersionUpdater.getPreviousVersion(previousVersion, level); + } + return previousVersion; +} + /** * @param [shallowExcludeTag] When fetching the given tag, exclude all history reachable by the shallowExcludeTag (used to make fetch much faster) */ @@ -53,8 +112,8 @@ function fetchTag(tag: string, shallowExcludeTag = '') { * Get merge logs between two tags (inclusive) as a JavaScript object. */ function getCommitHistoryAsJSON(fromTag: string, toTag: string): Promise { - // Fetch tags, exclude commits reachable from the previous patch version (i.e: previous checklist), so that we don't have to fetch the full history - const previousPatchVersion = VERSION_UPDATER.getPreviousVersion(fromTag, VERSION_UPDATER.SEMANTIC_VERSION_LEVELS.PATCH); + // Fetch tags, excluding commits reachable from the previous patch version (i.e: previous checklist), so that we don't have to fetch the full history + const previousPatchVersion = getPreviousExistingTag(fromTag, VersionUpdater.SEMANTIC_VERSION_LEVELS.PATCH); fetchTag(fromTag, previousPatchVersion); fetchTag(toTag, previousPatchVersion); @@ -66,11 +125,11 @@ function getCommitHistoryAsJSON(fromTag: string, toTag: string): Promise { + spawnedProcess.stdout.on('data', (chunk: Buffer) => { console.log(chunk.toString()); stdout += chunk.toString(); }); - spawnedProcess.stderr.on('data', (chunk) => { + spawnedProcess.stderr.on('data', (chunk: Buffer) => { console.error(chunk.toString()); stderr += chunk.toString(); }); @@ -138,6 +197,7 @@ async function getPullRequestsMergedBetween(fromTag: string, toTag: string) { } export default { + getPreviousExistingTag, getValidMergedPRs, getPullRequestsMergedBetween, }; diff --git a/.github/libs/GithubUtils.ts b/.github/libs/GithubUtils.ts index 99302f0ee765..258048a259d8 100644 --- a/.github/libs/GithubUtils.ts +++ b/.github/libs/GithubUtils.ts @@ -66,13 +66,11 @@ class GithubUtils { static internalOctokit: InternalOctokit | undefined; /** - * Initialize internal octokit - * - * @private + * Initialize internal octokit. + * NOTE: When using GithubUtils in CI, you don't need to call this manually. */ - static initOctokit() { + static initOctokitWithToken(token: string) { const Octokit = GitHub.plugin(throttling, paginateRest); - const token = core.getInput('GITHUB_TOKEN', {required: true}); // Save a copy of octokit used in this class this.internalOctokit = new Octokit( @@ -97,6 +95,16 @@ class GithubUtils { ); } + /** + * Default initialize method assuming running in CI, getting the token from an input. + * + * @private + */ + static initOctokit() { + const token = core.getInput('GITHUB_TOKEN', {required: true}); + this.initOctokitWithToken(token); + } + /** * Either give an existing instance of Octokit rest or create a new one * @@ -522,12 +530,32 @@ class GithubUtils { .then((closedEvents) => closedEvents.at(-1)?.actor?.login ?? ''); } - static getArtifactByName(artefactName: string): Promise { - return this.paginate(this.octokit.actions.listArtifactsForRepo, { - owner: CONST.GITHUB_OWNER, - repo: CONST.APP_REPO, - per_page: 100, - }).then((artifacts: OctokitArtifact[]) => artifacts.find((artifact) => artifact.name === artefactName)); + /** + * Returns a single artifact by name. If none is found, it returns undefined. + */ + static getArtifactByName(artifactName: string): Promise { + return this.octokit.actions + .listArtifactsForRepo({ + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + per_page: 1, + name: artifactName, + }) + .then((response) => response.data.artifacts[0]); + } + + /** + * Given an artifact ID, returns the download URL to a zip file containing the artifact. + */ + static getArtifactDownloadURL(artifactId: number): Promise { + return this.octokit.actions + .downloadArtifact({ + owner: CONST.GITHUB_OWNER, + repo: CONST.APP_REPO, + artifact_id: artifactId, + archive_format: 'zip', + }) + .then((response) => response.url); } } diff --git a/.github/libs/versionUpdater.ts b/.github/libs/versionUpdater.ts index 9b60fb82bd43..d9b24f532d8e 100644 --- a/.github/libs/versionUpdater.ts +++ b/.github/libs/versionUpdater.ts @@ -1,11 +1,18 @@ +import type {ValueOf} from 'type-fest'; + const SEMANTIC_VERSION_LEVELS = { MAJOR: 'MAJOR', MINOR: 'MINOR', PATCH: 'PATCH', BUILD: 'BUILD', } as const; +type SemverLevel = ValueOf; + +const MAX_INCREMENTS = 99; -const MAX_INCREMENTS = 99 as const; +function isValidSemverLevel(str: string): str is SemverLevel { + return Object.keys(SEMANTIC_VERSION_LEVELS).includes(str); +} /** * Transforms a versions string into a number @@ -46,7 +53,7 @@ const incrementPatch = (major: number, minor: number, patch: number): string => /** * Increments a build version */ -const incrementVersion = (version: string, level: string): string => { +const incrementVersion = (version: string, level: SemverLevel): string => { const [major, minor, patch, build] = getVersionNumberFromString(version); // Majors will always be incremented @@ -99,7 +106,9 @@ function getPreviousVersion(currentVersion: string, level: string): string { return getVersionStringFromNumber(major, minor, patch, build - 1); } +export type {SemverLevel}; export { + isValidSemverLevel, getVersionNumberFromString, getVersionStringFromNumber, incrementVersion, diff --git a/.github/scripts/buildActions.sh b/.github/scripts/buildActions.sh index 4c9698554085..4d54d75b0520 100755 --- a/.github/scripts/buildActions.sh +++ b/.github/scripts/buildActions.sh @@ -44,7 +44,7 @@ for ((i=0; i < ${#GITHUB_ACTIONS[@]}; i++)); do ACTION_DIR=$(dirname "$ACTION") # Build the action in the background - ncc build -t "$ACTION" -o "$ACTION_DIR" & + npx ncc build --transpile-only --external encoding "$ACTION" -o "$ACTION_DIR" & ASYNC_BUILDS[i]=$! done diff --git a/.github/scripts/enforceRedirect.sh b/.github/scripts/enforceRedirect.sh new file mode 100755 index 000000000000..4d7d169b01c5 --- /dev/null +++ b/.github/scripts/enforceRedirect.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# HelpDot - Whenever an article is moved/renamed/deleted we should verify that +# we have added a redirect link for it in redirects.csv. This ensures that we don't have broken links. + +declare -r RED='\033[0;31m' +declare -r GREEN='\033[0;32m' +declare -r NC='\033[0m' + +declare -r ARTICLES_DIRECTORY="docs/articles" +declare -r REDIRECTS_FILE="docs/redirects.csv" + +hasRenamedOrDeletedArticle=false +hasModifiedRedirect=false + +if git log origin/main..HEAD --name-status --pretty=format: $ARTICLES_DIRECTORY | grep -q -E "^(R|D)" +then + echo "Articles have been renamed/moved/deleted" + hasRenamedOrDeletedArticle=true +fi + +if git log origin/main..HEAD --name-status --pretty=format: $REDIRECTS_FILE | grep -q -E "^(M)" +then + echo "Redirects.csv has been modified" + hasModifiedRedirect=true +fi + +if [[ $hasRenamedOrDeletedArticle == true && $hasModifiedRedirect == false ]] +then + echo -e "${RED}Articles have been renamed or deleted. Please add a redirect link for the old article links in redirects.csv${NC}" + exit 1 +fi + +echo -e "${GREEN}Articles aren't moved or deleted, or a redirect has been added. Please verify that a redirect has been added for all the files moved or deleted${NC}" +exit 0 diff --git a/.github/scripts/printPodspec.rb b/.github/scripts/printPodspec.rb new file mode 100755 index 000000000000..80012edbc0aa --- /dev/null +++ b/.github/scripts/printPodspec.rb @@ -0,0 +1,35 @@ +#!/usr/bin/env ruby + +# This file is a lightweight port of the `pod ipc spec` command. +# It was built from scratch to imports some 3rd party functions before reading podspecs + +require 'cocoapods' +require 'json' + +# Require 3rd party functions needed to parse podspecs. This code is copied from ios/Podfile +def node_require(script) + # Resolve script with node to allow for hoisting + require Pod::Executable.execute_command('node', ['-p', + "require.resolve( + '#{script}', + {paths: [process.argv[1]]}, + )", __dir__]).strip +end +node_require('react-native/scripts/react_native_pods.rb') +node_require('react-native-permissions/scripts/setup.rb') + +# Configure pod in silent mode +Pod::Config.instance.silent = true + +# Process command-line arguments +podspec_files = ARGV + +# Validate each podspec file +podspec_files.each do |podspec_file| + begin + spec = Pod::Specification.from_file(podspec_file) + puts(spec.to_pretty_json) + rescue => e + STDERR.puts "Failed to validate #{podspec_file}: #{e.message}" + end +end diff --git a/.github/scripts/verifyActions.sh b/.github/scripts/verifyActions.sh index ddc8fa0a3226..17316e1aac70 100755 --- a/.github/scripts/verifyActions.sh +++ b/.github/scripts/verifyActions.sh @@ -22,7 +22,7 @@ if [[ EXIT_CODE -eq 0 ]]; then echo -e "${GREEN}Github Actions are up to date!${NC}" exit 0 else - echo -e "${RED}Error: Diff found when Github Actions were rebuilt. Did you forget to run \`npm run gh-actions-build\` after a clean install (\`rm -rf node_modules && npm i\`)? Do you need to merge main? Did you try running \`git config --global core.autocrlf false\` then \`npm run gh-actions-build\` again?${NC}" + echo -e "${RED}Error: Diff found when Github Actions were rebuilt. Did you forget to run \`npm run gh-actions-build\` after a clean install (\`rm -rf node_modules && npm i\`)? Do you need to merge main? Did you try running \`git config --global core.autocrlf false\` then \`npm run gh-actions-build\` again? Did you try running \`npx ncc cache clean\`?${NC}" echo "$DIFF_OUTPUT" | "$LIB_PATH/diff-so-fancy" | less --tabs=4 -RFX exit 1 fi diff --git a/.github/scripts/verifyPodfile.sh b/.github/scripts/verifyPodfile.sh index cd94a49bb091..f4b1c5521733 100755 --- a/.github/scripts/verifyPodfile.sh +++ b/.github/scripts/verifyPodfile.sh @@ -8,7 +8,12 @@ source scripts/shellUtils.sh title "Verifying that Podfile.lock is synced with the project" -declare EXIT_CODE=0 +# Cleanup and exit +# param - status code +function cleanupAndExit { + cd "$START_DIR" || exit 1 + exit "$1" +} # Check Provisioning Style. If automatic signing is enabled, iOS builds will fail, so ensure we always have the proper profile specified info "Verifying that automatic signing is not enabled" @@ -16,7 +21,7 @@ if grep -q 'PROVISIONING_PROFILE_SPECIFIER = "(NewApp) AppStore"' ios/NewExpensi success "Automatic signing not enabled" else error "Error: Automatic provisioning style is not allowed!" - EXIT_CODE=1 + cleanupAndExit 1 fi PODFILE_SHA=$(openssl sha1 ios/Podfile | awk '{print $2}') @@ -29,13 +34,13 @@ if [[ "$PODFILE_SHA" == "$PODFILE_LOCK_SHA" ]]; then success "Podfile checksum verified!" else error "Podfile.lock checksum mismatch. Did you forget to run \`npx pod-install\`?" - EXIT_CODE=1 + cleanupAndExit 1 fi info "Ensuring correct version of cocoapods is used..." -POD_VERSION_REGEX='([[:digit:]]+\.[[:digit:]]+)(\.[[:digit:]]+)?'; -POD_VERSION_FROM_GEMFILE="$(sed -nr "s/gem \"cocoapods\", \"~> $POD_VERSION_REGEX\"/\1/p" Gemfile)" +POD_VERSION_REGEX='([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)?'; +POD_VERSION_FROM_GEMFILE="$(sed -nr "s/gem \"cocoapods\", \"= $POD_VERSION_REGEX\"/\1/p" Gemfile)" info "Pod version from Gemfile: $POD_VERSION_FROM_GEMFILE" POD_VERSION_FROM_PODFILE_LOCK="$(sed -nr "s/COCOAPODS: $POD_VERSION_REGEX/\1/p" ios/Podfile.lock)" @@ -45,29 +50,36 @@ if [[ "$POD_VERSION_FROM_GEMFILE" == "$POD_VERSION_FROM_PODFILE_LOCK" ]]; then success "Cocoapods version from Podfile.lock matches cocoapods version from Gemfile" else error "Cocoapods version from Podfile.lock does not match cocoapods version from Gemfile. Please use \`npm run pod-install\` or \`bundle exec pod install\` instead of \`pod install\` to install pods." - EXIT_CODE=1 + cleanupAndExit 1 fi info "Comparing Podfile.lock with node packages..." # Retrieve a list of podspec directories as listed in the Podfile.lock -SPEC_DIRS=$(yq '.["EXTERNAL SOURCES"].[].":path" | select( . == "*node_modules*")' < ios/Podfile.lock) +if ! SPEC_DIRS=$(yq '.["EXTERNAL SOURCES"].[].":path" | select( . == "*node_modules*")' < ios/Podfile.lock); then + error "Error: Could not parse podspec directories from Podfile.lock" + cleanupAndExit 1 +fi + +if ! read_lines_into_array PODSPEC_PATHS < <(npx react-native config | jq --raw-output '.dependencies[].platforms.ios.podspecPath | select ( . != null)'); then + error "Error: could not parse podspec paths from react-native config command" + cleanupAndExit 1 +fi # Format a list of Pods based on the output of the config command -FORMATTED_PODS=$( \ - jq --raw-output --slurp 'map((.name + " (" + .version + ")")) | .[]' <<< "$( \ - npx react-native config | \ - jq '.dependencies[].platforms.ios.podspecPath | select( . != null )' | \ - xargs -L 1 pod ipc spec --silent - )" -) +if ! FORMATTED_PODS=$( \ + jq --raw-output --slurp 'map((.name + " (" + .version + ")")) | .[]' <<< "$(./.github/scripts/printPodspec.rb "${PODSPEC_PATHS[@]}")" \ +); then + error "Error: could not parse podspecs at paths parsed from react-native config" + cleanupAndExit 1 +fi # Check for uncommitted package removals # If they are listed in Podfile.lock but the directories don't exist they have been removed while read -r DIR; do if [[ ! -d "${DIR#../}" ]]; then error "Directory \`${DIR#../node_modules/}\` not found in node_modules. Did you forget to run \`npx pod-install\` after removing the package?" - EXIT_CODE=1 + cleanupAndExit 1 fi done <<< "$SPEC_DIRS" @@ -75,15 +87,9 @@ done <<< "$SPEC_DIRS" while read -r POD; do if ! grep -q "$POD" ./ios/Podfile.lock; then error "$POD not found in Podfile.lock. Did you forget to run \`npx pod-install\`?" - EXIT_CODE=1 + cleanupAndExit 1 fi done <<< "$FORMATTED_PODS" -if [[ "$EXIT_CODE" == 0 ]]; then - success "Podfile.lock is up to date." -fi - -# Cleanup -cd "$START_DIR" || exit 1 - -exit $EXIT_CODE +success "Podfile.lock is up to date." +cleanupAndExit 0 diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 63148f9e4eb5..624c00de6831 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -14,7 +14,7 @@ jobs: with: ref: staging token: ${{ secrets.OS_BOTIFY_TOKEN }} - + - name: Setup git for OSBotify uses: ./.github/actions/composite/setupGitForOSBotifyApp id: setupGitForOSBotify @@ -65,9 +65,6 @@ jobs: PR_LIST: ${{ steps.getReleasePRList.outputs.PR_LIST }} - name: 🚀 Create release to trigger production deploy 🚀 - uses: softprops/action-gh-release@affa18ef97bc9db20076945705aba8c516139abd - with: - tag_name: ${{ env.PRODUCTION_VERSION }} - body: ${{ steps.getReleaseBody.outputs.RELEASE_BODY }} + run: gh release create ${{ env.PRODUCTION_VERSION }} --generate-notes env: GITHUB_TOKEN: ${{ steps.setupGitForOSBotify.outputs.OS_BOTIFY_API_TOKEN }} diff --git a/.github/workflows/deployExpensifyHelp.yml b/.github/workflows/deployExpensifyHelp.yml index cda33d39102e..8a6237832340 100644 --- a/.github/workflows/deployExpensifyHelp.yml +++ b/.github/workflows/deployExpensifyHelp.yml @@ -29,9 +29,12 @@ jobs: env: IS_PR_FROM_FORK: ${{ github.event_name == 'pull_request' && github.event.pull_request.head.repo.fork }} runs-on: ubuntu-latest + continue-on-error: true steps: - name: Checkout uses: actions/checkout@v4 + with: + fetch-depth: 0 - name: Setup NodeJS uses: ./.github/actions/composite/setupNode @@ -42,6 +45,9 @@ jobs: - name: Check for duplicates and cycles in redirects.csv run: ./.github/scripts/verifyRedirect.sh + - name: Enforce that a redirect link has been created + run: ./.github/scripts/enforceRedirect.sh + - name: Build with Jekyll uses: actions/jekyll-build-pages@0143c158f4fa0c5dcd99499a5d00859d79f70b0e with: diff --git a/.github/workflows/platformDeploy.yml b/.github/workflows/platformDeploy.yml index 353a898a941f..640d1eaa1172 100644 --- a/.github/workflows/platformDeploy.yml +++ b/.github/workflows/platformDeploy.yml @@ -96,8 +96,8 @@ jobs: - name: Archive Android sourcemaps uses: actions/upload-artifact@v3 with: - name: android-sourcemap - path: android/app/build/generated/sourcemaps/react/release/*.map + name: android-sourcemap-${{ github.ref_name }} + path: android/app/build/generated/sourcemaps/react/productionRelease/index.android.bundle.map - name: Upload Android version to GitHub artifacts if: ${{ !fromJSON(env.SHOULD_DEPLOY_PRODUCTION) }} @@ -134,7 +134,7 @@ jobs: name: Build and deploy Desktop needs: validateActor if: ${{ fromJSON(needs.validateActor.outputs.IS_DEPLOYER) }} - runs-on: macos-13-large + runs-on: macos-14-large steps: - name: Checkout uses: actions/checkout@v4 @@ -248,7 +248,7 @@ jobs: - name: Archive iOS sourcemaps uses: actions/upload-artifact@v3 with: - name: ios-sourcemap + name: ios-sourcemap-${{ github.ref_name }} path: main.jsbundle.map - name: Upload iOS version to GitHub artifacts @@ -366,6 +366,20 @@ jobs: with: SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + # Build a version of iOS and Android HybridApp if we are deploying to staging + hybridApp: + runs-on: ubuntu-latest + needs: validateActor + if: ${{ fromJSON(needs.validateActor.outputs.IS_DEPLOYER) && github.event_name == 'push' }} + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: 'Deploy HybridApp' + run: gh workflow run --repo Expensify/Mobile-Deploy deploy.yml -f force_build=true -f build_version="$(npm run print-version --silent)" + env: + GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }} + postSlackMessageOnSuccess: name: Post a Slack message when all platforms deploy successfully runs-on: ubuntu-latest diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d6b346cb3995..36d4248fcc3c 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,7 +5,7 @@ on: pull_request: types: [opened, synchronize] branches-ignore: [staging, production] - paths: ['**.js', '**.ts', '**.tsx', '**.sh', 'package.json', 'package-lock.json'] + paths: ['**.js', '**.ts', '**.tsx', 'package.json', 'package-lock.json'] concurrency: group: ${{ github.ref == 'refs/heads/main' && format('{0}-{1}', github.ref, github.sha) || github.ref }}-jest @@ -54,20 +54,3 @@ jobs: - name: Storybook run run: npm run storybook -- --smoke-test --ci - - shellTests: - if: ${{ github.actor != 'OSBotify' && github.actor != 'imgbot[bot]' || github.event_name == 'workflow_call' }} - runs-on: ubuntu-latest - name: Shell tests - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Setup Node - uses: ./.github/actions/composite/setupNode - - - name: Install ts-node - run: npm i -g ts-node - - - name: Test CI git logic - run: tests/unit/CIGitLogicTest.sh diff --git a/.github/workflows/testBuild.yml b/.github/workflows/testBuild.yml index fe6ea5bfc016..10912aaeb436 100644 --- a/.github/workflows/testBuild.yml +++ b/.github/workflows/testBuild.yml @@ -228,7 +228,7 @@ jobs: if: ${{ fromJSON(needs.validateActor.outputs.READY_TO_BUILD) }} env: PULL_REQUEST_NUMBER: ${{ github.event.number || github.event.inputs.PULL_REQUEST_NUMBER }} - runs-on: macos-13-large + runs-on: macos-14-large steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/testGithubActionsWorkflows.yml b/.github/workflows/testGithubActionsWorkflows.yml index d052b343cf0c..f65319f14be4 100644 --- a/.github/workflows/testGithubActionsWorkflows.yml +++ b/.github/workflows/testGithubActionsWorkflows.yml @@ -25,6 +25,13 @@ jobs: - name: Setup Homebrew uses: Homebrew/actions/setup-homebrew@master + - name: Login to GitHub Container Regstry + uses: docker/login-action@v3 + with: + registry: ghcr.io + username: OSBotify + password: ${{ secrets.GITHUB_TOKEN }} + - name: Install Act run: brew install act diff --git a/.gitignore b/.gitignore index aeee5f730bfc..aa6aad4cc429 100644 --- a/.gitignore +++ b/.gitignore @@ -37,6 +37,11 @@ local.properties android/app/src/main/java/com/expensify/chat/generated/ .cxx/ +# VIM +*.swp +*.swo +*~ + # Vscode .vscode @@ -125,3 +130,6 @@ config/webpack/*.pem .expo dist/ web-build/ + +# Storage location for downloaded app source maps (see scripts/symbolicate-profile.ts) +.sourcemaps/ diff --git a/.nvmrc b/.nvmrc index 62d44807d084..48b14e6b2b56 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -20.13.0 +20.14.0 diff --git a/.storybook/preview.tsx b/.storybook/preview.tsx index 7527857eeda7..ec8e17dda4cf 100644 --- a/.storybook/preview.tsx +++ b/.storybook/preview.tsx @@ -16,7 +16,7 @@ import './fonts.css'; Onyx.init({ keys: ONYXKEYS, initialKeyStates: { - [ONYXKEYS.NETWORK]: {isOffline: false, isBackendReachable: true}, + [ONYXKEYS.NETWORK]: {isOffline: false}, }, }); diff --git a/.storybook/public/favicon.svg b/.storybook/public/favicon.svg index 6bc34f89282e..726791b58cfb 100644 --- a/.storybook/public/favicon.svg +++ b/.storybook/public/favicon.svg @@ -1,11 +1 @@ - - - - - - - - - - - + \ No newline at end of file diff --git a/.storybook/webpack.config.ts b/.storybook/webpack.config.ts index 4d638020cd42..09d881846b1e 100644 --- a/.storybook/webpack.config.ts +++ b/.storybook/webpack.config.ts @@ -3,6 +3,7 @@ /* eslint-disable no-param-reassign */ /* eslint-disable @typescript-eslint/naming-convention */ +import type Environment from 'config/webpack/types'; import dotenv from 'dotenv'; import path from 'path'; import {DefinePlugin} from 'webpack'; @@ -18,6 +19,8 @@ type CustomWebpackConfig = { }; }; +type CustomWebpackFunction = ({file, platform}: Environment) => CustomWebpackConfig; + let envFile: string; switch (process.env.ENV) { case 'production': @@ -31,9 +34,9 @@ switch (process.env.ENV) { } const env = dotenv.config({path: path.resolve(__dirname, `../${envFile}`)}); -const custom: CustomWebpackConfig = require('../config/webpack/webpack.common').default({ - envFile, -}); +const customFunction: CustomWebpackFunction = require('../config/webpack/webpack.common').default; + +const custom: CustomWebpackConfig = customFunction({file: envFile}); const webpackConfig = ({config}: {config: Configuration}) => { if (!config.resolve) { diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index d4b708ccea4d..0b93611527c5 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -57,3 +57,5 @@ compliance with this Code is required to maintain your status as an Expensify co By signing up to participate as an contributor, you are acknowledging your understanding of and consent to (i) what is expected of you under this Code and (ii) notwithstanding anything to the contrary in any agreement you have with Expensify, Expensify’s right, but not obligation, to terminate your participation in the Expensify Contributor Community upon any breach of the Code, as determined in Expensify’s sole Discretion. + +Violations of our two rules may lead to removal from the contributor program. Severe violations can lead to an immediate ban, while lesser ones may result in a formal warning. Multiple warnings will also lead to removal. diff --git a/Gemfile b/Gemfile index 751e05d2d32b..5227deb80865 100644 --- a/Gemfile +++ b/Gemfile @@ -3,7 +3,7 @@ source "https://rubygems.org" # You may use http://rbenv.org/ or https://rvm.io/ to install and use this version ruby ">= 2.6.10" -gem "cocoapods", "~> 1.13" +gem "cocoapods", "= 1.15.2" gem "activesupport", ">= 6.1.7.3", "< 7.1.0" gem "fastlane", "~> 2" gem "xcpretty", "~> 0" diff --git a/Gemfile.lock b/Gemfile.lock index e1b4fc2ec7e4..3780235053ad 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,14 +1,15 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.6) + CFPropertyList (3.0.7) + base64 + nkf rexml - activesupport (6.1.7.7) + activesupport (7.0.8.4) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) tzinfo (~> 2.0) - zeitwerk (~> 2.3) addressable (2.8.6) public_suffix (>= 2.0.2, < 6.0) algoliasearch (1.27.5) @@ -16,32 +17,33 @@ GEM json (>= 1.5.1) apktools (0.7.4) rubyzip (~> 2.0) - artifactory (3.0.15) + artifactory (3.0.17) atomos (0.1.3) aws-eventstream (1.3.0) - aws-partitions (1.883.0) - aws-sdk-core (3.190.3) + aws-partitions (1.944.0) + aws-sdk-core (3.197.0) aws-eventstream (~> 1, >= 1.3.0) aws-partitions (~> 1, >= 1.651.0) aws-sigv4 (~> 1.8) jmespath (~> 1, >= 1.6.1) - aws-sdk-kms (1.76.0) - aws-sdk-core (~> 3, >= 3.188.0) + aws-sdk-kms (1.85.0) + aws-sdk-core (~> 3, >= 3.197.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.142.0) - aws-sdk-core (~> 3, >= 3.189.0) + aws-sdk-s3 (1.152.3) + aws-sdk-core (~> 3, >= 3.197.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.8) aws-sigv4 (1.8.0) aws-eventstream (~> 1, >= 1.0.2) babosa (1.0.4) + base64 (0.2.0) claide (1.1.0) - cocoapods (1.13.0) + cocoapods (1.15.2) addressable (~> 2.8) claide (>= 1.0.2, < 2.0) - cocoapods-core (= 1.13.0) + cocoapods-core (= 1.15.2) cocoapods-deintegrate (>= 1.0.3, < 2.0) - cocoapods-downloader (>= 1.6.0, < 2.0) + cocoapods-downloader (>= 2.1, < 3.0) cocoapods-plugins (>= 1.0.0, < 2.0) cocoapods-search (>= 1.0.0, < 2.0) cocoapods-trunk (>= 1.6.0, < 2.0) @@ -54,7 +56,7 @@ GEM nap (~> 1.0) ruby-macho (>= 2.3.0, < 3.0) xcodeproj (>= 1.23.0, < 2.0) - cocoapods-core (1.13.0) + cocoapods-core (1.15.2) activesupport (>= 5.0, < 8) addressable (~> 2.8) algoliasearch (~> 1.0) @@ -65,7 +67,7 @@ GEM public_suffix (~> 4.0) typhoeus (~> 1.0) cocoapods-deintegrate (1.0.5) - cocoapods-downloader (1.6.3) + cocoapods-downloader (2.1) cocoapods-plugins (1.0.0) nap cocoapods-search (1.0.1) @@ -77,18 +79,17 @@ GEM colored2 (3.1.2) commander (4.6.0) highline (~> 2.0.0) - concurrent-ruby (1.2.2) + concurrent-ruby (1.3.3) declarative (0.0.20) digest-crc (0.6.5) rake (>= 12.0.0, < 14.0.0) - domain_name (0.5.20190701) - unf (>= 0.0.5, < 1.0.0) + domain_name (0.6.20240107) dotenv (2.8.1) emoji_regex (3.2.3) escape (0.0.4) ethon (0.16.0) ffi (>= 1.15.0) - excon (0.109.0) + excon (0.110.0) faraday (1.10.3) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) @@ -117,15 +118,15 @@ GEM faraday-retry (1.0.3) faraday_middleware (1.2.0) faraday (~> 1.0) - fastimage (2.3.0) - fastlane (2.219.0) + fastimage (2.3.1) + fastlane (2.221.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) aws-sdk-s3 (~> 1.0) babosa (>= 1.0.3, < 2.0.0) bundler (>= 1.12.0, < 3.0.0) - colored + colored (~> 1.2) commander (~> 4.6) dotenv (>= 2.1.1, < 3.0.0) emoji_regex (>= 0.1, < 4.0) @@ -146,10 +147,10 @@ GEM mini_magick (>= 4.9.4, < 5.0.0) multipart-post (>= 2.0.0, < 3.0.0) naturally (~> 2.2) - optparse (>= 0.1.1) + optparse (>= 0.1.1, < 1.0.0) plist (>= 3.1.0, < 4.0.0) rubyzip (>= 2.0.0, < 3.0.0) - security (= 0.1.3) + security (= 0.1.5) simctl (~> 1.6.3) terminal-notifier (>= 2.0.0, < 3.0.0) terminal-table (~> 3) @@ -158,12 +159,15 @@ GEM word_wrap (~> 1.0.0) xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) - xcpretty-travis-formatter (>= 0.0.3) + xcpretty-travis-formatter (>= 0.0.3, < 2.0.0) fastlane-plugin-aws_s3 (2.1.0) apktools (~> 0.7) aws-sdk-s3 (~> 1) mime-types (~> 3.3) - ffi (1.16.3) + ffi (1.17.0) + ffi (1.17.0-arm64-darwin) + ffi (1.17.0-x86_64-darwin) + ffi (1.17.0-x86_64-linux-gnu) fourflusher (2.3.1) fuzzy_match (2.0.4) gh_inspector (1.1.3) @@ -183,17 +187,17 @@ GEM google-apis-core (>= 0.11.0, < 2.a) google-apis-storage_v1 (0.31.0) google-apis-core (>= 0.11.0, < 2.a) - google-cloud-core (1.6.1) + google-cloud-core (1.7.0) google-cloud-env (>= 1.0, < 3.a) google-cloud-errors (~> 1.0) google-cloud-env (1.6.0) faraday (>= 0.17.3, < 3.0) - google-cloud-errors (1.3.1) - google-cloud-storage (1.37.0) + google-cloud-errors (1.4.0) + google-cloud-storage (1.47.0) addressable (~> 2.8) digest-crc (~> 0.4) google-apis-iamcredentials_v1 (~> 0.1) - google-apis-storage_v1 (~> 0.1) + google-apis-storage_v1 (~> 0.31.0) google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) @@ -204,44 +208,47 @@ GEM os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) highline (2.0.3) - http-cookie (1.0.5) + http-cookie (1.0.6) domain_name (~> 0.5) httpclient (2.8.3) - i18n (1.14.1) + i18n (1.14.5) concurrent-ruby (~> 1.0) jmespath (1.6.2) - json (2.7.1) - jwt (2.7.1) + json (2.7.2) + jwt (2.8.2) + base64 mime-types (3.5.1) mime-types-data (~> 3.2015) mime-types-data (3.2023.1003) - mini_magick (4.12.0) + mini_magick (4.13.1) mini_mime (1.1.5) - minitest (5.20.0) + minitest (5.24.0) molinillo (0.8.0) multi_json (1.15.0) - multipart-post (2.3.0) + multipart-post (2.4.1) nanaimo (0.3.0) nap (1.1.0) naturally (2.2.1) netrc (0.11.0) - optparse (0.4.0) + nkf (0.2.0) + optparse (0.5.0) os (1.1.4) plist (3.7.1) public_suffix (4.0.7) - rake (13.1.0) + rake (13.2.1) representable (3.2.0) declarative (< 0.1.0) trailblazer-option (>= 0.1.1, < 0.2.0) uber (< 0.2.0) retriable (3.1.2) - rexml (3.2.6) + rexml (3.2.9) + strscan rouge (2.0.7) ruby-macho (2.5.1) ruby2_keywords (0.0.5) rubyzip (2.3.2) - security (0.1.3) - signet (0.18.0) + security (0.1.5) + signet (0.19.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) @@ -249,6 +256,7 @@ GEM simctl (1.6.10) CFPropertyList naturally + strscan (3.1.0) terminal-notifier (2.0.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) @@ -262,12 +270,9 @@ GEM tzinfo (2.0.6) concurrent-ruby (~> 1.0) uber (0.1.0) - unf (0.1.4) - unf_ext - unf_ext (0.0.9.1) unicode-display_width (2.5.0) word_wrap (1.0.0) - xcodeproj (1.23.0) + xcodeproj (1.24.0) CFPropertyList (>= 2.3.3, < 4.0) atomos (~> 0.1.3) claide (>= 1.0.2, < 2.0) @@ -278,7 +283,6 @@ GEM rouge (~> 2.0.7) xcpretty-travis-formatter (1.0.1) xcpretty (~> 0.2, >= 0.0.7) - zeitwerk (2.6.13) PLATFORMS arm64-darwin-21 @@ -289,7 +293,7 @@ PLATFORMS DEPENDENCIES activesupport (>= 6.1.7.3, < 7.1.0) - cocoapods (~> 1.13) + cocoapods (= 1.15.2) fastlane (~> 2) fastlane-plugin-aws_s3 xcpretty (~> 0) @@ -298,4 +302,4 @@ RUBY VERSION ruby 2.6.10p210 BUNDLED WITH - 2.3.22 + 2.4.14 diff --git a/README.md b/README.md index 29a9e9b8ffdc..6544e0e95486 100644 --- a/README.md +++ b/README.md @@ -663,7 +663,38 @@ Sometimes it might be beneficial to generate a local production version instead In order to generate a production web build, run `npm run build`, this will generate a production javascript build in the `dist/` folder. #### Local production build of the MacOS desktop app -In order to compile a production desktop build, run `npm run desktop-build`, this will generate a production app in the `dist/Mac` folder named `Chat.app`. +The commands used to compile a production or staging desktop build are `npm run desktop-build` and `npm run desktop-build-staging`, respectively. These will product an app in the `dist/Mac` folder named NewExpensify.dmg that you can install like a normal app. + +HOWEVER, by default those commands will try to notarize the build (signing it as Expensify) and publish it to the S3 bucket where it's hosted for users. In most cases you won't actually need or want to do that for your local testing. To get around that and disable those behaviors for your local build, apply the following diff: + +```diff +diff --git a/config/electronBuilder.config.js b/config/electronBuilder.config.js +index e4ed685f65..4c7c1b3667 100644 +--- a/config/electronBuilder.config.js ++++ b/config/electronBuilder.config.js +@@ -42,9 +42,6 @@ module.exports = { + entitlements: 'desktop/entitlements.mac.plist', + entitlementsInherit: 'desktop/entitlements.mac.plist', + type: 'distribution', +- notarize: { +- teamId: '368M544MTT', +- }, + }, + dmg: { + title: 'New Expensify', +diff --git a/scripts/build-desktop.sh b/scripts/build-desktop.sh +index 791f59d733..526306eec1 100755 +--- a/scripts/build-desktop.sh ++++ b/scripts/build-desktop.sh +@@ -35,4 +35,4 @@ npx webpack --config config/webpack/webpack.desktop.ts --env file=$ENV_FILE + title "Building Desktop App Archive Using Electron" + info "" + shift 1 +-npx electron-builder --config config/electronBuilder.config.js --publish always "$@" ++npx electron-builder --config config/electronBuilder.config.js --publish never "$@" +``` + +There may be some cases where you need to test a signed and published build, such as when testing the update flows. Instructions on setting that up can be found in [Testing Electron Auto-Update](https://github.com/Expensify/App/blob/main/desktop/README.md#testing-electron-auto-update). Good luck 🙃 #### Local production build the iOS app In order to compile a production iOS build, run `npm run ios-build`, this will generate a `Chat.ipa` in the root directory of this project. diff --git a/__mocks__/react-native-permissions.ts b/__mocks__/react-native-permissions.ts index 67b7db830d94..d98b7f32a611 100644 --- a/__mocks__/react-native-permissions.ts +++ b/__mocks__/react-native-permissions.ts @@ -35,30 +35,30 @@ const requestNotifications: jest.Mock = jest.fn((options: Record notificationOptions.includes(option)) - .reduce((acc: NotificationSettings, option: string) => ({...acc, [option]: true}), { - lockScreen: true, - notificationCenter: true, - }), + .reduce( + (acc: NotificationSettings, option: string) => { + acc[option] = true; + return acc; + }, + { + lockScreen: true, + notificationCenter: true, + }, + ), })); const checkMultiple: jest.Mock = jest.fn((permissions: string[]) => - permissions.reduce( - (acc: ResultsCollection, permission: string) => ({ - ...acc, - [permission]: RESULTS.GRANTED, - }), - {}, - ), + permissions.reduce((acc: ResultsCollection, permission: string) => { + acc[permission] = RESULTS.GRANTED; + return acc; + }, {}), ); const requestMultiple: jest.Mock = jest.fn((permissions: string[]) => - permissions.reduce( - (acc: ResultsCollection, permission: string) => ({ - ...acc, - [permission]: RESULTS.GRANTED, - }), - {}, - ), + permissions.reduce((acc: ResultsCollection, permission: string) => { + acc[permission] = RESULTS.GRANTED; + return acc; + }, {}), ); export { diff --git a/android/app/build.gradle b/android/app/build.gradle index 1a663b5fa08a..70c06d5bf9f6 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -107,8 +107,8 @@ android { minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion multiDexEnabled rootProject.ext.multiDexEnabled - versionCode 1001047606 - versionName "1.4.76-6" + versionCode 1009000100 + versionName "9.0.1-0" // Supported language variants must be declared here to avoid from being removed during the compilation. // This also helps us to not include unnecessary language variants in the APK. resConfigs "en", "es" diff --git a/android/build.gradle b/android/build.gradle index 52c998998ba0..9fc585ab9f05 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -29,7 +29,7 @@ buildscript { classpath("com.google.firebase:firebase-crashlytics-gradle:2.7.1") classpath("com.google.firebase:perf-plugin:1.4.1") // Fullstory integration - classpath ("com.fullstory:gradle-plugin-local:1.47.0") + classpath ("com.fullstory:gradle-plugin-local:1.49.0") // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/assets/animations/Abracadabra.lottie b/assets/animations/Abracadabra.lottie new file mode 100644 index 0000000000000000000000000000000000000000..8805aed1944e6a00a0ebcb33496f36a122e9df37 GIT binary patch literal 15694 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 WRgwjV_=g4L@0s)Wp2hc1?*9OB|0t3G literal 0 HcmV?d00001 diff --git a/assets/images/all.svg b/assets/images/all.svg index d1a833d280ce..f6d9f46fc92e 100644 --- a/assets/images/all.svg +++ b/assets/images/all.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/images/arrow-down-long.svg b/assets/images/arrow-down-long.svg new file mode 100644 index 000000000000..cbf6e7e5ad2f --- /dev/null +++ b/assets/images/arrow-down-long.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/arrow-right.svg b/assets/images/arrow-right.svg index 8d2ded92e791..649582544847 100644 --- a/assets/images/arrow-right.svg +++ b/assets/images/arrow-right.svg @@ -1,10 +1 @@ - - - - - - + \ No newline at end of file diff --git a/assets/images/arrow-up-long.svg b/assets/images/arrow-up-long.svg new file mode 100644 index 000000000000..13d7a0c2d67e --- /dev/null +++ b/assets/images/arrow-up-long.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/avatars/fallback-avatar.svg b/assets/images/avatars/fallback-avatar.svg index 69293d72aed9..4a7fecf967db 100644 --- a/assets/images/avatars/fallback-avatar.svg +++ b/assets/images/avatars/fallback-avatar.svg @@ -1,10 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_1.svg b/assets/images/avatars/group/default-avatar_1.svg index 5d97c5bf855b..1edcaa33a8aa 100644 --- a/assets/images/avatars/group/default-avatar_1.svg +++ b/assets/images/avatars/group/default-avatar_1.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_10.svg b/assets/images/avatars/group/default-avatar_10.svg index 12c9dd76ae31..62e818cb3e45 100644 --- a/assets/images/avatars/group/default-avatar_10.svg +++ b/assets/images/avatars/group/default-avatar_10.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_11.svg b/assets/images/avatars/group/default-avatar_11.svg index 97f17f30f3a7..2f976b05519d 100644 --- a/assets/images/avatars/group/default-avatar_11.svg +++ b/assets/images/avatars/group/default-avatar_11.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_12.svg b/assets/images/avatars/group/default-avatar_12.svg index f917fb136582..c29992aa1793 100644 --- a/assets/images/avatars/group/default-avatar_12.svg +++ b/assets/images/avatars/group/default-avatar_12.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_13.svg b/assets/images/avatars/group/default-avatar_13.svg index 9e59fb9123a5..5f6b69f01fe3 100644 --- a/assets/images/avatars/group/default-avatar_13.svg +++ b/assets/images/avatars/group/default-avatar_13.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_14.svg b/assets/images/avatars/group/default-avatar_14.svg index ca071e488416..27096ffd77d7 100644 --- a/assets/images/avatars/group/default-avatar_14.svg +++ b/assets/images/avatars/group/default-avatar_14.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_15.svg b/assets/images/avatars/group/default-avatar_15.svg index f227cc0717be..7cae7b1e6562 100644 --- a/assets/images/avatars/group/default-avatar_15.svg +++ b/assets/images/avatars/group/default-avatar_15.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_16.svg b/assets/images/avatars/group/default-avatar_16.svg index efbb85f0b13d..1c02725ba669 100644 --- a/assets/images/avatars/group/default-avatar_16.svg +++ b/assets/images/avatars/group/default-avatar_16.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_17.svg b/assets/images/avatars/group/default-avatar_17.svg index 25c015c595ca..58a5014fae68 100644 --- a/assets/images/avatars/group/default-avatar_17.svg +++ b/assets/images/avatars/group/default-avatar_17.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_18.svg b/assets/images/avatars/group/default-avatar_18.svg index a58ee6e66eff..43eeffb3db8d 100644 --- a/assets/images/avatars/group/default-avatar_18.svg +++ b/assets/images/avatars/group/default-avatar_18.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_2.svg b/assets/images/avatars/group/default-avatar_2.svg index ff1cc3e6dd2d..f67a49d28cd2 100644 --- a/assets/images/avatars/group/default-avatar_2.svg +++ b/assets/images/avatars/group/default-avatar_2.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_3.svg b/assets/images/avatars/group/default-avatar_3.svg index dde31b5d02a0..471d3a348b4a 100644 --- a/assets/images/avatars/group/default-avatar_3.svg +++ b/assets/images/avatars/group/default-avatar_3.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_4.svg b/assets/images/avatars/group/default-avatar_4.svg index f6d02801bc6b..46e22d28b6df 100644 --- a/assets/images/avatars/group/default-avatar_4.svg +++ b/assets/images/avatars/group/default-avatar_4.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_5.svg b/assets/images/avatars/group/default-avatar_5.svg index fdabd36e2058..a81471170e23 100644 --- a/assets/images/avatars/group/default-avatar_5.svg +++ b/assets/images/avatars/group/default-avatar_5.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_6.svg b/assets/images/avatars/group/default-avatar_6.svg index 6f1c6b80eda6..71da5e5631f3 100644 --- a/assets/images/avatars/group/default-avatar_6.svg +++ b/assets/images/avatars/group/default-avatar_6.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_7.svg b/assets/images/avatars/group/default-avatar_7.svg index 62d9a8b76bb8..080426ca0454 100644 --- a/assets/images/avatars/group/default-avatar_7.svg +++ b/assets/images/avatars/group/default-avatar_7.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_8.svg b/assets/images/avatars/group/default-avatar_8.svg index 206b10c2322b..b6b2d98579eb 100644 --- a/assets/images/avatars/group/default-avatar_8.svg +++ b/assets/images/avatars/group/default-avatar_8.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/avatars/group/default-avatar_9.svg b/assets/images/avatars/group/default-avatar_9.svg index ffbe02ce57e8..14885d4c401c 100644 --- a/assets/images/avatars/group/default-avatar_9.svg +++ b/assets/images/avatars/group/default-avatar_9.svg @@ -1,7 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/back-left.svg b/assets/images/back-left.svg index 2ddd554e9720..2c709401916f 100644 --- a/assets/images/back-left.svg +++ b/assets/images/back-left.svg @@ -1,10 +1 @@ - - - - - - + \ No newline at end of file diff --git a/assets/images/bed.svg b/assets/images/bed.svg new file mode 100644 index 000000000000..8ee733733ab2 --- /dev/null +++ b/assets/images/bed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/car-with-key.svg b/assets/images/car-with-key.svg new file mode 100644 index 000000000000..e4770fdad970 --- /dev/null +++ b/assets/images/car-with-key.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/check-circle.svg b/assets/images/check-circle.svg new file mode 100644 index 000000000000..3f6f1da4f827 --- /dev/null +++ b/assets/images/check-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/checkmark-circle.svg b/assets/images/checkmark-circle.svg new file mode 100644 index 000000000000..102598b55d8a --- /dev/null +++ b/assets/images/checkmark-circle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/coins.svg b/assets/images/coins.svg index aa3c68e72ea8..164fa84388f5 100644 --- a/assets/images/coins.svg +++ b/assets/images/coins.svg @@ -1,8 +1 @@ - - - - - - - - + \ No newline at end of file diff --git a/assets/images/comment-bubbles.svg b/assets/images/comment-bubbles.svg new file mode 100644 index 000000000000..1277b8958c94 --- /dev/null +++ b/assets/images/comment-bubbles.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/connection-complete.svg b/assets/images/connection-complete.svg index fbfb2b041358..d864d9a33626 100644 --- a/assets/images/connection-complete.svg +++ b/assets/images/connection-complete.svg @@ -1,330 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/credit-card-exclamation.svg b/assets/images/credit-card-exclamation.svg new file mode 100644 index 000000000000..9cf946a56a5c --- /dev/null +++ b/assets/images/credit-card-exclamation.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/credit-card-hourglass.svg b/assets/images/credit-card-hourglass.svg index 2acd013fbe59..28ffe766b597 100644 --- a/assets/images/credit-card-hourglass.svg +++ b/assets/images/credit-card-hourglass.svg @@ -1,19 +1 @@ - - - - - - - - + \ No newline at end of file diff --git a/assets/images/crosshair.svg b/assets/images/crosshair.svg new file mode 100644 index 000000000000..66ee21774d02 --- /dev/null +++ b/assets/images/crosshair.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/document-plus.svg b/assets/images/document-plus.svg index cce2e3027cea..729bc98d4f8a 100644 --- a/assets/images/document-plus.svg +++ b/assets/images/document-plus.svg @@ -1,5 +1 @@ - - - - - + \ No newline at end of file diff --git a/assets/images/document-slash.svg b/assets/images/document-slash.svg index ebb183142e40..e8a0ff20702e 100644 --- a/assets/images/document-slash.svg +++ b/assets/images/document-slash.svg @@ -1 +1 @@ - + \ No newline at end of file diff --git a/assets/images/emptystate__routepending.svg b/assets/images/emptystate__routepending.svg index 90f3296d37d6..685696f04abf 100644 --- a/assets/images/emptystate__routepending.svg +++ b/assets/images/emptystate__routepending.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/images/inbox.svg b/assets/images/inbox.svg new file mode 100644 index 000000000000..29ab7f916616 --- /dev/null +++ b/assets/images/inbox.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/integrationicons/qbo-icon-square.svg b/assets/images/integrationicons/qbo-icon-square.svg index a8ce3468ffbf..e297b597f980 100644 --- a/assets/images/integrationicons/qbo-icon-square.svg +++ b/assets/images/integrationicons/qbo-icon-square.svg @@ -1,14 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/integrationicons/xero-icon-square.svg b/assets/images/integrationicons/xero-icon-square.svg index 94b79bb3533d..43774919c92c 100644 --- a/assets/images/integrationicons/xero-icon-square.svg +++ b/assets/images/integrationicons/xero-icon-square.svg @@ -1,32 +1 @@ - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/invoice-generic.svg b/assets/images/invoice-generic.svg index d0e2662c4084..251918c4cff4 100644 --- a/assets/images/invoice-generic.svg +++ b/assets/images/invoice-generic.svg @@ -1,15 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/money-search.svg b/assets/images/money-search.svg new file mode 100644 index 000000000000..72a77352f861 --- /dev/null +++ b/assets/images/money-search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/money-waving.svg b/assets/images/money-waving.svg index 5242e31092a0..e68744d595be 100644 --- a/assets/images/money-waving.svg +++ b/assets/images/money-waving.svg @@ -1,81 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/new-expensify-adhoc.svg b/assets/images/new-expensify-adhoc.svg index b3dd92fbbaae..8da6331c8c94 100644 --- a/assets/images/new-expensify-adhoc.svg +++ b/assets/images/new-expensify-adhoc.svg @@ -1,31 +1 @@ - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/new-expensify-dev.svg b/assets/images/new-expensify-dev.svg index 316da6b5aa4d..fcb371f586b6 100644 --- a/assets/images/new-expensify-dev.svg +++ b/assets/images/new-expensify-dev.svg @@ -1,27 +1 @@ - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/new-expensify-stg.svg b/assets/images/new-expensify-stg.svg index 1a1994c7a9fd..d536257fc880 100644 --- a/assets/images/new-expensify-stg.svg +++ b/assets/images/new-expensify-stg.svg @@ -1,35 +1 @@ - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/plane.svg b/assets/images/plane.svg new file mode 100644 index 000000000000..635bdc4b1ed7 --- /dev/null +++ b/assets/images/plane.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/play.svg b/assets/images/play.svg index 5f7e14969529..98a8c00520fc 100644 --- a/assets/images/play.svg +++ b/assets/images/play.svg @@ -1,6 +1 @@ - - - - - + \ No newline at end of file diff --git a/assets/images/product-illustrations/emptystate__travel.svg b/assets/images/product-illustrations/emptystate__travel.svg new file mode 100644 index 000000000000..287f99996860 --- /dev/null +++ b/assets/images/product-illustrations/emptystate__travel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/qrcode.svg b/assets/images/qrcode.svg index 42c49c958246..47d61d7dd47c 100644 --- a/assets/images/qrcode.svg +++ b/assets/images/qrcode.svg @@ -1,14 +1 @@ - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/receipt-plus.svg b/assets/images/receipt-plus.svg index 3907da65c472..ca4d96b3dfa5 100644 --- a/assets/images/receipt-plus.svg +++ b/assets/images/receipt-plus.svg @@ -1,12 +1 @@ - - - - - - + \ No newline at end of file diff --git a/assets/images/receipt-scan.svg b/assets/images/receipt-scan.svg index c93986de3c9b..f7c164c948c8 100644 --- a/assets/images/receipt-scan.svg +++ b/assets/images/receipt-scan.svg @@ -1,14 +1 @@ - - - - - - - + \ No newline at end of file diff --git a/assets/images/receipt-slash.svg b/assets/images/receipt-slash.svg new file mode 100644 index 000000000000..f7e7457e3e64 --- /dev/null +++ b/assets/images/receipt-slash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__abacus.svg b/assets/images/simple-illustrations/simple-illustration__abacus.svg index df94ab653982..6dac0e9009b1 100644 --- a/assets/images/simple-illustrations/simple-illustration__abacus.svg +++ b/assets/images/simple-illustrations/simple-illustration__abacus.svg @@ -1,43 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__accounting.svg b/assets/images/simple-illustrations/simple-illustration__accounting.svg index f7634141e966..3213b4f93856 100644 --- a/assets/images/simple-illustrations/simple-illustration__accounting.svg +++ b/assets/images/simple-illustrations/simple-illustration__accounting.svg @@ -1,32 +1 @@ - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__alert.svg b/assets/images/simple-illustrations/simple-illustration__alert.svg index 2e7bca02f5e3..cbf70b7655a7 100644 --- a/assets/images/simple-illustrations/simple-illustration__alert.svg +++ b/assets/images/simple-illustrations/simple-illustration__alert.svg @@ -1,15 +1 @@ - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__binoculars.svg b/assets/images/simple-illustrations/simple-illustration__binoculars.svg index 381be8988873..5abacd359464 100644 --- a/assets/images/simple-illustrations/simple-illustration__binoculars.svg +++ b/assets/images/simple-illustrations/simple-illustration__binoculars.svg @@ -1,50 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__car-ice.svg b/assets/images/simple-illustrations/simple-illustration__car-ice.svg index ba2b79bca6aa..9da1b844c101 100644 --- a/assets/images/simple-illustrations/simple-illustration__car-ice.svg +++ b/assets/images/simple-illustrations/simple-illustration__car-ice.svg @@ -1,53 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__car.svg b/assets/images/simple-illustrations/simple-illustration__car.svg index 2d420be6c3a9..9da1b844c101 100644 --- a/assets/images/simple-illustrations/simple-illustration__car.svg +++ b/assets/images/simple-illustrations/simple-illustration__car.svg @@ -1,25 +1 @@ - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__checkmarkcircle.svg b/assets/images/simple-illustrations/simple-illustration__checkmarkcircle.svg new file mode 100644 index 000000000000..66d2b1e5b0e2 --- /dev/null +++ b/assets/images/simple-illustrations/simple-illustration__checkmarkcircle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__coins.svg b/assets/images/simple-illustrations/simple-illustration__coins.svg index 5350886402c6..5caa1c0635d5 100644 --- a/assets/images/simple-illustrations/simple-illustration__coins.svg +++ b/assets/images/simple-illustrations/simple-illustration__coins.svg @@ -1,26 +1 @@ - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__company-card.svg b/assets/images/simple-illustrations/simple-illustration__company-card.svg index 4121bbeeb205..1f4e43dbc047 100644 --- a/assets/images/simple-illustrations/simple-illustration__company-card.svg +++ b/assets/images/simple-illustrations/simple-illustration__company-card.svg @@ -1,38 +1 @@ - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__creditcardeyes.svg b/assets/images/simple-illustrations/simple-illustration__creditcardeyes.svg new file mode 100644 index 000000000000..26b1ea7f2c31 --- /dev/null +++ b/assets/images/simple-illustrations/simple-illustration__creditcardeyes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__lightbulb.svg b/assets/images/simple-illustrations/simple-illustration__lightbulb.svg index 1dc359764147..62a9cb0c3b76 100644 --- a/assets/images/simple-illustrations/simple-illustration__lightbulb.svg +++ b/assets/images/simple-illustrations/simple-illustration__lightbulb.svg @@ -1,33 +1 @@ - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__pencil.svg b/assets/images/simple-illustrations/simple-illustration__pencil.svg index 8d9f06991612..d3eaf8771021 100644 --- a/assets/images/simple-illustrations/simple-illustration__pencil.svg +++ b/assets/images/simple-illustrations/simple-illustration__pencil.svg @@ -1,20 +1 @@ - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__piggybank.svg b/assets/images/simple-illustrations/simple-illustration__piggybank.svg index be87ff34752a..ab1f73113f18 100644 --- a/assets/images/simple-illustrations/simple-illustration__piggybank.svg +++ b/assets/images/simple-illustrations/simple-illustration__piggybank.svg @@ -1,50 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__receiptupload.svg b/assets/images/simple-illustrations/simple-illustration__receiptupload.svg index b8fe5101715f..efff624f481f 100644 --- a/assets/images/simple-illustrations/simple-illustration__receiptupload.svg +++ b/assets/images/simple-illustrations/simple-illustration__receiptupload.svg @@ -1,22 +1 @@ - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__sendmoney.svg b/assets/images/simple-illustrations/simple-illustration__sendmoney.svg new file mode 100644 index 000000000000..1975c15d5d24 --- /dev/null +++ b/assets/images/simple-illustrations/simple-illustration__sendmoney.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__splitbill.svg b/assets/images/simple-illustrations/simple-illustration__splitbill.svg index dfed7535ee90..1390a7cf9205 100644 --- a/assets/images/simple-illustrations/simple-illustration__splitbill.svg +++ b/assets/images/simple-illustrations/simple-illustration__splitbill.svg @@ -1,55 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__subscription-annual.svg b/assets/images/simple-illustrations/simple-illustration__subscription-annual.svg new file mode 100644 index 000000000000..6dcb4a422f0a --- /dev/null +++ b/assets/images/simple-illustrations/simple-illustration__subscription-annual.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__subscription-ppu.svg b/assets/images/simple-illustrations/simple-illustration__subscription-ppu.svg new file mode 100644 index 000000000000..39b2e4a12542 --- /dev/null +++ b/assets/images/simple-illustrations/simple-illustration__subscription-ppu.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__tag.svg b/assets/images/simple-illustrations/simple-illustration__tag.svg index 0cac51679a5e..0a93014d11b3 100644 --- a/assets/images/simple-illustrations/simple-illustration__tag.svg +++ b/assets/images/simple-illustrations/simple-illustration__tag.svg @@ -1,33 +1 @@ - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__teachers-unite.svg b/assets/images/simple-illustrations/simple-illustration__teachers-unite.svg index b4edd9513722..27ce709889dd 100644 --- a/assets/images/simple-illustrations/simple-illustration__teachers-unite.svg +++ b/assets/images/simple-illustrations/simple-illustration__teachers-unite.svg @@ -1,49 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__treasurechest.svg b/assets/images/simple-illustrations/simple-illustration__treasurechest.svg index 2bdee0c7e90f..622c611a9dc5 100644 --- a/assets/images/simple-illustrations/simple-illustration__treasurechest.svg +++ b/assets/images/simple-illustrations/simple-illustration__treasurechest.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/images/simple-illustrations/simple-illustration__workflows.svg b/assets/images/simple-illustrations/simple-illustration__workflows.svg index b684c58126f7..c11d2663997f 100644 --- a/assets/images/simple-illustrations/simple-illustration__workflows.svg +++ b/assets/images/simple-illustrations/simple-illustration__workflows.svg @@ -1,153 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/assets/images/stopwatch.svg b/assets/images/stopwatch.svg index 0f26af219e04..b8ca46fd1fa1 100644 --- a/assets/images/stopwatch.svg +++ b/assets/images/stopwatch.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/assets/images/subscription-details__approvedlogo--light.svg b/assets/images/subscription-details__approvedlogo--light.svg new file mode 100644 index 000000000000..6582fdf13fcd --- /dev/null +++ b/assets/images/subscription-details__approvedlogo--light.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/subscription-details__approvedlogo.svg b/assets/images/subscription-details__approvedlogo.svg new file mode 100644 index 000000000000..73615be28528 --- /dev/null +++ b/assets/images/subscription-details__approvedlogo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/images/suitcase.svg b/assets/images/suitcase.svg index 97036db6b5ac..452c44f73e22 100644 --- a/assets/images/suitcase.svg +++ b/assets/images/suitcase.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/assets/images/tag.svg b/assets/images/tag.svg index f5e13b8135cb..f25bcbe47f71 100644 --- a/assets/images/tag.svg +++ b/assets/images/tag.svg @@ -1,12 +1 @@ - - - - - - + \ No newline at end of file diff --git a/assets/images/thread.svg b/assets/images/thread.svg index 3b8f334fafdd..9f01ce7b2c06 100644 --- a/assets/images/thread.svg +++ b/assets/images/thread.svg @@ -1,3 +1 @@ - - - + \ No newline at end of file diff --git a/assets/images/x-circle.svg b/assets/images/x-circle.svg index c186e41c4244..5fa5f3741567 100644 --- a/assets/images/x-circle.svg +++ b/assets/images/x-circle.svg @@ -1,12 +1 @@ - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/babel.config.js b/babel.config.js index 3023d37df7e0..e04e589166f4 100644 --- a/babel.config.js +++ b/babel.config.js @@ -3,7 +3,7 @@ require('dotenv').config(); const IS_E2E_TESTING = process.env.E2E_TESTING === 'true'; const defaultPresets = ['@babel/preset-react', '@babel/preset-env', '@babel/preset-flow', '@babel/preset-typescript']; -const defaultPlugins = [ +let defaultPlugins = [ // Adding the commonjs: true option to react-native-web plugin can cause styling conflicts ['react-native-web'], @@ -18,6 +18,19 @@ const defaultPlugins = [ 'react-native-reanimated/plugin', ]; +// The Fullstory annotate plugin generated a few errors when executed in Electron. Let's +// ignore it for desktop builds. +if (!process.env.ELECTRON_ENV && process.env.npm_lifecycle_event !== 'desktop') { + console.debug('This is not a desktop build, adding babel-plugin-annotate-react'); + defaultPlugins.push([ + '@fullstory/babel-plugin-annotate-react', + { + 'react-native-web': true, + native: true, + }, + ]); +} + const webpack = { presets: defaultPresets, plugins: defaultPlugins, @@ -42,7 +55,6 @@ const metro = { '@fullstory/babel-plugin-annotate-react', { native: true, - setFSTagName: true, }, ], diff --git a/config/electronBuilder.config.js b/config/electronBuilder.config.js index e4ed685f65fe..5a995fb5de91 100644 --- a/config/electronBuilder.config.js +++ b/config/electronBuilder.config.js @@ -45,6 +45,12 @@ module.exports = { notarize: { teamId: '368M544MTT', }, + target: [ + { + target: 'dmg', + arch: ['universal'], + }, + ], }, dmg: { title: 'New Expensify', diff --git a/config/webpack/webpack.common.ts b/config/webpack/webpack.common.ts index 9d397b9557a3..bedd7e50ef94 100644 --- a/config/webpack/webpack.common.ts +++ b/config/webpack/webpack.common.ts @@ -4,14 +4,27 @@ import dotenv from 'dotenv'; import fs from 'fs'; import HtmlWebpackPlugin from 'html-webpack-plugin'; import path from 'path'; -import type {Configuration} from 'webpack'; +import type {Compiler, Configuration} from 'webpack'; import {DefinePlugin, EnvironmentPlugin, IgnorePlugin, ProvidePlugin} from 'webpack'; import {BundleAnalyzerPlugin} from 'webpack-bundle-analyzer'; import CustomVersionFilePlugin from './CustomVersionFilePlugin'; import type Environment from './types'; +// importing anything from @vue/preload-webpack-plugin causes an error +type Options = { + rel: string; + as: string; + fileWhitelist: RegExp[]; + include: string; +}; + +type PreloadWebpackPluginClass = { + new (options?: Options): PreloadWebpackPluginClass; + apply: (compiler: Compiler) => void; +}; + // require is necessary, there are no types for this package and the declaration file can't be seen by the build process which causes an error. -const PreloadWebpackPlugin = require('@vue/preload-webpack-plugin'); +const PreloadWebpackPlugin: PreloadWebpackPluginClass = require('@vue/preload-webpack-plugin'); const includeModules = [ 'react-native-animatable', diff --git a/contributingGuides/APPLE_GOOGLE_SIGNIN.md b/contributingGuides/APPLE_GOOGLE_SIGNIN.md index 08a444a6b8e4..cc3e256be399 100644 --- a/contributingGuides/APPLE_GOOGLE_SIGNIN.md +++ b/contributingGuides/APPLE_GOOGLE_SIGNIN.md @@ -96,6 +96,79 @@ These steps are covered in more detail in the "testing" section below. Due to some technical constraints, Apple and Google sign-in may require additional configuration to be able to work in the development environment as expected. This document describes any additional steps for each platform. +## Show Apple / Google SSO buttons development environment + +The Apple/Google Sign In button renders differently in development mode. To prevent confusion +for developers about a possible regression, we decided to not render third party buttons in +development mode. + +To re-enable the SSO buttons in development mode, remove this [condition](https://github.com/Expensify/App/blob/c2a718c9100e704c89ad9564301348bc53a49777/src/pages/signin/LoginForm/BaseLoginForm.tsx#L300) so that we always render the SSO button components: + +```diff +diff --git a/src/pages/signin/LoginForm/BaseLoginForm.tsx b/src/pages/signin/LoginForm/BaseLoginForm.tsx +index 4286a26033..850f8944ca 100644 +--- a/src/pages/signin/LoginForm/BaseLoginForm.tsx ++++ b/src/pages/signin/LoginForm/BaseLoginForm.tsx +@@ -288,7 +288,7 @@ function BaseLoginForm({account, credentials, closeAccount, blurOnSubmit = false + // for developers about possible regressions, we won't render buttons in development mode. + // For more information about these differences and how to test in development mode, + // see`Expensify/App/contributingGuides/APPLE_GOOGLE_SIGNIN.md` +- CONFIG.ENVIRONMENT !== CONST.ENVIRONMENT.DEV && ( ++ ( + + `Swift Default Apps` => `URI Schemes` => `new-expensify` and select `New Expensify.app` +4. Note that a dev build of the desktop app will not work. You'll create and install a local staging build: + 1. Update `build-desktop.sh` replacing `--publish always` with `--publish never`. + 2. Run `npm run desktop-build-staging` and install the locally-generated desktop app to test. +5. (Google only) apply the following diff: + + ```diff + diff --git a/src/components/DeeplinkWrapper/index.website.tsx b/src/components/DeeplinkWrapper/index.website.tsx + index 765fbab038..4318528b4c 100644 + --- a/src/components/DeeplinkWrapper/index.website.tsx + +++ b/src/components/DeeplinkWrapper/index.website.tsx + @@ -63,14 +63,7 @@ function DeeplinkWrapper({children, isAuthenticated, autoAuthState}: DeeplinkWra + const isUnsupportedDeeplinkRoute = routeRegex.test(window.location.pathname); + + // Making a few checks to exit early before checking authentication status + - if ( + - !isMacOSWeb() || + - isUnsupportedDeeplinkRoute || + - hasShownPrompt || + - CONFIG.ENVIRONMENT === CONST.ENVIRONMENT.DEV || + - autoAuthState === CONST.AUTO_AUTH_STATE.NOT_STARTED || + - Session.isAnonymousUser() + - ) { + + if (!isMacOSWeb() || isUnsupportedDeeplinkRoute || hasShownPrompt || autoAuthState === CONST.AUTO_AUTH_STATE.NOT_STARTED || Session.isAnonymousUser()) { + return; + } + // We want to show the prompt immediately if the user is already authenticated. + diff --git a/src/libs/Navigation/linkingConfig/prefixes.ts b/src/libs/Navigation/linkingConfig/prefixes.ts + index ca2da6f56b..2c191598f0 100644 + --- a/src/libs/Navigation/linkingConfig/prefixes.ts + +++ b/src/libs/Navigation/linkingConfig/prefixes.ts + @@ -8,6 +8,7 @@ const prefixes: LinkingOptions['prefixes'] = [ + 'https://www.expensify.cash', + 'https://staging.expensify.cash', + 'https://dev.new.expensify.com', + + 'http://localhost', + CONST.NEW_EXPENSIFY_URL, + CONST.STAGING_NEW_EXPENSIFY_URL, + ]; + ``` + +6. Run `npm run web` + ## Apple #### Port requirements @@ -193,57 +266,11 @@ This is required because the desktop app needs to know the address of the web ap Note that changing this value to a domain that isn't configured for use with Expensify will cause Android to break, as it is still using the real client ID, but now has an incorrect value for `redirectURI`. -#### Set Environment to something other than "Development" - -The `DeepLinkWrapper` component will not handle deep links in the development environment. To be able to test deep linking, you must set the environment to something other than "Development". - -Within the `.env` file, set `envName` to something other than "Development", for example: - -``` -envName=Staging -``` - -Alternatively, within the `DeepLinkWrapper/index.website.js` file, you can set the `CONFIG.ENVIRONMENT` to something other than "Development". +## Google -#### Handle deep links in dev on MacOS +Unlike with Apple, to test Google Sign-In we don't need to set up any http/ssh tunnels. We can just use `localhost`. But we need to set up the web and desktop environments to use `localhost` instead of `dev.new.expensify.com` -If developing on MacOS, the development desktop app can't handle deeplinks correctly. To be able to test deeplinking back to the app, follow these steps: - -1. Create a "real" build of the desktop app, which can handle deep links, open the build folder, and install the dmg there: - -```shell -npm run desktop-build -open desktop-build -# Then double-click "NewExpensify.dmg" in Finder window -``` - -2. Even with this build, the deep link may not be handled by the correct app, as the development Electron config seems to intercept it sometimes. To manage this, install [SwiftDefaultApps](https://github.com/Lord-Kamina/SwiftDefaultApps), which adds a preference pane that can be used to configure which app should handle deep links. - -### Test the Apple / Google SSO buttons in development environment - -The Apple/Google Sign In button renders differently in development mode. To prevent confusion -for developers about a possible regression, we decided to not render third party buttons in -development mode. - -Here's how you can re-enable the SSO buttons in development mode: - -- Remove this [condition](https://github.com/Expensify/App/blob/c2a718c9100e704c89ad9564301348bc53a49777/src/pages/signin/LoginForm/BaseLoginForm.tsx#L300) so that we always render the SSO button components - ```diff - diff --git a/src/pages/signin/LoginForm/BaseLoginForm.tsx b/src/pages/signin/LoginForm/BaseLoginForm.tsx - index 4286a26033..850f8944ca 100644 - --- a/src/pages/signin/LoginForm/BaseLoginForm.tsx - +++ b/src/pages/signin/LoginForm/BaseLoginForm.tsx - @@ -288,7 +288,7 @@ function BaseLoginForm({account, credentials, closeAccount, blurOnSubmit = false - // for developers about possible regressions, we won't render buttons in development mode. - // For more information about these differences and how to test in development mode, - // see`Expensify/App/contributingGuides/APPLE_GOOGLE_SIGNIN.md` - - CONFIG.ENVIRONMENT !== CONST.ENVIRONMENT.DEV && ( - + ( - - { + @@ -246,7 +246,7 @@ const mainWindow = (): Promise => { + let deeplinkUrl: string; + let browserWindow: BrowserWindow; + + - const loadURL = __DEV__ ? (win: BrowserWindow): Promise => win.loadURL(`https://dev.new.expensify.com:${port}`) : serve({directory: `${__dirname}/www`}); + + const loadURL = __DEV__ ? (win: BrowserWindow): Promise => win.loadURL(`http://localhost:${port}`) : serve({directory: `${__dirname}/www`}); + + // Prod and staging set the icon in the electron-builder config, so only update it here for dev + if (__DEV__) { + ``` -The DeepLinkWrapper component will not handle deep links in the development environment. To be able to test deep linking, you must set the environment to something other than "Development". diff --git a/contributingGuides/CONTRIBUTING.md b/contributingGuides/CONTRIBUTING.md index aec527edabe0..d6ab46c809ef 100644 --- a/contributingGuides/CONTRIBUTING.md +++ b/contributingGuides/CONTRIBUTING.md @@ -48,7 +48,7 @@ We hire and pay external contributors via [Upwork.com](https://www.upwork.com). Payment for your contributions will be made no less than 7 days after the pull request is deployed to production to allow for [regression](https://github.com/Expensify/App/blob/main/contributingGuides/CONTRIBUTING.md#regressions) testing. If you have not received payment after 8 days of the PR being deployed to production, and there are no [regressions](https://github.com/Expensify/App/blob/main/contributingGuides/CONTRIBUTING.md#regressions), please add a comment to the issue mentioning the BugZero team member (Look for the melvin-bot "Triggered auto assignment to... (`Bug`)" to see who this is). -New contributors are limited to working on one job at a time, however experienced contributors may work on numerous jobs simultaneously. +New contributors are limited to working on one job at a time, **do not submit proposals for new jobs until your first PR has been merged**. Experienced contributors may work on numerous jobs simultaneously. Please be aware that compensation for any support in solving an issue is provided **entirely at Expensify’s discretion**. Personal time or resources applied towards investigating a proposal **will not guarantee compensation**. Compensation is only guaranteed to those who **[propose a solution and get hired for that job](https://github.com/Expensify/App/blob/main/contributingGuides/CONTRIBUTING.md#propose-a-solution-for-the-job)**. We understand there may be cases where a selected proposal may take inspiration from a previous proposal. Unfortunately, it’s not possible for us to evaluate every individual case and we have no process that can efficiently do so. Issues with higher rewards come with higher risk factors so try to keep things civil and make the best proposal you can. Once again, **any information provided may not necessarily lead to you getting hired for that issue or compensated in any way.** diff --git a/contributingGuides/STYLE.md b/contributingGuides/STYLE.md index f3e928da8cb0..6af3a82c2ff6 100644 --- a/contributingGuides/STYLE.md +++ b/contributingGuides/STYLE.md @@ -23,6 +23,7 @@ - [Type imports/exports](#type-importsexports) - [Refs](#refs) - [Other Expensify Resources on TypeScript](#other-expensify-resources-on-typescript) + - [Default value for inexistent IDs](#default-value-for-inexistent-IDs) - [Naming Conventions](#naming-conventions) - [Type names](#type-names) - [Prop callbacks](#prop-callbacks) @@ -47,7 +48,6 @@ - [Forwarding refs](#forwarding-refs) - [Hooks and HOCs](#hooks-and-hocs) - [Stateless components vs Pure Components vs Class based components vs Render Props](#stateless-components-vs-pure-components-vs-class-based-components-vs-render-props---when-to-use-what) - - [Composition](#composition) - [Use Refs Appropriately](#use-refs-appropriately) - [Are we allowed to use [insert brand new React feature]?](#are-we-allowed-to-use-insert-brand-new-react-feature-why-or-why-not) - [React Hooks: Frequently Asked Questions](#react-hooks-frequently-asked-questions) @@ -471,6 +471,24 @@ if (ref.current && 'getBoundingClientRect' in ref.current) { - [Expensify TypeScript React Native CheatSheet](./TS_CHEATSHEET.md) +### Default value for inexistent IDs + + Use `'-1'` or `-1` when there is a possibility that the ID property of an Onyx value could be `null` or `undefined`. + +``` ts +// BAD +const foo = report?.reportID ?? ''; +const bar = report?.reportID ?? '0'; + +report ? report.reportID : '0'; +report ? report.reportID : ''; + +// GOOD +const foo = report?.reportID ?? '-1'; + +report ? report.reportID : '-1'; +``` + ## Naming Conventions ### Type names @@ -1075,51 +1093,6 @@ Class components are DEPRECATED. Use function components and React hooks. [https://react.dev/reference/react/Component#migrating-a-component-with-lifecycle-methods-from-a-class-to-a-function](https://react.dev/reference/react/Component#migrating-a-component-with-lifecycle-methods-from-a-class-to-a-function) -### Composition - -Avoid the usage of `compose` function to compose HOCs in TypeScript files. Use nesting instead. - -> Why? `compose` function doesn't work well with TypeScript when dealing with several HOCs being used in a component, many times resulting in wrong types and errors. Instead, nesting can be used to allow a seamless use of multiple HOCs and result in a correct return type of the compoment. Also, you can use [hooks instead of HOCs](#hooks-instead-of-hocs) whenever possible to minimize or even remove the need of HOCs in the component. - -From React's documentation - ->Props and composition give you all the flexibility you need to customize a component’s look and behavior in an explicit and safe way. Remember that components may accept arbitrary props, including primitive values, React elements, or functions. ->If you want to reuse non-UI functionality between components, we suggest extracting it into a separate JavaScript module. The components may import it and use that function, object, or a class, without extending it. - - ```ts - // BAD - export default compose( - withCurrentUserPersonalDetails, - withReportOrNotFound(), - withOnyx({ - session: { - key: ONYXKEYS.SESSION, - }, - }), - )(Component); - - // GOOD - export default withCurrentUserPersonalDetails( - withReportOrNotFound()( - withOnyx({ - session: { - key: ONYXKEYS.SESSION, - }, - })(Component), - ), - ); - - // GOOD - alternative to HOC nesting - const ComponentWithOnyx = withOnyx({ - session: { - key: ONYXKEYS.SESSION, - }, - })(Component); - const ComponentWithReportOrNotFound = withReportOrNotFound()(ComponentWithOnyx); - export default withCurrentUserPersonalDetails(ComponentWithReportOrNotFound); - ``` - -**Note:** If you find that none of these approaches work for you, please ask an Expensify engineer for guidance via Slack or GitHub. - ### Use Refs Appropriately React's documentation explains refs in [detail](https://reactjs.org/docs/refs-and-the-dom.html). It's important to understand when to use them and how to use them to avoid bugs and hard to maintain code. diff --git a/desktop/createDownloadQueue.ts b/desktop/createDownloadQueue.ts index 132848c5da9e..4403f989263c 100644 --- a/desktop/createDownloadQueue.ts +++ b/desktop/createDownloadQueue.ts @@ -17,6 +17,11 @@ type DownloadItem = { options: Options; }; +type CreateDownloadQueue = () => { + enqueueDownloadItem: (item: DownloadItem) => void; + dequeueDownloadItem: () => DownloadItem | undefined; +}; + /** * Returns the filename with extension based on the given name and MIME type. * @param name - The name of the file. @@ -28,7 +33,7 @@ const getFilenameFromMime = (name: string, mime: string): string => { return `${name}.${extensions}`; }; -const createDownloadQueue = () => { +const createDownloadQueue: CreateDownloadQueue = () => { const downloadItemProcessor = (item: DownloadItem): Promise => new Promise((resolve, reject) => { let downloadTimeout: NodeJS.Timeout; @@ -114,3 +119,4 @@ const createDownloadQueue = () => { }; export default createDownloadQueue; +export type {DownloadItem, CreateDownloadQueue}; diff --git a/desktop/main.ts b/desktop/main.ts index 0f4774d3b73b..57ea647cc3e2 100644 --- a/desktop/main.ts +++ b/desktop/main.ts @@ -13,9 +13,10 @@ import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; import type PlatformSpecificUpdater from '@src/setup/platformSetup/types'; import type {Locale} from '@src/types/onyx'; +import type {CreateDownloadQueue, DownloadItem} from './createDownloadQueue'; import ELECTRON_EVENTS from './ELECTRON_EVENTS'; -const createDownloadQueue = require('./createDownloadQueue').default; +const createDownloadQueue: CreateDownloadQueue = require('./createDownloadQueue').default; const port = process.env.PORT ?? 8082; const {DESKTOP_SHORTCUT_ACCELERATOR, LOCALES} = CONST; @@ -617,7 +618,7 @@ const mainWindow = (): Promise => { const downloadQueue = createDownloadQueue(); ipcMain.on(ELECTRON_EVENTS.DOWNLOAD, (event, downloadData) => { - const downloadItem = { + const downloadItem: DownloadItem = { ...downloadData, win: browserWindow, }; diff --git a/docs/Hidden/Instructions b/docs/Hidden/Instructions new file mode 100644 index 000000000000..940c7ab60d10 --- /dev/null +++ b/docs/Hidden/Instructions @@ -0,0 +1 @@ +This folder is used to house articles that should not be live articles on the helpsite. diff --git a/docs/articles/new-expensify/expenses/Manually-submit-reports-for-approval.md b/docs/Hidden/Manually-submit-reports-for-approval.md similarity index 100% rename from docs/articles/new-expensify/expenses/Manually-submit-reports-for-approval.md rename to docs/Hidden/Manually-submit-reports-for-approval.md diff --git a/docs/README.md b/docs/README.md index 224abe0554a5..235334c95732 100644 --- a/docs/README.md +++ b/docs/README.md @@ -186,9 +186,18 @@ Just update the content for each variable accordingly or remove it if the inform Assume that we want to rename the article `The Free Plan` to `Freemium Features` for the hub `billing and plan types` in New Expensify platform. 1. Go to `docs/articles/new-expensify/billing-and-plan-types` 2. Rename `The-Free-Plan.md` to `Freemium-Features.md`. Use dashes for spaces in the file name. +3. Add an entry in redirects.csv for the old article pointing to the new article. Note: It is important that the file has `.md` extension. +# How to hide an article temporarily +Video demo available [here 🧵](https://expensify.slack.com/archives/C02NK2DQWUX/p1717772272605829?thread_ts=1717523271.137469&cid=C02NK2DQWUX). +1. Open github's in built code editor by pressing `.` on your keyboard. ([instructions here](https://docs.github.com/en/codespaces/the-githubdev-web-based-editor#opening-the-githubdev-editor)) +2. Go to the article that you want to hide `docs/articles/...`. +3. Drag and drop the article inside the hidden folder `docs/Hidden/`. +4. Add a redirect for it in `docs/redirects.csv` to ensure that we don't have broken links. You can choose to point it to the home page or the article's hub. +5. Commit the changes and raise a PR. + # How the site is deployed This site is hosted on Cloudflare pages. Whenever code is merged to main, the github action `deployExpensifyHelp` will run. diff --git a/docs/_data/_routes.yml b/docs/_data/_routes.yml index ad738e44ab44..5fd65532c021 100644 --- a/docs/_data/_routes.yml +++ b/docs/_data/_routes.yml @@ -71,7 +71,7 @@ platforms: - href: integrations title: Integrations - icon: /assets/images/workflow.svg + icon: /assets/images/simple-illustration__monitor-remotesync.svg description: Integrate with accounting or HR software to streamline expense approvals. - href: spending-insights @@ -131,7 +131,7 @@ platforms: - href: connections title: Connections - icon: /assets/images/workflow.svg + icon: /assets/images/simple-illustration__monitor-remotesync.svg description: Connect to accounting software to streamline expense approvals. - href: settings diff --git a/docs/_sass/_main.scss b/docs/_sass/_main.scss index ae19775d75df..29b02d8aeb00 100644 --- a/docs/_sass/_main.scss +++ b/docs/_sass/_main.scss @@ -524,6 +524,10 @@ button { padding: 0; margin: 0; } + + li { + margin-left: 12px; + } } } } @@ -941,8 +945,8 @@ button { } #platform-tabs > .active { - color: var(--color-button-text); - background-color: var(--color-button-success-background); + color: var(--color-text); + background-color: var(--color-button-background); } .hidden { diff --git a/docs/articles/expensify-classic/connect-credit-cards/company-cards/Troubleshooting.md b/docs/articles/expensify-classic/connect-credit-cards/company-cards/Troubleshooting.md index 814bf8fc559b..05366a91d9fa 100644 --- a/docs/articles/expensify-classic/connect-credit-cards/company-cards/Troubleshooting.md +++ b/docs/articles/expensify-classic/connect-credit-cards/company-cards/Troubleshooting.md @@ -64,8 +64,9 @@ Make sure you're importing your card in the correct spot in Expensify and select Please note there are some things that cannot be bypassed within Expensify, including two-factor authentication being enabled within your bank account. This will prevent the connection from remaining stable and will need to be turned off on the bank side. ## What are the most reliable bank connections in Expensify?* -The most reliable corporate card to use with Expensify is the Expensify Visa® Commercial Card. We offer daily settlement, unapproved expense limits, and real-time compliance for secure and efficient spending, as well as 2% cash back (_Applies to USD purchases only._) Click here to learn more or apply. -Additionally, we've teamed up with major banks worldwide to ensure a smooth import of credit card transactions into your accounts. Corporate cards from the following banks also offer the most dependable connections in Expensify: +All bank connections listed below are extremely reliable, but we recommend transacting with the Expensify Visa® Commercial Card. It also offers daily and monthly settlement, unapproved expense limits, realtime compliance for secure and efficient spending, and cash back on all US purchases. [Click here to learn more about the Expensify Card](https://use.expensify.com/company-credit-card). + +We've also teamed up with major banks worldwide to ensure a smooth import of credit card transactions into your accounts: - American Express - Bank of America - Brex @@ -75,7 +76,7 @@ Additionally, we've teamed up with major banks worldwide to ensure a smooth impo - Stripe - Wells Fargo -Commercial feeds for company cards are the dependable connections in Expensify. If you have a corporate or commercial card account, you might have access to a daily transaction feed where expenses from Visa, MasterCard, and American Express are automatically sent to Expensify. Reach out to your banking relationship manager to check if your card program qualifies for this feature. +Commercial feeds for company cards are the dependable connections in Expensify. If you have a corporate or commercial card account, you might have access to a daily transaction feed where expenses from Visa, Mastercard, and American Express are automatically sent to Expensify. Reach out to your banking relationship manager to check if your card program qualifies for this feature. # Troubleshooting American Express Business diff --git a/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-Small-To-Medium-Sized-Businesses.md b/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-Small-To-Medium-Sized-Businesses.md index 42d06d45fa87..411cc64eda7f 100644 --- a/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-Small-To-Medium-Sized-Businesses.md +++ b/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-Small-To-Medium-Sized-Businesses.md @@ -194,14 +194,11 @@ As mentioned above, we’ll be able to pull in transactions as they post (daily) ### If you don't have a corporate card, use the Expensify Card (US only) Expensify provides a corporate card with the following features: -- Up to 2% cash back (_Applies to USD purchases only._) -- [SmartLimits](https://help.expensify.com/articles/expensify-classic/expensify-card/Cardholder-Settings-and-Features) to control what each individual cardholder can spend -- A stable, unbreakable real-time connection (third-party bank feeds can run into connectivity issues) -- Receipt compliance - informing notifications (e.g. add a receipt!) for users *as soon as the card is swiped* -- Unlimited Virtual Cards - single-purpose cards with a fixed or monthly limit for specific company purchases -- A 50% discount on the price of all Expensify plans -- Multiple discounts and savings on a host of partner tech suppliers -- Good Karma - 10% of all card interchange we earn goes directly to the Expensify.org Social Justice Community funds +- Finish your expenses in a swipe, we'll take care of everything else +- Get cash back on every US purchase and up to 50% off your monthly Expensify bill +- Stay in control with realtime alerts, spend limits, and auto-reconciliation +- Don't worry about credit checks, annual fees, or personal guarantees +- Create unlimited virtual cards with fixed or monthly limits for specific purchases The Expensify Card is recommended as the most efficient way to manage your company's spending. diff --git a/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-VC-Backed-Startups.md b/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-VC-Backed-Startups.md index 30d3b3e7732c..0f6df238db5b 100644 --- a/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-VC-Backed-Startups.md +++ b/docs/articles/expensify-classic/getting-started/playbooks/Expensify-Playbook-For-US-Based-VC-Backed-Startups.md @@ -155,11 +155,12 @@ The Expensify Card has many benefits for your company. Two in particular are wor ### If you don't have a corporate card, use the Expensify Card Expensify provides a corporate card with the following features: -- Up to 2% cash back (Applies to USD purchases only) -- [SmartLimits](https://community.expensify.com/discussion/4851/deep-dive-what-are-unapproved-expense-limits#latest) -- Unlimited Virtual Cards - single-purpose cards with a fixed or monthly limit for specific company purchases -- A stable, unbreakable connection (third-party bank feeds can run into connectivity issues) - +- Finish your expenses in a swipe, we'll take care of everything else +- Get cash back on every US purchase and up to 50% off your monthly Expensify bill +- Stay in control with realtime alerts, spend limits, and auto-reconciliation +- Don't worry about credit checks, annual fees, or personal guarantees +- Create unlimited virtual cards with fixed or monthly limits for specific purchases + The Expensify Card is recommended as the most efficient way to manage your company's spending. Here’s how to enable it: diff --git a/docs/articles/expensify-classic/reports/Add-custom-fields-to-reports-and-invoices.md b/docs/articles/expensify-classic/reports/Add-custom-fields-to-reports-and-invoices.md new file mode 100644 index 000000000000..ce0f60d3be56 --- /dev/null +++ b/docs/articles/expensify-classic/reports/Add-custom-fields-to-reports-and-invoices.md @@ -0,0 +1,27 @@ +--- +title: Add custom fields to reports and invoices +description: Customize the fields that appear on a report or an invoice +--- +
+ +Workspace Admins can add additional required fields to a report to include selections for project names, locations, trip information, and more. + +{% include info.html %} +You cannot create these report fields directly in Expensify if you are connected to an accounting integration (QuickBooks Online, QuickBooks Desktop, Intacct, Xero, or NetSuite). Please refer to the relevant article for instructions on creating fields within that system. +{% include end-info.html %} + +To create a custom field for a report, + +1. Hover over Settings and select **Workspaces**. +2. Select the desired workspace. +3. Click the **Reports** tab on the left. +4. Scroll down to the Report and Invoice Fields section. +5. Under Add New Field, enter a Field Title. +6. Click the dropdown for the Type field and select the desired selection method: + - **Text**: Provides a text box to type in the requested information. + - **Dropdown**: Provides a dropdown of options to choose from. + - **Date**: Opens a calendar to select a date. +7. Select the report type: **Expense Report** or **Invoice**. +8. Click **Add**. + +
diff --git a/docs/articles/expensify-classic/reports/Set-default-report-title.md b/docs/articles/expensify-classic/reports/Set-default-report-title.md new file mode 100644 index 000000000000..a103ad8d5e5a --- /dev/null +++ b/docs/articles/expensify-classic/reports/Set-default-report-title.md @@ -0,0 +1,17 @@ +--- +title: Set default report title +description: Set an automatic title for all reports +--- +
+ +Workspace Admins can set a default report title for all reports created under a specific workspace. If desired, these titles can also be enforced to prevent employees from changing them. + +1. Hover over Settings and select **Workspaces**. +2. Select the desired workspace. +3. Click the **Reports** tab on the left. +4. Scroll down to the Default Report Title section. +5. Configure the formula. You can use the example provided on the page as a guide or choose from more [report formula options](https://help.expensify.com/articles/expensify-classic/spending-insights/Custom-Templates). + - Some formulas will automatically update the report title as changes are made to the report. For example, any formula related to dates, total amounts, workspace name, would adjust the title before the report is submitted for approval. Changes will not retroactively update report titles for reports which have been Approved or Reimbursed. +6. If desired, enable the Enforce Default Report Title toggle. This will prevent employees from editing the default title. + +
diff --git a/docs/articles/expensify-classic/travel/Approve-travel-expenses.md b/docs/articles/expensify-classic/travel/Approve-travel-expenses.md new file mode 100644 index 000000000000..ae0feb4efaa6 --- /dev/null +++ b/docs/articles/expensify-classic/travel/Approve-travel-expenses.md @@ -0,0 +1,37 @@ +--- +title: Approve travel expenses +description: Determine how travel expenses are approved +--- +
+ +Travel expenses follow the same approval workflow as other expenses. Admins can configure travel expenses to be approved as soft approval, hard approval or passive approval. The approval method for in-policy and out-of-policy bookings can be managed under the **Policies** section in the **Program** menu for Expensify Travel. + +- **Soft Approval**: Bookings are automatically approved as long as a manager does not decline them within 24 hours. However, this also means that if a manager does not decline the expenses, the arrangements will be booked even if they are out of policy. If a booking is declined, it is refunded based on the voiding/refund terms of the service provider. +- **Hard Approval**: Bookings are automatically canceled/voided and refunded if a manager does not approve them within 24 hours. +- **Passive Approval**: Managers are informed of out-of-policy travel, but there is no action to be taken. + +# Set approval method + +1. Click the **Travel** tab. +2. Click **Book or manage travel**. +3. Click the **Program** tab at the top and select **Policies**. +4. Under General, select approval methods for Flights, Hotels, Cars and Rail. + +
+ +
+ +Travel expenses follow the same approval workflow as other expenses. Admins can configure travel expenses to be approved as soft approval, hard approval or passive approval. The approval method for in-policy and out-of-policy bookings can be managed under the **Policies** section in the **Program** menu for Expensify Travel. + +- **Soft Approval**: Bookings are automatically approved as long as a manager does not decline them within 24 hours. However, this also means that if a manager does not decline the expenses, the arrangements will be booked even if they are out of policy. If a booking is declined, it is refunded based on the voiding/refund terms of the service provider. +- **Hard Approval**: Bookings are automatically canceled/voided and refunded if a manager does not approve them within 24 hours. +- **Passive Approval**: Managers are informed of out-of-policy travel, but there is no action to be taken. + +# Set approval method + +1. Click the + icon in the bottom left menu and select **Book travel**. +2. Click **Book or manage travel**. +3. Click the **Program** tab at the top and select **Policies**. +4. Under General, select approval methods for Flights, Hotels, Cars and Rail. + +
diff --git a/docs/articles/expensify-classic/travel/Book-with-Expensify-Travel.md b/docs/articles/expensify-classic/travel/Book-with-Expensify-Travel.md new file mode 100644 index 000000000000..5d25670ac5ab --- /dev/null +++ b/docs/articles/expensify-classic/travel/Book-with-Expensify-Travel.md @@ -0,0 +1,89 @@ +--- +title: Book with Expensify Travel +description: Book flights, hotels, cars, trains, and more with Expensify Travel +--- +
+ +Expensify Travel allows members to search and book flights, hotels, cars, and trains globally at the most competitive rates available. + +With Expensify Travel, you can: +- Search and book travel arrangements all in one place +- Book travel for yourself or for someone else +- Get real-time support by chat or phone +- Manage all your T&E expenses in Expensify +- Create specific rules for booking travel +- Enable approvals for out-of-policy trips +- Book with any credit card on the market +- Book with the Expensify Card to get cash back and automatically reconcile transactions + +There is a flat fee of $15 per trip booked. A single trip can include multiple bookings, such as a flight, a hotel, and a car rental. + +# Book travel + +To book travel from the Expensify web app, + +1. Click the **Travel** tab. +2. Click **Book or manage travel**. +3. Use the icons at the top to select the type of travel arrangement you want to book: flights, hotels, cars, or trains. +4. Enter the travel information relevant to the travel arrangement selected (for example, the destination, dates of travel, etc.). +5. Select all the details for the arrangement you want to book. +6. Review the booking details and click **Book Flight / Book Hotel / Book Car / Book Rail** to complete the booking. + +The traveler is emailed an itinerary of the booking. Additionally, +- Their travel details are added to a Trip chat room under their primary workspace. +- An expense report for the trip is created. +- If booked with an Expensify Card, the trip is automatically reconciled. + +{% include info.html %} +The travel itinerary is also emailed to the traveler’s [copilots](https://help.expensify.com/articles/expensify-classic/copilots-and-delegates/Assign-or-remove-a-Copilot), if applicable. +{% include end-info.html %} + +
+ +
+Expensify Travel allows members to search and book flights, hotels, cars, and trains globally at the most competitive rates available. + +With Expensify Travel, you can: +- Search and book travel arrangements all in one place +- Book travel for yourself or for someone else +- Get real-time support by chat or phone +- Manage all your T&E expenses in Expensify +- Create specific rules for booking travel +- Enable approvals for out-of-policy trips +- Book with any credit card on the market +- Book with the Expensify Card to get cash back and automatically reconcile transactions + +There is a flat fee of $15 per trip booked. A single trip can include multiple bookings, such as a flight, a hotel, and a car rental. + +# Book travel + +{% include selector.html values="desktop, mobile" %} + +{% include option.html value="desktop" %} +1. Click the + icon in the bottom left menu and select **Book travel**. +2. Click **Book or manage travel**. +3. Agree to the terms and conditions and click **Continue**. +4. Use the icons at the top to select the type of travel arrangement you want to book: flights, hotels, cars, or trains. +5. Enter the travel information relevant to the travel arrangement selected (for example, the destination, dates of travel, etc.). +6. Select all the details for the arrangement you want to book. +7. Review the booking details and click **Book Flight / Book Hotel / Book Car / Book Rail** to complete the booking. +{% include end-option.html %} + +{% include option.html value="mobile" %} +1. Tap the + icon in the bottom menu and select **Book travel**. +2. Tap **Book or manage travel**. +3. Agree to the terms and conditions and tap **Continue**. +4. Use the icons at the top to select the type of travel arrangement you want to book: flights, hotels, cars, or trains. +5. Enter the travel information relevant to the travel arrangement selected (for example, the destination, dates of travel, etc.). +6. Select all the details for the arrangement you want to book. +7. Review the booking details and click **Book Flight / Book Hotel / Book Car / Book Rail** to complete the booking. +{% include end-option.html %} + +{% include end-selector.html %} + +The traveler is emailed an itinerary of the booking. Additionally, +- Their travel details are added to a Trip chat room under their primary workspace. +- An expense report for the trip is created. +- If booked with an Expensify Card, the trip is automatically reconciled. + +
diff --git a/docs/articles/expensify-classic/travel/Configure-travel-policy-and-preferences.md b/docs/articles/expensify-classic/travel/Configure-travel-policy-and-preferences.md new file mode 100644 index 000000000000..2e17af06773c --- /dev/null +++ b/docs/articles/expensify-classic/travel/Configure-travel-policy-and-preferences.md @@ -0,0 +1,65 @@ +--- +title: Configure travel policy and preferences +description: Set and update travel policies and preferences for your Expensify Workspace +--- +
+ +As a Workspace Admin, you can set travel policies for all travel booked under your workspace, including approval methods, flight booking class, and hotel star preferences. You can also create multiple policies with specific conditions for particular groups of employees and/or non-employees. + +# Create a travel policy + +When using Expensify Travel for the first time, you will need to create a new Travel Policy. + +To create a travel policy from the Expensify web app, + +1. Click the **Travel** tab. +2. Click **Book or manage travel**. +3. Click the **Program** tab at the top and select **Policies**. +4. Under Employee or Non-employee in the left menu, click **Add new** to create a new policy. +5. Use the **Edit members** section to select the group of employees that belong to this policy. A Legal Entity in Expensify Travel is the equivalent of an Expensify Workspace. +6. Select which travel preferences you want to modify: General, flight, hotel, car, or rail. +7. Click the paperclip icon next to each setting to de-couple it from your default policy. +8. Update the desired settings. + +# Update travel policy preferences + +1. Click the **Travel** tab. +2. Click **Book or manage travel**. +3. Click the **Program** tab at the top and select **Policies**. +4. Select the appropriate policy in the left menu. +5. Select which travel preferences you want to modify: General, flight, hotel, car, or rail. +6. Click the paperclip icon next to each setting to de-couple it from your default policy. +7. Update the desired policies. + +
+ +
+ +As a Workspace Admin, you can set travel policies for all travel booked under your workspace, including approval methods, flight booking class, and hotel star preferences. You can also create multiple policies with specific conditions for particular groups of employees and/or non-employees. + +# Create a travel policy + +When using Expensify Travel for the first time, you will need to create a new Travel Policy. + +To create a travel policy from the Expensify web app, + +1. Click the + icon in the bottom left menu and select **Book travel**. +2. Click **Book or manage travel**. +3. Click the **Program** tab at the top and select **Policies**. +4. Under Employee or Non-employee in the left menu, click **Add new** to create a new policy. +5. Use the **Edit members** section to select the group of employees that belong to this policy. A Legal Entity in Expensify Travel is the equivalent of an Expensify Workspace. +6. Select which travel preferences you want to modify: General, flight, hotel, car, or rail. +7. Click the paperclip icon next to each setting to de-couple it from your default policy. +8. Update the desired settings. + +# Update travel policy preferences + +1. Click the + icon in the bottom left menu and select **Book travel**. +2. Click **Book or manage travel**. +3. Click the **Program** tab at the top and select **Policies**. +4. Select the appropriate policy in the left menu. +5. Select which travel preferences you want to modify: General, flight, hotel, car, or rail. +6. Click the paperclip icon next to each setting to de-couple it from your default policy. +7. Update the desired policies. + +
diff --git a/docs/articles/expensify-classic/travel/Edit-or-cancel-travel-arrangements.md b/docs/articles/expensify-classic/travel/Edit-or-cancel-travel-arrangements.md new file mode 100644 index 000000000000..7dc71c3220ca --- /dev/null +++ b/docs/articles/expensify-classic/travel/Edit-or-cancel-travel-arrangements.md @@ -0,0 +1,28 @@ +--- +title: Edit or cancel travel arrangements +description: Modify travel arrangements booked with Expensify Travel +--- +
+ +Click **Get Support** on your emailed travel itinerary for real-time help with the booking. Any modifications, exchanges, or voidings made to a trip via support will incur a $25 booking change fee. + +
+ +
+ +You can review your travel arrangements any time by opening the Trip chat in your inbox. For example, if you booked a flight to San Francisco, a “Trip to San Francisco” chat will be automatically added to your chat inbox. + +To edit or cancel a travel arrangement, +1. Click your profile image or icon in the bottom left menu. +2. Scroll down and click **Workspaces** in the left menu. +3. Select the workspace the travel is booked under. +4. Tap into the booking to see more details. +5. Click **Trip Support**. + +If there is an unexpected change to the itinerary (for example, a flight cancellation), Expensify’s travel partner **Spotnana** will reach out to the traveler to provide updates on those changes. + +{% include info.html %} +You can click **Get Support** on your emailed travel itinerary for real-time help with the booking. Any modifications, exchanges, or voidings made to a trip via support will incur a $25 booking change fee. +{% include end-info.html %} + +
diff --git a/docs/articles/expensify-classic/workspaces/reports/Report-Fields-And-Titles.md b/docs/articles/expensify-classic/workspaces/reports/Report-Fields-And-Titles.md deleted file mode 100644 index e79e30ce42c9..000000000000 --- a/docs/articles/expensify-classic/workspaces/reports/Report-Fields-And-Titles.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Report Fields & Titles -description: This article is about managing Report Fields and Report Titles in Expensify ---- -# Overview - -In this article, we'll go over how to use Report Titles and Report Fields. - -## How to use Report Titles - -Default report titles enable group workspace admins or individual workspace users to establish a standardized title format for reports associated with a specific workspace. Additionally, admins have the choice to enforce these report titles, preventing employees from altering them. This ensures uniformity in report naming conventions during the review process, eliminating the need for employees to manually input titles for each report they generate. - -- Group workspace admins can set the Default Report Title from **Settings > Workspaces > Group > *[Workspace Name]* > Reports**. -- Individual users can set the Default Report Title from **Settings > Workspaces > Individual > *[Workspace Name]* > Reports**. - -You can configure the title by using the formulas that we provide to populate the Report Title. Take a look at the help article on Custom Formulas to find all eligible formulas for your Report Titles. - -## Deep Dive on Report Titles - -Some formulas will automatically update the report title as changes are made to the report. For example, any formula related to dates, total amounts, workspace name, would adjust the title before the report is submitted for approval. Changes will not retroactively update report titles for reports which have been Approved or Reimbursed. - -To prevent report title editing by employees, simply enable "Enforce Default Report Title." - -## How to use Report Fields - -Report fields let you specify header-level details, distinct from tags which pertain to expenses on individual line items. These details can encompass specific project names, business trip information, locations, and more. Customize them according to your workspace's requirements. - -To set up Report Fields, follow these steps: -- Workspace Admins can create report fields for group workspaces from **Settings > Workspaces > Group > *[Workspace Name]* > Reports > Report and Invoice Fields**. For individual workspaces, follow **Settings > Workspaces > Individual > *[Workspace Name]* > Reports > Report and Invoice Fields**. -- Under "Add New Field," enter the desired field name in the "Field Title" to describe the type of information to be selected. -- Choose the appropriate input method under "Type": - - Text: Provides users with a free-text box to enter the requested information. - - Dropdown: Creates a selection of options for users to choose from. - - Date: Displays a clickable box that opens a calendar for users to select a date. - -## Deep Dive on Report Fields - -You cannot create these report fields directly in Expensify if you are connected to an accounting integration (QuickBooks Online, QuickBooks Desktop, Intacct, Xero, or NetSuite). Please refer to the relevant article for instructions on creating fields within that system. - -When report fields are configured on a workspace, they become mandatory information for associated reports. Leaving a report field empty or unselected will trigger a report violation, potentially blocking report submission or export. - -Report fields are "sticky," which means that any changes made by an employee will persist and be reflected in subsequent reports they create. - diff --git a/docs/articles/expensify-classic/workspaces/reports/Scheduled-Submit.md b/docs/articles/expensify-classic/workspaces/reports/Scheduled-Submit.md deleted file mode 100644 index 18ad693a1c56..000000000000 --- a/docs/articles/expensify-classic/workspaces/reports/Scheduled-Submit.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -title: Scheduled Submit -description: How to use the Scheduled Submit feature ---- -# Overview - -Scheduled Submit reduces the delay between the time an employee creates an expense to when it is submitted to the admin. This gives admins significantly faster visibility into employee spend. Without Scheduled Submit enabled, expenses can be left Unreported giving workspace admins no visibility into employee spend. - -The biggest delay in expense management is the time it takes for an employee to actually submit the expense after it is incurred. Scheduled Submit allows you to automatically collect employee expenses on a schedule of your choosing without delaying the process while you wait for employees to submit them. - -It works like this: Employee expenses are automatically gathered onto a report. If there is not an existing report, a new one will be created. This report is submitted automatically at the cadence you choose (daily, weekly, monthly, twice month, by trip). - -# How to enable Scheduled Submit - -**For workspace admins**: To enable Scheduled Submit on your group workspace, follow **Settings > Workspaces > Group > *[Workspace Name]* > Reports > Scheduled Submit**. From there, toggle Scheduled Submit to Enabled. Then, choose your desired frequency from the dropdown menu. -For individuals or employees: To enable Scheduled Submit on your individual workspace, follow **Settings > Workspaces > Individual > *[Workspace Name]* > Reports > Scheduled Submit**. From there, toggle Scheduled Submit to Enabled. Then, choose your desired frequency from the dropdown menu. - -## Scheduled Submit frequency options - -**Daily**: Each night, expenses without violations will be submitted. Expenses with violations will remain on an open report until the violations are corrected, after which they will be submitted in the evening (PDT). - -**Weekly**: Expenses that are free of violations will be submitted on a weekly basis. However, expenses with violations will be held in a new open report and combined with any new expenses. They will then be submitted at the end of the following weekly cycle, specifically on Sunday evening (PDT). - -**Twice a month**: Expenses that are violation-free will be submitted on both the 15th and the last day of each month, in the evening (PDT). Expenses with violations will not be submitted, but moved on to a new open report so the employee can resolve the violations and then will be submitted at the conclusion of the next cycle. - -**Monthly**: Expenses that are free from violations will be submitted on a monthly basis. Expenses with violations will be held back and moved to a new Open report so the violations can be resolved, and they will be submitted on the evening (PDT) of the specified date. - -**By trip**: Expenses are grouped by trip. This is calculated by grouping all expenses together that occur in a similar time frame. If two full days pass without any new expenses being created, the trip report will be submitted on the evening of the second day. Any expenses generated after this submission will initiate a new trip report. Please note that the "2-day" period refers to a date-based interval, not a 48-hour time frame. - -**Manually**: An open report will be created, and expenses will be added to it automatically. However, it's important to note that the report will not be submitted automatically; manual submission of reports will be required.This is a great option for automatically gathering all an employee’s expenses on a report for the employee’s convenience, but they will still need to review and submit the report. - -**Instantly**: Expenses are automatically added to a report in the Processing state, and all expenses will continue to accumulate on one report until it is Approved or Reimbursed. This removes the need to submit expenses, and Processing reports can either be Reimbursed right away (if Submit and Close is enabled), or Approved and then Reimbursed (if Submit and Approve is enabled) by a workspace admin. - -# Deep Dive - -## Schedule Submit Override -If Scheduled Submit is disabled at the group workspace level or configured the frequency as "Manually," the individual workspace settings of a user will take precedence and be applied. This means an employee can still set up Scheduled Submit for themselves even if the admin has not enabled it. We highly recommend Scheduled Submit as it helps put your expenses on auto-pilot! - -## Personal Card Transactions -Personal card transactions are handled differently compared to other expenses. If a user has added a card through Settings > Account > Credit Card Import, they need to make sure it is set as non-reimbursable and transactions must be automatically merged with a SmartScanned receipt. If transactions are set to come in as reimbursable or they aren’t merged with a SmartScanned receipt, Scheduled Submit settings will not apply. - -## A note on Instantly -Setting Scheduled Submit frequency to Instantly will limit some employee actions on reports, such as the ability to retract or self-close reports, or create multiple reports. When Instantly is selected, expenses are automatically added to a Processing expense report, and new expenses will continue to accumulate on a single report until the report is Closed or Reimbursed by a workspace admin. diff --git a/docs/articles/new-expensify/chat/Expensify-Chat-For-Admins.md b/docs/articles/new-expensify/chat/Expensify-Chat-For-Admins.md deleted file mode 100644 index 5128484adc9d..000000000000 --- a/docs/articles/new-expensify/chat/Expensify-Chat-For-Admins.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -title: Expensify Chat for Admins -description: Best Practices for Admins settings up Expensify Chat ---- - -# Overview -Expensify Chat is an incredible way to build a community and foster long-term relationships between event producers and attendees, or attendees with each other. Admins are a huge factor in the success of the connections built in Expensify Chat during the events, as they are generally the drivers of the conference schedule, and help ensure safety and respect is upheld by all attendees both on and offline. - -# Getting Started -We’ve rounded up some resources to get you set up on Expensify Chat and ready to start connecting with your session attendees: -- [How to get set up and start using Expensify Chat](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-use-chat-in-expensify) -- [How to format text in Expensify Chat](https://help.expensify.com/articles/other/Everything-About-Chat#how-to-format-text) -- [How to flag content and/or users for moderation](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) - -# Admin Best Practices -In order to get the most out of Expensify Chat, we created a list of best practices for admins to review in order to use the tool to its fullest capabilities. - -**During the conference:** -- At a minimum, send 3 announcements throughout the day to create awareness of any sessions, activations, contests, or parties you want to promote. -- Communicate with the Expensify Team in the #admins room if you see anything you have questions about or are unsure of to make sure we’re resolving issues together ASAP. -- As an admin, It’s up to you to help keep your conference community safe and respectful. [Flag any content for moderation](https://help.expensify.com/articles/other/Everything-About-Chat#flagging-content-as-offensive) that does not fit your culture and values to keep chatrooms a positive experience for everyone involved. - -**After the conference:** -- The rooms will all stay open after the conference ends, so encourage speakers to keep engaging as long as the conversation is going in their session room. -- Continue sharing photos and videos from the event or anything fun in #social as part of a wrap up for everyone. -- Use the #announce room to give attendees a sneak preview of your next event. -- \ No newline at end of file diff --git a/docs/articles/new-expensify/expenses/Connect-a-Business-Bank-Account.md b/docs/articles/new-expensify/expenses/Connect-a-Business-Bank-Account.md index 8cf0a18ba529..516497c9dce7 100644 --- a/docs/articles/new-expensify/expenses/Connect-a-Business-Bank-Account.md +++ b/docs/articles/new-expensify/expenses/Connect-a-Business-Bank-Account.md @@ -4,69 +4,55 @@ description: How to connect a business bank account to New Expensify ---
-Adding a business bank account unlocks a myriad of features and automation in Expensify, such as: -- Reimburse expenses via direct bank transfer -- Pay bills -- Collect invoice payments -- Issue the Expensify Card - -# To connect a bank account -1. Go to **Settings > Workspaces > _Workspace Name_ > Bank account > Connect bank account** -2. Click **Connect online with Plaid** -3. Click **Continue** -4. When you reach the **Plaid** screen, you'll be shown a list of compatible banks that offer direct online login access -5. Login to the business bank account: -- If the bank is not listed, click the X to go back to the connection type -- Here you’ll see the option to **Connect Manually** -- Enter your account and routing numbers -6. Enter your bank login credentials: -- If your bank requires additional security measures, you will be directed to obtain and enter a security code -- If you have more than one account available to choose from, you will be directed to choose the desired account - -## Enter company information -This is where you’ll add the legal business name as well as several other company details. - -- **Company address**: The company address must be located in the US and a physical location (If you input a maildrop address, PO box, or UPS Store, the address will be flagged for review, and adding the bank account to Expensify will be delayed) -- **Tax Identification Number**: This is the identification number that was assigned to the business by the IRS -- **Company website**: A company website is required to use most of Expensify’s payment features. When adding the website of the business, format it as, https://www.domain.com -- **Industry Classification Code**: You can locate a list of Industry Classification Codes [here]([url](https://www.census.gov/naics/?input=software&year=2022)) - -## Enter personal information -Whoever is connecting the bank account to Expensify, must enter their details under the Requestor Information section: -- The address must be a physical address -- The address must be located in the US -- The SSN must be US-issued - -This does not need to be a signor on the bank account. If someone other than the Expensify account owner enters their personal information in this section, the details will be flagged for review, and adding the bank account to Expensify will be delayed. - -## Upload ID +To connect a bank account in New Expensify, you must first enable the Make or Track Payments Workflow. +# Step 1: Enable Make or track payments +1. Head to **Workspaces** > **More Features** > **Enable Workflows** +2. From there, a Workflows setting will appear in the left-hand menu +3. Click on **Workflows** +4. Enable **Make or track payments** + +![Insert alt text for accessibility here]({{site.url}}/assets/images/ExpensifyHelp_ConnectBankAccount_1_Light.png){:width="100%"} + +![Insert alt text for accessibility here]({{site.url}}/assets/images/ExpensifyHelp_ConnectBankAccount_2_Light.png){:width="100%"} + +# Step 2: Connect bank account +1. Click Connect bank account +2. Select either Connect online with Plaid (preferred) or Connect manually +3. Enter bank details + +# Step 3: Upload ID After entering your personal details, you’ll be prompted to click a link or scan a QR code so that you can do the following: 1. Upload a photo of the front and back of your ID (this cannot be a photo of an existing image) -2. Use your device to take a selfie and record a short video of yourself +2. Use your device to take a selfie and record a short video of yourself **Your ID must be:** - Issued in the US - Current (ie: the expiration date must be in the future) -## Additional Information -Check the appropriate box under **Additional Information**, accept the agreement terms, and verify that all of the information is true and accurate: -- A Beneficial Owner refers to an **individual** who owns 25% or more of the business. -- If you or another **individual** owns 25% or more of the business, please check the appropriate box +# Step 4: Enter company information +This is where you’ll add the legal business name as well as several other company details. +- **Company address:** The company address must be located in the US and a physical location (If you input a maildrop address, PO box, or UPS Store, the address will be flagged for review, and adding the bank account to Expensify will be delayed) +- **Tax Identification Number:** This is the identification number that was assigned to the business by the IRS +- **Company website:** A company website is required to use most of Expensify’s payment features. +- **Industry Classification Code:** You can locate a list of Industry Classification Codes [here](https://www.census.gov/naics/?input=software&year=2022). + +# Step 5: Additional Information +Check the appropriate box under Additional Information, accept the agreement terms, and verify that all of the information is true and accurate: +- A Beneficial Owner refers to an individual who owns 25% or more of the business. +- If you or another individual owns 25% or more of the business, please check the appropriate box - If someone else owns 25% or more of the business, you will be prompted to provide their personal information If no individual owns more than 25% of the company you do not need to list any beneficial owners. In that case, be sure to leave both boxes unchecked under the Beneficial Owner Additional Information section. -The details you submitted may require additional review. If that's the case, you'll receive a message from the Concierge outlining the next steps. Otherwise, your bank account will be connected automatically. +The details you submitted may require additional review. If that's the case, you'll receive a message from the Concierge outlining the next steps. Otherwise, your bank account will be connected automatically. {% include faq-begin.md %} ## What are the general requirements for adding a business bank account? -To add a business bank account to issue reimbursements via ACH (US), to pay invoices (US), or to issue Expensify Cards: -- You must enter a physical address for yourself, any Beneficial Owner (if one exists), and the business associated with the bank account. We **cannot** accept a PO Box or MailDrop location. -If you are adding the bank account to Expensify, you must do so from your Expensify account settings. -- If you are adding a bank account to Expensify, we are required by law to verify your identity. Part of this process requires you to verify a US-issued photo ID. For using features related to US ACH, your ID must be issued by the United States. You and any Beneficial Owner (if one exists), must also have a US address -- You must have a valid website for your business to utilize the Expensify Card, or to pay invoices with Expensify. +To add a business bank account to issue reimbursements via ACH (US) or to issue Expensify Cards: +- You must enter a physical address for yourself, any Beneficial Owner (if one exists), and the business associated with the bank account. We cannot accept a PO Box or MailDrop location. +- If you are adding the bank account to Expensify, we are required by law to verify your identity. Part of this process requires you to verify a US-issued photo ID. Your ID must be issued by the United States to use features related to US ACH. You and any Beneficial Owner (if one exists) must also have a US address. ## What is a Beneficial Owner? @@ -74,25 +60,27 @@ A Beneficial Owner refers to an **individual** who owns 25% or more of the busin ## What do I do if the Beneficial Owner section only asks for personal details, but my organization is owned by another company? -Please indicate you have a Beneficial Owner only if it is an individual who owns 25% or more of the business. +Please indicate you have a Beneficial Owner only if it is an individual who owns 25% or more of the business. ## Why can’t I input my address or upload my ID? -Are you entering a US address? When adding a verified business bank account in Expensify, the individual adding the account and any beneficial owner (if one exists) are required to have a US address, US photo ID, and a US SSN. If you do not meet these requirements, you’ll need to have another admin add the bank account and then share access with you once it is verified. +When adding a verified business bank account in Expensify, the individual adding the account and any beneficial owner (if one exists) are required to have a US address, US photo ID, and a US SSN. If you do not meet these requirements, you’ll need to have another admin add the bank account and then share access with you once it is verified. ## Why am I asked for documents when adding my bank account? -When a bank account is added to Expensify, we complete a series of checks to verify the information provided to us. We conduct these checks to comply with both our sponsor bank's requirements and federal government regulations, specifically the Bank Secrecy Act / Anti-Money Laundering (BSA / AML) laws. Expensify also has anti-fraud measures in place. -If automatic verification fails, we may request manual verification, which could involve documents such as address verification for your business, a letter from your bank confirming bank account ownership, etc. +When a bank account is added to Expensify, we complete a series of checks to verify the information provided to us. We conduct these checks to comply with both our sponsor bank's requirements and federal government regulations, specifically the Bank Secrecy Act / Anti-Money Laundering (BSA / AML) laws. Expensify also has anti-fraud measures in place. + +If automatic verification fails, we may request manual verification, which could involve documents such as address verification for your business, a letter from your bank confirming bank account ownership, etc. If you have any questions regarding the documentation request you received, please contact Concierge and they will be happy to assist. ## I don’t see all three microtransactions I need to validate my bank account. What should I do? -It's a good idea to wait until the end of that second business day. If you still don’t see them, please contact your bank and ask them to whitelist our ACH IDs **1270239450**, **4270239450**, and **2270239450**. Expensify’s ACH Originator Name is "Expensify." +Wait until the end of the second business day. If you still don’t see them, please contact your bank and ask them to whitelist our ACH IDs **1270239450**, **4270239450**, and **2270239450**. Expensify’s ACH Originator Name is "Expensify." Once that's all set, make sure to contact your account manager or concierge, and our team will be able to re-trigger those three test transactions! + {% include faq-end.md %}
diff --git a/docs/articles/new-expensify/expenses/Set-up-your-wallet.md b/docs/articles/new-expensify/expenses/Set-up-your-wallet.md new file mode 100644 index 000000000000..de1ee61066b0 --- /dev/null +++ b/docs/articles/new-expensify/expenses/Set-up-your-wallet.md @@ -0,0 +1,52 @@ +--- +title: Set up your wallet +description: Send and receive payments by adding your payment account +--- +
+To send and receive money using Expensify, you’ll first need to set up your Expensify Wallet by adding your payment account. + +{% include selector.html values="desktop, mobile" %} + +{% include option.html value="desktop" %} +1. Click your profile image or icon in the bottom left menu. +2. Click **Wallet** in the left menu. +3. Click **Enable wallet**. +4. If you haven’t already added your bank account, click **Continue** and follow the prompts to add your bank account details with Plaid. If you have already connected your bank account, you’ll skip to the next step. + +{% include info.html %} +Plaid is an encrypted third-party financial data platform that Expensify uses to securely verify your banking information. +{% include end-info.html %} + +{:start="5"} +5. Enter your personal details (including your name, address, date of birth, phone number, and the last 4 digits of your social security number). +6. Click **Save & continue**. +7. Review the Onfido terms and click **Accept**. +8. Use the prompts to continue the next steps on your mobile device where you will select which option you want to use to verify your device: a QR code, a link, or a text message. +9. Follow the prompts on your mobile device to submit your ID with Onfido. + +When your ID is uploaded successfully, Onfido closes automatically. You can return to your Expensify Wallet to verify that it is now enabled. Once enabled, you are ready to send and receive payments. +{% include end-option.html %} + +{% include option.html value="mobile" %} +1. Tap your profile image or icon in the bottom menu. +2. Tap **Wallet**. +3. Tap **Enable wallet**. +4. If you haven’t already added your bank account, tap **Continue** and follow the prompts to add your bank account details with Plaid. If you have already connected your bank account, you’ll skip to the next step. + +{% include info.html %} +Plaid is an encrypted third-party financial data platform that Expensify uses to securely verify your banking information. +{% include end-info.html %} + +{:start="5"} +5. Enter your personal details (including your name, address, date of birth, phone number, and the last 4 digits of your social security number). +6. Tap **Save & continue**. +7. Review the Onfido terms and tap **Accept**. +8. Follow the prompts to submit your ID with Onfido. When your ID is uploaded successfully, Onfido closes automatically. +9. Tap **Enable wallet** again to enable payments for the wallet. + +Once enabled, you are ready to send and receive payments. +{% include end-option.html %} + +{% include end-selector.html %} + +
diff --git a/docs/articles/new-expensify/expensify-card/Add-Expensify-Card-to-Apple-or-Google-Pay.md b/docs/articles/new-expensify/expensify-card/Add-Expensify-Card-to-Apple-or-Google-Pay.md new file mode 100644 index 000000000000..844a688e0011 --- /dev/null +++ b/docs/articles/new-expensify/expensify-card/Add-Expensify-Card-to-Apple-or-Google-Pay.md @@ -0,0 +1,32 @@ +--- +title: Add Expensify Card to Apple or Google Pay +description: Pay with your Expensify Card from your Apple or Google Pay wallet +--- +
+ +You can use your Expensify Card for contactless in-person payments by adding it to your digital wallet for Apple Pay (for iOS) or Google Pay (for Android). + +{% include selector.html values="mobile" %} + +{% include option.html value="mobile" %} +**Apple Pay** + +1. Open the Apple Pay app. +2. Tap the + button. +3. Tap **Debit or Credit Card**. +4. Tap **Continue**. +5. Follow the steps provided to add your virtual card. + +**Google Pay** + +1. Open the Google Pay app. +2. Tap **Add to Wallet**. +3. Tap **Payment Card**. +4. Tap **Add new debit or credit card**. +5. Add your virtual card details. + +{% include end-option.html %} + +{% include end-selector.html %} + +
diff --git a/docs/articles/new-expensify/expensify-card/Dispute-Expensify-Card-transaction.md b/docs/articles/new-expensify/expensify-card/Dispute-Expensify-Card-transaction.md new file mode 100644 index 000000000000..5bd23cd53730 --- /dev/null +++ b/docs/articles/new-expensify/expensify-card/Dispute-Expensify-Card-transaction.md @@ -0,0 +1,73 @@ +--- +title: Dispute Expensify Card transaction +description: Dispute an unrecognized, unauthorized, or fraudulent charge +--- +
+ +When using your Expensify Visa® Commercial Card, you may come across transactions that you want to dispute, including: + +- Unrecognized, unauthorized, or fraudulent charges + - Charges made with your card after it was lost or stolen + - Unauthorized charges while your card is still in your possession + - Continued charges for a canceled recurring subscription +- Service disputes + - Damaged or defective merchandise + - Charges for merchandise that was never received + - Duplicate charges for a single transaction + - Transactions of an incorrect amount + - Refund not received after a return + +# Dispute a transaction + +If you spot a transaction error on your Expensify Card, + +1. Contact the merchant. They can often address the issue promptly. +2. If you are unable to resolve the issue with the merchant, contact us immediately by opening your chat with Expensify Concierge in your Expensify Chat inbox, or by emailing concierge@expensify.com to start the dispute process. Provide the following information: + - Details about the disputed charge, including why you’re disputing it, what occurred, and any steps you’ve taken to address the issue + - Supporting documentation like receipts or cancellation confirmations +3. If you suspect fraud on your Expensify Card, immediately deactivate your card: + +{% include selector.html values="desktop, mobile" %} + +{% include option.html value="desktop" %} +
    +
  1. Click your profile image or icon in the bottom left menu.
  2. +
  3. Click Wallet in the left menu.
  4. +
  5. Click your Expensify Card.
  6. +
  7. Click Report card fraud.
  8. +
  9. Follow the prompts to deactivate your card and request a new one.
  10. +
+{% include end-option.html %} + +{% include option.html value="mobile" %} +
    +
  1. Tap your profile image or icon in the bottom menu.
  2. +
  3. Tap Wallet.
  4. +
  5. Tap your Expensify Card.
  6. +
  7. Tap Report card fraud.
  8. +
  9. Follow the prompts to deactivate your card and request a new one.
  10. +
+{% include end-option.html %} + +{% include end-selector.html %} + +{:start="4"} +4. [Enable Two-Factor Authentication (2FA)](https://help.expensify.com/articles/new-expensify/settings/Enable-Two-Factor-Authentication) to add an additional layer of security to your account. + +{% include faq-begin.md %} + +**How am I protected from fraud using the Expensify Card?** + +Expensify leverages sophisticated algorithms to detect and/or block unusual card activity. You can also enable real-time notifications to receive alerts each time your card is charged. + +**How long does the dispute process take?** + +The dispute process can take up to 90 days. + +**Can I cancel a dispute?** + +You can cancel a filed dispute by using your Expensify Chat thread with Concierge or by emailing concierge@expensify.com. + +{% include faq-end.md %} + +
diff --git a/docs/articles/new-expensify/expensify-card/Update-your-Expensify-Card-mailing-address.md b/docs/articles/new-expensify/expensify-card/Update-your-Expensify-Card-mailing-address.md new file mode 100644 index 000000000000..6ce53b6a359a --- /dev/null +++ b/docs/articles/new-expensify/expensify-card/Update-your-Expensify-Card-mailing-address.md @@ -0,0 +1,29 @@ +--- +title: Update your Expensify Card mailing address +description: Change your mailing address for your Expensify Card +--- +
+ +1. Hover over Settings, then click **Account**. +2. Click the **Credit Card Import** tab. +3. Click **Request a New Card** on your physical card pending activation. +4. Select **I lost my card**. + +{% include info.html %} +If you’re updating your address to receive your new Expensify Visa® Commercial Card, you’ll still select **I lost my card** even though you have not lost a card. +{% include end-info.html %} + +{:start="5"} +5. Confirm your details and click **Continue**. +6. Update your address and click **Continue**. + +{% include info.html %} +If you’re updating your address to receive your new Expensify Visa® Commercial Card, you can click the X in the right corner to end the process here if the new card has not been shipped out to you yet. However, if the new card has already been shipped out to an incorrect address, proceed to the next step to resend the card to the newly updated address. +{% include end-info.html %} + +{:start="7"} +7. Proceed with the card replacement. + +Your new card will arrive in 2-3 business days. + +
diff --git a/docs/articles/new-expensify/expensify-card/Upgrade-to-the-new-Expensify-Card-from-Visa.md b/docs/articles/new-expensify/expensify-card/Upgrade-to-the-new-Expensify-Card-from-Visa.md index 24f178db9f12..56e456eb1256 100644 --- a/docs/articles/new-expensify/expensify-card/Upgrade-to-the-new-Expensify-Card-from-Visa.md +++ b/docs/articles/new-expensify/expensify-card/Upgrade-to-the-new-Expensify-Card-from-Visa.md @@ -31,7 +31,7 @@ Before completing this process, you’ll want to: New cards will have the same limit as the existing cards. Each cardholder’s current physical and virtual cards will remain active until a Domain Admin or the cardholder deactivates it. {% include info.html %} -Cards won’t be issued to any employees who don’t currently have them. In this case, you’ll need to issue a new card. +Cards won’t be issued to any employees who don’t currently have them. In this case, you’ll need to [issue a new card](https://help.expensify.com/articles/expensify-classic/expensify-card/Set-Up-the-Expensify-Visa%C2%AE-Commercial-Card-for-your-Company) {% include end-info.html %} {% include faq-begin.md %} diff --git a/docs/articles/new-expensify/settings/Add-profile-photo.md b/docs/articles/new-expensify/settings/Add-profile-photo.md new file mode 100644 index 000000000000..60e56deaafbc --- /dev/null +++ b/docs/articles/new-expensify/settings/Add-profile-photo.md @@ -0,0 +1,21 @@ +--- +title: Add profile photo +description: Add an image to your profile +--- +
+ +{% include selector.html values="desktop, mobile" %} + +{% include option.html value="desktop" %} +1. Click your profile image or icon in the bottom left menu. +2. Click the Edit pencil icon next to your profile image or icon and select **Upload Image** to choose a new image from your saved files. +{% include end-option.html %} + +{% include option.html value="mobile" %} +1. Tap your profile image or icon at the bottom of the screen. +2. Tap the Edit pencil icon next to your profile image or icon and select **Upload Image** to choose a new image from your saved files. +{% include end-option.html %} + +{% include end-selector.html %} + +
diff --git a/docs/articles/new-expensify/travel/Approve-travel-expenses.md b/docs/articles/new-expensify/travel/Approve-travel-expenses.md new file mode 100644 index 000000000000..ae0feb4efaa6 --- /dev/null +++ b/docs/articles/new-expensify/travel/Approve-travel-expenses.md @@ -0,0 +1,37 @@ +--- +title: Approve travel expenses +description: Determine how travel expenses are approved +--- +
+ +Travel expenses follow the same approval workflow as other expenses. Admins can configure travel expenses to be approved as soft approval, hard approval or passive approval. The approval method for in-policy and out-of-policy bookings can be managed under the **Policies** section in the **Program** menu for Expensify Travel. + +- **Soft Approval**: Bookings are automatically approved as long as a manager does not decline them within 24 hours. However, this also means that if a manager does not decline the expenses, the arrangements will be booked even if they are out of policy. If a booking is declined, it is refunded based on the voiding/refund terms of the service provider. +- **Hard Approval**: Bookings are automatically canceled/voided and refunded if a manager does not approve them within 24 hours. +- **Passive Approval**: Managers are informed of out-of-policy travel, but there is no action to be taken. + +# Set approval method + +1. Click the **Travel** tab. +2. Click **Book or manage travel**. +3. Click the **Program** tab at the top and select **Policies**. +4. Under General, select approval methods for Flights, Hotels, Cars and Rail. + +
+ +
+ +Travel expenses follow the same approval workflow as other expenses. Admins can configure travel expenses to be approved as soft approval, hard approval or passive approval. The approval method for in-policy and out-of-policy bookings can be managed under the **Policies** section in the **Program** menu for Expensify Travel. + +- **Soft Approval**: Bookings are automatically approved as long as a manager does not decline them within 24 hours. However, this also means that if a manager does not decline the expenses, the arrangements will be booked even if they are out of policy. If a booking is declined, it is refunded based on the voiding/refund terms of the service provider. +- **Hard Approval**: Bookings are automatically canceled/voided and refunded if a manager does not approve them within 24 hours. +- **Passive Approval**: Managers are informed of out-of-policy travel, but there is no action to be taken. + +# Set approval method + +1. Click the + icon in the bottom left menu and select **Book travel**. +2. Click **Book or manage travel**. +3. Click the **Program** tab at the top and select **Policies**. +4. Under General, select approval methods for Flights, Hotels, Cars and Rail. + +
diff --git a/docs/articles/new-expensify/travel/Book-with-Expensify-Travel.md b/docs/articles/new-expensify/travel/Book-with-Expensify-Travel.md new file mode 100644 index 000000000000..5d25670ac5ab --- /dev/null +++ b/docs/articles/new-expensify/travel/Book-with-Expensify-Travel.md @@ -0,0 +1,89 @@ +--- +title: Book with Expensify Travel +description: Book flights, hotels, cars, trains, and more with Expensify Travel +--- +
+ +Expensify Travel allows members to search and book flights, hotels, cars, and trains globally at the most competitive rates available. + +With Expensify Travel, you can: +- Search and book travel arrangements all in one place +- Book travel for yourself or for someone else +- Get real-time support by chat or phone +- Manage all your T&E expenses in Expensify +- Create specific rules for booking travel +- Enable approvals for out-of-policy trips +- Book with any credit card on the market +- Book with the Expensify Card to get cash back and automatically reconcile transactions + +There is a flat fee of $15 per trip booked. A single trip can include multiple bookings, such as a flight, a hotel, and a car rental. + +# Book travel + +To book travel from the Expensify web app, + +1. Click the **Travel** tab. +2. Click **Book or manage travel**. +3. Use the icons at the top to select the type of travel arrangement you want to book: flights, hotels, cars, or trains. +4. Enter the travel information relevant to the travel arrangement selected (for example, the destination, dates of travel, etc.). +5. Select all the details for the arrangement you want to book. +6. Review the booking details and click **Book Flight / Book Hotel / Book Car / Book Rail** to complete the booking. + +The traveler is emailed an itinerary of the booking. Additionally, +- Their travel details are added to a Trip chat room under their primary workspace. +- An expense report for the trip is created. +- If booked with an Expensify Card, the trip is automatically reconciled. + +{% include info.html %} +The travel itinerary is also emailed to the traveler’s [copilots](https://help.expensify.com/articles/expensify-classic/copilots-and-delegates/Assign-or-remove-a-Copilot), if applicable. +{% include end-info.html %} + +
+ +
+Expensify Travel allows members to search and book flights, hotels, cars, and trains globally at the most competitive rates available. + +With Expensify Travel, you can: +- Search and book travel arrangements all in one place +- Book travel for yourself or for someone else +- Get real-time support by chat or phone +- Manage all your T&E expenses in Expensify +- Create specific rules for booking travel +- Enable approvals for out-of-policy trips +- Book with any credit card on the market +- Book with the Expensify Card to get cash back and automatically reconcile transactions + +There is a flat fee of $15 per trip booked. A single trip can include multiple bookings, such as a flight, a hotel, and a car rental. + +# Book travel + +{% include selector.html values="desktop, mobile" %} + +{% include option.html value="desktop" %} +1. Click the + icon in the bottom left menu and select **Book travel**. +2. Click **Book or manage travel**. +3. Agree to the terms and conditions and click **Continue**. +4. Use the icons at the top to select the type of travel arrangement you want to book: flights, hotels, cars, or trains. +5. Enter the travel information relevant to the travel arrangement selected (for example, the destination, dates of travel, etc.). +6. Select all the details for the arrangement you want to book. +7. Review the booking details and click **Book Flight / Book Hotel / Book Car / Book Rail** to complete the booking. +{% include end-option.html %} + +{% include option.html value="mobile" %} +1. Tap the + icon in the bottom menu and select **Book travel**. +2. Tap **Book or manage travel**. +3. Agree to the terms and conditions and tap **Continue**. +4. Use the icons at the top to select the type of travel arrangement you want to book: flights, hotels, cars, or trains. +5. Enter the travel information relevant to the travel arrangement selected (for example, the destination, dates of travel, etc.). +6. Select all the details for the arrangement you want to book. +7. Review the booking details and click **Book Flight / Book Hotel / Book Car / Book Rail** to complete the booking. +{% include end-option.html %} + +{% include end-selector.html %} + +The traveler is emailed an itinerary of the booking. Additionally, +- Their travel details are added to a Trip chat room under their primary workspace. +- An expense report for the trip is created. +- If booked with an Expensify Card, the trip is automatically reconciled. + +
diff --git a/docs/articles/new-expensify/travel/Coming-Soon.md b/docs/articles/new-expensify/travel/Coming-Soon.md deleted file mode 100644 index 4d32487a14b5..000000000000 --- a/docs/articles/new-expensify/travel/Coming-Soon.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -title: Coming soon -description: Coming soon ---- - -# Coming soon \ No newline at end of file diff --git a/docs/articles/new-expensify/travel/Configure-travel-policy-and-preferences.md b/docs/articles/new-expensify/travel/Configure-travel-policy-and-preferences.md new file mode 100644 index 000000000000..2e17af06773c --- /dev/null +++ b/docs/articles/new-expensify/travel/Configure-travel-policy-and-preferences.md @@ -0,0 +1,65 @@ +--- +title: Configure travel policy and preferences +description: Set and update travel policies and preferences for your Expensify Workspace +--- +
+ +As a Workspace Admin, you can set travel policies for all travel booked under your workspace, including approval methods, flight booking class, and hotel star preferences. You can also create multiple policies with specific conditions for particular groups of employees and/or non-employees. + +# Create a travel policy + +When using Expensify Travel for the first time, you will need to create a new Travel Policy. + +To create a travel policy from the Expensify web app, + +1. Click the **Travel** tab. +2. Click **Book or manage travel**. +3. Click the **Program** tab at the top and select **Policies**. +4. Under Employee or Non-employee in the left menu, click **Add new** to create a new policy. +5. Use the **Edit members** section to select the group of employees that belong to this policy. A Legal Entity in Expensify Travel is the equivalent of an Expensify Workspace. +6. Select which travel preferences you want to modify: General, flight, hotel, car, or rail. +7. Click the paperclip icon next to each setting to de-couple it from your default policy. +8. Update the desired settings. + +# Update travel policy preferences + +1. Click the **Travel** tab. +2. Click **Book or manage travel**. +3. Click the **Program** tab at the top and select **Policies**. +4. Select the appropriate policy in the left menu. +5. Select which travel preferences you want to modify: General, flight, hotel, car, or rail. +6. Click the paperclip icon next to each setting to de-couple it from your default policy. +7. Update the desired policies. + +
+ +
+ +As a Workspace Admin, you can set travel policies for all travel booked under your workspace, including approval methods, flight booking class, and hotel star preferences. You can also create multiple policies with specific conditions for particular groups of employees and/or non-employees. + +# Create a travel policy + +When using Expensify Travel for the first time, you will need to create a new Travel Policy. + +To create a travel policy from the Expensify web app, + +1. Click the + icon in the bottom left menu and select **Book travel**. +2. Click **Book or manage travel**. +3. Click the **Program** tab at the top and select **Policies**. +4. Under Employee or Non-employee in the left menu, click **Add new** to create a new policy. +5. Use the **Edit members** section to select the group of employees that belong to this policy. A Legal Entity in Expensify Travel is the equivalent of an Expensify Workspace. +6. Select which travel preferences you want to modify: General, flight, hotel, car, or rail. +7. Click the paperclip icon next to each setting to de-couple it from your default policy. +8. Update the desired settings. + +# Update travel policy preferences + +1. Click the + icon in the bottom left menu and select **Book travel**. +2. Click **Book or manage travel**. +3. Click the **Program** tab at the top and select **Policies**. +4. Select the appropriate policy in the left menu. +5. Select which travel preferences you want to modify: General, flight, hotel, car, or rail. +6. Click the paperclip icon next to each setting to de-couple it from your default policy. +7. Update the desired policies. + +
diff --git a/docs/articles/new-expensify/travel/Edit-or-cancel-travel-arrangements.md b/docs/articles/new-expensify/travel/Edit-or-cancel-travel-arrangements.md new file mode 100644 index 000000000000..7dc71c3220ca --- /dev/null +++ b/docs/articles/new-expensify/travel/Edit-or-cancel-travel-arrangements.md @@ -0,0 +1,28 @@ +--- +title: Edit or cancel travel arrangements +description: Modify travel arrangements booked with Expensify Travel +--- +
+ +Click **Get Support** on your emailed travel itinerary for real-time help with the booking. Any modifications, exchanges, or voidings made to a trip via support will incur a $25 booking change fee. + +
+ +
+ +You can review your travel arrangements any time by opening the Trip chat in your inbox. For example, if you booked a flight to San Francisco, a “Trip to San Francisco” chat will be automatically added to your chat inbox. + +To edit or cancel a travel arrangement, +1. Click your profile image or icon in the bottom left menu. +2. Scroll down and click **Workspaces** in the left menu. +3. Select the workspace the travel is booked under. +4. Tap into the booking to see more details. +5. Click **Trip Support**. + +If there is an unexpected change to the itinerary (for example, a flight cancellation), Expensify’s travel partner **Spotnana** will reach out to the traveler to provide updates on those changes. + +{% include info.html %} +You can click **Get Support** on your emailed travel itinerary for real-time help with the booking. Any modifications, exchanges, or voidings made to a trip via support will incur a $25 booking change fee. +{% include end-info.html %} + +
diff --git a/docs/assets/images/AdminissuedVirtualCards.png b/docs/assets/images/AdminissuedVirtualCards.png index 88df9b2f3fecef011db3e71c7eb12c02847cc97b..9c44763f584065c46b2a39b521bf802b996d07ad 100644 GIT binary patch literal 153606 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 z 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 literal 157289 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 z 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Í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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/ExpensifyHelp_ConnectBankAccount_2_Light.png b/docs/assets/images/ExpensifyHelp_ConnectBankAccount_2_Light.png new file mode 100644 index 0000000000000000000000000000000000000000..dea262434e59e2e3f7000ffd618854cd897cdc7f GIT binary patch literal 138986 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/ExpensifyHelp_R1_CreateWorkspace_1.png b/docs/assets/images/ExpensifyHelp_R1_CreateWorkspace_1.png new file mode 100644 index 0000000000000000000000000000000000000000..4487e10d97197e2e18a2d086b96c6ab59feb28e8 GIT binary patch literal 248297 zcmeFZXIN9));5e=1r!kx=>l7k-lR)cQF@WyLAvx#=uwc~q;~?+q)QJqBE9z(Lhmhf z0tAw8;eO6@&hzj5e1Ck4#g%I%Yt76u=9u@m?=chlK}nkMKGl6392`PfnRlueFGd`k&tGwHE`hf`Z{py% zy~M%U{)mGkoQ#7*?wH=7A_{zfYa%cG4hMVlm(^Sl2fTC7QAWoF2ZxN|=Kq$g>Wc&5 zaU9uqZ`3{DyK^AzG1NTPNmjpL=Oh9R@`Cv8iWg`UPqIQ$v~J_pJDZi0!bPOS-zd)> z-ywhgSEXQgY%>b~(ciD}pWS=*_0d~_Lvak|+$6#{EM&*cAi7wK;Teg{Q9slEQ0^9l z>kjb!|8soq;=3n!>t9#EtG~#9b@4a!_P_7@FE9Svvj0yN{>!re&u#zDebN7^-G6!U z|6C*fpB|R~zqkHO$N$o{{)Vn-{(Ji3ymrL<_tk4ha8xtc16_wqq^8lj6iR!fr|gDY@7jWkgMq(RK;#+sw_um z`6IwZ|I15lnt|Beq#e6{yW{-3wG?>2X_vNkIGKC!k@POngza1p{^OAcL#*elUOfJ2 zNBjJaWfb5u|F;@aD;B!!MZiaktf`;Q34zM}s}7$>ia&kN=Aeg~+5vv_f4}}?hKN7f zqw0Q3*aEP`{BL(tP@|?_yIR~q1&&D=d0aLS_|X9!&WQP zEKy?02@g?R>(T$|4r!n}AT5TGi=BK*#)VV|qA%`@lLS0%HCUkN@Zc4`|ZQ=_Ah0x-A2rV1&>q?1z? z$Bi3QfrInw)#c#afd-T<>+IpHCPWlJ66l7@Gn8IDmP&+jODYUK8gucc%zLaE z8PTSJZ|=);mG~D<(`sw8WH%`C;dz%JHDvhqngnddj2t=EZM+->%v<32+@(J9PSO$F z$_>{U8Xrp6X5dJC>DwTuhuiOPc4-sPMz_tZW<3;Vqu5iE4=b+1NC&K>=ZDYg z-Bxm1;Uc(y{{@E$srV5Q&cWzikQ*d+WbhJbP$!Z>`K03LbS@nAih{pV&(Y`~3*{w2h{Qif4I+p(?Z-Y@ti;0I*8BVIj}A8b_tei8K@>QPcL|VptHUJr zjYJZqoA)kP@5=W~MSTNCM}>)rnmw(>j(y-7aL~c)FLM5~QAtigsx^>eIX^a(Br*?h=Ul3e4l6ENX|$BHlJnJsm#h2k-@?&! z(lXNS$~qOFY?=6vH@LR76`?!8EWbHgX^Ba(DyNm+VMS)kN_?QSZ+0~k`$COCu48MN*o4%FkxNP%VUZY+p z8Anm8QV~#-*N#at9a1gG=qCB?>$SbOsq*K+PrVOb5_`usxm{OtnCh%zX1Nldy7I2z z!=3j3qc6wqA?0eGR}|Re&Uto^8=5ObNyydCD8Z{7N1H%Q1L@q)oA)5G{k7ldiQF^0B=ghFX138FwJC~kEpv)x!(KnLQolWI$*6RXU^>4< zb}(Wxp{W1pf~`BKcPexJjHqWQ>48_WmDAtrJdwG|^OTC#;BNSgSAJTL6;lvg*3BYL z+C-V=X6Qv>t<5oWJo~F!ran!x`4XOo&d#f{b6p`NysP}C`m5sC$AREWFE@_3sGDWx z=D4vz$mXI_LZ#(!M!_&{@m`)(t~~l=axj%oi>+qJOV43Y#Oso7o8vlqJ}mlFU|?kS zuyB68-iu9qQtvV*6BF#^LW?|dnIGXj|F&8YtncIgZCy!3A^@4b(D&iSY(#@w4H%QI zwpT9UW$#U?8F|ewo*yYU_H0>p&k*$qOY+P~=ztGT_DpS&c=|)(4AWWEf2y{qQ-D-s zURABo9-n24?RkNZ#77Q+91Hq9`t+LcjHWXk)%O>dWnJiK|E}7U94)MQQDCroK-aAU z6XoL!vQ`)rQH;XGthPw+pESr8TZ)}TLYhkJv>@rIove+T5T^vjmF0Z`oL?^F2!d_a zg=^#4WRx63slNQBIbF}{ufGS8Om;JTZZ)mbN>^Z1xgzs`CTeL;|4-dMTT%tg#HVLI zr67LtgfcxnlYMiU9!d|DC~q~$+Pw%R;XUUp9FYLbQ_yO1mdK)#>*}*vZQzq@`ugz@ zeN&#*YS7zyVj(0`Y=>sEMpboEXPkcvjWyB4{&b9J9zNIvaOmZW_H^sVy@T8Whb%iu zF}AR0N$K=j6hzl1%C#(z ze_;YZFVqGPw9#$-D#$`y<`xn5jl)_Ok!m9_auV!JmJq6El|-zkU+0I4PspylM@#BX z$*^fY8|@#ufXR(WfkeW1aBzlH9QVmUSWhgRo6}(-R~cRvnSQo2en0}Q6g^tn$~h*Y zx!ygfNMVY)o;lmt5{!x=QHtq{kS#zd8VGh~VS$B}KY8`xpGqD)U}NqbE8D|l-+B|% zN*L+(XJn0TMiy-Kla8WA)>vY*H0?U8w)`r2w;7^u!IubE`oY5}P0LshmVJm_$|mN! zeU%;cHtFync-@MnxbS{Rv;s#rr>q6>1#_cV40w`u`f?z@W)iEesT*%&XWbSzQ5pKP{ zoJ|q7v;Tn3hWy%ZgsGh4d~=Vm&$02=&GM_oYUtqZdLUh4M^M0Sz~{RuCvF#sDX!9j zxI%{~C)tx+@1NUso@HY7tI;TkEoQ7>_Gyzn{#{$zI(`8TyPihRf4yJGvSymd<^i-IYBe*CW)&h;lcm!_O0St>heTfIy| z@9_T&;K!#LANpLay|ooQNOFj8{I%zOq_6cFjZ>SqtJd7SfyoclK&)&PdZTv7E={_{ z#pkJN`ilE)3K`C%YA5aLAb3$~Z*OXE1Fo(OwHo7&@3R1Jd&QYx zY4-=>625U5Y6yF#_z80|tbERWM&ca{DPm`*erjrk`Z51$^F$n`CgNZ!P$YJgHzdH! z1TzRxl!25aH~599&9)rWWliK7xfDA<2NMM`8Al$>Z;UWJi-?n2?UJbBicht z$KG_5#B{?pwE4YI>9)@Kj9TH7eDaKfL0@dmUAnvN@0XMQL7|xh&CTDt&zbiYGgFdS z$Rsi%X^9cUh%UI%r5RKGq1vYnx1>7n-ISA_Yk14%!YUNf39Fq-jop7bH7npS+D{oL z?y0wb#h4*kFrF#VAGNC*>16tKcl52E!;s2-#V9rApST~~v`TxKd+7)KHd>jeEt>6| zdK6tYPeT?32`y}<&X{Nrq|Ph_8Q0ZkT{sj~ofckl7IGf8?>>5bcs7`V?_$1iDi%vyt%3eA^N)m-y-`L{C!%?EeVP0kr~Lc&em_57 z6NPWwX-AbunN`;`)p-UEDx$E7zQPVeiA)-^q?OaT(9b{h_}wOQu$*oXRaRoqy}SOL zEgzV_^}W~@U;DrhQ~PCEp*NE*kn-R-{G$(kpnpFi;)~iwbq7P2+kFq~gyjzW8{Ek& zZhxD$>7>AJ6zrCOX>pKv{G{31^{iQdas@LPK&} zuJPyZ)Fh%@s-<J|=t*OGML$)A(GFPYGr&ZW1@7dHqqkZl3(iVGtji)-;nz$dI$q3#IBpCcj*|Z485aXT1K3zxD%1b! z3pzDcK~On$4A!Z$f8gvKv-CH~Jl7tL?_egM3+~qF{2PDo6yhE;HLR1kXWB_0{EJ8> z+%=aTs+>z((S6vthSd>{rigWHhkqSwWq9a(jPf+cz-k=o5*GFe6vO&BIegxd2MrkC zmBtP32&xh)QSp=Ktr8Lw;>~wbSw+K6otTGTqCh1t5h-tm-q^a+-8V81EJYp7D=4`F)wh}_T8N?*Oa1f*Wo!T@hXWn*_e|U5=8CW>~CaA$iOEIfAW8ixFuxZQr)I?V)NRDNr z)}?Ijh~Md_u#Ks`40n~YONm2CmjO|9VO<>)H@`|_(ZYSA`{DPZBcdZB!XJd+o4R+H zJ(Ar_a-Ou&a~I?X+PE@mnM}zOcPqW+IT%Zbwn*s2EWzByQb!j=9ak61eQP~>kKT{f zZ7XAamZ}MHS839E?iF<3wFDpceW4~+xgWY{XcS#turh1J0>hdeJBaI}*GnSNQE4th z9H>h#UENK+!Az!tE4ea$1}%!Xh%-f<8tp1ozwPDs#RH zHA%jn2GOt{dyr`G;(?mOEcP(akFO{q^XPaZZ}OEC?=Sg>1ZTopWsaurk%f0R@&o_FB>DjMFO%=MJGg zNo>J0)?%&KNO)(BHB(aojLcr-=dti`N;JHwKeNbQJS7!d=9hzIbC+)1?X8~{r!f4X=lT}%*|;nd^Q3ZPX*`T|GB;*PD##%CS^L6%AvwD=O{SR0yqLMfrp}URN8qqS^A9O#ht$(~RX}2Fa zQ%fp@w85&+*oxUlUYvd&{u}}gDcY9%k|miJk1Bj(V35JjXYKmd^|Pjn@{khb=cn^k ze-Y_n%pj2-9^FVw=f|bm`UzRsLM?bbUL(AE78TFICSx!0jZLw;CVzF*1txM`IzzhO zj}Vnr4$ciGr%GG&S+n@y+EkLXFf&31Nv*w#SQ_7vkns2%A|wlMdSm$+UEKE|-PZC+ z7iNj*5?4*|0Z->O7v9ty=O9&IBTH;%ou-d~)%t^@T@Z>gW4Lho4r@m3+BB-l-9EX- zC7`sfAU~pD)!fhA^(b2YQu;@8?P893@Y#8X)F-7}t>*&A&KDndiim2FhS6vLpQ8TG79{PK{*4B2l(ABg3JsSWOU@Q zsI50CH{IqoZBsP`b&(0U{Gc=fO|aUFi13JyO7Q*7{2W@@@HQ`gXVN{d>5CFU82%9v zA%6Hh2k^PYpJnkg`D^Ongv>Zv3d*OCNn&mRfIzG0HtI|5}H(<1( zSojmL*-5K`!wBqDU}$8P2lOHLvqKO^a_>H~Vb%4BmzrW?5DgZG zt#j*!_P>MEqLkIUM9>4Lb&K1I+5>4&il*0|x{<*tsT8w8xEdHm>G0W0I~n7uqpcI1dK$M#N1g5SD&~b*!Pe7)oGMd3)JNW`EzRlDpVN*p zGOw25?nBgCge(^8N&*ZCd11GXNg5i2Nyg$z=bi#H(9*7-&88@%9CTk;)VEx0YmqZf z-Yavy?Y08N8*&Lo?)BFAvs|bqS&qZ6za0dU65`K3lKRM~;~zd8cA-J&_zYra>#TnO zI9Q9SWLkKmoSICO&&2{jz?j*(V0Ri`ezz0nrd4mTmxwXJ&E&wb zP7*2b#WI_7dniU&86bP?U?~lkOGPaj;Q5VX0bg$KZ7LuF?FZQBknU#QpdA?-+rKd< z%{?Q9=V~rvNwIrSsmr6uyHUC`9*0T&t{r;__R^!6<5EXQ4 zXE~tJGedNM&ThH~Yzc6pTI$!ck&qu@2$mgwC3kNG?#5{2dc( zz!WVkK^?~hyOkYHt}M9Wd*CT3*?^s9L))rAc26nj4KH>jjM9a470Z2pfP1{S?&ve& z<`ZoLVKyf~nP|SDYJgkOHEg4O0a(TRb44Ll$h4=Gi|_Ou^R}?9l_;<}2VLO*Hk#VR zYkyy)9_CDS3Rt)V^DBs-$L~Rt$-&5+E9N$)Mgf5;3Q!FrQOV^J+a7(%wG+%jVZgEP zOe5^;_#GhVIx4DMik_iIw(Rbk%5d|#{VXdfrCLv(39N5_j#`ZnNrkN>U6)DJFU}XJ z4pV(P%e3!2(^R#6asIuygk?(f89qLN?FM1}5-((dHsevLkh7D{Qaigd*ts=hWRPn8 znJwJHcNCncq-UAc+{&T@rkp|jK(^hQ_-`KrW;nrgqYFB)rWGaQDT>sBnob z@avh{b#Ha{-7vns$1Yo5Bk$Da4j$+e->h z_rQsRB631>iBBE82aa?0cDkz;o>@Q%^&85ro$|hIepuF`XXb(W>ne%XX|kF#taW@@ z`f|Om{ytbhq9?`TAG%8Y$&Mr^^ZBH3!NEWr$jF0f z;`?{&e&4>`7I2@-9mc`T$Y?c3ROo}P@}<6wu~ezXwE%P}_4UrA7IiN9`eTU4 z54$1=fIBSkhzqN=M4(uw9ztk6+CBBM6cGYWtS{joEyOpz3j ztH1Z_Pp>r;8EzDuV`7ArDzb@DdCu9%&jn1KffX0J3cg2x1bCtoO%%90!_~QFF#9;I znQArqs={e5hNt+%bWBaR-cDE;$#ol6tl4AsIQkd0u<`X?WZz1as#|B0at6BP+KtP^ zJxs|Fd@yrSPp6QEZv9O8SJht*(j+m@mzDf2)^hSSv7T%GuoB%@cJq=8=KyLtVw1zg z1rZ*73`Z=?RyX}DQh$M*KRK?08)2s|J35gMzZ|NN|7Gt}3u-)j<)3`A+Vub#XEFG* z*DzouahFu;dBhxC5-n{W;z$*`1|NKbo}`Ik9g z?tM|o4ti20qGJ_+3j(Co2wmDov_7rq*gjICA?m4R)yMC|=59}wqU5|b2Tm4~4}i#j zuBlnS+{^3IP_b{|NoWIY)6DB~dfaxB?{UjX~@$-z|6tmv}3_~X&xSKExscL8WXfRjRJ z)ha@o{P=}dlaaUI)ZFX25Q)781xP65V&sG?lH%=NEe7aF)Jg6$odZY0^bqUnO3zH=3Hwf1V3%Z)6%{Q3|lxNFVbQOg&mjNSpz z=034UK&!R!@${K^5~k8R`^@~6t(y{pjfw(M0KQxb+dreJ;-3Ybtr}_V>^xm{>Z>cw zxE^wouZG#LuNBp|2;~I|hcDAfK*0?lJ@8!IX)092I{Kctt*4T3SgT&_eCB!l`LBat z02#eR-Js4Y;Pz7>H#tRQR)9NIN^~t~Jt$nTOn`3$4;RE5Nfr0h!Pe4h%h~~H>pj_- zj=v_}iV-%2?ojOjCP+1_qif{&ATnH`M**NiJO>9yyC0f1=}zRp$x<{s8OVkX>q&%U7vBJc-RL7?yWR$dTwbFXwg@*meCMH9CGh(wF`@Ie zcY)knSGPuMTHVR+iHUp8QSI$%2OlR8Eom_^^pP53h8ujha|{ zx?33or&z$?a_zvycdVVQmc)MW{IPw}R1;--d|EaQf(RHvc8UE*uKj>LlOQx$1NA;f zTUa%n1x&pbZf$N#6kaykCvhiJ)hTC$V(mwmgdI3?$;@nm=I=1P)0&uiv1U;se#Or{ zvpamj3t&Agv|EBbQ{;*=#j_#eit}NWPSv0RJ-a|tlv10~9~tp8xrReIGmp3&TI02a z;d*u~HpK_wr8x+G{B^K1}aK*22l}jrmquxP=XPitAxwDg{TJtdfXY$OX<9&O9wW?oJ}z3G=I*FQL@OJ6;JqSB!4Oswzd8>>HlbgXMw z&is~Pv9ou9X*+gzzjAID;hAP)U4>=@4r07ZpOSH}y++5~a$rxVOyw&I%(L5_{I)s# zjz#gu=b|YkppTA35f7_St^?hDWrf9sc3FW7QR0@C zRsc?|toc}(4DXZ4;B2H;?YEuFDEg#s^5bnmR@+5oFhGd(_at^8!7eh>a~eAG{GeI} zPGcPn9h&B{C_}9U?S;`^XtAc-y}Rv+rCL|z#~0U-YJfMNaGR*5`G>wESk05z`YMpUkL8N<_gbv!oQVl-GZ=87Av16~6p@!yYKlCm z;3&h@Kk@R|+0%5X3m%Seco(>N2UV9iq|DJjlCHuVo{c?yxJQ5W(RjSyddBf&SaP;* z5Q{4CuFG()Y$2sf&@x1fcEdUdJKXdi4Ja{$)z$@d+e zIQRw7VQW1rB|}vWizO3F8E*LjrKwC>fP$PH*ZT4wCe2sn@Djx+tc<5t)i7(MGet#fl zMT%Q^i;@U=g&cezv=DLSSZe_89c9S%6_H^=Med%9k4~26N;XQnt(toGq)jQ$zH)ZK zZf+v|8@Qve=!u!2kUk&~p91D4N-EH`45d1!d9HPGEt z^q11TO)ztFE5$YD0JK33>)+yGufjdO1?rr2Qb_=g|19)D^OIeW5Z~tkYO^5k;H-eF zp2l`>NK}hfL&IIF2muQ_HD5b5vATfS0@Vj3h*{|Fsq{mo%;Wh5P3kMZk@SUrEUFmd zdond~sTbu7s5z2N_hMopr*&w$y0AW(5%HYPNsHx(S2<{xQuST{ME#gm0pJ+%VNCLi zKSIGl?6;m5CQhL8T?;vL~P2~gsRi)DJvE=oIg8B-8xkdN?4>-9JsuT|`rJVTPV z{RDuf0AQi5*o+8|9Q@mDU{Uv?4YnuT>U$j%ApAZnq3zNP#kjX}^^RL?>!Z-+Gmfuu z4>bWUYi@vTyLw&QNf@dZ4aOeiiOoIRgc8$SO2}^zdZogQu6m9fP^pHloTY^nE{*`K zrO8XSrmNmLQI^Y#a6bKhMm}WllWu@!ievk^6zXx`uV5`D4kqW?`YMiq8PWAcKuI77 zy_eMU0v?>dX7&hg4&U!5pT_e&4rUHpGd@;2KiMd$jtjw?{*&j!$ciFB%W}ixvf@J zvMy$@6Vqw~M2Bm1)Ne$6eyBThLcBXW&Hz1`I2b7?&hQwtpivyLA3bq7OBK+IM*Fzq z3n$K%FR{TErY1Njd>x0_xERH&`OF8sF;2uNtnGbeAsuCa0sI#)y zpg?#RBipUgw>JCpuR9AuNRjP{D>>uC>f}jJjTXKV>-_b1ZtX^~kS>u!f{>W5EXvMvI$xZh;MjcPE{rx9n{RSmti09{5rlhr_mYlQ+(pgm z6slEAO@Oa18X7Dvd-q|ZE!S!U&QdO2{Jd1xlDFS}mrTf!`Bp>7_uMi~SUX9Lt+VC# zT<7gATgG*lAce>W_V!k($?^bY->CnLw`ob> z=;&;KO_o;TTd@Kz4Z8rx?rQNfSQFJzA6qL^!ChJ~|Kh5H-wd{>ZwUjQmk9CMn0f}% zxVA=*yV0{dV|!<`8IvLoapO;gFANz3@H6;aI`_$kE^HUh2D(~iJxJxDxr5?YhB?l!lIYM{ zT@Hp9&4D8wztRB8mOdYYi~zWc25TO5j4oZ^Qp+(~Iu zA*D@N%dIB0s7d3VL&IknHrO5*{t}Rt@>QB3MKyy4^K%@(;6NfVkZ_swwLv-in|z0f zibJ`KrTL4Sc({rdam)}QF|Oij3EfYZSf@mKrEP5a)~WBK&4pzIA4ai4Z7iS;Xmv~2 zZ{NMdZ1o^M6(S3K_9&6JLCmFP#k71tFh{kb7RTvf#N(FrXv~)LQXk-|Bvc&%Qq@X`vR$3h zE141Pl&Lq_fm7{R}^HaAM2 zm!@Q&(JoRsQ1!dR+yY*~KeQS!KQ6;8?PSkGeeGJMZNQ?#!=r#Uv+Q;R_^mgVZH@!| zmpd`7=Pv(bW=UGD{2X-|y-gn=`Tgx^)mX=}{hy>aMre|pE*8F+rN(yBqBDvu^5_BM za`MuNL*q*7;^ZInm`gRV4n;mi$PaGs?b7{KR_FaiX$NZ=U|RT<-?+6|Iqx7mlEPZ- zd{ue=H1Z)eBa}<*{QZ90MTx)W^-}EwysM&NS*d>ebd{rFP1Bdc(4aq#}6lkXXbhbp24c|iK>Ul0o_AX z;H|gF>9-%l@ev|3cW3GY>p?vG@8+T=#m50@OPD)f@6{WTU!o(6hVT#95QzK3swUr~ z<+att6-n{?9~3vzFY*FsUCYaZyUeL(44)j#0K#|(SQo1Q46{Z3_ZydN6aCQsfN9A3peM_K8X#Zdo`gn$XC{vFf0_7;Mq1@fNc>69I_*6a1!Z z&o<{|N+gS?4iM}J^)pqtUwc(c4v!S5^40LLbJkx2b632&tLLodOI=Qb_t$g1|FNFt zk|^1b5x1|4l#-St&P2{dcGu0fP5&@qaLS1I7{PU zeNXyy5`|~qoWth!Fk@;}HcsrwFByQ}9pgt|+RUn(tDHRFm={`r6oIu3V8Q`;OC3d& zAm`1&W#nOCgC6T~nI}-Lr%CdZ_D*@`c_z|{jDp*2%!t-bkfK)H$*5GULV?A|nB~y0 z)sKppr4FDUSrfiXvjb#gw07FIz6jGoF>nI_x4Osg?15OS>%LxZ9=ql7)9ZDXMSa8Qv??_F_(n zhV%2PnTVp)B8b9M*1`l^fq?T37PculYxBD`CLJSVtCdUQzVD;Ng*+#Ew`Or+6jjmS z8G2$dOv0WTOS_4Rfs3S>^>V_`&&5k$bQmra+>76_(w-=PfXKD(*m9My5;oE7kyB?H zCeQYoZ`tCF&d&^fta+);;qxZ=45H~Sl6Ky(xunEF7T#-9{1?ghCjaZ-u`7U-DvXYC zbtB+oIvWk(EVj^Y03j^E&`4RJ28u)-vuo<*ZeH~!VG~gNRYCP0_7bWk_#BufUN6J31MFJWoZTP4F z(7m8$WgQHHkRRXPHTRDmAI;r54(6`1qp6%` z5lzh@Z+!6SwyYHJw8;rZsh85ODyc?>G#49Slv8 zJES-tb`dLmwSFrM1NUw-1QJJMZ+MCo{`a2{^{Tq=zNu(!|`sI6+pGYRZCEoOIxTE$rMF32PUjS$nbKq3wRmDcs) z%D8oc{c%XF=8bvO#X2%8n3A> z;HXdjZQL>_Q~0~fr}m7m0Elk1P6!Pi%W4&?`P*B4t0~eGASGT1SF8P^zNRTv?{*G9 z9!R$hd8=5zsI6@%>Ub%{t*{P&uR_?^}GDay9T6;*B8}hBO zrM-&%2eX4;zKE(fzYQ`atHs+!0=xV>#Ui+nbCf$jHsA)G(rP z#5f=aia?iPbhhIXecwf)txj5fM`N*@rD!we+%%$ErHnuOc)IA*H%(-VE0wv&J97Fw z$nSaGosvu5|=~Kt-j~E$tMby%M4!n$UOp(gkazYk6k*xn}uh z8@qNut9G-{!b?Lhm@e;?+D4@ zBP~8nWA)Cqfbgcd*{S}_ou+m^6Po?Ud4KGG_uN?9_Pk9^d;dWL8||NsR)FO*^rJR8 z8!~=d&jMR?Qh*38cg7)(y;l6KBOTe+sNn#L)-0IeY`pJMiqx0F8AGw&6Y&h{;+YPR zHrqbF8-?_{?q>!yMG1YnKlfes0&bu*dIh6oTmZNSK&^}y+9&ej1T+mg4-sATTg}O- z5((!|M@;(*BO1lR zT4vLARkA#p9&`pxs>2R91>w}+K8Z`7jcnM^IOtE#@IL)B*o!JP6?*$-`SbUQfK1cA z!J+NUZ(>7#QWqn&8D@T+Ohj&ROP>h%jAB{6mhe`ew>dpPI!x+Z|BfVQ_8zxpsEE?e z`*s?3=dE}_RmM!K)sjn!fln>8QSI4|28v}o+G)?WNi3M^Z{FegsxGeJJ6BFU`g>d$ zZ#4Y8L|rlKoTJo^(LRrm-{Z0-}ZI$_lC$V(Qe95dSMsATAa*H z5-@X*aor-o?rcqL9rh`-&Wqxmvp;-GPuX5vvjAkV`JT@4R`~CkN%+8$SC)~A4tH^+ zj*i-Ug*27ICxPZ2gGqCxT(5K*g|v+vE1f_`1O&Te_W)oFB;apE7C!+o*$CnRXINw0 zF)0yisqS3C?)EmIg;hGcymYDLcB!mzts#mGUp|~okkbJyFCd9+&ENE+`X^~itol=@ z@=bT^*wV(TytL+;w3YXe;*PbBcGh+Agy(gy7EZT2K6gLzR@TxZvZMxC+6YPmvqX8J zm~epbe&7?LYOW@wTN0c?_9kZ^GCnT?NdSKJ>nFg5x74-0)eCuW#Ohh=Avx?X{ns zp2f+wFCz_Qqu*lq+VF4u4u$9aBR5m84x!k?d|8*vw37Klja8l;r+Y{sJ?9~rrc9{S zuCH8uZb4(*Y^z0e6&2pZL~CM5psC@v>3(Zju6~-l%GBOUIBNzMnOa}X@fUs0fpX>% zAtmA(eI_8*t==fp)le)yzTaTwdEpO0&S*VBfYk|#E_g~S_)KJAVraI1tOGc=!_bjG zzFmbq&e*p$5wL-H8*3E4vk}VH=gborx2F3tsb1a$3;3b>%*LYTT>(QqqDd+}Jf$Ff zC6X;;JQvL*SGLe{l1^2G<{CYyu!vI6pnWq_Wo_DClAqMjp%Pvtv~{u>)`it zW!bBU)3Y$`-O0<&%P$4@xZb$z%P1(0+ap7*WR;i2uI}ALU#yJL&5I{rEVsE&=ICmH z&B+IG|7?c_w&~*|l|`XbJ#eGE6ryP-Wb%CK%yp}84_IbN;=yBt1MN7F=y@V@YvJie zXAgR{{kOYSv}5vk*+{E}E690b$ld2D9~74Ek$GA(%sg!_+I z`)AK*$RekDC{a~T{&?n;;r z?ZVVJ$6^tZYYg~NfyooO_FZ=YApEaP3Fa8GT6h9BvKj8RqaFxlCgo|#k{qXRH*)a^ zovJ_P_x^$Vb&j>1l^Ru*{Bx0Wo0M|S6}v|+pBacZY^t?;_xUZqU;otWX6LW(bN@!& zQaRGGg=~=>%_D!_T!%!Z%T=0YLYMA)5)w*wOjD_YSt6FN)g<;RnT_x`h>$A8iLR~}bowlnUM zkRbr?(Zq@II)*?lb2bWKJ`{owC%$w%Eg#& zv&R+MCtqs=Q@R(+kZL^85+XmuVXsm^!4dQVcmaOpL78Q!i-`1}3fv@`DS!GyotZZQ zw5QbOI_XCDJ?S2nt{#m}0B|3BQ@#UlAy=acYXxhos4ny^7I=lU*BOYAK*~e@ps!Iu zEf7`wf3$sdSX67@u8jzaNK0*6TIohWx+J6-q?@5TloXH#kr)Q)M!FG{?(Xg!y6Zf{ ze!us;`}?kQUFVN;)V;;I*37K+tl#si`~KalbECM%R=Aqv4xdjW?0vsX0+=ONGDVbx zdPHc&2VVvJ-3PgyyQY1BtOD$eN1%@oNjVDo!nV`-6-Faz!zG8I`Q({N_#T#CaD*@e zRFyU@Oh9JkE=04W^h7;z?P%`ao|df^iM+5|j;jqSvnzj6xV0Xi)O=6AKM*z~M# z0*Pf4MGGa82m2;9UT&D;bQ#6>jH-VH;}{Q1vQ<_$r(s%0C3x?PrP18UMc9Cof+Pv@ zd(eprJD!KBP;Z73X}Oy80>(&!GZ%Xi{%I;YaM23W13zK58#f+hW_l!VRO2tdi_^DG zKmB{@Z+9;%^4^=UAXr+;eyp^I%jG2p(>7WK!NllmC@jphOQdBUZ6_|=2OBnqdsGzhAhm!G;Kn1b-d&_fH?sb8^A9D^vgDgyS9~ ze49unz#uzq*(!?8Mv|jquR+PoggTFYO+W-BdXjXCn~{e?kE_dnV4zlW{xhgkP-*uL z&vR-ozk+{)b5I<3F`==6A_w$CQ0_RB`0)OSX)Q-RzCP)PEyhgijO*?mJ0*l^7eNgw z=9vEFevutuW2Q>_3+zDtQUd!-vesf%f+#Sa-&MZ0eQCkg$WO+5b^XL?rQs8}83xN~ zkNi|U9-GUhIUSQP6`fB z8o%W!`(|$nmp8w8;-rh>7Vhuq1#>gGP0Zhp<$uk?KK^JvIjJ7vZiQw9WNi3G8?{q4 zr-&2de*QTgjT7AQ+}s>4++xG;zQ1s@rFjPWv{pqtF0Aaxad4}@bt`~K3z+`?3u(t| zEHesnT~L!13O1*E!`~B~;uFuLe|fVm(djQF!?}x^P=jjDe2nZ~**F%5Bf;9&84hht5bw_&LM~+i)V@|82y#gs~)KgvwDGUmS@$h<$XSz#}1 znGt?eUcvqpXHYZ2bf`m5OuzfRxQQ`)Pz~?iB(Od5hfYu9ggbC{UryjJ%a)y$?#r0H z`SG)$I2s~r%vyObNrtKM>hBrlTj$biZavE2AlMvoLo;pD22&Onjlh7B)Wuo_># z7eCXi`!hw|yPbcRrpjhUTU5(0{1oBAtXe#BODI#_GI6ZV8leV(=c4_P2!dcgSRv!YqzDmB|y?QP@u9PM~> zi|XvucV43-7Zf0) z5k9l7i351)-+FDptibR85OYEv@Xtg3^_G7N zR{hT-{$G8_#Q_#lFv(Ag97!Ob;Nkk}sG`K13nspk%!!HoKea|4KE^JFlu3P_`&XWD z%PVN|sgWYXaXL8LmT95|YEC7!B?KVsr)zot+r)A-j7L0Y#B8Ui>InhKnG)H`!jlygO54D0{a=R$^p)Tam*NsLG=@CDN3 zxa9w(Mt1w*BG#(8*xsQWhtvS>R-p+?SE2ofaglOX(u0v=87K&PaZd7voSl^9|M>RS zrwGNO@K!4^=)F76EH7AVyU=xe_hiHr(|aT}7Hd z1^-UN;1h&%&%bmoZw=_shc`E!iG|VV*W$QK>o50%;B@^;+`=7=%k@2G3?7&?y@Vm# zFnP$`|E=1FyiLEf8ez>@(mk?gQyZs(&n%q{0~+-qv8s;vmsfrM)6q)mq67?L#PJzPr-rlUyib$* zj?Sl((&4bF*ysdbnMZd%{lmWX9yw9_7|pxQ_g;(&Oo&bw2wFy6A8v;^ZeJIBg~&FD zYIr=<`|sz1hBKA$(!Ad84Z)wDtU(S2YL9B$jdO7b=FJM8^vPJFm06z40DDe-Ms00g za(OlS;^N(Zdr#``8tL!pC~dRVs4*p*r(YEPRHa6ifE=`;q_xLey^(m1+EVBNNRduf|&**Vf;e=BlR-~JR zq>2rSd4ekN2^pnclO5knHW2{bhZW;`K#v zfdbqiZ{CKI(UBMrx+-C^80qFn5+Ns=3cE{O{`G>-dYov^mMKh0Y2t6c-fc#E4X)#p z%^7}*A{nN`9*APbyMDSfK;&f~XCE@9bX!1jSJEs~_wrSnTi`(_s67UHx|fD@0w?5v zbinLc%wh94(**PuNAH`ny#wE^G@CPeeXsuUaJ_Gd@vql@`1z?9sPYv|)wWpV3_sWm z+V}Qd8q2EuGUl6gd5Qi_<$U!u;gcsUC3cDl>%&x3Rc|UNQWwY-6`@M>!44|}r5uB{ zwu5?B;-bx>l$5P8F)QndP@@r8%Q@Zldx!|5q)cE~Q1F*3Vs*vD$q~hykA#zt%rwLl zA)b#)vN;3=S-FoK@8_p@J$YV7O-~b3Nf}6M<23Lhe|n2idrJ>1g+wd0*t;pZa_#iX zY1;Rc6blP{G^DG-0v4{=VNf^C|N9vkynD5@RKBg6CjWG1XnbaZaSo*NhA%L$v5`Ua zYgIY0WP!|O0xy@b@fo^J9Nh_IrgEW#2JZE=O7LRgRv+o&{xMFc1fEwP0~9oWBD1Lt z!gezAG~W16D`k4s@5T_Hn}7Y~b;&gKUe(k<-)ej1ZDB6a;p44u=hYLouG&-qk~9kr z!nTQZ0S7K9n}7`i5GO!&fN&P{ZRUPSnwgL}*sro!L^xCQ#V)K^&qU}gd^9wJF1xP_ z8;brg(nE)-*w8aH{BG`PYU~(lJg@aB3#rlH+I}TF0)j|;)rB{D* zSA^b*f&PktNY&gD=|W-lMtb@g0K2SI`Mk-!84@k?wYK*USV37=8gC1|*)$5p28auq zvF5^LFRvON-sd+YjUpC>i;t8%PloP>@ z%v=DGfLU~g=)f?cTnK)-y$VDFFwA&=bod@l7nqtqZE^2_U~+PWRlrO=Ju}FfW!&yw z>@Gy<$!_IuG4qJGiW{w_O-oAGI$uRbg!uI`l0K@-fDN}<t!BlrSLQc}jDmG@ta5Y1_)^j~C#Kqd+xs7k+f)+p=v+H82qC({7LcpHb z$cc1RSv;MKD8q_q5|DuE>J!lMQ@@HulRq?QLRktN{2%Ja{o1U2(29O%~%>pvgXUnX9zFRW{}I_ImxFAB2A zcWkcn(hMnqHiXrqix4AnzJ&3Q+bbXSpfM3KDQ9}@WljB^-Baz<%z{e1l^1@e=H-0d zy}evJA1&<~1G_CiA&iS{5XU_}=E7w@l35b>lt7*KYW-In7`RP%nT1#263?yhLTQ0L zb%~z-iRCoRf{BZR{XKi*bhsX_9j_wmLPphRGd-x`CSvIQq?cHtimR6J5I1jU^6pzJ z`nrOQt>5hON+_F&Q*7N$36C_Ixi!&vF;I#DYQa(Mf-Vf7 zE6_-apU7y}I9t$M2Y}HusLPuK^VZ7~dRBTrwL1dwIEWY=KQKgsrpi2EMq*LeVVT}a z(~?;B26#CW^K2ULn(Vp{R-V->T&3}fDDtZGs&0Bg(#r0>ARv%a%Um>7$+(JWryH5n zI0Bx^t5Vyt3I`{dUKu9Z9;&6Kj2i8|*LEq-f50Cj#5i!9gx!QK9kKySIC5wBTMLR# zSBE5fQAIV$+#e&3XzbN^fK|G1;o%vY%T=XujRHIi7_Pdyzy>8U4fwhv{uPI%D7<&x zRFQWt$fQa2ef*-y^~G*yT0lL^Zm`I&`T>5l?aqVUDr6$VAu=@`xP`2RUN?#3;{XJ4 z#4f)v>Bm!e8;Zw7#=(}{MVko!9^ppS!p9qIhrOh8+0o2MP%QjNhV>dc{v^0fg=D_+ zEEOdLX;Ng#&TxLLLKQ)0ZArSYVpLsTu8~r zy`*i=Lzf)B6WyRyZ4p(CL?^n(m%1z-TI$y>l!PJ*3K$9P+;Uzqv!#8ng6#DnhD6%C zWjWKnPd`4iG<98Tb2%db8O6l(<;5eCgG9vFyGFNl@O;+d2yR z+eS$oY4*!t!7Y`w9wB$vn;?n}y@jOLX2Y~1i}b2jdU|!KDHd0kDugh%gM>l}+<-Q! zRSA`V42GAB>b2E_fAO)qc5P?pr(Xl=46sN`hxKIftX#$ujJ*?#V{@zI7md@rbJab0 zI18H?51sHPiwA0dcwdAx5P}wzBOYv!Rf(lUscd=4kZt6HsdtTEaDLDF1OHhTu>5Xr z8EMqmxCTHTD~@+O(dj1>b0^f8-N+~t+75Ex-lFH;MJhMr$4)ST@*7=c(&gl) zv*zYzTf{3}do#FJ++~krDDc3at463-_&{C=MVbs}@wS`Tmk})u8V zT49GV#|nHQ7NlG4B!&6eQKRR|0>86Vag?{h~pp?&arkF`2Q&dn$zrmMpy)Bx%Fyb^d`H!)hXoZ@?01*JZ`k$vqBv0{+oF6}s?x9n2X;6wL$20W1n5-Ahbc z!&T7=!t>_y)sG04<%i!29KouyqYVctaCA|>^nu7)Sn`-yL-mLJT7A{4CX|@CzVoQT zN{W8kmYr1FR3*PI@sf~pnFq5;SE9zSKpu2gS-bl&A+kz$L2>_4YlMf^Fr~l|*3wOw z?D0herJiK*=?{-JEP{<%G1HHTRl7LQFF@R?i~{CpmV9Z;CFS-WydU$1!UXz(HVq3h z8G}TeCRtWii$HpvIdj_pYke`*nJo%W8sl}ApUsg^sxX)kyZT{!8BGWr~_O?ILN-^!)3aJvn>=r|B)aU=nC#WK%i1*BdOs?A$j!8TF}*?V17Ate(yYGJ9N zqv=V%H3FjdBaP+vjddxt4NWt2lq{8Ll$4w1C=NeIUIMdOiA(js)^rF*IS zHFWe@QLTqh;}#=IaHrJH(GgIVj5xG+ck>r^b$h5VNpodBUQYTIADzc$?I!zOrZ(Rp zZec>TP5*nF8=Xzu+Fu(bLU>g-HakI|e8bbOq5?^Zi-_~sei4W zYx_%|S9-M*QB;u{skm_e4^+KoT(fEd4{sTri1v?VIv%!>dgWL=@A$iBaRY;CP;}Q? zcMp#B?5mtIGDQg}Tleao%mY_#LnRNKUba5_o z0JgnYWK?XziV4WoJsUmaZB~I}*v@Ntq#9{LkQMdrY1#tf8ONe%{x-(9ck??)BmJZSL_Ie!9d{>^N}6$B6j_r) z$*YvRR!hH*`t5vVOhwMr5}q4>K7w4>Lv2g;cLo@{*E>uLZpZ zM&ZTw5soPE@|jPiZj+=v9;EmL;)jO_rk)YDt2&zV%&!o}>T+`QFgT+?oz3GyWZVM|(-jdJUVQfo zWRKaOH54G>iQk?RlSYJt>!%c+sAwzLZkl?UXk_vM`5%j=po0 zfsDo|TU7;HL4!|aeFk>u`p2VzRkX3VRS#g znvIc_n~7}0QPILw5+bdXzoPkFwhUCiO)6O!(D;`odQgY;mY9S_&j)Z#&R15?#5h)T z`+vkcVVY%8#i`T2K~<2$#ytHT$QWmVaN?m?63XV zYSWF0b%Gx^2R)Gw)8eErR;!@H@LGEU?mcYo!?E9knZEaq>*|wkl!AUQyf9)o6K4Ie zvU6Tzi-rdLNtS^&N36R9LJ-;4;PzkY-psH>gsm%mV~9WQkA$HZm9PG~244ZxC`Xiz zb87wwLe8A`46d3d%;#g_SLLNS&uL}F#Z)@f2@fdq+jp+q(p9iQ^iQmvvc|fLJoWp0 zMY=3O2)Ull_mhDb2U0YSy2xU@fi<_H2CH}B5ouLww3EZv>hh8V-Z69%w^DeOJKg4O zkOAgqjGN)*>|BFzvDD^rh-uUrW%$YBb^-JinRu=j>tqiy3po0e_p>+gqC!1|m^i7G zWZQs#4{I@bMk}~9)a-ThdV#aOiTi}llH_{ZKhXQqsmJEZH_UE_MRkUNMvg%aYWx1& zlA$y^Z=u{|mZ0HyN{CK3UGRm6c%wO-^zt;s@R8E!OPSf@zV!3m-Q&Cz^fWf&#t0!G z^o6Cg02p$x(s#%TP?PiD*Gt9{c>0iJTA=MWx##4&f)FH^+u0~Px|oS%lRIvv=Y#x^ zW3~sKixZ7gH1z%#KVp_Z38wXk;~-a2Z{WSY*uAXb8QTzeh)kBj2wIeF)Q#)M?Z1pG zJmyO+&%M;E`kIg7c7pJezV}DlpaRs959O8wEgsOUFqdho7oX*KT%tkCOev1!P_gq6 zv1H88D5%ef>wlgUUV0FFP^jejJ<+cG<`gLRO_iigPi9&Ud#!DOfU|eiy4q96X}O+a z>hsjaYcqFPvPx3Ilm`UWkZlGTqP&80?O@Qu2?~B3hFY`aHVk?X>t=9Rlz+nGTl{LS z9WXUQ_m`W3OWU-)MG@e_?=*cRknAn_6(LU(o2@J}MTr}z)<(L{vHp?M$>ArCVo|kx z_SKL^zM_O%4ew+eg+(&m3llGj+iS<4(q~!FnJsh9vP&!0CNC}hFER5J@4@XDC5HwfCs?gqNwq@CfJ&`c^5uN=$ME2y- ztVZ2j?;|t^+;a0vtKQat+huL!_Bl2A-}Nwxoek z@8uTI99c>!0e5HVvIJOY)kL&`>n9>N#go(Fj5Hr!dq;U#wR``PXmCIkU;lcMgsG3! zqfV2&AH&fK^ugIN&BGt4j!K`TIU?bBr%yDO=Q)dpx!a&$Lz3`W@Gs%42*J03u-nG|ndwdZwIV$uIwD4>ZlUFvD56Us-TimL zOQa!yRjcfp{B@<*{))MwR2Ga8!lUeZH!=?Bum;ZVQ_iOPpqvO(3}kyO9kN#I6tYpr zk$x{W>VMUH1?na}mc@vH+ehgn`9;8(=lKY_Ge6NdTTz1(X<(J6jY1c^w`_{JtLBjt zm^&a<<=bmYu%{SU?M(3q$xSjz0~#eu$^^(BR*^;gIUpQ}yWFKN)RNohmjVt)HJ*=h z9vhTpwp+~AIyBLQQ9T~A)#r52?hqV_mzye)O}10}$Sj$Hle{qdW% zwt{O3p3>l@{pqaGEj!=C@A$Ks9tJf~9U6c1v}!v4)ytO&B{FEiG?v;zo60 zAcvgc0}yuv8G*5caXone$>^2q+1#w$69EpFg9%LLKV+G9vWFWs%u1yjiee({Pl#^= z@vEckCD?YpzU%TJ-v;wDKH-B@uSK-|b0i^aE-qcM&6har7j~*kE&LS+>e*D_l#@6e z?lTTWv6BS=I>ZQbEV$td3mBi$Gp(=R;!uu0yqPgpw$o>2us;Z`YM|O=L(F|NN@iBm zPcQx}Uf0vY|E$O>QSf}FUBru%XTR_&z$o!L;&fH8hZLskxmDOA-i8oF_k3cwDv^0C zOY9f{1fXs+NsaYI#Z;b`FL*Z=Cp9-g{t=fgsW4AwuR%rr_qC)xI9X|gP_Sbh-^+IS zlyUcl=rE@Jb?Xp!R(4b;_U=SA&%^^h6_m{7`OZPUrr_$8yLiQ>U+DM4QLlZ$!xoVH zfC+PUmcjn}s>OZy+|%=>Jky_0C<#M7hF7T(M3WU+&NN{;^L{zCXfa7@4LwzttctFb z3~(dijlg<_ObyTUC0MUf$-ICX<-G&iPF&}f>tLqh zNL8k|3J;C7itO>^KcyXtk5rP6!eb;gIvJWpKo+n_Pt`DU%0hKW2m8Yt3Rm4Oo!gr2En>g2vJ9d$ z&nJh-0;x!72a;u!c z{pj>fCx4EE3Qw=5v3b=FKOI^;wi`a@i4CuiXBb}OOI@sK%oQ?|Y^UTWvPR~jRQHC3^pjOEv!_jXN%-|;P%uVz1^F0?!I zj^DQt44&8+xb*Jw_Ra&9I%Y%0o$wKPVY~Zf_2u5pSt4^{z!{?IXgN6iB<0lH@JdB)dk+JiYGXCXqaZp}+hsxQ8HfwAu4rJWNQIeymPfne(tTywb$2Ytp{EYl7y zXcd^@BcRSteUr*K>5pfa+;OcOSyM-~k&9>&?Z`VLt}-^GKcJUB*vv|ws#exr5fGhk zDaeCX9o~as(bBd%?Ajlp9TPgAgMw5JV)gK0+@fYTa5oH(LfpJ;JQ}=e!bEl-wv9;P*axMa zFD|{WvMYuuZT1!`^+C>>;p>^`3a;|P?|LTCbk`@kV{))4| zzEd@~l_i&UNVL9NV7lpmSH*mObSEEC^lfk7OrO$)H{FGIGBVV@g{exjR3`d>iuJs6 zCR%=39c{9csiI<}qJqQvi8j@Gu$v-oX*zt7#mrtV?dR*x-{Z$Q@RNqY6V%-z>!R*% zY0_CUN7gkX07)82x^=)NLGRHwx-xTezeDN(a0t99yvG=ix}PdD!#k~1`CFEwCp9*9 z(rDtj)W$1$ABsI_p%QDQ61#XX^V7Ph#KDP#b9BEvr(GqIL*a7vgRySnDcp!pG*Mq3)pIE2 ze!!|qLozSt)HU76aQAt+zDB^cLaxt9+`dqtpC6U$%G=Fhg7*;lr-?hCpbGjaf&J@- z@G7^>()8ya!0Iobw+ed3A;PecIJcUDOfB@$5scks-#Dj1#j*BddE5M{1d0=Ye^bqt zZ|g+v&Tt~T$fcuHkYyb)U__+Kg%5gBsfL|no5{9Ew6>p1XF|RDro1kiU!dt!aIENe zN6jmXK8YI5I(XU?N2s~zh289##-v7BSyIRD?xE9YYqP=wvBZv*Tr`Sn8(48@Vlcox z$KZZtzsi!$cZKrPm;lI9J|B zt#AE1w8y#R~OCarlg^p~)Xs@C-5xDUFS$vvXcix|%ETm;L-Jx2RrX2D zhx2oe)FNsM`sQ#w$N3!4oRD%+7YJ4;L`5tcK3rF)T_ja3Zx;i90A}%s1PD_!cDW7dlgOmL|8d~v76P$Q`0H*?oYH%Qm zrC1R(lqM?Vb%j)9KiKGdeDL%%a#6o)^WNOfQb@=Me7l&Kt*+2FXrC-S-lT7|^TPW_ zb=1tv6#T5*6s+kfwQudr!my`0r4Fzn7XfVuv@rZ0s>h$`BYKy9#C}`(z~`>Y(MR_L ztt8O&l!zKu$@_&gk|!T?7qluRZJ59az{ToMu-Hi|*=IsP(Gu-RaZs?`qq;zi1XHlA z1aY*c>yqPOrt=_01s5z~5k6af1&;|>XwX)(qK8dNK`pX6+NGtXEh&wE6g4jYO#bNg5gG+3sO z4tCht4t~KhHA@Dqycq1&7lNwyy(~7&I)j64lVPl;~N!=D%J9ZU!rKkXXiJnWfwP6DrKz<(A;j%#5o9H zhB+(-Rh4Xm1{`Sgh9(toSD9|-iMe{j_yub_%VcHTfZNIh`L#5^osKniaKOq4vjjwk z7RPV6J>{yG1;eA?uo|y&;1zWNB@rRbU?LX~Br2Qm^Rbh5mhHx;+FJmnNzZuQwHbt4 zuX;y^4}su=-|B}<{0Rz0?>uFQ*bp&Lrf7xvM2UNuN<`aSj zH)xgtB1gfQ8vq3WX#2Xn1faJ-xYYmMBaAZhS3u&qx%-FZPg$;YhZw{3vv({;Z#Kvm z$w8*@)q>&6VC|OM2P`|KK`dH4qAQV0;ySHB&Gvy|0WxkmEKAVtAen)z66dp@$Qd2O zF0?N~!TD*pMy|+Qc|$d-CxCDy=%f?#X+vq6P2^euuSRg_#%Nd8j)oAlY`=H20pQ`S z$tOVUD9ZPX2&wW5h5@LgE*@BI@`oApV+t!v&{_`&W{St42O1K;HdbY)n!$H6 zYHhJWg-z}q8qVe-M)}w|9|uT=eL*d;Eu&|q2mA@6)ePkI+WaKh?94)=JeOiRspUESVdFsdSaQER?^MQYytU)7sGg= zfU~Tk+Ic#+ygCmyj30}yKd+~%5q~m=QvcWBb&9l}6j4PC1Ol;c?w$PI?qBH(sDbL- z*@qQ018wg3+(pE;L;FbwIOmLGl_o=gP8#)@YrHf^T8VvoNdA$W40u#m z1wF|`tQ61yLM!3-U`pUt{DK8IHtWD98arbks^dLo42<2Q*F~nr>@76SW3F6yQ(l`{ zIVrmU72A{6wJ=_HY^I=K1!TIpvzu2%ibKP1is%zGTuJr+&`Uy3OnTD6_M=U&^g{N8 z9?7=b!P1`4zEIc9BZGq(o^CYiq`oOmr0Ru4Fqi!)t9k5o_SIA`fceyQqN7upWiRYPwy>mknzXH_uS zm93pB*CO3l%b$T&iJzMpP!sWO+x`ACX#e+AEjoD35g`Xafhm=00F+&c;<ELn$)u99j~t_5 zur7fx3$IXz#i>}b5=%#xvAs>I=)}6*y2#Qr$I_TxMFksEbYOd<`TL}TX!Cf}GFwpv zdKhXh19MkzuYJve?y{NS!bhU*xgNuTP4mv|56w+N5Kbn-aWw!RWu#Fp;Tcrx9IzD^ zC2Lt%I#1Jc;+tKG02g>i@|}>fAO#hFfB)d{#BhCiwf$WC$RHiqJCKWiFiAvs>=q2#pL6%51?S#%W6yHYx-VP9ZsFWK7V%2mZ z;20^gVJU-%1z=y0o~A5N*d7cJ9LBeeSu3IBf`Kjep~#nJf%0=tDF}lB77VbVvN%W9 zrrEA`YNj{U@fwi{aGUw~%s?L;o58X-8{QQ6fcpb)!t`;|)g8(IsR?cia0DP_9UX~Y zC*o${8ER`Gzw#Uaj0Y~A>W{04CS4AIQEu}k0xsQRl%ACI0br&9R^rwaEJ)fm&~FtW z_E0lRG%dC7hCq5o{wo1pCGa}0@QC!WQos>^Qbd4omQKA(ejG%$_6jiV`mf@RK>&YR zM)~@3gj+NC%a}D&6htH5c;TZ1{UvV1iaNT6gu&0UTy0s9*^SSwEt{5Fx9Kt5?e*^N4ua> zlWTHi)!0^Z{f7b>aL5Py7o0o=g^W)7whkx9FHcdwx@!1=7yx{qvX--gjiakrB&=o- zaI(lNRnTW`Qgqa?*wBcy&YMbVPVJ0%Fg7ORodYa+(&hD|9 z;`(x;+ilNgg8}EYfm7o?sia#T!%LDDe}+KUr9tt!6+G~FKOdds4{GS1yVWUB8_Et3 z{2*1Ok&cf)KJ0-cOe=OMKgkv*Q)qKtRxHX>rNl&ARGX)0{94tL zRme2PP5u;lEq_J+8c>e|Y&VWqvev!KZEQ}(s9~ssdF}bHm_e!li)5xgr%}qiwtKewh?rUU$26l;cfAeNb4CnxT%XkTh<=C7k zmdK}@qF#AqK!*J`0ZOnS`{bs!I_!oi!Zs0 zj?F%fH~fLWy%_*g%tDwgK$4lRqujCND+frg4)PGH?|GJID;TAs()9Fv$d`z(;| zRU07iks4adcS^97m&gEm2~m7RoZgB=U_Egl5olmP!UMP4i3J~x(q4Kg0`!2uXJpY*dR;UV8QwISNrWArJ}Z!?%s8Xh?99DRllMI5L#C%#=!pEUJQeSE!1K8;h6=afCxtc` zHP@$|lk25YM*5a|GVknkt=)!fKO7U8j_j|@J)M^9ypg`zCpkKBiy=gOu&Pw8+JkJ5 zo@~_LK%1#`r^GE?n1Fm#Y$u+Sl&ynSEkg8x6EIMwH$Wll?87f}P=ojaJ#sxEWaI?h_*12vo9jx|)ul#oZR5gIf&Y%RJSfB@lsW=z~SVE7c zw@Z>#Y?-AV{ykmw`Ud)P zOY3Ws5#Tm}1Td}Yhr87@phykX_NK84223l?jws3(=7OpYY^5vVOBv$)KvcP=;k_yc zkps^=bp-=}?Tbk`GNRZENKwwyojrfDziD(>Wn% zvPyWQbJP{5e@~*22r+oQ`krQhVu^o*@CBV;_$JyhCPS$HSawJ$joRNV@* z%;!3Jz~N-E0HSnfN)_2e%{;d233N%4k(pbcd(GqToHO-i>&9G=bHy&sc74!21Ig0t z@w!y}W0r0Ar2ZT{&z-N?9QoHvZ9AgaU1f#H)m1ls3Mw)(fgHd1o=^>DX;^j_d$=+4 z4YR{)-Ny7u7BAR4^~k+5T<$hRym9ZoXH$*k__2P%e2)>wbIhs1)q%24n-d_CfZh-2 z$8!2W<9R{X6xVPyEuKfs*f8^1na@IUqc-cQCe~EoeE%r)EU~1la>-3})mhf!9zZsJ`73n-DZ9<6T%y$n!+JPPe2bBs=}JUR%ot81xPw)jl2nXfiuoJC*3Unk(?YeP=B%5o-8m47!5 z=Z0{qHwerY{E7BfuVx#Kp4xmr96F>lS9N2hAq1*EXn2}fZuB6<+)5l0DwIJ!6&!;Fr`m)-dzN5}b4{BR2d|%Fj`MLN z@ka(UW9)&R?=9pf$g;=-?6OS?HD-9?x7S12?0s~gTn{+U`vWvdUA5CY4Ns)&Rik#AG^@uj50Df{dd@=i>M_%> z*JgQz#n$BxgnE8%R*>`WK5jC?r7=kIqKS=-oS~?Kf=wte7V1j7?}s3d8`H98VCdo~ zs@O-{qw!<`C4vlbUX+pp^jHYb2XDz(qk0S^)qr}Mn^Rnw$2L2-y1(WFEPJG5c!p+I zOiE(`(9th1zY0OSey%+SU5srJ(1-k!XAS1Fgj0oq(!?wBzHmJi$Tz`Vyr&d~cUqQR z+{1pR`gG$Tihhx3a7pCPCNbnQ)NEbLIajmB*Nd3jo56W+?||-vTJvxl%Ua|%0ohp^ zAgNb*yJKN2<@#U(jRKgfDbz_GuQ0gP)w>r1WzG&?n>a72;8~TjyXvM3Op11s;3p3t zuA%1u+YB_BOL!Xgnas^q$q+fXezrJlp2eO%%atH=$#a67)Fd>+AhEou3zF@~Q%@Q5vbL&~Jkja=5et-L z!DMf6kZqpUcHR8~EPBVP{6qhVAnC*{aRQ<7pvpnNFItkzT;Fs2 z#7y4u#Deis_>#Np(Ske3R;?aQ%XCTrZEURAK`^{`ynKjp6c!q0 z@W$k*3`a!vo0o879c=h}RD#vKf&L;wStY(zudh;uCsq<_mJHe;FEn*P&lU{GA#2^5 z3Dpm{HgWc#{W&gkfLbe5H78-=&Ld+DNb)Po#@~6zecwI8x*OYV(biSJxVHS#j#tXq zAKdEWL?DisFv?~(42t&(;rpQ6eDoAiHk?i}%B;Otr=b;149AWNC(_i2FH|p*%V!YS zk*ESqGP?`#g=Yb$t<>+ZI=4Zm+AJ$Qk<1gHgdMpLLGA+P&;TcT#OgTyiko8bH<$ne zPWXkO0}(a<8>*hR7Ct`eX#7;DQ~y~?FBO<&1M8$WboO8dUlYkdzj$yurfr{{!$9td zl1ul5QJds}liu@ikjY;R2Lr?pfO~9$-#~5Y;o}}?cnanvT-2`tyE=MEC?i+AS@b*i zIAvNB)~~=Nd+j{Y_a9sm^%ojK^U-dy9!dkNPom+to z@Uj_Z$9h;^k$t+L}lfnb1bcsHJp#xhocs@c&rj5=G75>Lrm>K>+ zYh@7-*iL8xbSqLv)8A-?*f2@>6m~1dT6+h~p_0L6A6SvWQ=?DJR2UDlvB8vb+v;u= zx!cZr`a_!b<$zrUo#nE+v1BVGSwdfIbd5I=@FN#A!EdaTjc7s&Y8d4koHaf zSW1shAMwS>NN(Za)OGVKB6rq53XhzOlq{{^g%`onp?%$7yP|p514(9*z%bj{Ssc%g zsc=0p%Bmk~m1DqPfiVIAd9Ws!{y{kzF^UKCF#5cm;cdxzTSH5{6|mYVu%EJHL~mU% zNG`BqS@|i(|4a`49_Qd^O%G8JubMMK7>MLD!P=1HQ#6#Vz;%K_Ffd})Ow~e3*$g?Z z)6;`4gDOgmv)eM=cr^{_(JCF^tjoE(8U@KG7Y6zOCi&z3z5oma=nB<;uFrTj0t!$= z14>}HlhwT3u2nIyIBQ>{L2J>!)%WGN+UZnvM2rUwD}8h4Ne*CA8>NHP1<-nn?ThSA zj_DZM23~>D6RTv`c4ufS>xu zH;Ed!zzixrq2}Et6Uy$dY(cNcP{}CYVGBQg9{D`-{T;H;3$I#Hr?s{BhO(71d$=8P zj1DiZ6j=HBVT12HdJhC#(^UQ!RbL&~Wc;jWqRM`5ZNvP6-6F$!*C}Rw^VWG?LUb*XKEy_ zp$S;-31Kgf-O6CbpAQi=_Q;ciGs>-8AwfjigE57W8hX9Tiy{0RMg8OcrBZucEap%} zXfRzX$w{S>(a&Z@!&QS;tEqOem|o9t=A^fQg-r6VIG;f+RKnTmAax^)X48@dz_2C(7x`9NArzubd;Rtg5w4tHEnD}yk>I1@VrpdW2r)q@J_mlo%_PV$4 z>S-?StD|CC(yE4$S76=42I^cDI&a|fF2S+p)bVhN?_xK|f4vT>w`WVki>uw4mXQoE za&rClRJkn4j)(VI7DNCuf`lP_l1lfow1h1)yj){5f{!)q8NYhHRQIs7t~O9f<%`*|ET569 zj{A)1Hy5+wCUC!xZqut}6;oyqsVj9pMfq=JcpdFrYc+ovk75R&m-fHOZ2Xwl5wUB7 zd?n?1CR4XSQGO+Jcv`5pX4K%g8O|!m(~CWL7zoy+1W%3hF(kfpw$r#w?A(83r94&b zqv3UMkP+|RDL4jfaXe!GU6Iex3b6NdW2)G{nQ&RM9WG8(-0>qoZ+tJ3x?}}L-|ZsB z9am{VZo+!Cvghzk*jnZ#9a2-$c{P>`X{b<{_M?WrG-aB%AOk&6`99$0eY9HdDTH2c zl}CrSI$t6=hDyj{vD}J5MQ3_l#1TC?%v1Zz=#y~-Mr8db9V@DN+VwIU0u%jz*Cya+sH1OPEwIPa#+Ow9lX^ety1J+ zYG-!&O@mflF_F)6wROsI2USoB6?QFJIZa3}1O^7^3^4teHO0B#)&}O9NM%OPi>Vc} zluh^ML(Agt;PRzqRL3DOQ;WP!ymNPnv*qZr@FT2BI&YoxMOZMS&D6D<{5E>#aJ=%g zB9mFt0v(nxQCw1+-JcOZbI7QNyFu;h`=wlg5-;nO3l^f`KycB~WS{LvSp!A>&4nWG zeRy3y32;MMA&6tTkQwqgT!iR%Wtuo^+)0MG?HdOZx6DL^*Y^e0}gDpw@+VCRxnmMP10qvA!&cyjHjXD zGb%P@%SaE88ht}`I58ORmEKWsb>q1Mel#=lEaMW)=I%QQ7oyVTcV7Bu-aojF2;P2y z-OGOMC2sSxkaZ9vWi1dZsIl|Al4|%-`#4-yJhcbq8Rh^<0GOM$Oeisqf*=Sjq$jYJ0nWYijS6G?<~n;6RM!Hq&pj8 zEWg3yneZ;sUHW+*7Ep1m#WfQ5xo}MVsB7j<`%oL0tY&*qXQn<@#V5}K+hfKRQvLLO zJFtd<*lgq=R2b7=V3i|z@ppWO)*X#1cUg-Ua<}uf-q{2s3fP|LWU_T(mrCHWU6Ad* zPpITiVrpMhdW*AP0YXJhWVvSN4?fWDYl(MPrgv1Ec43@k4nA%t8oV3#s$wM0Er&&}Una>QomGCt;8sgmLXC9#pW_vN^Ulq$K=1-prj>9~n!O!UO!fvCZGP~MUbwQ?U znAHsONqLGNk*=^YW`gfx1lTAhR17^U8RL|gLr<8>%qdjhS{2%G*vz0U?t{Ie|Hk4L zSDm$kU(*F?OtX{ZGj=@NCPIuO66wb17?X>1uzJll#PSY6X^)g;p=UxPcS}?|EPSiyxl7cK){benA*u%czC9lk? zTsGCrdZ$R(@g>s~l%tDvEKW-y)I`C89A8=>it(RbEXXm5RBM8UrXMAlce2(ETNcpg zOlPnRF8^%5htGe+uG9=v2XD4fm^wj=8ho7m|Ir|A6%~noHd~Cjn|BIHf&n?==B# z+-oK9Y(pucR6Bh$Ph|8*6$7#!Tl}OREFE)s?goL53tNxJPSn^5j~)!R#LqbHOdd>X zM2sofd$=y?!tCdBTu5uSXY1^j0xUwGBa)ijv7{$9pS41)r>>9Vi%SReg{@k{dH`Pn z4DUvpc%z)Lh7#jWqD?>L7u6uc>hx|J_q3jljm(Jk5dIP~Ex}Re$aF!@o_(}ert9xI zWecmSVEQ)M zx|!$kZ&uz=D7$X(46~cR@VKU!_kzC@{({7t?_l?|;1OBD#;T1$YwYz5Xs&r1d0i8r z;@p9~+Q%6nv1HlOX^gt;){x5pWZ;<%E8%YM^+C+)Z2!glPx`?lxB0OOH2-c z(;z7?%Y3~?Fn7p`^&1!aL!|NGtUSd&Ccv+bMre#?PUHuN*IsAtocyFrrx&s?9Z9v` z5^T^%KmE$jN(#E#K1d?6g0jJ#9uc_TSjWmo#m6)JU@{U9Ns%Cy2NdAFVErk!vl z{E=zRTg*LhsJNSPm!4jAbD1@gHpQ)}s%qsA63=L8r8@(JoSnq1Lb!IUAgu}NOl>~r zv?;Tm=i&FXCZA0!)7f}hT{opkyGh^yc#Rqz&w#~$pBtpU+_S|_tFe>!Yqt=S1nUZQ zNS*AAWW#SqwFdV|>Bfc+>gyLKh5gVRdeZWVDP#UW2g|X1=l1-JRH~AWyD8#!Iq7AUt1HlK-rf~wW-!u0a59qBDy59DWsd+3^XJuN&+&G zE&80oaT2uZV?c*0@S=M7o zmp_!p8A)fouS+7p#WhQPl9us>zM^!|u?8b7_#t9)=v*F(AMO5T>YoY<*Em;1zregL zG_!{F*|r3Icba%)AN%X7+a)2><2`kDLhORF)6E4^77N^9aA5g$E#B*9i}wmpJsWW= z%Sw!nurQbf^Oht?T`n{s#hYASO@8JvQjYY@T~@&m{}+e710wP7TIE|MqcYvDelm-f*@nARX4XQwa&%m2^!{@{bcnk6?|Rf z-aq$Bfa_4&nkQM~p**DWt^F2v0AM0Wfu#gqfQf^}4q@(LhAS&QMnAjEmsM&jssHYK zjP_rK*-dq<&igw1FUyE*7?$&gsTk{IMpgI?dzd z_>J)ttko_0+eBpj|F(;`Dv=+_EGEZc+he@ZcYZf75o}#G+LxB}Ctep*oE6}I$C#V@ zH~AmIXn)CHBp&}37Z}lv8vu9`b5g!92T^<%3LScAbx#y4#ir$uVq!PR15WcnCWTQv{z=f>r{w0%iBl(2vO;tyqL6i zkBje<(8@)l+JgJfY-)$6dO*`lNPVVz^N=;ST4#0gN6V zWwo4GH#|-6N6GN<*`Tl-5x$_#q-%e)on2;W<<7bD7g#vlBA5Pw9s;E~4kjsaq70+5 z0i$*NP4VSbs_P+15C0BZjh1nO(wA0F$?UwIP@<#IV-LNcr?jA<@rv)MZe$Tej?G`_ zq1{K*7i%Gag{IdyW4PG-Hy71kkhrWYaLCAlKO)a;V_(8quI1#J`(z{{_aim*+2CK_ zZVD@M$_CSA%xl@ubjLdI`77nM|M-Ddz4a>205sq1bc(6RQ_ zh0cyesuqtqg?G=MKS@OE{qp|AK7Y3y@t%kZVQ;iE=N)?8>D<@NZoUszO?ZP z=2+qPH%`mE9b}sDfsF!K(Hmc2@P=f?UiJVOFeJm89M@B)Gkqp?Mb$y)^}-G@J%AJC)&+fWU=0 zEpP{pxi4!_Y3$theqGp$d4T@#6;pnm<2FIZv%QbsuxD}BJtF0GB-^QqH0UCJrh+X0 z)!rFz`L-`oA&CFs4pmurtV>P!TLk6?&6kDQ@Zn9Sfwjm@oTA;pOJe)_1;%v=3F9ix z?tKw$ra=Ef?X8qNPlSd{H|1HFDf5(8+XddH_P03i8?Bf6l;{AsSLS1Hpa<>`oCCF# ztJ8w|fK!G0=sd**i9Z%71G{mXPij&lALUhN$q(LYn#t0)?+yya>5??sNt-x88+Lj3 ze9-X8w?WZ-;)7y^CeN~s(*Pi@Qk?on3;X2r-@i03^mI{c$a%oUt*OV~jV0P_O4R*fL06TQ`G{P$44t8)oKCw4QEJ&WhG_Bm*S_A&g*TFjDm% zJC!S^-Scqs`jW~G`NEQAYO86lFDt~)+#_>1>~FiWmX0}j{nARbk@Yjr#EJ5aNF5cK z-(er(aws@p>55DuFCVtGR@;W~%c)>A(&ANr_8-5AThUIGXTq=e&G4VG28y)^0l!VH zAh-9zYo({6zHb-1R5bQE%{4AjSC%C3B?nhjf#Zx~p(-fe9BFLv9`IJ~ip8#RE*cRJ z?3^OZO9e<_dm9PQMn%t(wNC5dMJ22|P?F|0pRY z&kzd~(7#Fd$Lpm@(i9f<9G)Q3NdWs3U$9n6XJhT$f}g<|f|>fmZVf_G)RwRklca0u?rCZ+VJD1Ub5jEju+-^czRnS z{NT-8E6AgRZF_bV7tZ2~Cr@8g3x8xh>45tq_{rTco<{+}d9h1c^UfMOuf19YW7-81 zLvOqIECfccU7VP(;q|orCBu`7G>qxE7by8rU@Zj3dbcK<9k+gA>oh@Lom`30i(Aj{ zFi-7EA72_U%5!~Cpi_u{{DY?FxROlIzG1Y&VT>kr`Xz4MSZ?5%;X^HOKqyj);>;fw zr`sk_d42`9m>9+El_`+<`V*SM)=qUqp8;yj?DJ#HEJp8q*y?T6l~KN*aNxIcz|a2A=F)iv7iW-vk1CB1f%3RRGUn;NgWb7Zn} zuA4%)Q|=@uhXni3+qIBDn@3PpQ`d3s)V(_bUYUQ@Z_PZ+YGL!H|L^QT9U>h$1sy8i zaK{QzWmuT&+DkuJc_n!pu%uLP*voHQkQ(*i|E_t4P3?B3WJ>tRwPJ1mxZU5fTpB?) zeMH@M-;Q*zhC)au4ZU5>1@m|B@WnNbU&} zx0M*zZYd;t|mp${Acv?L%DUh7RZs%mw>LkigchCJwwanrFQ6pv3~i-KKAq z<)%~y*8DL59bgh$w1F=%21E`(z=wM+kfuJ0RaMV%HJ0!F?*AvxucCVAK(9GIenEo3 z_A|9>*i}DRRH!WcndWC4!2SwQu>j;`0_mN|LroOMf~_JoI2IV>)VxT4CfTue@BJ76 zJx%P>SG3EDo&FY2!}wdE2)CgBOdWyyd}`TF#+S6{hp;kO&}9m8@Eq)9!DipjRS$|a zRwKba#kZPo7Gn>xJ(y7Klyh^EneY8KN`dUx^y1kZVWR$sTTsGP^?)kSrQ$>or5akZ#`l5ZICX zix_)0sncd1fHewPW{~=}e{@Qo@~hhxni3R#pZlK|Ru$_lg1ijdM@_eXPmNNa9W1M4 zQqf5tR6Rp+O;cHa?Zbr~|9g`M%JVMfY%sDXoFHzh9Vlb$%v|-1>U7}8_nr=js!;Bw z;(2w|m~GY#emru|0ai=QcXB8De~X&Dkj}w=%RX!|nXXLTt25aqnA~vT(}>GXYY20! zb{d|xBH91hurTe`Ka>p~)(3QK_Nk&KOg6QwvA=vv-<4FV;eV(Gzx!MsE2yqkrW`Qv zXKjq}^-nJP7w`!$2g|PsA9368r#tAef)N$plka(ICZbUIyKj0CvC*k$vqIJ2Y~6wT z|JLolVaOjsJ4yo+U8a;EQ7!E(h71NN%kswNF3ETbp5L?8f1lpyA*xAz8NHKvAunb! zZ^j?ORpqtDAP4Ew$+;0bzONWuh^qs+F?z2B4m%S)jgjM3TVLM71P~*Q!WZ*!<8^ zXT%$X($;|S_FCgk3=MJtmp%CbW1atuGXpoO-rPfo;+sCs=BSc?PYC<%3Y!PV>E4WZ zSbrA&|4s6S=RlD`z1^p5)>_#YZfJ>IIThmWc~-S46#-%v!I(QAeDy5Sa)ezpj=X;q ze>6fEc(g0JePt^(AsJ65zxa2rUqGKk?Reke})2t_b#`xQrvMl`G2r|j`#ZDj+c9yCo5&*0yiupr?na}E? z{LceC&-)Cq&i^EZ29m!0!01EH*^d&(Ok#mUMm~-3ICb^s#NJ4`WqaMFsGAZb{|$z5 z!30714ocdKki#=hP{X=rlxlcUE)+m6zvw6+m47=?-lR$~%;aaQLopBVf<|*W`p{TQo>W>7t)}A5O6f zA9&XBJZq9t^Gxwf@t%rDyQ`u?gq2rMWix<@isG{aMjGIg@?|$wnpm?XXR*!R3m=^R zQn@Ntak-q!1Lw!yp}e^{J$0_5!*xQZbDFN_P5&)gCjFb%=?VX}XEYpdtU*mOm6aMH z74&j1OBE*=RPdAbaakwtH}sn4I`^PQn+HYOqkw1z=6 zPqAAgA5@Q6B3p+|MP^~Uq=`25#w+&X#NS~ZF1~a!&i0*_ty^3msN?k`xTG2jz8_P5 zk3+)oXN}Mgf*<}F&DRn>c5DJaRUV#Rr?Ytyh5T#{(|5tkp(!ltH&)ZPqwsJ?s@^Ml zWkHT5y?NI3S4y||tp5LF5>i8j^HK4fVdg2{Fqp4mv4B>rX*x|%YUac#?kCx%$dkI4 zR_c0Xwl6=Ik4(2Ex|D_cDB<+o~0$en&al%0(npss55<07>Oc^ARX} zXB!vLr#`6tcb?2^k|&dY@~dK_ zauMg=PUZLhuZYSqMWO@`0ypeO`847bvl04s)0Pi6oE1Wobo)oms-u40hAF$UH_VRi zHpM;-m1d88z&NjVzdHIf2J2GNC=eE%d)rQ${Ze%PK`dPU7h+kqUUr+t_edgZQl94h z@3pug8NvXff0X3tOW}~Zd*MZiE!?c5MQow1FGLkgo*{uixm6WOB%U;RW}F6ii~sdj z#^%I!d9XFjW&8H=Eb~;}`zROSZ}ncWB8MjmU;b1Q=o*oKk8e53aH19&Wye#dt3Y+a zEg1g!;a<2oElb`fWep(OoD9-6@2k%LUZwCkB1cbrq8fA3-S?dKMz3xYP8M&xW-p^S z{H>#kPga9Dc56Xhk*+FL1^MgiNq%SsxUK);H2~^G_@goT8m3`VGYfUhdmpy^MbFFq z{g&!IR-2Y-%1!Ne!P=AR_*R_Rt^}ps-d~MN?4NV6xtl#h3cHFPin(vNOt6nF@o$d$ zI&lPUC0eG#2wzLwEo}G?TD4;ZpZq_}*>^MyKpuySC%%baO{fS-(MA1_PVexGL@ zs{7`h=c50z^=3nHu4bLCF#V*EW}pTv!+EYpD3YSu2EXnpWi2D0PzfP_?rLO)IDQbAV(C zdmn{XuUzZHmnK_^6Y&87I)9ya%w1l_v42=$bu}@yl#oy`JtE>ZHO21-);hJwt*O@# zb!x<&=L29Foo`8+x6~NDdYexmGi!eI*@UZit!Gh`#2X=+^Jr6!;g)v6Gl=x`Z=JWb z^^h@ly0Q4s)VAWxQk%Z=$v~*q$%kT==7!?$32Ss9is_!bFDlK8L^2_9IWx%Ki|)tb z@ZZ!tPVIMh#QCZcx372qkqLt{PvUG-Y>HCl%;efx<0-60sk`f3MyqTecd1+Pf?IJY zYqqo?&CRpE?qRbq_+YxCi@V@$6?OfAM3;y>pbebM!YR~JlgZ_l23XC319@-krI@tpJl{<8rX@-Nqc4H zVPu0A;U20q1@#aeU>cKmaq7gZRO=o!U{HL$wq2%h@cwXbFK`Drd%bAJn4;-^32JUW z#h1L?#`+#i?OrZdU}wP^Z6{k$@bcy|r0K(;^R%A>1=hTuJv2*EPBK5=omaOXdJ zLiH=qJpex0t7FnRx_CP!Kx3oAcW=g*Ef7PE)u&7m$zsw7R|~l7ydE5-RXBN<`7tgb z{NNdiW#eT|I%t32PGQz_`OV5e-#F*_dUoAb^J!ai-Q`*h=+#PHxQgG&{251_5RU@7 zmJ_~I?o+B?g${}6PxhX1cevhm-#zI|QkrPozX+bLX_QncIPa?O*GX%-m#}T(=DrW7 z%InlOnI~!qXh}@GgWF?X^6&LL+Sy?W`i7fCHXHkFHEiVwlX*Qax((-Sj&9Y+j9SPC z4}xcj3cnvLFwrwVPI>Y2u{oQZ3KPi0W`Fd>e1^ty_Ma$|(TxcAFOh_E+TBU1KTE_b?%fpf^EOb**gmsL*w z$~IsI8O~dA`&d4+ZT>i^-j>0~4ggaGNI4`_$*y3-wlO^H!)#UYiuzGuSfwA$hX%_3 zS+iJzw@xppxP-c617M2;tr$}% zaXU7T%NKFe0UT=XkBQB1&pxaybWsWor0IO+x6kEp9*A!`$+vJ})XPrMy$Noz=&H_v z^Vc*V$vi-yD{6=LQGJCu{ZIju@mNCsTt%->)8&s<=*65lnf<({ezNBBB)V*mmc5AR zSwes;o>cU<)dN>J&sFp`n}FP`2ZN4Ue*#52sF89?^a^gFsrFlEx<5xnIju2-bTZ`7 zgcj6&JT>%R_Fpz(YW>6WRz#@icP^b36C9DhW=fe-ov*FdR%l)yC7VG5M-`@b^{l?? zmMKqD%biCP252%Pz|<_-2Fw$rV$w3T*vqGH*#eD6nSU75Z^*kN%FKh4><|(JGCeuS zZc!Q;Yg)c?Lv>>@uTvluVTaB5&-1y6AHB2#yLm)j{eX4cVQyQH_N>k)4>uby2kTx> zl2+^IxU3K(kY)G1J3hmsyI_^Mp?i*%t)T{L*$&}zW*%T4M()}6=NwoBXA zq3IsP_khEI0g8m~0eXYtB@2o^Tdix6fqlj8{;_2iKf5@zJ^+qlP8A)RMzWF7>%DM| zTw_8=jh5-#)lFtYR*uBiAEdw&;iOrlK>gqk!M5#gy})Qy*?eI?dxWB>e0h-JUrK7eO~ho_%q?F;XKSUIJ|TSCiLF zI$qM}nS3{LmDeK4YHszEC2`VJGBLNX9S0_CQg6YjXx~?`^09!4CN=Rbo)H0h1h!v) zX=O2a40sdUcpnS|I(K}L#dvsZqzSW+n8)YVy`1cFxIVQ%H-x`H!rhZKMDa@R+Vn76 zO(W<)&aW0XDAQ@jRE5C%0i(>aDs;vDloP78j3CcSYji)bGl-_zgT1o0pUHo}R8{Tt zZywohS}8I}Hd;@l*J!*kStr0s%aTEC^7NWdt8Nx9%u>s*!VyJ=BFw?H@L^jGaft zEa`KDPKD{^LYYA(wDQa5gv0FBR8py;64+Z%N~gaW%K;i_5pKcX8C3FtVk5!k^=wZ7 zZ~1HmVtYsG?6<_qE%sZ`K7tl=#2g-w9LHC`EnzlVa*|5TdvMhE@9~w!Ke##`L5dR? zyw&YUFUeQ}6Bs(z&N**yNFW}R$U#?PkE{nl8)P1-I93rncDs^@t7koWvqm5DH`dng zIyhy@KU%XMFw^l>A3+uKn}kaxjvjj>5rbFD@sAlL8m{D$Z22HRf2L)jIR0v+_;_Q2*-aYo>5~T}@}5BwXk@9U#Jr zNDY(OmVR4{ug+<(Zw^R3s|u8Ao?~VMa;h>%&bH`_$I{D@$7|Rnvt&Q_fP7$6 zJW8@>>+o(|ASzu?R>q;W;Ga&rnPQ0aD}5P;vqc@~#Q;c%awm+&+2(MC4AQg!ahyBZ za?}^QlKm)jwVY+<`(>cC$?tMUvd%)c%~jT@KJ!q{ateEFzuUYvo1(?tBp74WIBku+gztg2t*mXe6ZVdn*W&t?qr(g^ zn&ULbbWxXK9$`&>E}SLQpylH-n`^nmk6$i9ah|DB z_Grn<>%D#E4K9gA`RyH_`lS%<&8TX~`08mzym&?GePSWtFj0W=AN6JgO8K;plc#{J zqcU~JXxVSrv{$R58?p1vWHoe~AbG$SdCrBXRMS^`B3L?8+Uh7am-C$fI7`HSbk*f2 z2C22yX(Bxp;(Zt5lpfsllZ9{s@rlGT!AjtON;vSvXr^ zJUy;)G}!Aa6b!F3?n}frfzTJ1OLJrDezQ$yhwczC;xKFOI=pn|xVuQ@ZZLmZea&^I zn6ERED8f=0OH@DT-Nc_~LDHMrYM}P0@1ul)Q1L$C7hFeZcA?@X7nqy`p%R4;@`QNT zid{*aQzML@(lPUuopsjXKn**W{?(@u6!k{yOy@Y@$^}Z`CP3vm?z>z8B_EID3yV-9 z0{6kj6@(8+k4QurJ-|X&tD&A4>;O|=>INYUE|g{nXe4W)heEB^h2b_``8MW zFbY+fXi6K%*Ye9uIC!}#YFv&6TQy&;j(?LSZ7e$+m{Ons3^oT7im(O19ov93I_~=9 zwns#AqXd{mT!tHA&rj>;Yb$f_gfyTuI{}GoqRoVIKey z3Af2pAaoyG2mER0t1%w^t4Y9Ksicd**Z$1*xLAt+72lZbF*|izDhAavq)ykaRvqQb z8tOM&epxyhKvtiCo|ZDt4!v^k?0>xM$)CHF~jfak-Pr{?_Qwn@3>bnI|0!^W~X0Z zj8q|%&s19PJTpOHQ+uPMwBNk`+ZVKm(>h>X1|QU}Y1`xo`gQL}QG10<})*HGg zD;C(;%L#7xKt^n;Z}K^gHfy|h(o=HGlLqoq^I|{Vy*R1ZZNT`e+nuK;l-6Aa3rSvt z7Oq||;uT&w^~Ce-`m8jCCS08Tbe?NI>%0Ek7t`$H7rQwN*clhU+U;YcaF?FsaP@bi?sb;JG*<*Nh4 zB8#>w_xpMNxCQ`om3&SzARge&=}H$w3DBPrA#vocnJzSFEzxw{zJug6k*5WTVxmqpz@l)0_-I z3Ja%TD& zAGM`mK_-QsAFi>Bo4!j1a#FWLzl((rvhYtS+tEAldHQ`xHRVro$?Q`X`(aP4&7})$ zyYZf-p~wr7xb|V7i#3$=AV3nTVW;~zFseEumWnl&1C`bNovBgs`EMy)upIl&row-^C0ZSeBGsOX)nBGjlu|2xS^XqYj`vXGw7^T z)=7ESJJos_7rrGUFxpt_t8_N4w{h5&u5$%gibi~_2;}m_MFmh*v6*Rru*`futkAnH z`NddMdM2hYeaFS$7=37K$i{@C@A5s_?{FPSK4zRY@&^hjU=Dd^G+S#tKJC@TgR0eC zxAv;d{~)Gs)Y0K4t~fO!g!{Wf#E;Gj~E;V;4hS$p;d%=a|adz*=J5xMIioX~?7$ z3c%ce&;qW20OA1y&ij&&9Z&e8RJMjOY2%#<|s+y>XnvN;0!*b(U5*_dDR3Z+p!I@jnDGc#A~ z)?)B+Ctu8Ot=66AYAnv(=dvybDS0sXZLRt9+`G98Y>HrnuaUx~CwObt^*TbL%;gB* z#X;n%^L)2qYuu+4Gq#_5oukoy{=Qc7aM1;)XbA)n9_W=1fSGnf&srpVEk}){WVr!zMAE@wZyj_}qK=`*xu(on3SbJb(q^k9CRXq(Z)W zl1!#u;XDJhE!Y9ro$6#LT_x>WRkooKp(*u}&!;6-t`^_Fd9}(_Z6?L;d4KBg_>fke z(;RR}3}5(Bp`jWIZ}NMSK$cMk2*Y*TYwYj z*_4LMA73PGpMuYp-n~Em)~l%1IQ6q8(ypcw;9~=hNEur5oCJX?M#~N777l8qsUYiblEP|- zz}!*H@me1&6<>I;dCk35OF1)Vah4cfZ1^s}kAnc%dZ*o|TZ0T+OXFQ(bqf37$%=9U~iwo-(><>ySJtMJP5c zF>@WQ4V+Hl%lcs-0dH~AF-lhIDW(FW8Tvf5bSS|G?#(^%$F#nrbdUas+xW80sUeaj zAPQh#N{Skusamri*`z@4zbz_tny}(Z2Ra%Zccw%Dy@^xW;{SdQV1|1HSl&G&ZS3%5 z&RN$-iMGShvS~PY?NOmtLnAhgO$dlCnj3d<-7APvpC~W$*`FLx*v_thDnNW<0;wIM_cut7BxJ0#+%3%h?g7#;A zHFonTmCgQLdSt&@d9?kzfTQi2Zo#XbaRMw${nnrnPADUM=LYd-54Rlsyu8|6 z0p`|46c?jj?;{+<;2Q@LRkor{01`E3O5j3eQDh++YSpt1z6oa$CGdDU>6-OLQONfI zh##O_YHBPT&vF*!i%gCyW1S?ux4S2M9#Meywa)~G4pF&=+G?+B-Gj=R$7lEcR-RF7 zkkZ-oG`+2Mtpvco`*6{!=Jl}Mfw8`1W?X`Xuz0Kjx8; z1mdNgRgwxu177=Q+fNxflzhAA1)U?xZj+8Ob;}u%3 zB5YclKFxi6E)F4P@mW&$2s1U^np6Z*<|*$d_^3Pnng9=AHLm4aUk38^RF8DMIEw~x zHQ{x;quFR9_g$!Ndl|sgdMa!0X`6897)~nj_@UpiR+WT3BRp5$Fp8a$MmZhvR&W3i-c>B z{qKxEcH3A9zRh}QEmjYDap+!hdRZf(bKMr9)O^_X$QM&)f1T3l}bvzxtjWi z);~BfisQ6Dk5x>TY4CXabXD^yH7aQcfPfgL;XRp>t-WN7mom7>ez7P&Fc8etQQ*o0 zfS{C@*BRpw320eymi@v3iy5nm2XKk(-0KfG3IzOlj30=+2ee*cBtba7_^k zbD+A$5FtE4_mIwi0kBIqg6kZ&r!Q7=u>yL8Pun*h5FO87F3OaH!ZqKf?;9^P zlZS6q2+eBkHBKLFs}I_*o|mTT_4#7G>u1upcy!1L=&O@3`kDi}W-X}Ckk@ED2fZGb z+!5yL=ppCd;n|@i=m+fD3s0P(C@c0i?AeGrSvay8#T+n1V8qL=trqp-&Ju$&{Uhp- zFvng^Gl9`dl#4yTN#5z;_hZ8aZgGVON(mLJ4(7kY8}STX@x7p@K4>Dc zq>$lKR$TF(j|`!py>!o&eX;3uvy)HEVnS}RWc8c{Upf`e5QRw{o-FVuB+1Nxv-tTrD22gI*)d| znCH2S5BsfL)YC6CsIMBGZ-~@X(LUI}i$cE?io!59A`zAt< zx`Q~bF}bvDZPx62U6PY44a1DBAmR%vtf_Hezaa zy!mMk*MkJzds^|6SwUz0OJLIN8NW~0y#j@-12#>5z29S<$g+RbMJOi;*^V4f=#kdg z%~hElXAuD{_LLOpw2aEg)8#`15X7elyYvn}R&f9VycEY>?ZfFhfN8@8;vU{*7S#C* zBL{JaFbBHpQ6dDr$Pn_LE5g4KV0>^*IbB!q zfUW@w3V;LbKxt>0Z=WpyG*yy>T()CAhaI}U(y@4ywm!}&va!3XnPk1ScP@rQoqZpPLUBD@?1k33^`Xv^7&0M z13-d8vdRv71#;Y(J=$9e?Rqs1SmEsCMEIxK%$10YCPyGq42b=Dg8nbam76bnr1xu#htDF?8l}B^s{p0`KP}~TeX0W;MhzRS|qxTaYjCk|4mtl(qrnM zunsP+cu2l$qK)R$=kGXQ$eOuHvOf+f!2u)#fKfCDs8xAVfxcIfr1bq=}%d(3@9n_ zB~>C=dE-ICw@RB~Bwo)B`r@kt;Oxil;z|8h-mC{Dx!)a+8^?Pc$g z4i_3x0L{|h!FPUeH$G|ndTy)Y=Yh$ib@AE**-GqH`8A4s06kAzL&LuSl2})RHozgq zQoo6&{axM5V1@V@pVR8H-L&&VvTfSy5_bmiX4qAO)h>Mdm}l-UAh@eTyXUPFSI?nN zl3+{#UzVeI-NMgGS?#FJoZl}3k)pjj;Lz5=an=N z1ZaR1Xf0L1=oLy$uB5B}ELO<7_j5pcGx6$yrNm1|AQ0`N9k;ZDugLXXSVUwWd-paZ z*$Ndqrb}|Lpt5eg+!At3eCfWr-npMoR_lyh#XRMos(=7YrQ%2`HLEhT`=r!0#fW}P zbwb!mM&`rWy0Fk-Qo3*IgyU?aZz|Hv{{J!c)?rP)Z``l}ilCx|fTSYbAk9EUxbA+l7;8{qE zXqf-z`Rzq40L4#)SX+;`xHSKe{k!Ae=Puq4J?K{a8kOr_vEYtz9)$M*^g{CU5t)m&iB-Yy6Y zavU%xvm>hVZZISBM`q6)E7$Kj$cigWvw<`3wrTGE@PjGk8>FTuU%PxSCYXS zwPb26j=ZT~(SZ82ktmEZb{`B3+&YKyVGdgng1ZBx{+p(b#-Qvgz^-(FHPd|D9o>py z6s;YF|GXegyWB7MNqG-hoe7ZLPw^)l%M3W1f~UooP5G8t5^jR!oq`j6g1!yA$M`b_ zcVP!=F_z@IKL)u)wmsJ)3{3(p{>FKEX4%NdLI9dOe%}c-Qu{c=y_D~N zFTx$)7YtD;vF=RUuQp+-=?i zCFL5RqCUfZIBbt*B*lejS3l${h1NS7EDNwN+{NP$Z-x5IfOOPR53SiYY)-Ignb&wj z+f1eGj6U(JqD!2KYWuHs2A2k|;_e%+|Gl?yu`fz~rz?jFDgN6XpvR{dH50g1@BIPns>|D-O!rbB(4Id3&QReR z@DQ(BIb39Gm~Kh-4oyIZ&8 zDvVm)2ZRYj(SQF+Prt@(mNVP5H}B3%blKFsUSDzFE&>Du38U#J&J*b?XTie#87&); z-Tbw~5y+!d-iI<}Rm^j9j84<{oxt|BYg>*V&%H~9mp*?8(6BG?CJ5c^`1mCYZNcQz z)jm7Cv~G3FhJ%`g=#_p{f!-kqvl;k!{N|(>vVN~wdC}2Epw+tBV#plTLDKf;-g!?W zwKBeFxNYp$rmP{+X7$S7B^M4AtTSI^2>)d6_U`2$-f~-3VB-eQ>fqEf`yx7dRL|2$ zBmi+I0?_}yFBzKt_%=2!s5)=7Q!!vBHyBOGBTrtTOb$mX0xrrcjDN07=u7Qm;tRMh z!(~kONA@tYZd^!`6B_NzgBrLWz+qbUTWGQK!;O5Vz9`C8?C%YMZQr$Lcjwoq*YD9gOt5Go&Q(5+jXI<#5!;R(rtBl9^$|_Bb%71$&(r!5F zw~>HnpY?!!ebdiev<@S7U^j5eW2GHNaTXoujds|^x-WwAXh#LW*1@JgAEiMBIdA-n z#GJCB#?&~ zKE|lnEVrIWQXuT-dmsx}r9$F4RAkWLh9uvv|9+=}k9zl`Q*dQK>TTsf62e*p zqjGWYmAwz2RJl#h`$+6elcnbmPUF^1OvWzvWl2>t>Q?*9Fo~TjB(-3z>XrHT@Ozw{ z;_)bcy8KY!8nam(fD{C417kxDLAFk|t}kaMmu#)zry@@#*|#tqy<#Xe(STwXyySy( zeEz#{*$4I3nZ$z0iBAyz>Jfi>7RX5c_hj8ykUDSDW;^9krwtb#a!EXc$9R zMniQa3q#tKx$5z9Mw1q2FH;%lkDnG>iFfp47`;MH^?t5B;Gx2t$HVK_Dx_O6=cIYC zY9KYc+*c7*Z9S58n!~|%E#}cVe6#$hb;i2AnF)IaOp9XOUXdj3D?IQl4vt+X*O>dc zIfm|5Z`wYb!EVZ6&&RWu=P)x)0b7BW%k!m1eje8GZTQ@e{X%3)plrpW)l~ zcLscR3`P}Qi$W2jEYiH{4HrLU$2k_pOVzs{A~HbZFYdRqzkuumDy`3Jed#stu_YBw zs(T^C|8y%^EVn!FsorF00}f2<9$Dc{p&3n1Zz}m+PLlN7t(~Wf-(d#3Oq1-Z#EjwE z{69YvW5YrlrxTSMPsL+DEz74nr?t~QrV@>xbglrF3hF2?;vQwbXV#ksw%RnggT#oG z1Xv-HD@k6Zn#Yr_one%YcX3F?<*#Y3?)b*5&2BwYIaFd$UYO*Gj?Be$ zECA5|lLW~aHDgy3cPv!dxhUYYU}yZd^W;Q zZi^mO(Y$q2rhZox=fA6u+fCg=V5d@RX2eH`=a$^hxiBYNpp^Q zK`c^#E_?0!&t$q7Cn30Vcj`k*@!NimnLTq48aqT@-p*Zsb+D^j68V-p+>Whoud3N# zqfs1yv;+B#zRL}KUW_J}GQ3Q5?CxNh?dfP038BZ`Va^e?-yfBn_QVIW^j`nCi9bVa z!_bTR6?8Jl8$d^8sPDHCh(*t1Dsbrfn!tuaP+W3&`JGMU4$c{|$9ymU%HegOU3`~v zM;g+Xtsqj#dhWc}DJyblgbfZAXlAv%7c>eGh5tQJ9X3D<{z_);q?|5w?!D43iz zan65SuizX@HttI7HM0Zzl=w+fal28aV{heFo-;j{|8L-^3^&Lt-7#*@-$HYTLhk{J zfawu659Eetf}V>nlv;Uh=~~9s{OL#OhHa@FRq`fl7gi!wI&*3vN7k?YE%_o}6xCpDo(;^uRhCb1`b!9xzXDJf>!s7SL%(nD} z7w$gfEEDP|4L!aFMX~U4pHDgk9%M|(;1<#uK}n$D2`W{ZbaT-_0fMFzo-y-aj)LsxIhiubk}P#F4b6tHeZcMLeNT~{TGVR zBSEjj9%H{47xU8nQ)m!8(Lt0h47%VZWv@TN%&hgM%LIJnm#tNo;7R$-HbdbwI}UM9 z%}1KMOto5x{U|OjsdOQO%40D>vOkJU5b3&-8;OZP9MbO3l$js!l%-~QhL2VT89q|s z#dWsuUsx=uiP!QxW_FuPI;*&$#U3dfc!3lKc;>vsX*0=Q!xsLq!}ms)q!o^52MT)^ z=dG~GiGAGHH^ysyomD+>T(2m;-T~JR32xaGdp?1}c;f~ximC(Lx=gX#J`?_nXs-Z~ zll(HnxxjULQCznujo)DYt{0AOlVH@dEdcNc?228zOO?Xz91!{m2| zjqU3uofE=ucMUIr@~uZqVYl+QE--HDv@pG|(nPf12vNYVUdBc$7z(cDZEpc5@gXl z1o|XFD*3S-Q~g5nq;Jq}rfoz~S3-H+gsCosd39v?+zgO4`T>W=OcAR=;H}J63 z?9Qfvx8CvfL_eQl>Z~uK)eUW$KjC3RjoSnp`Q2{~nd77iBV0DF>0oN!xYp+wjXln` z(?hszrZXDLoVH2cZ5Fy;BhuP%idAt!FX1292pkR9z@B2r1J0`WE=T5#P+mB9Yys{7 zB6_);wWg8hL6Z@xjUHU0_h+r!;w_`>fvgb_dJVCSkzwIg)3hnWE#UgUJ z#2`MQZoFCDOT2fxs9jKt=Y)SBokOe~?%b^yJr^f5(Q8XCx)Umi`cr8<{~t*kD3C2^z%yXJ=Ep>$4IZegL1l+=YQ*Vk)2Ix)qZ zjsvXyvL4E73@(5>#Yb06cyv74Ayw&cZ(NtP-ed@uyHd7jzJIQIJ%!2WldYzqb++u5U&NV_hMCi zfA+LOuU8GGRXyM~?>zW50f}}G`HIJG%)IvNq}A~AhgBZIcP0clsvzdjPOH(Li1lfP zDvm0n?kAH>ieB7fB1yH0)Q=gf;h~M&uh$ofwuQV1RH-6iS}e7r0hAy)(Qk2;n^j0P zOp;-3glD!^E?Qr&feL(4p}h~?QI@My4yDx%A}iXSOM$mpTH0OdLn5D2s2#e;{gIYb zB7N3_^rHpB&C&hZ-w1)6%b99AXA~W z0^A$;q6F>azjZN)87#AypU@685y4@cM4OKzqJgN&OLrI2CF!x}h&>sb$6y`6hJ^1K zGko^j9bcCoRjA`?-AX1ZU--Wdgiu)@?0~$k#BwvC&DWg3PY8ky_TNMf1$Gg9LI(p! zgL&g*XR2)`@o=ME{cW8^a8tUuL&Q98y#JhQni+DUntH5&nn>m#x-N6F+{^YbJk6P^ zkKT1#pHtmc!8g$K0({el(Jl5F-CjkfisK79g7)XWK`f3#+}?Rg7cJ3h)jJ$>)H!uR z+t%I1V4s{6&eMOas_e5cXM}W&Ice@QE%~k9#OOxXu*Lw>eiUlw#OAxIRWA znF;U(+Gr=T_Tn06aR0-zbNs1jx|o^Trk?wvx?Nm=m}Kstb?_*Au0y3xr~BbTQ6jbj za95*T;2W;=4tHziQE;gcWZK@`+N8J5RGLve!SZ26|0Oqq4|z9ihc0(f_zq zDsWGQd-*=sb)Hm{@|VP^In;Kf;4v#;T#x9-{HUtF`oNfsZ-u`S043UoMRleyv(7G7 zmIpbn`McMjM(O7b0+14ZGvHN_9a9(uY!K3Bq)xwPJ|SS-eN0m(?Mi}2B`^HDbtR4L z^^RN!a)MSU!^T^pWBpw02MpbcJO0JlVE7Pn+f(DMdn1+Zs}WXeE#*gl!o(fU%Bf_$ zCq&CFGbUE=aTTVfxx-5vB2i@2-AkemOZ1RX53|8 z8g_NO^{lbgVaC-b==dB|6bqn{IcUlBEXO{BcWao;^cXI-|Ih71?b$xt$CCct(#2); z?mPB!3*xo7CnR*BIDK)eJvHk1Wzco)<7Z!!o%bY9`464GesKQzBi+)n3&J@#jnDC_Hs&&B-$I-GJCE`T9H=V_6jCuKlwJ_ zl^~(P)B$p}%nI4wg$mxjd=~Z0b@S-gI`B7uM8A+vYLER>8w%1~!88Ted)A)Udw6*C znC#e=nVBG3ZLg{EySI12II?kg*At)y^SFbxk&1PZWx$#4;g(NMewt$1o6|~hM`1vt zhi!rfF07lPk7oe!dJBaI7JkBU+pV~WR^PMo5*SeY&^qEa=uPVb#s{UnyVELKkALHI zbnEt@tHnS@(u44@fnP(?&+pvk!d<1!kK3UmcZ|_d(}y_i8{WFrrkwFENty}~LQ96f z3xeJ-rddM zD2({qAb)4|sI%(^A`%<|H=waOj5pe;fFv6l3Juj#z4a|_6$GJ4JbzgG)V^p^)toDm zhtiO<_UTQV&T(UV&F;gG{p@SNdq#;!k|w#ZmVTuS<3SwFdig5-mdY_4WY4DO;Y5PMVxIPISS006~Y%3O|hiDKv5+wt1o z(3=(WXU7T`QUN=kc-L2LrOg0_4VaKR+G1{f&bzoo>V9pbhREXTo(sN49K2K1ungKBH(G-TbflhJ8}%$)nX zjugVavtk9A)1(R$+zuqIS!63%YaY{Sm&2<_nehf!KoW@V*O z&Pqv)B6Chys~5>Ce7oQlf6wsevA2>Ah3{u)K3ru%$l$pk#akx+Vdb$L*%aNGABBc| z!{ox9A{1><=$2p<4+OUN5!C0rVb+;F+N3AR%XLlpafdiSGY;k6*IZWGVX}ej7xIyb4^0*^u#)ddYaB zx~-x3SQ-xtX`vR+a|O^=56+)@1){4jV7ex4X~=BYEGi~&A_ngN-m!xXlZr5`_A(W0K4@4yl1@DE*6&V}>?-1vF$U)X9t4}S zh#wtH|ISxdsaos29>XB%gC{Mar+eZ)YfmhG{HO8xlTKNIC*ve~pk+29o>8f2A4zRo zIet1agoBCsw|is*eQ|KMqh#|+#wuP{?KtDNvm)@Ka_=baH56Ddtl8CcWLz#@`m#!| z&mHJ=&n)l8480U|IquXNC{*bAniBzp(V{@v1=PB1>eY&O8k>F?Yu8bv1^Krl5clv?$&n`GOBVMMpp zwSNoHajatm2unO3dSz6(&O(QhVUqxo9C3|P$gs}(Hqmvs%Hla&M~jKP9PDLA*`Pmr!DEFzBUeDgH)G-q89{F_>or$-szH@Uf&yS3 z>Ljr7JQL?R;?#OxH1BsbjpsK4v9l*-=i5EpFpqwJ)GYN3ECV-Z!&iYF85>M*a_>sQ zJICMxJ{RA7LKm{y=_OAuCQR)O#%>y zjtt1*s9=oNR-kBWy~pow^+P!I^r_3^t(5$tjMRfkA&nTDQXr4i7cDCSQd!yVyIRVr z<=(DC^P)#$aVixphx^|Z$o+ZzxQ7I+d)i-BG^Ly1{HNSBcwe`K-s2{i zx%{2FNwOZ3E%g@sGC+p~zMON53w;>w0WLkDvvov_hDTO^HuXKBted?C2=^<6ks#tL zc;vg{cOEw`a^y2%{=p)NHt})e+A+n+aI*Vjt~EcrTgxQkhhW0Q(gmJ4RodLp#^X1( za`k-g2PmrFaw2rLg0vzgwdm*0G?TbfAB+*Io2lg7JtPbh7XtSbR?%iXMoh6f{HyJt zB9yImpeTuN#+X>o{7U?7%Z~_`YdtCtkpAQA|I(AMv>SWgFwyVU2WT1ptQVvIZq(lF zIaPsaYZItnr&1AqXzk+xmVvqGy+)J}${&@KsbE^^umkmqg`#EvDRx?SG=V#BxAZc_ zqH)-j_`RmxGAd~^WWx`x3Hi&^Xc1}5BDjj&KnLzWzuFG8`(8JM-%nEB@|y4%w>Of> zuL?M6NXw~(Z?;1c%x4Bfe+!FpLy<*5Co*@In&c7uQFcR3WIKnh$|hecF+z$tMsRKQ>jgKlgrvUm8; z0$j*zPf#_x&Ko=2RsEnJFUGb_vQjg=99`z{YIQsc2Q=KxyYyd@rO-=9U{&aCy*Wkbuz|ez_?qU+>4sa?`K3@y&9kUD?`|Mc0p32DdfP5Q`MzKQ zDPkZrLij$Cx=6D**LzK!AwEN=j$}=6i%32X2r6Vb8Y1OmzB1mJa+guK=%c#bl88Jo zWTMNZ;!7>=PGtCbCv5Ve2e*8c*-PSwXWR)=36B;12_Xct&K&g=Ftbo--1>AfQ}CS_ z-5FI+=sE0$on?xZvSrpSWGbvc@2fM_57DpE`$ZO(d%KknkdWd$RP;9QYZ-zjAno0t z+m^0bNFxDR@r+{@b7whtqt4xaLh(N+<#A~^?b1) z5EHT;cpgHF#P(Pto7aCQWgfBCMyE!n_MdmA4~aHF`3AUI-7eg+kIO#$l`GaklbL3W z8kTx)76><02YNBdH8}s|&T$zyu2*?*2on?xUC85tWnJv=0Q1DDNPM=~#ZrkK_h|M& z&Q{Nx_<&KZ))Tp#>g#@hxAT1K@?J?yXifT?d&7%>tCwPsJN@UvPfU9(_| z^9Uc#c?ZO9Bn*M0PftMFXhumm8r(3yHJp51FrS}AG2N5&Y!wC`GH@`d!Vl0G05C=@ zAnmzxP{rP2030F- zmZf3^9J}B0D%!N3bLqbeE)DyJ_E|5NAbpOz}lBiwt8q?9&ZIq&@l=ygSC4*+Sb5MM#>W~nFlO; z$v#3ra2NP;!; zEftz~GrH{0LDmN8fW!y>-e@YAS-HYJk)+Mdl}YUkJL`hXFm1q1A5y%oh{U(>>(g4a z;XCJF6G74;?c)>7)PEa#z$?x#I6>w5*#%CYXqKBtO6reHJxjdBpxi#oUA3qjbCNFc zuldldi})_IFHuHl9dEgo3lymVW;@n^Sb4kmxrCVLczCMiFa#BU-UsZt$JLqN85)~Z zGBrC$Q+PqGIpvz0=V;Ke%mttFayC`2W0Vef5A;UBU0cw)Up6brHjs6=HX}~9`%2Bn zZ*_!J-68#Se+S%@s##-FU_&U@ZHG&M+wtT=SlrS}YZ2Kn0Q8y#5UETbpfD4@0lx0fD zM%q_{Z3R}ynshCHww#8P=h@_2u#fPOC>L^dnMz`sEVo*U!x||{DL|D?e%Cv{@@^gl ztdDZqgVq^--cH_UNuksIc=DHGHBh%j!iwjsvOIn|=v4JTk>_l?(ZgUF+uEH zRU^A5_NoIA6oasgo-Y;6|$UB;fhK$@ss;UAhmBJ zUd{^PCa--bV<}9pkUS;rmTZraQIwm8a14zI2!z)%*RLGJL*^5`^-1NO#>Q_3vKi|( zY6@g7nZ;il>=xr~>C9CgRlE=_v1xUAKlE;=6^RU3W&DHyVk7TJe6S zy5*&ecP#*0t=jNfzY$f*=XPq~iuP{!pPxUK2RZ%! zHigup$qO>}9~Y(B&KfT@@;e94L)j0esDAv}k7N>Ckn3J-*{Aj}>UK|X%v5^!#8#Rc zEd9K02M~-n_WWU6IMwFaR)hIPuz0GTe~St4;#`ngp0z={24gv16aYde`D2iW$zK-d z=xTyze2d4Gsn6odV)+4H&56p|`Fw(Z-Z;z$SSd&xL1gbDKo9wTujO5D=XStJrXk3$ zNv}H6uEl*LgEThonR|5S@kx1}R0O#F)gh4vu`M>9%;WgZki*L>>LFt9c z|H@eDDS}XFS!kmJ=TK5cwA=IyQtiA{F_AcG@xwY@z)fvu`9h1wvXN1RxBa54|Fknh z;&@WXR!Ay>^)lWvNdfxk+gdv?knj&P{{%TQ+v&^z3<>@$o6~+pH6C=Xqkd|Jk>|6_ zRk_f|HQH*2OI^1k5&>D2^hv+z=f52yGDz>WMLxiQd!`PBAzU``wjMx)-8q@y%XaHG zERiW}@_BPQveHHZf`*{}T@ltA^`7k^qN;xT7i?>R?UNohjvRrP*NwN}lGh8?;4Fp! z_;Cfd2M`d0S}!^jh}%I?3Dm)Psg0K@=beMzg^=@=x~8+Gxw(``FYVpnNL*GUzZ$RKC=C z=?7kwMdvtFy%xFljajvhL_Yk_&pmVYDbjocZz>Z`7`M~`e{Lu= z$mvdIPhkbL3s8}ZCU$-`f3s3%Woy`GFxMQ`^T3^NJC>tAnB_O?gsflPp2z)dM7EsF zL7k$`diWgCr|~lAlKDBon#B=5>C>u??Fw$qkNMl3W5)7s1v_b+<>FzD+Y%)ct;uBI zjyPtYszGIgV;_iR<86v7GRHyTU6Qr#i1@6z1bndd;DiEIp|n`d;_4kcD&V702CHpX zW>nB(s0o;6!L+V!Fg3>o!zF?ocs6v$0faMvZ8j_8(;n2p^H0GmiP`~iHYm`kj=*LI z?jheU;ISMZWDGbff#pTs)9Z)B=ZlVbJ_Z?oSB28D{kK&Kb5E@=enePv**11lYKG%Q7 zGQza^G4{9R0Bm@xiLo&kMEf-$`ej)x5414f#*jk&PBb`sm^gsJ=so}F{kmfsig{5LlL|$L?z`^)3 zTpL&!7oIxU!9rYh4{H10U73i;qSBaP81As((d+*rngD!X^3nm*l9DTGxKF4JT-!X@xK;c0_^HTfqys?ljWV^m z*MIa9#sKPpI24+kxNANF80HN3gaP(}_thL>>)`Jcxoin|Zn{g}_P&5-TZYs|nC0-g zE~k>jTgM;+S@Fo>Nq?AZox+hQbsNBne*dZk z9HSuF&^^}Mm)Gb`KU!GLhx;x15Y$gT0Wt@d_~d|+PtxRBf?Ljm_hV97dXHw4?X;o) z$X4u=eTk_c-c@~Lwh9Pz=bJ4AT@~G+ZZboOHYxa7BJ|;_u>+Zd#L_O>;8ep@%=&bR zaFXLk)3GW#BO5vgJO9&k{`Wy+`E>6!x!Ueid1~LMyR=h?0x3cr7-;lk@M(^eWKj3GF(5|G=gUG5U}p(=mEJD!`JYCDb4t}v%$o73 zG(Ov|gZbJ6Kr(9~<<9SRu0Q=_n*EEa&rP6ql#J`iWcZ6)TbWTv0KwZ&3YSgW+X&d( zFgy>gZ>!fzFQHh3eT`K3^&wVkXR^U!n^&ZMee_)vpd-pw#66xw+(j^VFf*#f-wZ13 zS?@|U=%tgba2{OGu1Qzexi6KrEHv@FVU`WeXGKd~<)Q9E9mNo7k!(`P<`I7yMl~Bg zOj?oGT~*{;K6|SMWNclr^@dQH)ci{W6b|L}{9kpbDr{9edwzFPyU60! zTE2qQ@Hz$ajBa1cW@zdI1^IT7WLT{G%S`2;FJ>)8FMbDW^UDhiyxMK}C5S6+eTN+x zUV@-CREx%t>A9&*_Ls4X+VISavTq3DEiB@Tbzsf^BNrcT@`GbIMo!jiU2vn z{>&`~F0lD(948gyE@e6V)aw<}?Sv*C#JnUa5M1L=VBqtFb*k2cOv;~LBf-*m?>@;5Gip{`yFYT%=rt3~|URO@~ z*DLC4jh)&-FNZ!yyk$B}Nj@<81CA=`m{91AmSMSZPa2)ZfEg*5D~mc~bcP zHp_!r-CXN4RC-=lqyv$h@l!*b~WL>#;L&0CCv^ zA3*|Z_HzztvrOCH_XniinU%=hwvI9Bvy9`81z<(`yp4GTL7E@YQFUrpwvb!-3??N) z#IIhlj1c&GJ1-&lJeXLWP{YY+F!!D2>sy7de(g;9j^B|;_27%6q)TyMX&utH?~^=y z$s~Tg{b4s70j*8OP4RD3!To>@-xST{)7xb7Of;i5G#EG=*R>#^eOuHHIm&ELHNX&& z01yLUaX>hG3*0?<3Ysf5iHYu2oA+l#lHM#jl|FlCzj@H!1AEIP<_0EPHAhA?PtQJ= zaC7-xMJzi{#gLP3M($Oz;#cJzgh(|?bWA={PvC2M_?biACE4EG#$~YUI_}jP6|z~u ztn>X6|NbozR~T99gNpB8Eln3;{!c8JHx=&+e{`Tg=XtHv-%EL+U_+Yf4yjVht6eR= z)??iL-FKZ8z4IEhJl43XBGDfkDl{U*lJS{`sN~yBAvr)qE~JHi{nRl`=-Y#HHZxpH34$onOt z&}NkQW;;EN^5VhW;gt5>k&#d+>!h}jVBz^VW*F2^lDd2NC(Pimif%+chB$n17P) zPvU_r6}blUO&6Wmw5l2T;paDw6jRi=J2Z*aM|jd5ibL2CBm%CXjTDfS3O7wl!X5@N zFhxNyW?bHz0Ac#mSwUWodF=U>%}9e+DVxoTH(v1nWE+F%eRht2B>Odvut4*o`FBn1 z&UG-6C~bk^str-r5yx%-6JgtfEu@KNd!9x#v#d+P135eA+d;kGN*7&o7!?8BX5$Ee zF|H{MU?|>9bH73o$_}FWb-4H+?NZT=D3&+v>A7k^`%IYs5q)nD?bWTNYL8)Qsor0U0*wBV@dcpcmF$P z=a-i)@^YFllPTVtwIS#A?}l)^4+ z00oZ(YuSKgV}7t*a- znfNh0R-6Cb6Oeg@6wkA-e8x|AiS*s8u z6Jt7~{%F=s9vjWL?YrWBhxsvTw6qzD`boMy;;{| z$lEUrAsVJv@ko%Tj~2RSQ-9?@8f9etX0@+eMUr?$=%hA_nAaDh#Q_AFMlG4fU)P*4 z?8#cnZxF20m^@N zCVj$I3nL~-WMHf1P0!@(m)g&W?tlO5fn2PjK6RIzM>qw@U(@}fWDhB(US_(p8EHS5 zGR0qf>@=d`>R{8H&WNQIW?cv7?_At#h<6Mw1}*vQV! zuuwsoX}jkx$Kdo)L38zh{~iHt(c>2oMk(a|#@+z6pq0412htka?b-EW7uHXiyVxJZ z5Xt+gL*MH1gP7a;$u6sRN7bzy_Qf@?fo-|YE#WeO9d{dt1}J9}B{ zHGFhq5u+}X`14u)8@X&^yX9T?Z?sqa_+i`H%y@HCYwD`8cPR93j=DR+<9I&*2Z|;O z9pTzU03mp*BHJ)LLjPzl<U3aI@zh&v{iIWkt8iLlI=g;SBq?7=nIOD%hWoU~2@Hci zYKo8z^PHvkco_SCH-HwPr?MvHdkx48sbbt8kfZ>yws@Cb#g?3})U5xyTIq(*tzq&2 z4Ra@IqBd|3&gdS7&5DN{-tOK#4M?C{f%;72epeL4Mbr@OB%gJvI2qpV|VLRc6nqlgNI3bpNr7e#?FPE%DmKUsl6a zPpN1@-kZei)N#GEH}#peH^QyZ!dwN=jU25@-)^=hZ!2+tkwhQdZA`rhw%eIOTTSD^ z9V;|k@s07yheV)YcTUj5)I1GSxJUQuOH7S|G*@XQNoN&H_^Wf6(b5Pf2~RPCRU~Ps zjyXXJ($TD6#|$ABe+^V2XB~Zf2!F={OKHm;PnX338~KGa%oKg@D=A8RmO6gO;FTCU z;EP5w@esoj7*Ix%9gpR(16{0DccOR}#WyvGo-m8ex^!1%yerSvxOJX29X^~?@zr|! z?3s6#dGJ#%eW|o~-IBic_U4xfiOvZoUwRdERr8-Aq<)2w2nr&Oc2WeF0_*}7gy1@D zN|D=S$`nWzh91Sb3E~+==Pmct404Ka!2~1zrTZ&j#8?lzMe`?meo9ks$gLeP^gtvz zc@2pm2MXC)=~p~W6+?Rh{h?6Wv6FCcnrbtvYs5g zD*T=yV>;aDKewkZIG8dhz}zAC0<*$=DvcS%XL+n&N+ll-D3@NP%avUjH-sv0uX>P!MNd5?{8+3i_V{%a zR9*hV$72F~sjeGp42FKh3w=^{0v?uC=7_I*_3UI0Qz24XB z05I|sqQ{CFYNoG*J963BtG;ovyk#eJ(^0v37~5@Re|#B`vtCjoL8KTjnYwoWiPWcR zA6F*voJo)<#u-vLdy^F}9Q;yy)pnqSSCGQK=&m+>ZepRIsf40iLO3V`QVK6jC4%pZ zRX*E%#M19Urbi>f#2myUTr9O|-ogAJM+EilMc~s{L%drOxo8rKM+&N%DD*t?G4TB0_CHsF@HCbrm z!qbOhc@e%^>}&Ofl`heTb@gdmcR#-|VVzxl3y@~Y%%0?@-B#MpqQ%T@QUz>9Mn^s-XjgqN^ z@S`k-!ii%nO*`a=yaj zH>hhlKh_v$74IwGKT{>apgl+PW+Y|p}lNmdq|;w+#pna0jqj5 za(qVVIiXjW!nYQ&&hhBD^r$jERe3wxj$d9?8Iq536zZUPYWfsp$aXI96bpf%n}^Q* z5dMF z@~l9WnWL|*-!XwbE5~!`0-6+-Z|-OO8?2ZR#kPyV#z)MF5-(@-Q@$3EQki%ypEFg{JO%qe zF&@;Bdl`>NuHQG-u*F^9Y2ju^xP4Pmpgwy$4-XuC^ib?b{no>xZ7>3Yx~L97A@>-R zR?qe5o`D&+ZBi3!4DW#RDSd^Z>q;$<+Z+)sG2HrQbn@lwR+h9a(eg9(Eb14`h!|) z)Fc$rx#`x_`&m%3)gs+K=W`RH=%_O94%_EQF8xsJsv32SogYHyJBACM_0(E83atUkZ zAzE2lbs*xlZ5FB5fU%!TWY9Q?1&21Ze7Vr}bD4w}`4j&+R{@*Ea}Ln>f|pVsof0XH+6f>> z-W@J(dWi>`|5v2GtV7K@G@3g&WcD2EqI6x$DNIDANuH2GAHE0=+H;%Webe^{;z%2* z`!oh@dHJs%^!T{srT&N5(kHuyOjmaPyUWUDC0lo7qxt03D{&V@^}}B$5yLSR$xh3 z+QOjZba; zcR`l9wK&IfVS@;YS3y6&`ajh?*a*>yxt&*F9s?Z1LTPW~4T#R#mtnH>B+MR#cOEA& zbSvg`ZkZ4*RbTS>gqnp)uokGBMrX6LBa$G(2nTQni)2KHD)^~i?|rE258F_vlSxLpV|q2*BZ63NeN&A;3NbKBQHT3C4NG*W%5S+ z_A4md&!nKy5==S?KDp0) zBwvXAIHcMXPrq=0>Bds>E+~nZPiU1pVQ+&SK&f9}+s3Y5k(a@@DmCBm?A?>f6o5R` z%UW7RuNO%hl+=N7iT|fGebnA;G&9$1Bw*lTRH_6SUIut7a}cOO$T35QF84xgsA#oz zxCsAN=KWD5QqNIW4qA~eh%w)KeLuKfm@jCW4>SNQQ3J=sSSG}gWethEHgoxVj;A@) znLR<5T1?D~^|N{KYaF(AGdkq_9P3CDCo@*Egv5I>FQe7#6e^3n%jwU!F&{{fWVvHo zN5pqe-hqQ54kf1b!_$+-eQ=>Yh|pHx$*sl?t2W~;rmT{M9%nkfm&WtP_WWDNKcFW< zR4WHaLLaSN)|&vm)b=h~`<=nJiJaK7cK5sUMB|bFxZz|qU(n#U^BTtP zi6-Lz_WD}WEJ=DG65a{9Vxv3-#!nCPBpiFcMQVPvwDiXmbEs{^{HO0LXFoU zWj>urJAGyp#rkJwjZ{v=iCC@f+R|}TE{qb>`wLz*TJ=pJ^O&aU1gj#l&aml;%v!>l z4lUKsQm%|d4>2>}=i%7Mna$W{D!Z`v`m;fB#VoxYQlQsHD@YMYKzQZXf+da!4(+P} zcurV9^Ud6DdX*C*vc5Z)eZ(iyUiAux9tuRVGCRmFW$G>p!*T~PMK^9xU-Xh?Ccr>O zv*GOd8NQBa`^a~A8h%2^qBzL@VR_P^jBFoo^7%ImAdv}?XXa_+Qsy9kUjLYxxnmu9 z?_=$RoOvCjqV=kAAdLDsxjrUpCuLvJoZ>Xx6jJ84FM31SXGaF_jQH;J^G?@u zE!^8gK0eL_qe^6O7MK+I@x)su-pg0wi9**BN9s2XrHf}^7IBW4@I~RGGS&avt51kf zFm=?ywIB{bic~#O{@${E@s!{&h`|E@yd_pSa84>e=;MsF#t4}Nq*L>ez1?=P=OnPn zORj(Bn`Jfv^1PC-jR}3DOxCVsSY#MHa&f&Jd2Z11H1**v)NA4P*>%VH-4*Gk8S^P8Ac#6cYbpLT6WuYaZnU`|ejX9FoQ!?k-Ovd+ExLZ^q zTFVYc70Dci`V?O8#?`*)&aBs7&kckGSHt2!%%n1(Yh!Q4^iONH6e zH?5FfUv5DAC9F<>_)vJMI+~g54p%W%wl}qt6Cx4k*W3{7v*{Jb-qCUiXfel)E0)^_S0v3e%9f(oaGLz+s9B~zv0*fqd_aWD&o$6`rpuqT2vasO6VHUK45*yg z@O=+ova_dy8WF1LR(ex^L+mP}p&hI^CA&52)7Jfd7vaqt z_Z%G+P<19t%2r*Xd$rU;mvLrbPpMRfLcVPD>ryyBYQnWGYKs6HHr{{ju)5KICnK%; zNmP9|ie4N{EoQnWzJo6uRPKp=qPcjY+Wye*?E9m*ahjB-kCjfVqe18&)(6We)&fi4 zC_8|VN9QC&waIWBVF_m$%X}A;vD>O(2duK?mU(rmS|nn`i8f>;dGorf)5(%w1*|8~ zjuczX>()~PsWX+#%mz(YR~+pQgrH7}2M z#wVG>^7gx0keJfUJ#U-V&R<_>V^&3~l0FqtJH;(m@}?gn;S$WT)gZruM0x=*yp{OG zbS~%m$+=hMZ}XQ&im#>w<2D{NPY(2teds06LcM^4Rlfb(En^ zwb;e!0F%s~4Gr2(;sQ7(;{z%9ixVDN|LY}R=`edlLR1*4u)no}+G_>nVGlL*_^!Zi z{Qzk#Y&EVmK$`;CG$k@rdVi+>-{^J$ywY)Lk-vTZg6axGECSVOOQ&rqhMDb*Z_{sqI2x8;5;h9= zmrrWgia{rT{D==nv88?l{5D4<(u+sAp{KrVFW_#D6#zPr8C&#-cqT4Pvrsr~%Hrd$#9(@BHg%v17IMFmI9{_q#YLH&3%Ll!X^ zbP8&+YzrL>J@DV_F|%qw`VnhJF7pLQ5&j2^#=3M<k6#Obp zr1pJx@OLxmH~>@XNO5_Se25-Ziyw;5%JX@hh7GJqwOvKWU1r%h{Hfsy9;QrF>PukI z_TLc8O2$*1P(N*cX52gVaH(+CAIigKk;K{^rMtuUV{iI$;{eh+iW$6*tiY}fEbOaV~y)Be(U+R%kYNh&(mBOH?dPVw_dmOWfPP%Y)K# zH$=x+#1RVZ3~0Ftbbtn#o*41QEHZ*Ptq!izeB`3hQY(;!)Tz(Z`b&VWsqm3?j129Y ztlFbPVK%*iBCP-%?)NwaR(%Sr=Ct9?_9Kk*H)HLG@vZSK?N?Kbg6-cyARMh$;j22YXT`eR@l59`Jf{8{H5FlVZJ*>oo?Qg463Gnc0BvWmOS+6QGSG>Z z6ksBnay=MlRd6yu)D)A1HF!j?pEtQ$&qr|)z^vY|B>GSVB1ywgKl&0 z3cQPOg!L*lt4iKGz#g(tyxb6;h4Car&^uK#+NKZRe+qq6bd zu*yNO&>25zB+y)my{VrQpGhCHihT|3hrJb;e^U5$7Fa8skWLA5!~6uS#_@fBqeh8S z%O9w+X(~spN-YOe-au5o&z}kFsEzHkv>6bo>f*ChC?_0Sg1BWsi0O3_|`=WnTzpb)Le%gYjgFvAOD=X*pzCq zFI$oQOIh~)rs+T=fcAAHv+63!GJjkS4WPwfNDxOO8nsbi%|R!vpkI69Sky(sh#H7M z*z5$Xr-{_4OcgO-t!Mm8ul;{&oM0bIr?mIU!o$qQhb}jg<2)P@9o}3kjfjT z$|DHT23GuRT%7;%u>22}8wJb=8?c#8GtRg8{-Vxz=P;)!hTuap&XdPXG=Iw}%>h== zuqCK@Y(=}0v1N@5aE4+8YD93B0o#!L?F;t~S`-TJ$Gu7B6lix57lI?u^rVLSDQRyT zuU691=UaeWQ(;fVQA7RLxJhNtJl(deQev*+m7KiuX|{QD~oE zd^zZye`4faUu<=kZ#|fNavBkt=P1t&VzYev)BA{VTC+j^%Q9?t{#VP9$&Y;eSUwde zA#kK!%azwE-NLi#ht@!cm5d{?(KRl?rYF(CaXx4iN*7*n$e?WyOX8yFGY0Q&)ojvo zvkM2oHS?h=y(F5t-{#a)4pqeowu0yXm3g}G9@%Gam0QEB_@ zQCof`drc3$w<+F=^6LM#!>z2icfDl5&M3i#VC#1usfkh>BVcA?eW&ccMboYe_gpSa z=3itJii*5{>m8_Jl<)eV@B?%Pj|5H1scRk&($BwH+Tu?PXRo(S?W5{e877e?i!yrB z*8Evy3Yxv4d5oSjealOf%L?&iwRHce%;|!Lp#MwFWHr81TauW;Qd|7PPq|`%^bj&k zVoIrD<3X-8WF&eQv@UjPP`*PeUdQ!p@L+$kKag14`s=qE^f`4ja4t1T8rj8E$Z$MW z5KjvkVu3Ck-x4hCvE*Lr%k5?-o`^pz9yennuta6({7OM05y+Zp@jJGKZ4FD4U3zfcb`-^di!1Gd; z?F#mwIEkm`lsK1Zhhkv1A~Va(#@b@s;`e`%MkYY#w^tj6o$q_t{!y&wM7YaKhWSGl zhCukS!tA5Sk9h=#T<7D0|HZ~1{c6Fb=00cP{iF7l11qHn8l*5b@79IQY&lr~sTO+$R0`hch zjr`LfV>XrGOU^g-xuqSV+rPwN(!sEAO41NX{9P67Bk)Q_E=`-T-6PPpr$Rf38hF=|1bO}e>t1vVI+5@$5 z3p;E9j)scn%=T{pk^tN;!T4!So-wRRHeg;)Sib-7NINi={phDKFz^MGCID^6JEo^~ zAKBSnt1zu7WokSV2Jl9J7=}1ctLHQ%S!13L82ufW_O50FMnh@jMVf>0h&f2 zd6(wM$Gll!!|ei7P4aUP>wL!ui^A|?T@LDJlsBbVn4fCy;Jm@2yu>X!Dvgxr?8U}# z6{b5Y8Vrec@9vNCUJ@MrXUW@c`B5`#Ss~EKaYy>KzNj+!M#&h4J1na<(SCP?dWQHQ z4QRvHa_B(6K`yRn`6n?&i*apE^T49PHGs;eq^uNOiS>C+o~K9t8DkE$zDWc~1BMi) zUA^n46(sML{V*T>e8qqT47==?cwbD6^`CvnEP=S4V{A!~d%YU$;t~V~YB8_VzGw!c zo=%Q!O=}N`sA(z^Piq4$*7jOLZ5%ZmHK%@x6RckfRZTruHDPL{yKC`rjN$iCHTXl^ zkrlMe{H4(jE>rGn9LrL%rLQ{2EGE)afDdMsr~eBvwnwtqF|Mo|F#Rhx`FritNPvgw z+iryUY36>`RYN^+8y7XU)#Vi~WCwtL<*4O&F28a&+kJcvw3pNPWUyVRftH5|K#kp1 zEEa{(Q(WN*&rN=vv`ZH`-6$XP!Qmy5z%d0=@7AHh?qx`9_-XJmt36(OR(>6yQ0Dq? zp>ghXZ4?*#5T9xmv`@v|8G#M;M-fr>FUGX?(OsLY;%pwPJgvljTb=M?4f{n|#UuAY z9DHN8o~4_I8PTeZNoVTt`v>r%s-5jJTHvx1%^@n2Y%LQgHxx~$sc}p=%1(+7#K0?%R`tPJMe!Dc%saZjO+z0dqWRqW!MrqQ8&#e+; zLs(lUe>BPfg>xHcied@Wm%mYOl=$Q<&A3_mSThTmoUg!U zw0A=--u~Mpf7>i;+ZeY_E?_YLrkZo5mSiGFW`2J3<3k4O`~>u~Pk1Y8g1mxGVZBM5 z55^(2VQP!*%QmbSTcv*Fq+zQAyN%FdD!_zctIA0x zaIxau7Xw=NzoTdkNgv#KG{YB*T<*7>t4ht5hkmAa0j4Q!L!F=7H!g99Jjbbd;Dh(> z>;`{PXH-~lHQr`;`KpG6GHBp~csznU4g4Xp7gL+BeGq$}M3ShNI-D-Iqec_mguaOeQ9{Tl5$oE3)djo4q-}!eMc}Kr!^XBz*#Z zd>ZN_$G$WeTx!l^s46pPk9BX=fx!QJ^V0&!6zF}eeV^uOnZ;`iALa52iFi{G2N4u_h356X76tSkj|kATZixi}Qsxi;#PAjJ36tXa?%oB-TEJui&UWSK`=a&Lm?^<5`Qy>3Iqk^F*KpckdcN z2i%H2nO|2F@5|~=4XlmbYJ>%dqJn|nY+8BG<>bh4zg$WLzbVg@xp{k%$=dq%nyH^# z!#Avac{fP%6aR&&hHvqWxjS_b65aC9@yWavolbgYfHc^9-qgv!NNP&ux2B}stJ8O3 ztCH4WQcXm*vBc=)Ld7#k@}lAvX`kpLoxam1pP#ZPCVB>V(ijhC!E#5;MhltMhUzAb zKC#oa-?~g8GM3eT{k4_$g{qU`J_!c{W#!UIDwPb;ck#)=-tTh|#X@~Ib! zKn5`%i#*5Pl3JMyhk8R-B>|0frzL<;AZqYl0{9l8-k+M#qyI!QhCjGL6zxa8q0qD1 zq6NMfe@p1=vtKXlB}O=rx2=^&NR|EAcwiUFd}f?vQr3}uWZlGiuQl;KO`4F8puxtu z?}QT-jB)t)c9`B7FE4i652f6QtRULH58+lwRC)2j>G<2&p6=NP_>jLcn`z7Zx+<9i z8Di~}(uI~gW)X>c$JxQMVI}v!M91a>wdKE+l(y2{Q;A$GK7QBWdp~s$8Sv6fG_7Ep z`s)-gSe;1^%e+!QGpBIkI%cEJ5mKlB1SNWV^lLUX;-Q-L^b>4bV~P(TUvs6)l|TBq zsGEFU(O?Gw=4~Sg1grYXOI5K>O=kTq-8we5O`1BVg`*}`;SR|RvW}5y_mAWfjNd80 zR*zChT7rpu(jeDiz{2cjM2qIBM^dKbT$;Pi`m`npFaR}O!DVFlg>^yZg5yIWOpDI^ zzs>@GUQ}d9z4&GfdU0=i-nK|UlD+HC=#Ok$lx5~}ca0sbBkA%tAO)PI!YA6thYxrH z%70#SKR#S+SMZ;1$aL#U@lfQql@OC@GJG}7awORY0pB^E3OrDHpFDhdpH{YOaY?TM zr5GN%ty%Sdlj*g;_Pb&KPN1!{ym8)%Uxsuko)*yTGk2FcL){}XcVyhUUhDH0y$}M< zM}*&fw%2r_nNL^@Ke}={wNRgLLgt{-YfCw)Fe(0CNMhmPwt=I~+?}{<>aA}M?2lXV z9I5#2dac?yNpAl#PyQR3y-9_wHZSQZeSKb{%n0#ku50lJ&ZTn~uk2C;81az|E+vo(LO0->_XU z{0uu)mD|G*t!3eHCt@sdFp^aVLyvQN;%WO%ZJ+D>079W*u+?v)i=~qrlTC~H%_p^Q zG_wj$uhWX1ytVvKj0*M!^o{?JD?m?IEG(`g4l+gfhU)T@qYdi?B7 zUSY_%&nf90O*gF6$iHtT6I@7!4Q1IL?SEJ#&fY2iiLn(MDSi4(`^Pz_0yAgh14G+18Da2Gd1T26FH8IV@&{zSE%g_)F)oWj@$FLbjp z`)g+AM{_|F9647*YNp|fyN&V(&y**Uxmc|8=?8cgu1(m;2;j9_{Pp$(fVe3;hw7L zmbtuZ`zuNz#3k0xYxVe`7{0B?w!X;Qdw4Tap?v@6Fd8VDc z*vj`-YrvtHUO>dI-357yEBdJP_@mS#g-{Pin`oPAoqdEf#Ox#goB^qsL`lQj6LCn7 zR#O#kkHEI{Y(Tl=XP<|?(kAAA+?=JD2O0>1ix9&~JW!r)95l2TUh42L;fbauNQe^pZB8i}SCAT3(_PBtoDnRsaRMiJ^3f%dv zW81im6?P__%r%;UHvZu{1n7nr4!*j?Px-nEokiGKol75ZgmcS$4baRYr|Rv(-%n@5 z3!Def?9a;P3Y>;Kaj|wJ0sf!!7g5y9;#Z97xLoK;eGg4#?$^Ww;F&JT0Cll`CcX2G zzM9xlqPB0fwClg#4x1ht7->?5c(m=~9F(%J{p&jX|1Tv}DwMOej*vtFY@wz=j;V7n zmfP%;`}U;|3#NkJ>BZd+g zKP7)QfK63iCjz%l5GE+2F&$f{?G?e{lgQ;DQQ#^rjMsU44t*dO<}v;GOty7y-0p3x zYrGc8gBX@_V^^@p4C5dd^}$fHxFgxZ3laf%skRSpFFRg1>Sg=9f|E-SF& z*KTJY1f95b{a(y*X+=vYpPaRauk^Q2-vI8hw62opy9i^=1GBaJreNDf1_8Uzv*CaJmjcna3LNtjVBiwHoM%D4f2W2 zeDv)fMyy~;4Jg;73FlT%tiq69c>4)15&(;QiHuR6WbsG@#jL!)z0KN9etb#VLY92@ zET#o@G*#j~PRGS6iE`;G@S$oE!nmLSj*Rj@WL0f0Cnma8N3ja5gWRQH-k2{-ppkGZ!N)lo9Y{4j_CI%DS!* zLOr|J85TAUXQ>wtm80Aq)AI{apJlIuK)LcdnR|VAk3fEsUb69;PSz@e7&d#r2_ev8SFLAmai%cVVDUoD5$rcys#%`}~ytHzsEp=WIlKt0n?uKqM&Q0@2h7R3=u z2dUq&At__?=1os$*w=fe?(q18aQHd0|DZQVn7%+&idqEoQ z;CzxJ;$w=K{qzvIGGDSBZ>Tc7aJ%DEZk3hN34#6+t-`< zY->}fGb2_aW7;zgJ#h9ATAU>~7IsJ0IEJ@aC(=TzIUo=YRd?M(M zy(m9z%64n}ffz-gl%r*WR{k$R5TsGdORp)DidO9fgCUTGwxTu4M+6tfv!Ew5;sF9O zx`p1QK4Qd0yjGX-d@h@^Uv5%a+pyfjCGrWI?Y|+3DL_B`d7xe174__y9AbXen8wb* z9!+x}ClJk5shh_0h#_88*I3;rt&ae zK3D0&=|LT^K*(}>QWrk1o{>lP!9z-pCN$Xt^;vOUIf1>QJKvY{vKRf1E(LQdMbL_5 zRIpCw=BsVM%gKcegbxGdI*p@N{p_$|)BwPPgWmXl@!kYqAX=exL)3qrnodDIk?fgH zrVeB*=M~IF*9R_kQYk3?j<*ENZ>2O@c5vR@+^`^l}^!$OxSn?*Ki{;m& z&`|KWGoHDJhJPDeMkS3Cdk z@3Mpg<1jU@%z?0wwe6@wRQ+k7U6jyfvJQ)f-Ievtq zMJ^@C;XMZUX`k;yQBUJjcg*^ahFV7qm7Vtj7`!lp!TAAh8y=zU^UGh`C2^0eJ8^C* zWJe1xI3}t7V5{d-sR{gks)Aw$p2SF)i7tqWsS2O-V(l<)!?u660T$9I*e)Y;bXU`Q zVH;f9nmI;lqLe1BGl_+^Q|h5hk|HJO`Ap0kGx)i*K}?n{C)cn_M31l4gh258T)O}RyR8(Epb0Od@u-7 z)yeFP6Jyr!E56xRKk{r8_GZ!D&DTF;g?CMgqREkQNEeJ~qdt`pz;wVr{ z+M+Q*`6B(COgPvlAMCEYL2j))cFDEdyz^{6B_tH1G5(Ziq~PrFYG4*&LQu`ZRv7T@T4A}J4N^;lCq~ULK7%e;B=LzX+q%Bpu z%eN=ooKMh%?Y#iq!&sU_o;-zhAOj`&(Zt$T&EWx3U5&_%hu`o#N~@KLE7SR)v?$Z! zsP*dK*d!V1<$}xsxlxv{-yeP#!d{GM9zxfWC7k)D5EDA>a}cSC`^nOszdspGm)=Fq zJonKcr@>m7Gne2+z}9U8S#tMdK23?!CI1aXVoy0+IJbr$$k=iC2T9iy1D)qtz!`x- znqK;6i6s-)X28*sx8KKE67pII(rHB{P8H79!^j7gCfIUNIgpeeZjEB^cSZ4^(XjUDIcla~*zTU6DMm znYhd{+s>Y!nqw;GIZ&wmqwo^lEBlPx@GJJn6+%B84Jt=wx_XbAz9j-Ps0{5k4>qmT z-dX(o-FVrmbClc@#8Ho2N|pUunvz$QfD+j3H*U^fv>};JoO!1tD zKhw!xw|I+Ub-MX#`USymOkT*InwODz%@xzqMBp{wS)zgBf=G=Tqh7emblkr7 zko7e+Z*bO7JlILvd98b4V-brA@>{wj(J^_>_np+u_+59f?W+Di9Q}|t_wv0H+i3<+ zu*HGLKN;vk4~|k9et)Wd!!+OszcE=8!_V=3)T&o1qjSD+T^JvfI&uG}de&4HihhX| zxi7aowFm-=@!if=+S0H!fw`VcYUSO^d(vy_eINL3(gtvphB{Ut6&0#1C5MS?mO8@q z954H11yt#K+a4VCiHIp$Lv{h#BkH1E-}$=9^Y0^WjOK!s{BY7Is6##x<$F&8_Y2c7 zkE&UtTB8j}4NvFOC#q0uyK6X@2;hxJG()@o#cbcJemu77s{DtOOYiy#IqP3)dWxm5 zvvoj_3_f;YegdljEd{lz@FzPSsEjBye5`5kOROgokFPrO!773o>!&0y8G-!36qg*6 z>PaV;mO0ghU1WPlSlVT-@NPd~MU;DF5j&1(Q-M;3L&QhBD zKVvHpUgsn)`cb>AJ1=y&0=?;D+_UD4rq)LNhx_<3#*`@fBjvR{n?>Nj6e(dxtrszwVuV`ddJsxv$oVODcy&C zoqsq{FyKea_68>u+*l~V{%!>mS6dbSgXS<6=a1t##ja0VL>AxZCM}JS;o}9vBr05K zu=uBRSa29m;}p(;RkB$c_bvG%aq5d z4g7GG90<1T-isFDISYQ{dc|q%jiHRyMoR}>- ze^Iq?xV(LLKR91_=dX!q7j3D{izKs;^EqwA>u||GTwVx&#CD{ZM|y*9xskY)t#$tW zA4O#qdA;M)Y)}3m( zyCA*kSGxcwa<66E{XH5=zD;j2?b==eJACB>_M{CcDTHGLqWx_T?9~%5HEwkuF03s; z^hKp5-#P0;lAN>S4PBi^o;z3P4s--T9yC9*NIjg+J*SXIi69jRweVyI&x%vJ$R(NN zT=l1SiZ-DvZMEUiI6A~|_($2$EBw>Z19gpXo$W;Sc;r*9rrg#$@1T+rNlx+8`LyoH zMVpg2^pF13e!+z*7u$9kC>KIc-5_Blw>rH;3*Y)S@7Y487iXkcGh8Bm_AI`oX`x>_tP^e?Rm?bRFIl*K5aA+#fBu*!!$+0pDWF7XmFeqr+$y7Xrnt@a zoob_w2z^CI$});8D9+#_qSza@)ds?(T}q|xcFQvMT5?%7dUTPa{`W;LrjvE0wyEE z1Dx8kPq!cPKN}$6`{$!&WnD~H%q{rRi={7+`9`2pf3{^+QD69Nl+laNT{qjKKMy6} z^qsPwd!*C8H=!k@E!dXU9qwa4LTSjq7lYsG0$C%9d5D}yNuLdTHb9P1T1U=E8!^7NL0#3vY#eJe(_&H|kI)nBO!=b0@oR z3uC0T#l}q8WrdK*t}(XdMVE=ykN9y5pQ>(u%y*hYyM^kTzPqD!#kfmnjAQ^x@-im<>q{*}du|nuw!oj_g1M_pa|?HG z=O1-J!hXO4=(PP{>7zre(}HwIBc}foo$kANb)lgY`taLYIlFA-PrZHghFN)&C>vR0 z@8P#YPiBqYBB;qU;9?CPRqah>12P~#cd*qe>2)Jc4%^5(lIbC4nn==(It?9jpGb=;wvAskwTkhOgC-BB{pSGX^jYPLCdx+*lUy4W! zp1IXfka2VDT1lvDW;ypBex?eOPz*#>*jp$4OwKR-%qIVD6C7mh1Bb5mk$x@xewN?3 zTg>L=DSJJ62W`J_xzIxe!*^R1ky~{C$0m<`U!l9a(p}O_T9Qkup83F!{`?(h@`fJx zWLbkc#&0oTc{x)<%I;q9Gq^xSZf@NL71oa>AeW;5QKX4ElB=r$m^AjOo)3uIsN?XT z^pvMM)SVClEim~PSK=F`XRIM(QM|0M1#G@IG?0aqbHhbiCVv(AFE4x@vso#Vi}~OF zk@nl}p%ev35F50S%+XfEnl>S<=9SA#+^Ow;Xe5ntkhaBD;#W3qK)Q64(1eJ8A=(`H za;wyHpxrw=XrQ*Hn9ezTRIpM7K-uhNb!k`hg?&Xkq{<@juOA!0Q&{d99O4tJGNi%=-VY=WJ&sQU+1Y6>mZkJ(n~)8d z{F$@sRURS7auYxH_`}Wv@>oPzpBD|=&E!GK_MUoVpoi{$7Tp~h5UAZ47rgdNs2c!) z${Ose+!{ z@kzL3qXS~RX|#r3{?gUec<|To8ef#Aqr@_EGPLZlgBe^5N ze4(*=fAr(S9*J+4Y{DBVB<$(28{+5N#YO$P62e%724xpMmyxve%OF#4bO zo-kv8=aQL6VWp~iw#a*4pKVmP?_lKs(UiUP&#_ONVBFWeuC(=xy<~2`9zniUowgma zz_(t+Gk_T1Uf*SfTz+{j+3)~s&e@W`h{tSkyLaqgxzIZozJKf|wBdlT7K@#zvqjQC zYeK?BO3KRJA+Zyet6qiws`Q@}5ldUD5lm{~qcnCG`#KQ=c|v&lgQkh$UW4EFF% z?eV3{de+v6bhsavtS#Hx|EfKIfA+Z+$a-I0)|rWM2(~`;`O#I)(a1k1HBGg2KYBT_ zL}t?Qdr>QS@vv`^E7bCRo<1@K{pd83&W}Srlyd7L8Gchdn3VG{lS%H`b5t%cxgas9 zJSnf4gE?QasiFhHZ|!RjoyXi~2_+S8`D)KOr`7kP}>##VB&C9m4*^y@kFTBFy z*>}6lN*3D!sVPw!8!xqy8A_d`NEWz=J-0=>>9~V-@ov@pMbU+i-EkDbs#swgUXS{Swx`Evb zM`I1QD>~2Sjo#>Mvm;HovqE(HdHEUS3{Js+<`Zn`=lCeMj(hvHizDPp+!;MorNACn zb--n)=M`-J(L775PiEPgfYSrnMzVlCI-es8^5>8mLZ^z12VpJZfsoJ#+#}0lYbhs--=E0S0Q|^J{5ux_wmG^bJ5S@6Tl~4}2g%F~Qb?Nkcp*ciwOzkbu`PXWD2R5?@kZ5YOLlv)# z3xSxuEvtz2vMKGq=R?d$`zvt@H8bIES}9 zeks|3$MP}ZN9{f$blXhp6`N#-OfO9BE<7ZR$9!KwogfT<$rJx!L#1&)H%P&9oy_WlfpR<6!uwBi0-_q(nccMk7L|sqe$J(lrM~M7G+uNLl%RbM z(A2_v?2nj9z2-IZ7iMW8dz<=U<&q32zKCxR>v%B}%AsF9>sW`J4W7MNhhqLGf4@=r zDUKnJKVnl75}Qw)+(TF>(sxs8f!!zwo!J6N3pqRhYGMup2PtG>_fH>(Yt=JH(5$N^hRO&J)OLy{;>r9tW1 zz^{5_j47k)W3_yr!GHu9{na_AIfU zu>Gm2pBp+TgHT(EUSM;rFj`b}o(Jr59B*fsAth8;rG@k3_V#M!XN$^kVRq0Wtkn(E z*|Pkp1!PC~Nke`imD?UoYK|m>^PK3nph7L2bUl4s(x8C{y!3AP_|e2eiEd@XexwoZ z_)YZhoQHPC?CWjLIita2KSm{8mXV1Z*AD?4QE#0wro0R}`FHiHIP&wC~0jp%mPGDcBfeHtV%nEKlykLW)_qyfdOOkt{)B@{x^1 zOr!)G7&Gm~uo<4N!8n9T{C8?s9tCVw6T9L1O9GT0!O>Ecc0Ba+PK8)CwTEPUtf~br zq2)6#AnR?dJqyakI2sSFuOoPrAQ-=pvdLeqp<{D$()g~g@G&^l(kaW;SVy0~$^~vP zza!3tjsut2azlz;*nlKZYw}`H&>gFw%C$~?Rsb+r&6-eO)HoW=;v+B@4*5BJm(v-u z3nhNWiNmQ3#1EZXx;G`*^f7l3Q8=47rh)EOfQogAp6?PVL@zI@Yj#mG*@1#m_%tM7T#UmC38kft=cyYb z(z;fmBEQd`?x-$EJj9%re^z%|SoxV5v{6&m&WO z=a0_BCEW13jN{Qr?R%WJbbDt+1Rqq5quaeOv6KejUE9AIF78zIj4FL}Od?<-3P)L$ z?bqfh*qa{uF#t6DOlCRKYLe1PKZSK^p(3qx7n+o>0le_%A0w@mxO+9v>$bf+l(&xB zy&F(gaG_!xD7S(J4DY#6QpcmK7FU_>JL7H z^J>PUqtUL8Z6>9H*PumYLzjs1zOC82#}NU%<`45K=|}@QEM7nJNcHHf^##|*jfbkj9KSX2?3g=dlW`aA zsRTnv+#~6zZI0-^^jLUmW=Sa&mBnV+FmYYKHS?f1YcWD>-zJp~i{f*$g|H+m+wXpy z#+_g2T;XGccGMZ5s=RA&jTA~EBb+t1?4xK}mggfDIb&`5aV1tQ|DxwtgH+5?%70HE zqaHKbwJ6i>f!(Jq_6_$p*J7lk_Bn;LGs-w{tncft&-fsVRP~onnuvbAy-Z@f1L;@+ z4S|na4XKvhl@Lj30w3E+Yv$rf(GuN-&3%Fe#4mQPxtW`%Ct?6k%;f33?^1o9n#vMK^9s%vs*m=~9=IeSFBU9Z(&ZD{m|F6Rk+s zH@@nXx97i72qi96Bq{G4q3OKJNgpzvrxrP^rd%ff&StR%pC7@=8zHB|sNmd}Ait8`@y+3z zG&D|m@6)$FIYbMli6gx?<9G2e)r^$$M2(GQ7w~H3^V`D89{YU}VTy--s;pLP4RR1U zD3C*1C(D+fIMOZaMkeO^()xwWS;c*!Who2)rT?nb%J9RzQK0|>YYj&v;A^aPRz_0o z5Mf_XCY;dtO^?xeGmS33Ray!@+ciGGj4SvCHOX+uI_~iMe^h;CTvT1VHw_{wNSC4@ zN=Qk!fQpplkV;5*3^gF3NP`GS4k6)CQZh26NJ&cx48zbpGy?+z@4nA@&+YU4_{1kR zYwvZf>-yI!gc+Fh*7q+1cmflmc&7N9Qk)y!EQBUu^kqs{0DQ8NQLGn$vnx9r(32!O#GAsHuNiG zg3}87*fHEN6emZaN9B0Nxo*)7g*|_9hc~Wf78(4=7r-rap&P zG$)2-6-NnX|2`_~d1ThTXzENG69LGy@`FFvgNgp5coD#*s+dzrmivAmPs{ZyEbE~a zXHLV|;j`)O{!d2)f*g*U@?2-@YNo|M6WduXegZ%I);gmP=#;%gYe|ei26D+m_f>Z| z10s}J(D@GvVy)k+O>)5U%3`bmxsaEF63TV zQ)q8l*x3h~H61{&4f#T58bxBjSptTB2hh~zP+|jL$cg*lWG(-7*e33|$JM(QdqCQ@ z&6|`eo&nR@A}jMkS}2C0^moF$cG?xxJ^UbZj{J@_2Ng_oU4O{;+^o(Rh<>e*kJSk%e{gPP{@$WovOxT_~(hKxJ?Jc)#T#x$N@uW$SI8bDR>7!EDYIBP4 zswLe#xpf?}*kUDqThZ0BEEQ%p;a~|(fU_8Z099SBY;ppZLB2+cSpQ`uKhEHY;)Y@I zR$SFE?9vIEtufT8^^99qhzV8?nnCZg0Bm?0TjL`jYxrtbn0e0OMhhOwP(gg z21LGWa9hN8Mah#0w)n|<_(05;7x^)?Be`1;Ax~@3n9s`jzX~cMe5&}lBgc;IMX|IP zYlGdntH0Qb;&pf_qq52FlNXylJUZUMvd?Ghy3pr zMD*OT2A|bzPSk*oaQv`E;8I^-;^;vJ`<6geK z`aN;J|8V6(#c6JC$5gY{#?!dJZ*JcJd;<#TH@T$4pZ5sWUNp|5)fBym*^W;M7Ab0`71!xIw7`i1WCx1+OU3kszO8qZ~ zvP*-E1pCzHS>JwCjOPRB<74uWYmRw(FDQxd-d=#Tp^(0)v1+b)z7cG zrXA9h>Jf{Qdsyq}>e)n1#!L6PE^A~tkr7`j8!CWf6d=n8eWYJML1g$vbMiOm<+mn( zWBl^BYT2y(uC7K&Vq4D>_c|Z2E#3KR|5w3d;Rl@>FF|IOmGCaRus8ZkeG;Dji%0i48({F<5C|O%r z_|JFh9S1tqc0FEvGURH?9R0G6;7Bbj`1kQ$vYvlIDqyLuO_|=7*W7b@2z)8j-%m(7 zQHct~TT=CRzw63&qfoR3pdk5gmVG&ejreVEAz_&81}>-1Tcat|s-X$7?0Y1W&Ca;W z_PKWaSaC~qe(%_XpOQJRx3c&s&6N}t4zr>k(=4k(+Pe{Yws{|ZA)Zx=Dq=Qh8}~n z>e4mbubsfVwRvwiq|39F8ng7|#fs%~`T!jwfs!J33*&NvRm!4=)B}^=m~B(cD+nQWmtX#1 zRVtmTxEDEoQyM7l{YBx*3pWyJ1;2T0VqdCIjs90K#x1(8dQ+)}?vHlV8JGMX4&Kzj)m zg!X*?aVg84plq2sfl@hQaX4xO&ys0{7lOZEtqpNs>{ip`JcD(oGHAVP0O6^}?Eu4< z@;g#XrLC|S>a*#Jaxk>s<@38jV7-7;@<^gyw;;CU^+CR{uD$Yy<^_%yCpWI zRl^!glTTE|7v_*m?+W=max3a)!byzm*SsvP4O17+V;T6HWWNp)JLz*=3F*LO2W9XI zkT)|$D#>S59WV7Kv-50&C&0whqDlrvoJMe)MB30M5xo;$XU6V{2Yu&7qb7;XtwQl9 z>(W1>Z(i=OJtF(%M_NmCtn-p;u)uK{Uc7rPm^2eGx4B$0tpay^!*t|YbHQKjmyqGx zw7%N$%a%th3MB~1CzOo6h4f8|<$x>WMMO^xBb`w$7crJxW`>{K`MT$>1zN=jCd&#! zE+2r!pJ2OeJq2DkgF+I8eIclv%}`3av1Y4f&gad!Rm0lLhh?g}PqNEm25%Wb|0Pwn z@Zw1Bn_~aeDElEy?p&fw)=?@>p1`g;?69XCtVj#ro!J(B-QN{WfAvLc1EQt{CJDUK z_rd5k?rDuOY@XcN{eoRgWn$L5$)@s2VT;>=pPr568sG(kai%{nqHeXC*nmHSNi=0a zz83F~1#>6xo5)zeX5tLVlA^lVt~EU>Tput$pfzJ0+H{}Z&dvQ}^5$)({R18?D&YX; zGOx&e8u_g5QBuZmZyx&3k`0o6imHS#qKVTc7JWy3N3YRi&=hbW*TaEd^e+O&%YJRn zuo1$3AFEIC&*A>8PiC}TEn3hDajPgN(=bj?j*%sR0jnTMhwYwl5Z3FxOpvByMOA`e zbx&*wbRB17xS||HK8o-K|0eSF!}8=*FvajoGR66|(=?`Z`G^PW6xFvBS7pxLAS&B@ z&HnrS54H`?qv3^OMxtA)27!0!65o=*LaC6Ebuif^h%3O7q+7NKWd-41HFdht7@DjX zOI;_3065FFAZR>XTCc-4<9ydiuv?m%Tt}^1v^J+s%xySGhtz2Hm#~1W4b6oDLnS{qU9&4sygnUXv zh{3a#=$rE=A-~-kOShD6N&GVuHirGV{<{9&I;=o%J_?t#ntO{DYV)H)P+iy2 zSINuy;hl1wRw0YehcU70Uao%5_XmROHKdd6Btg05&8C)rK@kKomhnlyHZn1ny?mu}R26I$ z0`}tVpLoOLyK%{OXo>kK^ej)&kQmI7 zz?8Aj9r%Z0;^`#+h~Ku`T=BXJV3cL&x(4XPx$k)IF`%fv_()Hy=l?3M111Vf&QX@K zFV`e|ewFF+^rQ2wD}RC%_N{zW;pLXG{)Q&Ufqh3ra!U-~2mLqd4Kf zyr>ed;n6ajUdT`0Pq(0aLsQ)m2fq^_q4v|de{ubG0u_?HffR0__^_tgwt1mNr*BE& zP9<<`=R2#`u?3UXPWC=v!QMLPk&eIOz=qatGDMiFc-ZE@J~qv*|EGE9<=8w|=yKm1 zm{6>w*KR#*80qEL8}AH1H#oX%S8%xM+ib@7J9~BHh3z}YOx1-#&CKr~*|iXRD<|+9 z@$R0Z1tkAq6&;d&+*3isiv|^*GRXx3feC`@B zaCQj&@UUg__5X=&D`*KY9f)(fXK{tQQ#nK+p~<&zzy&*`hLBF=#2|T@?r9kT{T6k& zT!h8cgWi@Ur+17LgR~|MX33E($j!XW#fLwyD8At2`}z5U9B!^t8m??xV3STAg@VR2 zZZNkk-_c&85`Ry-S;xdIq*e5QByHhbTXevJW{QF59!ZvaN0gwl5( ziRPBSd8F%4cm-PuPDXZ2%c(~4D4S@cn=zR&KC>_sUWAm#IbVOo0%9`?ucG(mx#*#v zo9zV&ZS`#*;K_2(bLdBhNAH2Uzr|+BPKj%9Z}OAvLp}oT0o&+aS+GgPc=kI9dpaI zgYuc7_E}dJPWnGtr&k2tqUqyJ#~n48D1IYenP08vg7@m>^;Ct*4@-%`Bxfiq>emr= zZXFsYLR(sOq2;Pv16vB`p3jis^QvRt>CG7Bgr5U*ilcY+@D9;WxpEp-9Vr5=5Ix$b zmNH%tp{CDHdv~`^rFDT3I0z)sYX-T0;b!qS!HF^2{YbUy5onzmS88(kruea70c1@q0T9vvr34pcd83@}9TsU8X zJVw%pS2&wDw-a|W?w%Uv?k7mCO@87R)WR~jj&%gRunEr3rFA~CfPqA;AkQ%z*q9xi z6UmI5?;p|Rw%Vf=MP3^0d`_y)JxaJAmMA82bqA&x98vQvw~9w@2F+aedL5n2 z2r|>E9s$HG74E|gP}fApt$}Vf@a2ZNI5!&S~P$y*dIhiL!UR6?J9GVgZZ%?`J#RiY=%p~s{r7t=J)LpxZFKloU(qmeMn}-d zd#^wMnPEFyG^-tJmBMCAA*8%R76s`PZujaQrRyID&fQ8Y9qlW1kF2So+S*h2JV%v3 zNVxXLv^@M=0*4&EaM<{rFX#4-xARMt2tyq~rMF~=4_c8P`kbR}Yn4JZ;MI@lej!vArRL95Mp21-vlN7q&%ms>-QQ?vaJHsxbn4_m}`B{9} zjpSMHlJ8ceK>hZ9IPZURD9E$EnTdi22yS7Mr)N_xD%4*Yk~V$Q-~oJ{Anhq{V>vyF z-fZ(sI(>B+GGf{NS|KAnV(mEZSi74fVdcK0shm*Vhn znI^fpY;_%(T_i-C5YHFfwI}db8jpJdjJB-`;ik||UXjEEns4#6q12wbqr$8_;~ z>*V;>bCEwa?lLaSXvKwvM~6sM$ggIKI{$Wv>(vbvU2L&68M5cXj*IL5L~RH&TE{#* zSZaDD>lF|*vXyK9?}3~|g28GsuG#UsT`R@Ci>%Nk$Lz$A+ZqaxGqd;^9B$^zwa$qt z23RD2zUtLI^9e`rTf{jjmPnTd*ME8ViVxxA!fiW{d;8WCA%N5c>hsY8VC$wo0d#+1 zy9z4EaWcb+?@!6o?XArigJm{@faI8(MAXwojZ-(Q#7LAuGHh5bPtIbq++AA%qT?ki z$&Y`ARt%Jj07r_SCKV5qhX?1CzBtM+Z(#mjU+i1$%JrWg8zQ|+JLsH)dyTQT?D*wq zuUKu@ng|i*yB0|;O}*redIF)5Cl1={pt$B+p4LGWxL2}&QVp!Z*AQGBJ(rer9SA?D(%_-uvh@@lNo&5& zML&K5p&{u5-b>~lz-ilE>i{M2)Hw~b(2+#=8Z)T!#G^#vVIpWnolx!)Ly;F0?)qN_ zhB_ewfgC&I`d?Xcf&jZcO#0$Tn)|}DuW%^1r{#zv8#atmL0tzin$Vu~W!wLCszdI0 zwkc&w^RsaF*M0I>y1aY>AXm{j5!K%U;3A7jK7#f{1rx9CxjeZoW7 z`0UB@5#hursJw5tJNY%Mr?ptCUw;ClV_CHIRT$y*?TMAbhf%&w_SE8QtP2KFG4FhKev|pwR8Ag15 z#g;r7ewu=6d$@FeYP$p0?~#cLjXCVj5p~6fsGW7Sa}Gv+Xd88C+W!`O$BYsBe$!jl zbB_g(80h*xoRCuIrl@3ka6{Yy^R~`(>tyq&>b0XrI>%B=uqDS3n4yG7=GPlz! zBlF`GJ2*PX@;)}37<>6#L45dW+--GdqM0c&sN2&w3GJMQ3{K~HYBc|zCwNNq<$Hb1 z2NKxkb&+nsecd?VlkaQ5cA(Df?e$xwXy;6kI+=yEm9N(P;zWJ4wCk zyE@gwp!-TLenH-d^rTSJ1Ok=SwD0`o^S@13^MC&$cRQ9TucX&VZyHJq&t7b=6b67p zBl;|sP;@YWB@$VR5NTvV{+RXpp-9(?6me%p zS9RSDnBsuY1sb>ftE8UPB*JEYz3D5-k0dwp(6aqUiVOi?+UHITIq$yY%QUOMLtr^9 zxGcR|cXr9NW;<=SWPW{5;8Ldk^OKFk8%--!v@cOtpB}$dVtu=7;`;KE_k`=UvCSx# zPh>)9Yd+YP>TS5(mQ1}uP`OKB&V~;jzIn~%i`(^xM=;mdD4d<4df8HMFDnIrf0g5q z5Q5#85zH=Lghp&2S1K7rA~@K3y6kta_u>QdIe4Ro9nymo33z|qoWiT5N&bCf|Ll{R z@rU9=m8I({)a(xB2` zsi@Se&+n}AHLPUt0jMx-CEDku-EZ?*f~%vUAZ;4@xb9RLZBB=z76IJG>m0}SGiYh> zU@K$8>^AEb|F^-TT`_Kxqtu!bz5a8%utSlMkC{|#-|L}eIB#2KI(bE31!Gr%PFX&E zwrcQP;wSJ&X++=ej0*K3CC?q!!XTC7d@NSMbC-4s;7?SIpcy9&v%=&rj)q_xUmg#B z0x#P^L#}z61ownn-VOnewIFK2^A8k3xCMk-aDG?%KFMqm?SC}gyx|DqIezOVptoh+ zl91tVH&SaGJ)Q=2SuQ%YTUvH%cLDm19Q_Fpb;o=*(^#eGO5qy5buFn2wp(*1N&LMrwU&X^LN#pS*{UOkuaB`^%f&4#duMwT?+n3$oU2A__ei9I*~2~W6MYep`@N?8$rhHn*|r1( zArd@&tYTPpTtxAkhS~nw`34a0Vods@d?NTCaXgz{!=7!<#GN?k zl{%&;H8Vl{ie~i=;%34(Od3yr^wQ4nR=3BZqm0HJ-f_nINz$uyx zF0#R|1d{%T;v9t84F|5>Y=`VbE77*qw#tqqCq3O^xpccmAd5~kbLG(W*40Vzmhb$R z2;sg4l*P2yx1^ruHSeC1?|?+Kj!g}=2RHK`|~^~cab3SrH1`3 zbnJotZez6&%|p~F=Y6J1At3^mP?dB<7@nV+$0Xi1ROu{`y0`ZFHJkjCbn4?&+=W;0 zjS8uuw0DRh|I=pMpqAW*9D8%i`FJXROJLxdJTAtU`nWqJmDv6Qx8pZ&1FZ-#w!bOV z=JA5EA4)8*U818KbvRV_29dIIacXywI=_=L?jTV+r8fzL3^v!@Qv|W~pa`+YOHZxt zm#ou&h7J8aE=seT6jCD2q&0U*1zR23qeLr)SjP)qtsh7-Lg7$NNhdVo?gd9AsG@p1X9|9OLwP46|7%&JG`r`N-9y+9ce&$<5Cy(Zcaw zZ85cYQ^)4`XdWmUlL8c2j&ES1{V)raXOqC<>>O>DriX$K%K* zOr-kXD^Vh^4Ze&#k`A7I+>gBj^m$uG<+%k(5~tZQ4`^Eh4&)RsskS5(cm~4aHil(R zEjPEqDuZ*P0xC&vQ-A#&TZZ@%-F4Yx#DeI{~HYqLa;L7EQz(+M&qQ^QRCp zqp-3@Qvld{`6eldzeik%l$JBJBcw zmhWb?8_6W(U&ffTp%ulbIf;;s$Ekn~QRI2P(r?TSs5}FFI8k?%L|uciV;bWhOkR?` zm=v$e)Nn}aDP^-1VDmVo=;OM6-1Wc5(?ic;ukYy@p&Tc4#QNZe-}BK=Tly5%3i+i8@NS;@B6CB|ST|B=xtP~BM z;Rli|b*lz38Sf939Q=%rK}kz_j4>RJUYR&y_TAOf{)#V2PcB?*ziP4}!&|krLX4H1 zKH!wZrzG!Qy*x5SK4zZc6T)GZwRID<|CpZN8qI#V+jmG)PkP5R?uJd)<5l_4*y{<; z?d%fLyKZ{&%XyvGBX7ck4Hs)$pht}iY+6`^zE{G5`TI0Ly}%uLNCMaj;ya2n+aZgG z1Hp^+@FVS610IsVS-$8l{O3jy{{nt5wGNq;5xuRj>BsLmjR`ZC{u0 z+T?9CYL-v5Hh!u1(}*MJNDMi66cr%oY5hQNLYFe^C`x1Jra>hU2B@z_VV;j_@09ll zr!9^zBP61fljk^fM~hMb2R73NCETMGL~$RhD-rP*Nn(f3zkWQK6nDLt(L!m;;{}Qp zL#9iLi48w5Qy!kb2TKq5FOTKly`1E5HKi|x;5lI#r6M%rA`$J^eH)X@={<7vI^VIO{fc_IUnJIGH(@&U? z>n>pc`Q&^5-mDp$Ky!3nY1btx9{hFq4}t?;`sAC#luuef6|AFNh!~R!oy>x+731&h zvRm(5MpY_*~N5EGxW?0bI69jz2W{EI>-qr>J*s}8>x1kg{fxQr=%g=<3z397{LG`Qcng}^hItpJ%O%sj0ZS4v5Uh~A_0Zr$e z=5A997d*SC6!Tlxau8UTf9Mm{vN5BCk$#|TZ08b)*ZLa&(<9G4z82I@?=FHyL5mc^ zQ&zIc#m|X==nzEUUw=`k$~#2s)A>(n`%)rAt5iU$B6rrhrgZsMNeffdKSsK1Jq(M! zTXx>0+7y6VrKyIAx!h%!hs(MYbB{gKA`f#qjxO1fNF;It=QaY`tWya=aH;CAT(}9paadBjVAh+Uo0i5fvj?+)a#_fa`ctEMNJR#t7t1OomnW3b7WZiKKFF?wjq;C4}>>_ zT|9QUGV=n4MjqW};*C4giivKA3_riH3`bOnXfWaRM={x|8;7wnt-5+IEuFwJh*9QqQT0T8Rfn z+Vaf{FA>)OV>GqKD+9$FC;GK^fbPD9Sak^qB9SSlyHhq(cEj*3&!GqqKH9)fVHc(u z@r^&&CyLu}1#rtpYU)mgBS(KjR-dvlxd6o_Abat4fZOY?pb)){SV?QT9q6hesI%}nqTv`KQ zy^SFL#(y;di?{4jMo(`dCqP1-wtUiK=)R)%Ks&x`qx`%Wpxh7@`m`VFoU=&T^?9B|XXV^- z=naP&0w@USt~}^!y$iG)&wnn^85*nTAbGO(Gy3e({Pf3dgV+CrAaYBRzBtytSmnIn z14h#>1oxQ#?#nA3M7`tvA4%0bcvHmVc@EamMei_gECD)naxsDjK^wNTebv{lkfHwF zXns(M?(a$hbF8pt5%orFW|ask)321xubSot@K?5)6xK@XtVD#^uBrg3Q+<(5{@FWz zx0)(U5`>CI+;ti8nv64*_LjD=5yJwd z+fU3XkOrS=aBDFGWiR>*vv~!n;!&Ce*b74CskzxMbj6qXU&CLCF~(D75~STKMifLU zkKS74P)Btjq~+pcau)tCAeojF6R?x8UXf)mC80jEI0D`c=(Ry#I&2Vc>6$!u(<&rQ ziaU#d$HUI2ur)9!*ne}yyUb(8t;F&`w&<0mHIgcS*v4%zDYU5Y%Lm@}i2;1~&a)|I zi62QHVV8_()O?EeXpuq%C0-SsH%sR$X_oME-I<&aTUBXO9e*F==-Ec>Ic2Fy9VIt( z`nT?f#wzB?5MB&`bSxaVjt3X}71(OfFuG&rPh z3X@}|CF1qKDh>ZzixZemr0L*|=M4S>#5-w8C$F-5{ytG)y8>y`0=iChcztlD?l9M3 zzVy%ahn`oJ2jFh{FlA=EZ3aNnuz@1(1M<)ZBa)xko+t2B+ubarlpC9!QRaBF7% z@mgsncz=Y0+N4jSdvoW<(yp$$FK7*Q-IMU8XAa57tL>Kk5kWd)`7~7$Un$|$(t0-I z3wIfsVr*^cQ+NR+{}%g?$4TKMa$03R_dYEt7yaVf%Z|lmy__if4-G3VeEw$-g*Vri zsGV0J6V@2ul6Y14FvoRyR_F9FWssPqWvuYe2C;?Ju^(4D8UB5w zc4Ir_Q9j5?02m05KL>a$aUCiyT`LoV{CJw7`@~O^L}8VEazHSZ?t%p!3VQFT-KcvN z?-LCrL301($ID|`92+8Y(wWI)^%&Sx)r^5Sz_dF~+oLazfGBKdd2e&%-?*Kv!#8rb zj?}nogRUk0srTkxRy*1yK$f>5AEP=Rynu;J4G-C?csBv^7l{vp^atM<)AonnjIb$aN4JdOQTptzc!0v!rs>Ry;7UM9AtFU>2fAmd!%Fz3QxZbe@DNw0?>Lt$cETC z#jy_FZtqx&{=(kPAYQl66%C>T{&7YqY1c*<0%Z-4Qjqd2$vtK{A(oj4c?-{9m2<#u{i7S~a z59>6b*D#_PEFItREHmnaWKDYJbFGS-@lFCON~tT)UYqy3v671wpC^&$*fFcsbGKQ} zn@=~)(s7CyL%bi89-QaJL4+B@FFTAba8eD)K=wI_YwhJ zseoQ^sBhzb)ZfO84xYM0F6;9qn34p>M%%nf)T3m@Ck&+O`4|_a7;6FB?RNo9RPe2B z1ZiJ8Cx{vVOP1T63C(!Qq$sHo*6X^xchkl&cttP)TPWc^1k=%)0ihh|~{niP(A%9^GF z0v4G!K9o4Ti3HQH%Z9Fsx8A>gnx(yt3my8U`C#T}r#5x=rE+I2%BI!lt6Q+g*gB^| zX`>Qzt2Oyq4-qy+@c4_D2rh?B=?_2s_)m@VUkRHH?Fs;(AahvJ?TmJxeZ;Cw$4Y6~ zBxD{nJGZ!xZp$33%N)jAJ?X)d^Zx`mTJFDYqBS5u6mR6~vfR9T`_bCrBUaWh(XIhr zdDUREkF!GH0Z~Au9g*^6X7JC~z+vBq5(oEw@=)qEO#BGvlgM+;QTY=*J)K#~?r@w0 ziUnK`p4ngU;9~VxcGqA;fC2MUi%Ts&v4_P`R!*@KiyU&iJvEa8iPhMA zz&gs-mN7{qXYIdgP~xyQlZ5XB2#1T*bF$1s!lMuK!yLLtb8efNXb0{K%7i=Rfb!FH-ij`fZV1>f)6-J56oea>i>Fynes7<@Mm$JgQ_7TZDE=(fhevre=iJOmJK>K;yna7ZH$i)fdnfz$p*x!;#3f)8)=2WE&Cqm`-szej7{7K2zZL0t(j za|UA_>+0?JS0Of!MJ?x?_iEfqrsU9yqPxDswp3Lv=@ttmZLAFDX!pmW-vS>}Bf%X1 z(Psd7KF{^q@xp6f$Yy!DU4nN%S~(tB;(6S|oa|UHVM(Qui=`?*1I8Mz5O;aE`H{qk&lhLA5vsr(4~(5ciZPgiWN5g}ZvT8vlGsUl#i=Sq2N_75z<^e#BrY z@^Rg1D2};huCqV(F8BFpK z>(Af}Gdwy+PYeO|8CvidDeH)zU?Yc1KWQ3urI)DE7|9u`D@~ zwbO5JD8)%6rvd#bCxx8(hgTV&lm+y7Tm^07-*j`AJgj92FvVo9&KZaU$pKd(ID1<` zzdaBBOFb$lx{q;B-4!7z(L&;8SUkObD*K(-$nhUJZ zlG0I+D<_M>6W=6HG)3}6QcF&L(B0w(`n}I!?UCc0$}dw2=TS|eNZk?yNTH9Jk2|(1 z`l~6BSdObQVb)0Jd7$Sf9J8QIzxnMBvG1?8jr(!SmUhX-7~S04;?n5B&km(D`F(CE z0&GgSOBlM<4y7V=rG8b1^-+rYbvs`A!6TRCoBMra=sY4Bz5Hh+XJrqm@Q=^678&HM zl;wi3#QW7(7u}ush2}9r@UO<_7OvS37$VgS%z0~-mX+mnfAa6(pM~pP&rS+8)2`x_ z?IruM4z%)kRqRx3_<>7==57W57UzEvvOtu4ZHZ>sSD|$*kFAvSSY<`Y#%#moLEj=@ zC!{Jij6M9E=lT}#Qn({$i}iP%HPYIaR!bNoG#wfy8YUzQPH0NFV%KeXbSLG;==?2( zg6;CT_mKJQ?93Mt^MU8p#qA)4+{=pY2SB@kH3>E&hpD3Fok zQn}nlxH?4xOHF&L%Y{Cz?peQ0v^z-GJw0BElNdaCI0mh(VmFcCJ$ycexp!Wyt0#P< zO_O8f_&AZaG)}oTQMPQ#W(7)xU6|e>Kr05L2bhRQs1vp+Vb#r8DX$^do>x@Gi)<8R1;THsGp9ru%0{3H%W zw)DLHgvq~f+8;;(sLGyQ(Y}^cTeu?&Bd6P6`QiY$(<$gK?lijsRZHPlUaNoS&d2H_~}&;ZQx)MOM3I zTRGScd3|L~j0_{d4P&)O8JzVd)~O~|(lkA^6%K`Dn^AtWB!OdMfVg7W+_xQ1@wbft zfFZPg|JEDYqs}8|Z-1wNooiR#QlG3$EP6&VYU=8%NilOn;gSvd#p&w)1A9j<+GcfH z&v~{urOW9_)}M)+J2WKSFY9(M`|^VgsSrYLd6npqb%-DBCG2=pK~EvpY~3~fQI#sO zB2SKwTY&dEO{(dx-$0zJ3uh4k+!>0G(guAYjYaL3j6T5XP@F$~NbQ+q*9{J|z79Zc zbgIF=H@Fg$rwi?__X2=JRTrsUX6aD$7{j`((g#uanH3rSsex7!~XfGl#XoBleH3qDm;M}Z_8E5B7z(vV`@DA~!9IuP?& zT};h~j;u%gZJO!Gj3HMYZa47F6ngDxd zU8*&B%fd5)$#5c*W@qByzaRIz95gvPolkV6km|jP%a67aRrx8_G9i<;P7ESBbI0gvq%C+r@ir~f zR8ImtSnge)XCJIumseG4nC$)0D|UfW^Vk*7@A?+MhJSNH57_IWMLFSntm!Uo*WmrY zsbcgVl$EUGIMey-<%we;Z`@L1?cdJ^Q1&*A8$EhwFM8LE40CJnPw^l7nqL4rOzmyU zcPuzb39@9kv_q6KMnn!v_=wa7>P&tuA86nxJLP&Uh6;!1ns9@B(UDz28|}Vmn$b5z+(-BfM7=)ellTW({QppGI|TXSb=e=CHdj1N`&_S*hd`?C zkZ}?NmlXIW8Rh{n^0l?QWFPzMH9Y3Ut;ybx4zrmjhE*f@hF3G4d$go(>q{6I6Q zleeJx&3(~xZH5~}5g`XP#3K#hJrPkihn8Xa^<9Q2{)$ZEX+l{K5`br=1tM(9UFxvt z)KQ1n(AbMsa?jy+sg}@d9n^dT2}aL>dzmgQ&ZP)2SpVEnIVl8}E2b&1$O@Q| z(ucBIw{j%72y04N>q&@1hE+|5uMTXJKzmtN79FY?zoJVk3Cm)}-zWZacL~;JB@)S zrvV3xd6@eQEpM^XCIL;vep$ykHTmV7t5! z=swF7&VK;;b9&{~u8@>~cijTeA0`zb(?(Fm#CVFvZ|~D>OCw%vVg;F{18?rSm#+#<1rO?hyy|i>}rC}p+@}mYab3nWl+Kojczy0fYJk#Fl7uPj~rNq3wwG!8F58i`Y z+Wos90C_1_Z-n6P7s?;DZGM1veYsUBo4~KJML(Wic;vX-h!7YwwonM6WE(O!!AEKX zHYa|uZ`%a9AaBnz6iD6{Oa2J=Hg0_JiB^TS!Zl9Q`tu*!2IeItW|z!^-%1uUy0KOF z5BwlM7BL=iQ^%<`fl90a2E1Ah$EgqQ(Yz{Ajk6ijD5>+_oqNA(Kly&g>XqQ6N>ki= zY)q&Blwy=RU(k><>S-1yB}{EC*Mu0Gc1W`>OE)Aj^Gx6;x_7f#%h_(406UV~0?%&F zqehZ1rn>jE$Sm?*cSr;KU$#66&oPR_U5jW21==&5p)L1Vni1st)c#Y)MTqH(ssGI+ z`Tv)qp+j4K5>0fo(`crlzd9Z>KS^1r(>et-DWGqKuUTjD}Q< z6!ahISBg#q_%gjkQQNfLsR*U-^0=(7Wd!X3rX%eT7iyzzP*HLGX{H9ssJp?R(I+=? z4E@0IxpeG=YhV*{qkL_^rDet|_#`#-fDgFMW31ot>;<#Ec3KV)Ft5|Ftco5ekH|>Uw>0Qub-|1S;#tFyj=IE9vY$QR+kgpu_I+YLZoQKiQ$ zU!rV_!#YtIDOIcgnllncL}%naD#+T2xK(z}0|(>RKILdULlb|Tg)NnxsbQQf=&$GV`~UDA&pF|x>${i;R2JM1`O=-x~s$AHV< z38z99C1teGG;r&U4OYxjJKpOf3gcAiCgoyh^0}o_?fj*Ba^Y|$L;hy==Hi&i|0HPt z?_E$VfXd*@d{H=PV~1;P4=Lbz*hBC*)~>-+#kpj7LJW}GVjy870$N4)Np3dxzy0C9 z>0-~Tv)jH|$uiS>LuK&Gm*baGG{>8|9|ji{rWqY8n!IBb)hSUst^5Rbw}ZWhV7Gk4LMy5~ls*YoR`I@?(j{8>WA^SJEcV~6j`-OW*Z8wdW@E>H zD`KIV5R3NWWW6J?W&9XmpX}xknQ!{fTv$|Xr!Y}F=A)x>h|{Atf|c|VFN!>DraY^2 za2a>LgC{khd0&-k-!Mn*JtwZouKa&gop(Hy|KG>0>>0@>Ldf3Pgc6PjA(WkYvJQ?t zq9ikW@4Yw2EPLesm*Wx7s( zB#F-1;JQ}2oG#=4+gF&c62u$a=7~tZJxwD$YDr2PuqNzlyNMW*X?P4Jr`b)R?>|aK z8zG*^WTyZo>|KpHxIei#475+XoNmd)H*{~*i&E>|sBE;Dlg{62Kn!REA?YP#PzUh| zy1R1e71C6YA4UeGRuC!AQbGo>(u9F-dLb{+vzoL15H`Rg6bSFVt=Y2wggDkxH#a|# zOtHSX@`Wyy`@nKknFKo%_GeN@roOx!l^8j;;1WM)f}*=p^7_XJ%RD2CM%pM<5u*y z}KvI1NSJwHB=y8cT(#c(Ewsv;!a(b2e+Y12Tu$ppf=>2Wu|YJ-i$MF+0- zrWCY)%CJX>FGh@`-E3a>d;B13%xjHf#og--NmEl6)#jPuOOcpZ4gH_PCe_YR4lX~o zcVuMRZ-1X*sY21X3d4&-($Q6~EHuG}33>^Y+wwXF_tl&!*y;zlkO$!R} zr3a5%EfA+PAuvk^*7XmF|&G$*)SQE2#8eHfENtI1YAP1x@c@o z{-#VSMPt1yZB~Hea_eCeicmVh-6(`XrXFo?@2GsZ`6_)^T;iGNM-QmwpBxQ#hu3@) zDiV!pKhypt!0&35jgx=mIbH(LiFr4C1}}MN^Sr4~u&VCP5*@f;X?1P zUv2x!uNhN_xlHvkZmhCeU##d(pLNBQveACK03(YN$J)GoW~-OF>fUrM-?Lv3Ue0p7 zXN;}wPHE4cbxTP9y78JXlfg9TD_?>RsIG*p((4fLGf#Du5;Q_fnF{?zwVeeT(rv4h2W$P^;@Vqr?h5{cu^9`SCwyFcq{ z?TL)`!bkIu(%qFqGmGM%LAD?H z)CN2FHPH=$QA4f;z#O2Z@V|4k8=XLz>K+-DV?qWWdHz{~ETm~m3CnOd$y*pU7NJW(W%DyrabjPNNW9W2QdgkRIe#|s zOiLXRjcM~ZpT;@3&HC&VQP%GkQ1F$WcgBv)SSzNI5*RB6BI4^puAy(&E>zH#>T$V@xAL*djH z>9s9p@b7H$%Lsk@+o}arYBwRt8ZzD$1rC@uS8u@ws7k)VYn1M&CLsd9w>N`z+$GEI zgTGACQ}IR-C=PsS?5uZ+%7F9T=z(<$7p{M@b#mlxG$wWy<7O<-khsk|u|IJmMPtPo z#N<(Ww*P`LsWV7VQ0adCM>gN!~QGhheFff!U ztHE*D<0`}DZh5+MXtu%IyNHhR^Yt`_6YpO3@`2KhOOS5Px+ftc-)|N2p^D|GU`crAb)BDAr4?p!GicbuO5Rw%7kxn!onhnADfI6WqmIOw9lGJ5X!ZnQA zA&uA)2SZ~W_egqSBea<2s%@xnVFM85_a)BdABDJgLkH;F@~tf-?$98H>I?TYWZI;B zghyP`OE^y?xuBB*;Cp)II$sfpy1eRz8wXAE z0*Q-jgI5q=mL_w%kkTHd1+f{v>bzd)(Smlj21EE)9hlSoEg}W?{D)EN%_;86q@Rav zbGGQMHP*=#M)vtKxmmwdTd729rf>1P(e`*?APFu4hB7jLwmk;{v79DZ)u?;3Z3Mfq{2b%xiEyh;9`)F2oqVZ|`UztQVU`CiI$ETM*Y7)pC%Y!_$?EM2@d_rg}d zTN?#z__UGeKon2*IO8IOsE49AqoT2eK>@ov`l!Y--h_!t`IQdPq6fyrcPnQw~trlb@aD-yj$gWC7f^V&u83>4r8#gG-X`jYI zng6Z@yg<;;r}?KUZoy?ZC?8g&gHGp~kp)SX2%CdVvG zUh;(gUft3;I9C;O+)~vNjQ-Sa0kH})85^!oS;eY z3jnRCbVbO<$KOBB;`P_p27c;p5iX<%lLLhm0Q}>3WQGjW(>&o915x_mqY(~BK-#?C zn=~dgeD=M1U)O++SRWMMSlU39TT1=Cp-&$I>(!0EZn21}1HbC0PUPD+fzmNToBv*V_Z zO)?pTmSU9(E+{XpKL}k3E=o77zS8{q%LI1ink%SG^0a9E%dlI;65@I=8P2^qug~pK zSoUQFi>tUHg>gA3(vAdFE7ipEx!y9R?$E#cYF@6h4dy8b_YP@Hq+V)2;i}84Jz+7R zn>pOSm$Tn6S?^kK4}jUZLz2$^#H~Yx-lA5%P2H>?s_5nb!j#A)5Y9Vzj?^p<{A-D> z0w*X1F}{zVAC#6-LPHR9cTiF57hrBI)_}24(XV*+!Lp+Eo9^JY3qC{2Wp#Kz$PQT}UKfi>Ow9PoM6d!( zhDn|HktMkU9+4nA2ZjqH_u=b3i34KXFw8I|eZ$Qnzrr)cMj!lo$Xh3hdYe&gI33{F za^djdgtQZAAx(u)+DVLzM}pUjmzHojJmjS&C-&*xoqsy%fC(ChaF{et3Q*K0;Gvzp z>$CfC@2VabySSND^uN<&X=y9oOkhi#`2)WBtuxuJ+L#E`J;WIh&% z*D4XqVrl#JT{qs!DHb~BYo$-?;H1P`X{N(RS;UHp$qwFO2Lgr?rxtCC5BOMh-Bp(&5TlIXduPFY^j%#(HI+cUS{$ zQfb$Q5oCBfx)>19d9mrQy_GhTlAZ}cKu=}{>wT1?6tM;m@o>I!ynypJEd#pao7rF~ zZ+)W8R;L3pgG=#P$t82uJ6h%=L)YtoH}Uj-68Wf#gPo(PfNt@RJUY|flhqG!OT6i9 zA@#G-hN5-q%gR{PxJabM$&lWggzcu{R!!{|p z1djnlEx@=al=5-mTqUK4G5oei+esAu9cZZ(-+NgQSk6L##{C5@ZcqYPVfreGV0-~= zD60UerZq?^^xN&S5;CPm9|K5{Zl4~jJyKkzLx03Hfr}3?`r0B4p&~UsmHO$CxP@xb z-7~RT>b*|eM+qafNYAKn`V*&8hj-?(u~w6(4{RYx>4%TAeTGlLK3wpn;MSoXR*9^! zXuC@=9ir{x!=YK8+WZxz=tXk3LKVjqmaZ}|mEmE9$$7e^w zNSf$Q!D6t?Den|b7@vv4bu;6)Ohwm2Qpc`kG2mLOXChRmKGw)a3>Ah+-}g}jhAeQy zs`~Wy=@%rDe?}Omr%VQJFcf-J61&(R6WiSC0lMi`x|4dJh2XH~8VxltOk^=cmN=gS zpIL|SHZ?WU-X!d8Vo6$PjoG^v2|yVS=~XHMA^s}REdik-N{BL9n&C=xeerj6Hc(%~ zst~P>ao7CZBy<1x=E%02Li1=^`$!~o-t{PhDNtAVHK9H4l!y+-Gdc~8N5D|~hac>! z>Z7be{2IZ@i5-yc_yI7H<&=SvmkA^wR8H4wYCxhg(s%j#0vKvYFXX{puw5IYKsP$1 zPM$1~vIB2PLht-=L@jDJvAORdMBPPp{n7uvU0XN*H zW^OPE=n#BYkoc={|7(J;7Cr?mbm<_?Q;pFqtc^KvJJWNsWF6$<@fpR#Dx+DHX)@TrzCpC zC=3M7G+z(fgJNBV;_IR|scDLR?4`T}>ZKTy9nNLxeekAQ1Tw`?=!%YLL2jDMLgC-f z-hzR{TX)XqQ!Alqjn`K>UueBed<&8)ENZkJ6j`XjMDQ1B+r~8d_H!44E1gdFc1* zVf6=B!ZrFeuR-?5^?cw~9%hp!S~=qH_IE>dQpdYl!;w#m^Q`k6JP5^L>=pG^*4DYU zLQ!*Y#=**Ds=v$Y1&{%vx@pgixG{TjTkDGrzr>IBEaNPMt7z;)ms`C&pw?X3Ia^LG zNs!nPv3a*v=U86VNzwW#Gdkm}-lq(bvlLtODh;_?4pT*xun8-yZprm zE^X-1rWqEDU}j!`vjy+HX9B%9cH{F^?5a$JSo8)yDOH<{U5AZIEObxgS9?X)4On24 zGoeb-7c8ID?R{+bHg>rOybS%sD0d&)dK(ztEmlhTH3vM*6#+Esli!sK&Pt%4RL$J9 zmHQ-`ZqT%RfKaYNbPgvRR1SJ){PtJ-`|lT>i980rP;VY@0aFVQa6SERC;Ai^=)gwZ zpQ+2C+$zIBSnG)Nm0=+`2DnlRr*i6A30C^>>{9`r>3U_3{!?{`W)XwXX&hDKTrzPP zKtDIYVw7a~`W0hV+!UE7!9p(>Tex{bKH{Ql#e-cfIQpgWto9Px)L#tx-7y;Ox;J?I zy=rH98505UAm^;no093YTPf;`rZqNNX8T(yG{Fq*_VW+XwIwD**~gkO=hY5(=oQj) zg%PPEvfXC&McDOuvWxy!-jSStmkA%70V+34%29tC)_65I*pD!lp(gMLT4p}%K2B~N znG82&oZJ(;+~yMj5cfx5MvLz|qx$kvZ$F+;&yEj=Up2?#G62XJyNm)8{6ZQ-Xc6^p z4)x92CiT0D$68gXvua#z6^9@44$VHwB)D@F*=)R6rr=Ns%?CG(FF%EUkL6!kiDyfUI8Zigb(Kkv=@NQX;UF!C^<$xvFSg zV|}se_+{12GjZ??>Dh{o&Dz<$9kTCqSJ7W;l08mbL%YZuj@>HL(^TJ? zUHhlo050gvI1O~W&*s#vjx?PtWb_P0F6s*1f2K}?fYB_Ny{k&@l^vJ-akvBBF8Moi z0L5Wce{mBvo=JR4GPmTgME#v^BCFnnw7w`04K*AB;v`@mxe*s(3?K;f1A+iOD_o+Q zyWL(uxwm-JOc#*lE$U|CS=pGjCXU#6taHHQM#zBqf$3z(!xET;+%I<2S+`dp-f+%i zgcJWkL_sc$QZ4NI|GuVfG?d6?0V1NSj?Fb^Hgkfptex8 zR`1>Py5r}ow=v5iw?)w%J>;swA<0`7lSXzmLr*@FlFseqdVIKJ^ztm+O?!B=?;XV@ zeP;kb1TK4t_c0r5f#Kpni`)yuxYvQvJE>C-v!b*G5NTrHX= zwnN-;JIqzrB^gxPz9z*wbxn%nn?yVqFP`GN|o#HoMrl zN=?gKhRmigIquj<#u`kGrLp;K)tSWl4Yb)@AxdQiF=XPU~aeEWCPF=Ts8Fh-Tj?;F5gnJH*li+ zQ^9&m35%O4tr0KCnsIt zv8K_qsB&y92gVFyW({xnrMBrU5*R~LA*mxEkHXO%Md`GC`Z8dUovqhUJH1FYJnOFv z3IJxOGQW=Ye@*o98R^370Ce+pjXV1$10>pph&l^a%_EZPR_rG@%a>lVMx}z-f|oCi zXH~~%F~hzb;V49;|5_rE7e0hho<_H~27S;G@EW|Y1KXzk&Q89MN21?k>!Y{SO32n| zaw|7o+v^DdGVB!ru3x1BDeo|G(&m88VL0ZYWqVzk_Lil&%64w(@;Nv;B@vYfk)8I^ z-7-#?LC~K>=~50$ScJP<{!T0PyXsj!yRLM_K%~*9`3`+VcKAQn(3^T;V}=wRt5v2= zBTb`Q1lg|@C&~n!BHX4^*nFXrIEcGO0d*kl`%_}vOo#_q_-}#Hf2rAb#9P=TM1omO z%LCbgqWaj>fcMEbvc?(YXR9mklwX6aVO1tXI(DsGiohO#k(!HSZ+ON}(v!C5tRtge zl9)tt1W_RC&_Ace1h;zDWBE7H3bm#!NPa@yNz`%%9D;;hBQK1dJS6?3x}qoTDl4cr zJ)`zQ=gM-F@;}(gxO;!{M+F50stq=hoxXw%rqwc>MYpimu$L>nWg&g+e=^hschd?y ztzbXE@Spp%^az#IpR+;pBH(pj|7HpTpB`M-$dFXOzZdo6)zHi9&*y6gr$h56(O0$d z8iEf^sOvik0b-oLr$(`Hkq9YGf-WlhEF`4-h3 z$mH{hS{qWAn_@*?w974w8VTtxxrx>@l4gi+XutyGb#vnt3E3PT$ZvM@ zVDRAafpp>_z%EAlsc&r1MYP1XuR+#Fz@wYYjmv>HA`LM<>QBavm2~aow>*@_wL7QF39*e z`@D*)%d2%9Erba|4a(i5ullgW&(e0YQRa$+;KI279b_~Q!oDMw8!Dh9ms~2=qeMr2 z+moB*%fcZ4@3{cu00^4-m;MhMH|^dpTU>2cC*duwX?BE8|;UdC2k9PNjjS$5WLLY?Uuds}jva5z0y zrJt>9eaq_u9#ZVeCGlF zi}EgkzfboNIJNR*iDiT_&ak$p-FrJ@~(U?Iqm$&GRmAG114C-m~p%JP1#D zc`i(pcK1#@O*;Yi6q)0BG#x!m0alzBIeB;1`610DIBGD3)T~O|eRa}%TqUKhDN=k~ z#I5-vaW=Bc?!Cg9u7pMT+v1FwHqR;bYXV=1ZuM4Ps|xFmH9@0?x%xN@3Qge;aQ`*} zFnyt4y~}SWH(yTU?!-}ZxZyZyy`rj@Sv=@=w3pcJK`$9zaJU9-<|OU=_EechP1XP+ zw69CBeZ5R7I{R61dw3H#UBDfLnniH&2d1jum{v&dVZA)z*Er!JjRJtg`FJ&e%SI-d z)lWM=6P6=niZ)=$qGr|8KKei>by+O%;8R7rD!e7jhb0))`lBIS%~jO$bP64XU>^Sw z`}aA4uH)CG8y=Ql#$5}RsVc5XDgM;;yjlAU0CD>?ndZTM;y6e*p=tUol26fRc^Gd{ zV$2nJrk3zLA}|+(rFjxsSZEZ$x%MIY^iW7Vh$>=a@3MH(DjVX;EPB>C1oL82NyS@0 z>Ho-nA=z-J6Q+oJ1&o8@3g`E!B>)OY=^JiDVvobO+=PGt)2=GxbVzlXQ%Y2c2# zP94XV4Z6-T-KJt7lB&o$M?NppdSw5E6VIVlDTx&|m4s4wy;VH(`DFfLDlOr>r`>NU zKxaD5$ZUq((@HHa0U&Zn3s#zYnXNz!p@CO8?hoNhDLg4lw|~2o4}t2#*2C$ij_KYw zi*L~u>R@D;s0PSmF`lzu9wI~^UoqoU9{Z_-4fq~QQG%YxJYkY`FGN| z*SU7@rx>5_FG=CC8W=(^oBfA5+(8HJS_6cDQu@q3Eix^6<>L*6_V=R9uO@Uz+CJSb z9__y_GJf!I@R9eYYGte2oNydE!8q^`Cs6y)v6uMs{|_^Np0w8TKFc`^)gQPLKi}M0 zmzBElb*j!J+>g!*n9XhF+Z8WLORnEfxk0@ieno)pBMjDkuwOBG3B^~gh9zJg6dowrjUc(CtLA-`zZ~o&HLEG(q00R*eU|CIPk#p2)NN9D_wSL?{#UqM68>~ASaJU(PruI4iN`6Y{cmytGgZSm(}EhI+~&TvmkP7wv+KlTNGCQ_*GkF3=dUTlGnV84O%1ehU58 zWS{iU4*ri|5Q)E#MG|OeA@@}p8$U46B26=*;m!8tWaM({YoMPo6c2DZxm|B(#{g^s zqm;zY(yU_9Hs;b_%vEpWm-lY&<8~8j-`4*kry127!4`eyq{oesS66i_i&Y7W@`G#y zd_&jr?D89hU?RY}gvX17+h~(_I2F{_l^0 zvrvcg)AZCXHC8_;{dZaVzQGU&dFjIOd-yFRcB**z0ZjrRe!RzEm6Y(3hK72i2SWAn z;g5PTAqa0RdzbyZ%Cwo9i6HgVrXmyWRbJgNJ{jhU-Fe-koXZ|^G-M-AnN5+R4Sm5o zmi@gLZ%)VI2IQdhZ~w>=j`-f_^JOB#pGF@r|MgA^+N83U9snkRBvtShx~&{_f!5Ep z0BIj-$75OQ?XuWFM~AkszU&EbTF*JyyDys0czNZf&Z7xq1?fM(i>#H+X@`7rh;Z7$ zTVBg`v&1GM$4#iMlGYR?8F`urvGDN8+d{6UL7aZLH>6EU4La+%;{dX;hXJqrG_!M7 zhu^`M+(HMXn#d(ZP%*2~GQ}`r=nWd=?@0vERxJF$vs!FF*_)==?^`dNy@7SUj z*cxp2`+oYV*pRk*x|QA8euf^1y`S{h8vAtc`yvi9>mw13;$F5{U3N7F|8lwXX+av! zIId$#Ya5w~Tug*tei7a!VaR!bc?I4F=9|_Ky6h_mARQ(McC##r#1$YFu(R|k%rd-t zKAq`qX$?=5FdlvmvCgSEFTAc7Qp?1%+2@`FL?#)BgQH z3lr~`y?M4e4O!6x1gp_W;x}qhk3@{lzI-YcHmTWW{YMQ39|FSlVq=U2rvV~*qk;By zB7!C(Up=Q6uf^mskBRG;^Nnk!2KTO7);E7%Hr5tJEjTQnY`_2!lhSz>H9{HyVhPDoA*Hlx>3CrcYw?IH~we#<0X zVE6g9{ZvL3pF$Ft(6}Z)>nrnhanz+ZjF0X^S0sQ(qSCrJudX~a9`O|~#b_1hD4dB%F)@1Pye z;ykB7<%s#!nF4J0^U6c9*wyHVT@_QsBroj!uFT{d|L@HCC#r}n zP7P1U=2ELV>#n(tTt&gBEA zStp~ipv5v=^SQBi6i_j2tgGG?NVnG%RgVOC>a9jvDD;2`zqj(OgkIm?9o5iqSpBk! zCnMbZg~wGV|1z$8bQIEF<6uY+wrXbrAM!{PVQcu;0mw+QV35dSQH-_LvaX4g?tFcb z)GAT+^r`cYe`yO~>q)q!F7*`e?76P8 z#;W+}-22+@B)58G{QU|mcHZ+Y1-2Yg%>B?gpemZ`qhs2?@vph4Q(9j@Sv2%k-}x4s z7aeHOt{&|gS0rcMjF9}3qhKS1OHaLDe(HN`TN9^iDSCa?L+pR8c1*SlEH-g_ZyYJW zx8&-BrJ`P90P`4oxc<;i=`T$td8ZMab1{H=zEwR@ev8@>oHNUc{zr%XzqbyTFErVF z^}Diu{xCYCdwu$U-v!Wj^x8K~%IxMqu*J@~=WI#oVV#Cv;IcPVdHY?P-F#Lf>B*Ao zByz7kf%O|VkQ}~~p_U(4oaTrS#$lUol>sY90MHTKKm2SB8+KpJMO_Dk;C=~l;BgudkRNP~z@Y;j zxVwWd{z*0da}dg)FYF)23Xtq--82%SatH0og7W5tZ}^f39>knq$=bQ|jn6^zx+<~9Dy0VwM{mC>9Fn6N&^0p6cOA5 zC+s8iB($%(G!+5}p!!$Ig~p=8=G8^8khrG~i4amCj|pXbr6TQiVzuG0LPybEYP8}y zY0jpi{Wo{H0szDjBA5$0GA~d(i%0RSX&!_NK5>@zb$#@qNIN9u%vGa>~@i5q-t|Dz=`4bdX=XATXaSURb3tsJocc;3QZO77Gy%>jd z17;89RiX@M`|O6qF123qGwC| zW~dMT0QY8m$MA-&RARz5SbpVu&vhlU%ToJK6#azMBi47e#Yow(MId4E+k3tWdfL`C z<;Zt6^qs-vts}ieKz6v)_P9eG0;(3y&UXchZP^~EE3YyZsjp4GsMw$L9;44<6FM91 ztGyui?~diw33u@o2av{FVxz6KEsRT_s)I}X0Npcg7&|WD&3PrL3XCf8xSbI9>|D89 zo61zsUg80h*U0%>pT%YttAOd_mJ3F+LGmtg>mueH3dzJT+m0K}f`ZatrrT~<5AkT^ zy4~L7uE7G5q~;)@Ahyddm@Xq8d>+a=u*ctju^i|8twsU-!h;Z{A-uefj?3iGkz-8i z!#SO2xwCO4_-qji)^O>8j$2NkESvqdcp876jF%BD@j^H768)7t%x;Ekv}veG@?N4~ z>VhY)rHd`@l>j`-kVDdc^7p!E2)Fs$R?FY>EHtwxLVljnUvW7u6All$kV%3sDx(Jk zlNw1DjGfE02@xan^pcGvglmmb@vE1$>{r*b$0ME`|Gf@8pm24{O~v;JG~EOWtBs~I z-+p9qd%(T^Y4uPjF(58OD5*mA%5V@R25+R%gwj@32}fyrzhln+uo^nO0iTW01OBudLvA^)N4Z~!UU0WbvDeCM(kXlm6%83fG=56VguOjb8T+Z9U{qN_{8v}JX$D$y&Gaz5Mf%73@jp0vb^sQ6(m2&*5$THD zChTo-oSjJP*2iZ(hGwT6by=-t$}@-Ys{qVgNI>jrfEM;jv)^egZ8tB5d6ZlbD9HSC zSpSLAWC#}?e$K|-S^5YO-W?X+iYtGNNEb=aqhUr)m}QjOED2 z&pAC=+e|p)aL5e@0H#5+WT^r|+s&a7v({k^$1ZfhK-6cA=t<(3-3J5BQIzMFzRoCt^Xgg2?>xJjK4+~~|+MlRH_-c$`S<{Rt$O!}qbmnwr2 zA8|N+a&h>KM?&wl@G?qU?3}fYKI~gy+141+{(eXU#rQa*9|cS~03<$9Ne}qC-v8&W zqYV9J;>8Ro)1QK1LeQX&SAvB-JIgL1v~}xkKvPb6E3TpM+Serlw@)wS<+Dd_mQu3- z4h@LfBbV66`LZr-f%OEG0cWuX4gU0GgufhL*4afklf3`tyOv;}&z59?00dGbE+wS010E`ZCj54A9h^UI@VuPZy8Q>CHP)Sj+0B>=W%hDm|>YcuvXN=<$GS zYz#-uF$=QGiQdRS9FJr}7JKA!IC)N~ z{k{dS-7u{uKl_UwO12wVNPtNKZ;slsb z1fWke+-Qxp9p*<9eOI!5k*G%)cYnYCbPTqj8|$IE+mSPKW?H z5s@|LQvi2!Hzf%>1d#;F5OaGG+O2tkXz!j~J?&SfQLYxh>N97j6Ve0JG9skd;iHx~ z?)npK4IHIWznuuEK8BU^9^{k3#!)5ED-6+XL-@!P4M| z^Gb^Ri=gC5=%nY|-Vd`gAnYHsJH0$Pn_WTVdiyK=BTxF@^9r{?Me9r9A*K(?R;`r zYmS{{bMT?S^7exP{TpUyMU_Vp`?}02-o=QWNY~uW87IkMNyA6^r3~9W%7p;Jng14p zzllVK0c3H#KTMMEWH*@#FzL+Hcn%Y78ka;yCqDlKsp*1Z%jFJA)UI#pNLgfx_t<9y zqrcpGhm>|3tnOGl$BAyzOVWWZ8L`8@?H5x7C};qAF<7USlJR_g#o0T}QxcgT8Ti?0 zUeBlNjoJWSm&JE>6t9zmyJogpP--G%DvaIA?E5ibaqY2`)5Z2(?N}Y^*=O91Msjy> z*z9y1e1oa!0JdCQOpy|ic7I~Iod2$zy@~aE3W9xJaKTh-*!}&#$bEo{>CO@fTV2oJ zx$|)peH`L>oo=$iB9a|ql8?8R8yTT-|Al<;hyoJE#+;eS6q4@m+lKSt-p9|JurDX~ z<%P%a(B&PGh=F8*O>ddjWyUHA39q4nWR9jQ56M&#hLt5)mDW)5ktFh1`lT(@R(YI1 zc?7#))XE;#Q?f=rb0R@j3AYzD5AOMGjg0pe-K=Vf^g+eQ zhq`&0SYe*&ROnbW_r4GmlIGzt0{7`T?Q|rTzVLz4^2=0@ml1qm6;{z(dto{v2vP|9 zeC@=)voD2sE_kE+&aQa+6^YLJK+jus`NCN_Yb)*fIWpg5!6L#no#C>PU9Q3iRTiWA zq9TxO6Q`xOIl{8fwL1!K;iS&`=%w|L3ODwBHWm+sNjG-r-OqfIH^^H;3*-X!t@ar% zBp8gsSRq~^Mngk;^P-+0nm<$Y*E_ga`*Ekz3*JJqxd%2~2|F&C(?l@p*SpVbJ8ult zcUpX~Qe}5HKa2E)EM>e7_Sfp%ZlV2z5{I`CWj_&r&gi_jmhKP;h7ii{EY)>t3DC9& zjUTHL+4<5CDY+=QygKd6mL+3bA9(+!uDEff_mbH_U7n%tPQK%|j!YNxNim4#{;KD_ z(=QLmWJXfY-YeOPrPio+n_*|s2=9ERJmJjYW>>O-YJLzQe#7c*HI5A%6COY3WFGlifL10tjyI9b0ETvNS zzeImiE?tmUtQulu`9?5dB_G7Bf-5L)*VVck(8~~8h0T&^^#dzzRUI0)_x?hMy0m|S z-NW?WC{9rNk)?c?lHw7zP*BsDKmI(ihqKGW$*L*&NTj}S9J@&8u#;8xUhkVsqS*Nj zees2)4yiN;Q5wwR8l^%NlIeW)yKH~*`yFPFUoR_Mc2o`X#3wgm{GyYsSE$DXmWv`T zWQb@Uffqe@_+`)&_YJ!TjE-EF>9dIJiJXa$sP1DWSf#jS;;yLnJI67bKrkq-q$7lu z-QZU^4H3^n9;wHPW$by_tiU%_`HH1skfxEP{>8#P;|s$hgF|Gp{vndcM%;g(P7LB_ zZ^5tm>8SQ8F)4zKeS8l5hZ?0Hxut=sr%XcD|Y4Fkzn>7bicUig9 zlYYHGsuoZ1phL*tT$bxvG)mBMUY1ef=vQzdg%(w)t4{)wdec@|vI7)JMtP?-^of zFqY>+Cg*}Cvzd9y9kXYVF?51GjAVpj56?G3g5%VV>8*7)6zpzLJfa|C>>Cw=)nS_kOefM~=3rF37MU05)6YU{%x@4USXlyW8v>M&UwcRLK|K3XK zaxW>Y5!Su)EvhhCn(Y7nb+ka}XjcaLy6&WW{!`kdaY2DqLea{3S~^Rz5Og9lgQ1P>`Wr``!uQ zYr1K!FMR1Ezz&r7^8*Za>`4(FW<8u*vxZ5kO8KKBP7L;Bu%QAnuN6|nEY9O(nr~Y_ z^G&}JJQm=M^??ve2lY}-9={Tn4eQeA&sKJGhXz6SGOr4QpajvB5l`AiunQ?CNM!9_ zmuBNAFh6}%)T~xl<*@$g03RR4IURkE!nQY6Hi&&b|7Z#K-_M|Mu}3qV@mR$s)h3%N zOR2)b)psl4+s+4Z=0^+TGHUHqlNEy;J<>}S-{}wv{sgIU!mi(4Iw>dSXY0g5b>$ya z?SG3>dL3OqIro^-H#t2h(7t@ft|XxdZ27!QemA-fTxQ|wJwLCLg{e_y&np_-!;K61 z^8-!_L*|7@?Od3_`&o;hYca2-kS?>M8!0r2GIbJx(7sQ&c@$hPeCLETvOkzl)Nmb0 z$}fH~a!`p)M{~`b4lagiuih7>os%u4H4WL&=~RtZec^_#9_G*W)_NjxfZqA)K2PSu zv9M~Vl9Lc{-sB6WR2yOx=LxKcccCZ&)N3E~pZ1^`(dva&8CQ}-^5R>{ag~rh|yEk=^bQ1*PvY1hbR4dk);`z)}32GiuiFK zp}m!$mGydEMfSn~?Z2BF8YrQxlb{*LX@D10R6Eo*yBq`t(I7iRz6Y@|O;3+g{+`-X z=i%rv$emgHiBAY@1{InpYU~i{e9x>2ofwaw(w%2#RXlxaIFBRVVmt3nI99lK6>V5L zEeidRtJi&>!u+3A@MkTe;i6PK9-b8zKaT1!%P#yh;!4LA2o;!DccJ>Ap=zXSpuJX2 z8{FBTWj(Qh zw%+688B)VfIr;_J1_h!FSm{Z&P(3`nFGgh{IYD4#?lw6t>TB~oQpBGh@bHZ)^@4?) zk8C)HW&58{v!1MSMW>T@7(RIL5{2i1KSTr_NzxKV^wzUtg}ahkPZNIG$Z@%>wpU2U z#B9u~U|Ij#^HmJRK#mBQq(I1n+Y5T}@)~O@aD-{TStV2Zk3a23evc98Fk{R6CIXRq zB_fnFLXGPQ44$ zh7N%|ZdasoMc!KlOyoPw5js}nha?ME%iVe5Hox|R2>jkYzoUJk)QKp$;a3iXN?kgf zcHxg5cce4~(~YhJwIf#J1ip`{)yd~F5jn|jUn`oOw$m@4-#+SE3VzP1Qkl$`S=SA_ zm|&l<5~`8Tb6wPyRX2(z+udzUPv%q55+gyE*XG4_M}@1AE}FnAppkXoUUt`pt9O#K5Gk+{ttFcz0l zI(f!IW2w0k*ik_@xi(Qf;kmncaWBLj`y*LhhYS{elj-O%b8#!}nQktq9_Q>w$z6^< ztXnwn$9I`x)xL$Zww2OrE-fALFW!t2FzGM!g6yz}tt1ww12oHw=@Rp2{#w7m9}4^M zMzQa)m+bL)%oq#TIC5<^B~Gg_?xi|rPO6c2&^y};Di@6AziY}O0%!jCAEK^0s;U3| z+Y%xT0@5+M8$qcd;pi5mJ0>+L14b!5n$bvi4hE=xTrh}$vP&{eZO19PrmM3Q zf+L&9=p@Y8)JI9mua#WmX6817^j^blMa#OW9xCEkCL6|tYbd40ht+zs?Og_*4#b0x z_R6(TS`*8d1s$p@_bg`*UP;GvMzw-}j($BBm#G)Ts!N45>ax>bU}czv99kS$aGBJT zLtat_o{*pHe2)r!2P{}%D@9{tu>;9@O~Nskk|C)1Hsv4U_To5vd^}XF_z8%PD3A;B z7SHpCk-;=eI%-%+?W0xX|H~hRHwdEgyARPt6h^%)OHS`=$stTK6*vPGe!or^NC1Kw zOA)K6IjV*NWvk-8gsH~OD&(b^i}l&_JGhcDxmQSA+MHxn*lMv~3rO`~#IK|==TRpR z_O7pq;?t`?&_tnul6CCX*DVs5y=3uJ^XJ7x8e#$_2Lfr?|9t5xCQtRhnsJJT$jbcM zGl2?e6J#%mpblkueJRg;fsFhm+ubz!)+>a3N0n@{n6npb?@~!#>XuB~y7>6f_&a$U zm|kfYcV~EQv>Hrpcr2TAfrrGaJjAutN27Wjr%b#`fGlJO!?Ajhotxf)@X+IQedLC^ z-=n$5f2P>QM-kDs{J$v3fk%(A(0C^^o~!T1n57za60#9gEC9vda(zk<#nNMQ)-l9V6PEuEzw>5-{m z5Gic*M%3=pb+QxAf9h2rOq=MTC`sAw^o%=%YzZiyc&LfRsqkbetE`yl7ew0*ts78v>x3dQXI=A>+%Sl`5=aZoUZtwn2o>*#!yc`ow&7=a19peYRrXy z7>nW+K#DTVXRrPK%RKkoF$+^u5NZ7WdA;lx<+Qc$reD6vY%Uhb-edLaUrGDKEh<8M zo`e5!{j8oL;EKqv^@NKasF>K}wHB*^A5VPp&U<85M0Nbn?PuTgCaqBsDfZY;#fQ$-TrwVrmlm8Q8kA6fTOxtPHoH!pij`Q^9avwilJE~7XCRu06)tdE zb$^1Ai~ic9*V2;ISGV3a4}GC))o63Q*xkk3Y-}h-)P+;itkol4V2?P6I^Qdk)PV_Da0m> z`A>8G{ES<_jjPS<`Z|416F$bYV4D<9R2IU|<51Z{ z+GUx=U4Aq>2F%($LV@AM&QB^QID_vV)aY{!#?iNe^wx5CbWI`mJ^O@eZp+ZDYG6sS z4QrcrArYDURSQhg^v<2v@BRMO*xXUChvqIhhiePqes!yYnd9~yc^HVJz9xnRRK1+| zgT4MabO3a%VK?!O2RZCxw<+!}Cs-Xg}C{9~xMh4vv^OG_S2&NTDO{ZhFwK!l{)3Aq0QVKpFXr zPp2Y}Z}J9{!lIJ2jZm}?c0n)ufo z?%bJj*qh|hBO@$Qq(-=X?J5++bf-VzbUa#`6*ASY_&ISi>1uf?jyoyt(BqP*0d6+v znP7P$J#pmAbm2>(q;%dqQG9I?JT{<}o|-t=&nKCiXrhT48o@=ErRx4zq|jM&sA_`3 zY;TryVoCpwN*S=gEB8@DiD;)hLB)CXenHB|oOoVN@a23)lgel(rfSBRR(%%>9>&e< zi3!0;wREcb*GvQ?auy-)9%`0Gq=Y~4SKg4P!zkO8Bo0hzno<+1l!lEk3v(~JeoZx| zV!G=(pCs2&6N7mFK>|S7OcTJHip>wdp2+4145g36ADQjwy{^CX2jT|QLG>APv<_8u z)niRMwOoAFp9P4NhpbPpZw_#yuU^=65Ux5ueq09H8#H?3Ukq*ow}x?Mee z;)hXwN=rwa$8vNQxwiO6DMkGYB`ydG;;S1XB*o{rWc`Yy#;!Z>yQuw1$H`VGxr0dF z5z>j%1L0g+alzLudXNyO%*j~c9~aV?7HxNxLnZ6-No)F7Xq^MPp}w_D&bXhhCaNec zo^E^Kph%=iCM*@2sXP_((l$gx!qG3~h@Otf_jg-Y2?CT1Yw?1mv=H);&)w%XgyNq; znapNhW7B0303RV!cBWdf6z?iY$dsiN?7O??#R2r=_c$lQ_)l>K6g+WXOiZ7*VclIv zo;>!5?UNIKt7cSkk>InS&xEjbCJ>Q4H*=>)oEn9w8Km5FUgsv!5OGR1aAiv@{u}Tt zNS1#{1Ym7kAmsD+VA&#qx}d(!HeYUFx_f7qPuk?JOx?KD8Z*5gTpjCJZ(_=vxDlu$ z4N$BUz$LB2oK=zsmxt$N&*tLIIsS74%C`RcU zEM6%lsOCYwZf)i|fJwN{iLchH;{0Y8>|Fm!+pHh}Q>z>1u$z6SYCb()JTKe&ntHod z$;cgZ1z|Lk^r32rVDMW(LkI_6^b3{sQI5bhud|7i!o*pzWmNUe=4MKA-1AXO~16q*#5LMh}PMSh~{ zj8Xoz@Z!Ifq{B$0*p!&E8@qmO73>h1=;Jo4I(HsKdLk{68mSt?didMJAVgf@)?#(y zFKaC_oSFGk@s+GdAD$TL$dq*jewaceK-xt%h7D>@B5DnQqeg8U77tAxNo>^VU*qlJ zEs-Lt*1sk-1B$F1BIWL6Me7`PDm!_5$1?!O4@jem^PG!4R!fmVpmINeJa#yAuwK44 z1B%~JXG&{?57&C3r3NZf?q^=V+EI;NS$qjKw=B>ggQfqr7>(tAVX+~x3=b{yOEp7L z4%VBH)Vz#o7yd*0N$i7UjbJ_O=v#%!OG{cnpZBNRvgl(?unxT-V)bEW#1pu14v zqLclOBZhu96f$@Z@7t@m5!ep>_>>u!DV0nR~{ zBN+@a!I55Bj9iIY@=GP42W$1yK2N1?A!GxUG@qNsNEKTyx!i|>4`bi7UT;riCSB#} z_royxp&~5^Y^DX`RWZBt0_$tctP4b*1@-h!57{BdwrZ_Ep?HfHxPRk9qnXTO4~=K9 z)KN3(jPY>H!u$%>?NbAJi|8X4_Nc;oQ6Q1EEK-Zf;I1#fdOXI?M@`fj0=p0(-Hz4A zB7egKFu6xtmKaraPvQ^mD`!g$a?Tv+V^tojb6~g=yQci%{liy5DlPIHm5`8PsW3m!g7`;}gns7~G zE4r*EG@F04n|_7u4z9uq)t#dO%&EU_D3_mPbNCMqzc>jV)%QB@P_t(!r8h zHnTl~*x`-w)anWmWLUb@X#K8sw6Sp^twq)yP9dg&%B3RSQ$e8TC5J2<#(Mp#Dtu~a zyGLV373lfsNyQ#y4LiY^6XI*j!(3;5GvXEpP=Ow<Gc;b6Y{<1BZ<`8H?!*u)k`!ytNmS|5D{Nn z*1Nnp9{J)P;vOwKU0{j?3yE}_?WOIEHt`2*ZxolpVu?iE7ZE*{ zDi^72Ki;>Nl~rf|Xt1QsBy*?Jm_+mnEgwBHCq6443YO=deiJ2wWe!M4bF18T3U(LO zd(%?uihpnsqa3QrtRsZiHpD1btkAI*B4kIxwa8#tP%bg-Z;>+&M@wl$JW;$yEcpJ6 z1@BFEE)w^vceX}yv#9{2xZAZaoGUCFs6WfftzDPKPfxV}`05@?S9lQe$S(C<)=~kt zZBlQYvKhZs`_*4Ju_bcsl{8Etyo74H)c~Nj;;*4b!uLTcX!&>&B(3hp z7HUr=V1}ypfDI1=!*Q-*gnH#gO?1zfyB9swp6T%P$XS_aCXv-Vo5kd9QPB96+_zpo zYJoCF7^)jvK)4b)EFm=jv6I&({Vx}|g=BIWDleyA5&?M;VvAxN#&HiDzPs4J!l`tD(>a`a zq#69u(45hvNu?;dCcpW?ZTEgMX~`<(>OoVB0)rT6W~IJSyHW(g!!>?g`|v>Hq|cwq8YR_D{WC#X6u-+Elj_H191=-cOlef|F8&&~VtFS$ z22W=0Dp1-?f5XQ!KuDdOn^{WQL%L$I<%fWdmna|;*VfNuv196*iaSQGo#r9{SQ2z9JU_51mZ`$V{(R;b)C;Ter=X5j=pbnEiOe zt9CZ1Jpb2??H8-S#`vktg9rYPL}ZVbFE6)MU;AH;a+L(8q}Zfr(9PEHScHz)jvUOa^phUGgKof__yN9|SHAVN$$n8O`-jU)I3(^g_RpyQ0HuY1IU+7>L z@Cx>zRebOH;v=$g7nv+uZcH8WD z(dCkJw^F|EddsB_?{`Led`uqFJXVSnB5EoaTw6J+ zxFefRg;1H}H(!vW@>|Dxf|QELO9C60z$kybX=@M+`Cg`u`Z@a2Nc{lT{WrMN{9&fk zzgB6S{N~|A!lJ$oG!|Lu0lLri7}@0YB`&#!-;)q=V#K5A}$V_f>}-%nj(>pF?H zXLRNHKK$C(W>`VvVIlF9i{vB#i_gXx7(s-0hvGiCONE5<8<|!paEMldT(FgJzJO;rG)t*;$JH5^1eb z^)nhPmIa4;3UTf*#RU!PpUc?IJ0vjPZPJ$b4Dk=IHVILW*jqAhk-dB1VNjCqc@D7b z^SSNI_|+|1aA{WuHg0dVR)~tYwMCl=&D`ww5ct{n4r7x+P0c4Szu|9t<|9dC0Re)HP4U9c{k;o;U z#;12-le7Ev2Be%#_^h=Z}cMd zTY8oF8(hs|W|VJcV>uHAjH@vhsaA=TpVv5wV=(>WPSEZh+?`lN$uuPc z6_F5iS8JwM(`o5wEZ0{B?TUe*m@T9Eg0`vJe;era4TQZAMnrtZgi-evIp*>Zdr~H>6e(cZ)Rq!H4ZX z>osj-e+oUsC=;)6;4drwrrD#L+8%b}vroD|>d6#@U_vs*%N~V1zN&;%dRJ(sPoTU=g+<8FSIkST8e^7JYPUdq17ML5X7GZ#VysuJ3H{@A|hIL-E=Z}HDd zHi#=JpnD0O$@iz}Dtve+a97Ar-p+8Uhc6`nz$aAw49|=2ozHW^C=;@sXoz4M0#WH= zew*Oh!ozxWAza6NUD?WhNNk z0+5bax9asta$q#$Ta=ll2Ggn_1krDFz_`T3B0VPEbU&DNLGx0;Qik!Hrj3~F+tJkE zglTXYASs5f2X1iXs4h*bGa}(XJzaPU2qu*53UWJeam=6=(o4}8Rw~!3uP2oq=pg;( zi|2aKrF>^5Rs#i=Ko4oF11fN61kVpFEa1|KTkW#@sG?%>8=9d~%$}6Y7S6wgQ&0yX z`gPZvO@8W?ZwSBp>}Z~``u-IsJ?FyC2YD4B6O?O}cNj*QJt8V}puZR%+IHQh0y;xa z0^2qnELm+@^jwu`u7T?R4A6s2EmGtJ^-N2#dj+;VSbXT?76tt)kVKK4%q|AKFe)Kz z$sVP8Q{KLurbK;-P^XgzEi-o5gXvtlPNUZ1IBT85R@E8mIuozRdwkaZj%<;PX5GZK zZ*XI2&c!lIT4hJNZ`mTa8sL*(xM{RCw(+k|u9T7<*q;yTlsigtqLRn>kuv3JRlgcA z%nuQ?8Krr};P8qAnU=lO?bux!xE`N zu`HNM6&?$+z@dsiWJW$zN6*}MUP`Y&gCDQy3`b)V-uf*K&y)UFiPHVy#4Xf35e1WO zz8TKri}Z;j12WZ~0~W!}fF((g^`#vKbP0~V0y4|U0<0!Z0ZGwsrHVEC-h@7NljPnE zD;>656iiMW*4%~f^r;n}az)=gK+DuqrRROfx2ebpE-$4H|9qu<|3zGsinu{? zvPef9EH7#5YwPc+Rp!ELt_V5q+5V$n0~8V+4_@=?e#ZC9RB&xe{SR&EJ@5~IN-APi z9-5mzRLZMkQ9wZEo&>^sBwpQQS&veBa+=QlrQ|ZB|L%%rJhaL(#+%{(5m_a1puAM! zH=2a3Vtvwz&PWU`m@yxXb4nGd{KU(g!)c@EgJ1%W>qHJ|zSmLoL=TfA8k-OlMkR|@ zY24{{24<-3qpxB*bq_i5p{6LI!QU3^#8po!qCgZHTMT+5;7$VhyRnMlO7%J%9ocJD$Y3`x&JgmG(Xg_^j)^Z%Iqhu^eFfB*al2;b@D(IbD$3M z@SMb~Tqi?BF0yIgVG*Gy&&IxOwI`{+fK&}Az16gYk11T9Sp4`a?e)r2N?>P92Ha_C zgY9y_;tuR3F#vg6*&GaY;h!0!BEFd50W1Tx;7|7_AWVTCt$R9<%NQHJyH)=a0mx{G z$jy$#w3Q@x%0RUyuIX2|znHq5TWDRHkmTbmjS6K2_)Y0cQ?_>D#fSA(UnjSaTQ^hs z+J5DwKU5C{$+CC}wt>ip zDWrrd?F)hkk4$vJQsC)e0wfGn(7MnlRPZZGY2-E`zx7$F21@Qu zyOrc>rZsBjH>=lCchB@woEuA-@J$N=xh^K7fY*b$G6b;;pl- zw-S8}l%2jVQ!5@7<{N+c_?xeScsG_iF;@}naP+nJX7n#{%-UomSmS7bSh$itt?r|% zyn={SWxVy&HzA0N1m-dGcA4^njbDrWLH={cPcIm(0oGG}QL;PMk4Di)pcr}OcU#LT z&&q2vV8Djz^}`x_YdtutkQOPqnB0TX%YX#PjAT9&KIW6M+UKqJOYMyER*>9#Py#kz zMZ}4MD$9Who|poWMuobe9Y2yjt^#?(n(L|17R_oI+awaUT^*9tOcIys{iiWGq$&8R|1r zIm*6jY)A4?6Dgv8TVO%k!DwDg>egSKlp53BdP7!Cd$L!{Iqpm_)of9ZbLV#Kr#BAb z?UamREdUyx9D`TOWpBHq&c^cAL2C_E#IwT*V8si8Diam5KEl$?3*c-{2Abii{l>cf z3X^VGNRk*p)Ywo(IfmYtllEaX1ZG=%!%B3O$6IZ^=r|+Z)67-&DBl&^t8 zpNl6z&BxZYIq|DP`v1XTjzZIT=_b|wmu%Z zH>y46Lrpviz;x5=|G(wTi@?@W(RL@@Yly?;ZK39k`*Y~>viOZ*emn~mk#u~(WbOAQ z8x{JQ5cOVftxz!IBmPe}4Aq;1ZeAeuKjL|+@7z^{ zg!+aoYAoK>&1(4N>G|xH$$`ft6Yfg+ACeOLT0C`)5ul>GW8i2UCq@}d`qxLSKn81; zY+Tvh+4a+Dhdo}AY``d)Cj{`xHEU7Kurj+5y|sU8@qW4`NL1`(j;$D`fR zCO-rdVK`I9TPu)?6q8XSQ=rHfN!>T`Q!^@5!n-}S;rKHpBqulNiE)^Rf1z0y98DEZ zUCZ^MujdMFqLE9>CqGvz;QYnkeUsGuV@eZat72V8XF14ZQIU*zH$Go2G&$liI8FGn zq_MvH&zxqTIaO(#ppZ0KhvJ4tWoRipR45#tZ3p4?T;f2`W`ifDoBs7`09vuH{$%f8 zP_s`%+<&1P_1=XHf#q4f($*v(Tzvx`y6^OWnM{!1b8TEjWmS4D3Yc;l0W%0E6#!#v|i<47q?<-1r2g-9U#5cTu8Fv|F zr%#MEM-yHS3s{-2hc)fms#ZIWg*BP@D&wz}4+tV8%~fQWsl|&aE9r?MAB7O1$;=d{ z&er#bMQ300zfly)d-_MAhykn>6DFbd$-{{g|AoruA%uKU|5q{frzD7MWZBSL z(PVu-f!c4i{DKLHl`!s+7T1h z+{{uK(a(qvIylntDUgxhPPYsc-ee=SYH&!gK6%KAi`%J0-|LJ`ANbfbM&B{;lUJv90#k=(-!}^cNTsk%j zrHSvoq{s<%cUDC&bUYZCy1bl1PVTa9A_vgG2Xaisq_ljr5v^x(PTum|$gNMks};B} z@g(LX`59)U?nqjDBWjo8$ZJ1>NE%ut0Be2;MkG@9jOJGpqvY?SI*D6XXunS%th4HsS(oV7F} zISXlFIim@U93K$HA$vH6`fl;&$W+>0XU;`t4U@boFDYeW**N5wtdOe8j<@)U4{~r| zvNrSNr8XuP-Kce4uG>X@yoFbi=tlUr!?qrdxEcwKB!UoS>m1 z{l#>!*-E$k(F1VW%+|44ZxyhxnOp#qK%JEt%Ae!}4^U&-E{w#@LG9zK(#Vtsk)Hpm z;tNxlg&C$|;A0a5FUf|-3C*duX0KEJV#sjwt%HZ78XjpD81=M$K${&1z|OUl;Z7_?;28THnL4!tAgSW{z2!MWO08dOchLXpGkyl5*)v78?b&ci!~|!G02`nwC4TpRntAZq`|)s2+4zC>d6r-WH^0;z z<@cELnmZa{_3JVAT8Tj(XGxmK=!5p-fj)tvOLzBvbey-_w-5YSe@b9`Vg~ThfE6DH z6eefmG{<0gUaFn~sgjAE0x9}s!yZKq6W1NJFP2x&v}a!l8y5`l$H$g4eG~n;XV13U z=l)rK%4rKByb4E~tF|6A(CS_-69&ag@B9);j5LNE0Y6ZWn9XCHMoU&rAam9;ejcBb z3x9gq)Z?fx?m>QoEFl%RAQZ>@)V_^V9vqya#L6oiQ)z#6A&;D)_Y_oBW^`++c>ZSj z*OB@K0uvlPcM9(SnC82(f#``FHtW)z3-0xy90@zWEk4F+kNQ91liiVcRSKo-BG~*x z06oU!A-?#jF{=UID8Ua(6ujQW6CLx9uKWjiD;S8w$;qRGl75QxPG3&;p#-*Bdc^rX zi@W+Cs`}4N3mp)KE-&6t9F$Y{yPC9L>*bSks24p3zt1lMyrS#{h9oCdX|z8m`2|2Y zDbvlwJxXgxKnxnKLTV!3Hcf|Ic?e-HYd&f;35{LSw}IT6y2JO{`M@}X7R(G;AC1lT zRA^+^%EF)6isAG=`@PsAWnGfUZ_*jT&cej*`!R{Ykw418*-VqhOzkG zOHxG0q9-NNL;JLGb3U&HvtY1Dl#dDpN?T);*5rIX39R)uLIbm)wM25Vqu<312k2)k z$;tC_J`ud~lL zU_|i#?*ZS$XszqaS&36bs%Ny>G~M}O(y5r=^){(0>?CDngB9-@V~;y-N1{vI@(a(4 zrk9;Z@@}cQy|FIdcdS2ciEcKxO>rjcFZ5=od|^$={g_b_3$mxg|*`?fH&gpfwrF|siYon?|meLuBoRqOC;Hr6RS8NozYWfkO zN-W9$uaSk0{A5;D(sir3rU^RqnSls+lJcPCpZXA`e{7=em+LR^$Cm|A5qe!r)dtx@ z$=~U@&`D+%DxA0st2FqMGb2`|O~*{&?kw^U8Pj>gD*eDzXyR>B{6WjE8A+9id&;xN zw-=SyWPS1Ze{PIPau_w+ zksXZaPy8iwyZdc)>y&LWRDUkrx9@iwwcn-u&)3*$sefov#2I_=+&u>$_FL#axf)or zDyDTTdkPQb{slR1g348yLAajP^&mBRLXHYy;@kI!jSHMq2%~lSUgevw?wMFZc2-7% z>_Y8V;VIG0-3Rql`WBG6MDVGB_F!CI_kvSP_}9|a(&EsBQ~bl>RgMC^Vm(Qb{=60y z(%Bw)(Rwv*2l}DpJX3J73e#XiM3JepO!4j;Dm@3HpeGvPBNMH^Cg=vkW0d=YKpLpf zb3r4N>u$jxcm$NN;S-%EsOxEnS;KsFl-xcwV5ihp|Ix!Y-Gly{XB`N{#D^ps^|?Q8 z#6>lP*j+5SYRwCEkyngO7@*cXbgQB+CorqB-~4H>y#M7zNgkNT-kdHxWN~Pv?l#fh zmF?SZ0u|*H$!%u^qd~Wnes_ZsTr(!mu-jvm=a*DR8iERqi&d%)8TcW`CG1ohUZFd4 z%ierJ;3#gptko-4O4jVLg1b`qJ54FaP~2)?_EJ}CAIMpu(YOc28X!sb0SV_f-TJTczJr^8xCq z@|oNdlqM%YkuMTktIs?Vo>e(oIa)Ej|5J7MCeBE{XPQPXeHZcsj$R7t=fs!Hv9?3a z@pn^@mWQ8KraQDrVKlc-Ct9hAi!8h#{N+JyHNs-@_9Qk90cK-~%N;HRU;eM)G!Voy z#oc-+QM{h%kZ!E}wR+d5j!78L>uk(*H(luHMnUD!x&6-`fSnX}-FQz;sOx7dg++y? zz2`4SIz4gTVj6sAv-#5^(|_#f_TuMx0byZkRp3iX$nFs6gRtiUC*v=_<+xS&PBg_%rOyz@5qT%gA9UfLp zwd&5+RA69g2ZU=@4-5_vTygiZv%tgo_{pRY)$ zE40pShVGp)y%QvbU6mS9kO_`3{tpM=%Z4&a2&xXry!WsG4HJKnZWbv)Ps#I>9!CBN z0jzMF&~?u6U(|>60)XI-$-hvTLvy#zNwi4$Jf**zE5|Y+Yy;zDbScekDw}76b)KyZ zOG641ibVX9)PN+=sSgAtV?=NZ)o%I8UDe7s+6@bY8TsyjANtHUtAj#6z_LiaM|Tv^9)L8d4IjwwNh-$ zY`4TKYNBMiZKnu7E@)*%0zn4zkUu$lApRq>kWODm0MT;0YS=k3}pZO z0dzzHJ&9F5$xiy_fy}V#>mQ@LSgIqUCmZ^OH_B8|y4nb`xcg&DSf`d_+sYpsHm+r{ zlcYv}Tn6$odJsLxRRA^rX+`1#@kz-~G2v3n;-TeTW0DZT7RvNho3>2vReZ&#i)U2C zJnw#s#bCliQOOP{OceOcjGum%N<}NBM_)T)vYQo4Y@F#e1Ec1Fj^%uyS<_1O? zg8FBg{^`yG;37QqOu(!cj%F<;d6eyR;{yl28tj9sxzM*Qk}@xQ3(vHeUxopm>`HlK z2OnU625AG<`w6GdBz-=5&3(WJRjtmrT4S^QG%>6K&T75Y&Q_*Tt2|LqUoj{_I!Gs; z_Xfk7M1H4$(S)f=DmJsr^g29rj}-P_hwDGh=PNvT@&QtoGVa}j{+`Nx(ujjmj*A3a z>^;p3YR7NIEuVgRy`y;_Tb?G3K+xevFs0g}<+UqKpW#8m&#Kfv+3#bVuEv@S8Ku+T z72Pwt5(Cw*Xy5t*3#H*WG{tGbv z6TT{{pkj7?Y5&sc+*o4G_}$)xqNtCPB- zf1X`I5EinTJiMkHG$@SV8<9)bKuP^!D{Qkq{MjJ?G}2w@G(~L-MwCBSf5sSy=D<&V z2)$GoP;ZiK;JNn3)~jmw$oSS>NT=CIk<7%`aI393@Y-uT8te4IGJ7l^ zp4ap*R}NL=<$p>7ODDX%;IuFxJ!6zv)rOM?sYmHM@XpOh z$lg}6VfB3UL|_v~HY(z{?<6#iwBCydLg1!1hJOH&(K5YdEzIb9Er1k}Ru7s35hbrw zJ2CF{#mSOy#xYh7>9*)%T?8p852~Mjg%sFQ-2f#YKu`WJ3-IS*USpIUhRmw$syp*P zaW}%#P5^J_#f~fqojW-mYSKE=45YlfH%OHeMHsJql%UP*J}(OME(v4N$Kr*D8=I@g zO*KM{xD|MwSZbQ6q-*g#KuUgwMAD4F{gb*H^Uqf&p*;p_PypOnXAQFo`^x*)yJ@~7 z-~2T?2uE|jOtgnX-Q;?Ii;-m@?Aw!+Nd!Am_WH@#4rU zBSELEz)OTszf$g`RGo-3PB2U`&XbCi>U9c&T#n)KsN$l`xaAiWeCkE#`E4F zN}p4oQ#AI*=nY7qYs9ioIKwa@$iEw0{WyiP*flZdp}V4_z^BPmkE@rT&fFGHL0n3d zl@`Zoy>tKV|8jtV&$)JBJKz$|=|l3p5GG=xD+tLv(kD4gLZ`>aU8~)HJhEbP^2{P@ zSdrOt#32Vc#}qTZ3iTz2bz~YgJrXo-lsCHv@VWpB(sUyo=E0-A99`{=MsKX`+%!yJ zW-j?=oL?k`|C5ORY0l)pFP~P1SYnieTI`Z4_4-J($^_Xwyf@5C^?=rYuIp&NYCWm1 z_>4_6l(TV}zeALT*{!7d2x`)v;1Q^Bd684Sez+y@P5AeucqXM zDnomZCNnPbj(Q(Z%E>_9QhAu)0N%k_ULv~)%J8CHFqw_go$(I8Ovg{omu}hHKcM$N zzfC02yHq_e&Q7U#;poTmL#O-Ut`xxXQ4!xwp<8bHoLtO$r{I3<)Uf{{j~Vx-$-qzc zUl!}%xQ)}rMfDx$>6+Rhou?Cz3R*MxARTtOpV zwd+t#W`;Ksaf<6c-K>&RPq$i`ktx5zbdIF%HheW1!cZgFeqWND%ZW>}h#y}(;(YJb z?eCt)cjENA^J40$%EI)BGYO0W(|v^iVeUF2yO3^ARx1-_w#Wa|%HvP|`?v902wx)N z4XM0vTbEAe$HslHJZ9NLzm=4+d2Ic`b&PV-ja#c%st_4Q>(QS^i8KYc_bgeP!_;_; zZLavxqwDXQ?QQ7V%gNl7ylV3XKLn@NO6f~}X_1_rRkVeDct(GlaS#7qT3y1Q zo)i+;-0k%4G1@9hb-Zbng@<1v9_GcP+x&5^ZP{Zvlh(a>m-%q*>@||Cp9hJjxfr!2 z=&9qtnS~8k(DU=0%L$D+w$i0mcsyF+W9ncuVG~b+c+9{~QlN%Xs$vziT-GLsskhxJ z#|2XnS$XlRA0*Ax@j2YSau)8>nNOf6u3_OUTRFKWy|F@JDwlGSvo3c+dWpZD#G({A zX#x_Qs${?cC;O`Z8ysa0Ja^<3-O+1fbhjl*KZnx0K9BQix23*>QGUz^>wehlb6sFw zUp(*m!A*_eA(eL8=8ZJ7JM6E(ap1}i6{FeqvYZ&D&&ggbo7%<`@v$EjWD;z2b+146 z^y#i^c1dZ-5Np`b+N*%x4+{t$txxY$dd*9Q&D39@{XK<56f&4C$A2f4%ARko1ePQ2Kw{F~_&5np7}9IC;P_yBfeJNkPkSUBnxEFhW0 z^;!uybjq%Yh5QfD|L1TCN4V0_$(p+m{DI`UOO@*VNhlYTvkP|1AH%_Z!Hqt0n#2+|iUB{;t<%P?9JqZ7w##}M>o+fz zWB95!2W@uE$7v*%h~yUu5>;5`=^W@~;fwRz%?lfhDvQJ|q)OZ}}K97=o` zwRv<_v(#M7pb$_{|GWB+5u_Y_3^orEg^=;RwmL17ec621^%TYhSH zinjZj_2fl0x;r@LY*AkZiQ~)$tv!k_sP7+pz)e(&QZ`?hn(2iX^RlBtdeq426i4P4 zyADjUq`CHoI+(kel(nRF!t|4smIrF?-T9Dhj+QEJZ~xX3w0xrm75icN!`o3)^0LiX z)n<^nmGj$8{DX4g&t<6yPng<}w$Q6gU761FWGQYt`-}tj zX;-T=2w=Ykqq|l=5qU=FKs5n`jGr8SftkNMJH!-J=eM3x)S7b}OM9a0N^TZ8%8zC1 ze)v)KZd!NlmoE$VJq4Nd7Ppri1_)YRa&YB6=T(g)9RXUy0`ZdWD!ztiGyy7n+*rle zfYS z>#OfS*mnkay#9-Rd7Sv%?iH%nx^W+32gN-&t*D=!`5sb!wOY4J^3N$zIxmnvAG>RE z5D=lvp0O#db(_;6fbga+)|d2Waq_{pcqwj42RZdrWiFZ11DY0pl#-3!mt9^fh%T?9 z*uX+PiE$e3_Is~u58Elw@v3gyfk_jj!e062l4Chn^PfElr?G+1yt!%LF52c7`^3I^ z3KZ{AYw_Lexoyj4+of+S`GwfHgFsJDv7tCPGS$^p>ZAO$)3L#Hp+>m|rNOnurkS}U z+|2=s5XGxCZ>Zb+$izU$I)!CPLk}T4*XM4&^FNDo98vXmR~t}zk4Kd8f!?<$#hI~@ z%(q=W8?R+|OnAPDai4?umx((=g6cxTT73cIvWF zus7hSJ=QRvcmw(-bNuqjyGnmLK|K$J$3OFEifx3No}WxM-i)3&cG%^(D)7ub$Ya3; zIDwSI!_|YEXym2f{Rq;DBZ$JBs{6=3 zKhn%ZXwXO43~AfiD1EcrPIn@hi-_SBrt+qqni1+M79NwpxM!Z$=%Td3hV!4dF!L>C z`N_H$kLX^ORek(sa`0!P-s$?n%-zcICt5J`_}V8?EecV8D$#%1JAhNXteGP;j~_Lc zleaVel6-WM76r5QmM=duOg?Y1T+z?koBw@&eBSGyFTB#y`{6=kU(l&Cds&MJI!c>2 zv>kVH$7}Yj8nMV2*ty4H=S6$dlc9J;4W-*POl`vzH4Ou;$otz_ zU*sa9ZVT>+WK`mP;XMeGc9ytx_M;do`h&l9Wq}jYN zRIW*ed4@Zzt0el6>{zb|#JrQc^UEi9JX{c+7V^@~OF`R;<@@Ktji4B*-Z}b*eZYYh z@X!w`@!7S_%xc!Cbt@7CVDC%kcM)>4*$)Jtmo7cBdHV!(O81O9~SDb1-a!ANojJrZU#Its-_`n-o>Pi>wntfn%CP* zrzalwsm~rd?UVaf@}GFc{0@NI2@n;^JF&6Qnma>ifj9|gK2v-TDs$&b4@VIFOx@>@ zEEWQVyys3zbpR=OP9GaQow_wGF{ME}WwWVxLHiNc&!f1Yz9>={!TRZ>04DD> z4RO~-e>ZJAk@|Yb)qBna`2SwH4hjRmiPpTUu>YJTZt8h@fy6+U(&Y)i35((3elF9n zom#-T~8E`G@bL{;Ja^p2s3ys50sZjN-_SSv#Eaa@=ab<#D)+sh{p*`%D z*EUZ!=9vF$)~K?Vv3_KBVr5R4myMe$1>Qr=bjVp2@qbL61zVKc+xEALN~ko53Q7)* zfW**}(%mK9-3*8#DM&X%cXtj$jEFSSH4F^WF*FDWytn?h`+1M~0_#|_?zOHs&)@ap zuGeEdj<65R?4CI$2AP~?XOoo<=1+`eJ?st>gnJSqXcc?n;B~ujB<)406z-WHgCIac zIJmz3-`glmjVwXM;4s&Go8R1VVA=0~$>#Otfn7?nolt}uwa^~@`mnIiyMd_3fzH}a z`1A3a_ihWpIver24pY4BnLT6-a_SiDtsdiZa%mOpX0a$z>+G`fb)k&sYIWV@OSpJr zyup)^(nVlwujFYvHm0`}PZ`#4HyC6<++!f8cW*&$32k+LPP}|GdWk!rZ?Ryc^e~lA zUV1@*n~C1nTvzWVe|52@3719jk@cwX)u#d^>L# z-ZAieMy$Ck(%h+{qldp#&>r^YDpPGJ^@N2+WiGyELG`j+N_Al_ z_w2!Mzt-hdsxL}ZbHxQa3YCd9H_7wMYCIkbZW1J-DvT_|k6&O47W`A?OeDrk@wWY! zB$qNG>&gk)Nxf*y;yqo$o)uNn-4U-YZ3YB)q&S?uFS*sGqyBL?d6uasETq!_f1Nvi zUrHZ>S?Eps3Vq+*GcCKVW|dICT13-mRZl0_lzVNH*1cTww8wR7ZWUoJ5tUxj_`y!u zUWd2;(Y0oBa}TPLcFzyf#fLQC90u=?>K`eCD^C9b=HC#qOv2{G4jX%wOgq)Rw<7D_ zLwUWFdB6`fIyZwL?$`9ccN`$`Hkp3aQ{M?8`d2*jPaQO)Q>uKbUe>xieqMUWG!jM41tKY+VHHBIHr{@;l%TbMfih^E~ zFY`5hlZIFk($#RgTyZEUBNqlllrx4+M+OdGeqXcXx=XbeJWH(8DE;Tnop+ z^>~7!f>NlIW#VDFFrQ?g@sE2i&z4J+Zt(3mQkcdb&G7qP-gp8ad3yh?NxWA>V;&P0 zpw=tO`Mu(a(XpfT={`9}iXxY@;dkEnQ2dif`=DxJ?k)#@#Y{515%{2`lO?BA1 zN~lv!X%^TsGLN^#rBvLG{f}1SIfYq1==C}LN|y$pchKs=$r5f|#iOazSJ4#4!@VjZ z;V#d-qUlI6IkRR8J0JCCHMpg_FYv>$WN@}a={9rd;$$eo*B;Zja*{G4-R6)~2+Ct# zlD`FQv2|=O2qV1!Ydnnm^LuV0sJkx|=DZQzkFml7v@DInG>h09ZC9k;f{ht&v^2Y# zvAU7!AZc=nDX?zr@UWtag=4nVMz(-Pjm)UQqo6Us)UwPI z5y}^p=?5hBdu`w8DzLTP}v4zfpYmfwsjxjMac__clRAwFCoNgZF|4UHSO* zHb9Nhb3rTw0qn8=77G-ziqJfQJmLmkJsSmhW97rQ_fOYCUw@IpJ{!IZCTksQyxe{k z+$emBpzM<6v^1`*bX>1;GMN)Bk!yat?jx{H6x2t9s?rMLcsSF|lgPlkFg81QG&O5e za%7h$oJ_2iJkPm5eltL_w%($zkvV>I&>{OVQ$sOs+n zrpEsTX#aEIMmeu*G|@Y)-z!Otdc{h)g>-$NK*Y|4ABxw(S<2hQ$V4!Af?o9uRMy@{pP*H^1(NzLCYQg2CcuRSg!uyS6h_F%^vjp1hu?FwA|5`yYl zcl+#NZ=vf}^AFD#OurnyOc^9_ZNKs)zR3WEmvJ$^6}votrAGM{&mQG&=LGL}*3ho~=E=z2`)!ljTip_cA&ZS3OC$(5iNY4F9NC)wrlJ zGampfh)THQu2VscLex#TOt=TtKZN$3x8_(5$Ja#X`)o&NP_X@34$nqUk3?p#Y1}p!~TXW z-xU#t$=j-%r{41!gW4lGcS^rqAsgeb1F)`JFuz*d*0On!W5VPt{)i98rI#HOUWbH> zkDYHvb^4L{1RTfETF0KrMEp86U!{}$z5lU=Vv68csu!9CP`Y17%u}E#QK*tu%5d1) zS`JjVQC*?$x411W(%II6M^;xU4l`}*iU>5cU3Nv-xbbN~WMULjSm{jaF)%6Ak$s{6 znXXy|kCqTB_ z@%v8Yk~jHa8*+_!Nni5?o1nxI{efg+V>yZivobsaOca>8VU=!>mzfw(^Ai*|Gs#%T5jNB~<%py_Gvl zpbD1x0$CebRxK;d|+Kn=NqNqeXLG)@3M}V9j8}g3Eqejv{ zxBZ;GJ^*1;_BNE=3%f-uEz3C>{>k(9GvixIj7X0W`DC4DD-IA~O!j>?6gt+{x>osB z+U<56uq}^%Yxw678Dyt4*&>^57j&|syw@p!NBHpYuks8BT{(Sqpsi0`FS(8 zA3!G*e|pnH#l10-asEBsSZ?84e#^-Vn_gw>jT?dCq{6NILOAq+GSJ=+S7_N<_2cUD z;_(5yB(6MS0)+=q`Bz!TvBZ@t=e`OB28SZlpzRluBB_xCZJV4W%NKO23>4p_+f#uQ zQ0fs=I^~fj-D_}8tNHatqv9iG6g8}rm(pEbN_VZs0d1)M2yvb;*(j(%eho^=5jh}p z9qG#xQPs?fiNUM#yrFyh!ywshI)WI3b6ImMAZ`UYM_l#_P;aX#@dKJSevp<{7DE&~ zkBuLMY!Hxp4L-mINM$$gmcv&dwwh)T9BCvV2`gmOL5v@4z;8ITpqaaR#)0ModL%&j6ojYft6_CvvEpge>?LcmgEN{Vs-ZzFHqk zScXXJx$EXn$MGr|(n*l)dOcT0_~qoVMCILes~CZ-?o;EGa>{2<+|4R*9^Y8-awG1e zi1ovYQlt~%yHWW@CH)uUyvYiVqYS zkT!Bac_Hv*q6~4@t}FOQld9X75@(#VuxJZ%OtG?Wtw^5+zv8#ZG_`*N-uHgNFgNQQ zx&DN}3L)lqq>Yh|Arj)v02qt{yWF?^Y^2foZd;9Kpxpw(nUcC4M}yei*2{rJlSvKr0{TyqG*i^O2FMj zvYz9339?ov`Jvsl@oobR6<-SYZ&}1biT`{NBN;X8CUe0`iwV|t^1pPWs*6maO zGj3~kl$%qI1VbSZLMsg9 zJLPwRARZD}I(oj=TNBO<2A={!_x^o*7~eF{8=khAaUYGKm6%aq8f91uWh;iBmMIGY zRa3}XwotZh{v7hBMs*A;=TPLlt`O{|fsMaXDB}&$`I`W%RjW;$&<3Z=Xc0&cy)XVUSTQcSH&|7g7^tSDUg6i5(sLybj2o$qn zlnV8%caDZbgjtcANyM4^Cw*?6@z+(&TUBfAY!Vg0JyS_Vl`&iOC*kYyLb9<@l*FYK z%B<5n25Jtx67WNXm#gzK6F%pbNL#P?c%Ai3cl(hNliF8qsSKd-{_x#Kp>gI9yGk%w z(!uN8$X%r%T{leh+~5obLaCBPvM3tP25OVLil01p^^*q_pUMERGf6Gy>He(J4R>euDB-rryk@;%rO;D`|V+>4fZa7_y_ z?Flw3?)fPC>^olM)mZ1v3I1oD-Ui4cQ-PI?1_!ef!l-AM(coJMLrpNwrO!;Y&_1QP zizvS4VEA@?F<(?D)Zx=b_ey0@=CFC8P#}My%;iW-x<& z71HURcF%E5sTd@r(<@8&Q1FFlvz&jtFhckq_SvrzOEA;QLXDSQw$B8pM81Il%8g)A z?{gOen}p1gFnR`w#Fm;YW6L-GP zdIi`V5R~K`s!9*O4YPlmr~G@GA|00fbYdSvE)F3;|~qs?!nRs1|)Q>LVHWB_Fn{1t0zd14O*LU8`ZXzD+H&CH7WNVjJp`Di59F*<)y@4lyDE} z8(@fPsvXC&UuLF9*8PPt=96KD-Z^x;N}&xjdP|nNw?qpbp_tx9T6uk!vW2LnAsmB+ zJp)TWIx7p9-f#IVuUl+@t(Q?TCqDNi864R77R+Keu7@)oRMt1}N>I>T59e7ViKg`_ zf4}A7{jLnX?{iG#(SoSs14gKu$Iu&vrt)`g310prl}vDn-&GXrEBiCZP80VN%XMNz(3ZzWwe|9voTmXJvrpR{JA*J z*-7eD3X4a_QJBB@rASD|7-aSpKvrS-b!2oZm( z!3sL(*z}pdx(}$lo^m+Day%_0;KN<$c&ysL5?EW?x z;LQ#`YL2?rT&8%W8Q&k*G|^&XtMaMZvtRC9a1n}C5$48G!jkDY?j$A8jh9lwW6mod z4Rp2slOnL99rxg00ueLmCMku;>gwIQrPd$Pskt!|ebS-0T+>Qkq)Op;&_>RWR0xtg z7xvjbWm}knV~d>eQFKE_>dzm)-43sL*r^v|e(z?gei@N=<8l23=ONx^BK5MhLkVSD zk-_?~+G7f=)Gq&ddCOE2o))wM?HBN_VH0Xjv4*CrE~;~oMAoKNW;WCzyj;>`o>+;C zasmoC1{F;FO}$bF*BHo7Z6C~`m?r900x3MpKpKO`AW{s2orP1p{1zMZW31MXRc}Ru z8WH#=Qhr{T$3Y-3kV6H#P^k8gFci3Y!^km_uL3n;Hmj-hvX^SR4@=^3Bqdg{CDqhG z5yNkugjg20i_uz3y_B!XZ(TY72SMUU4^UVM)I?f^(8nc4G^wt3=H9}e>-UmlYs3jE z6mDk<47m?>lBSp}rj8_}l$Q)tWGu4oDE5@b7dG-AZ3NFXeO;;d$L<$@$s3LNGVL!#2n`rgt!n!ZuH)W^SJH`pS6$P` z!xgLwh_m1!QnVg7pQffK#7MiM9ebgEKapbnkeU7s#EN{w@lJ*YICkeqaQJf{+-1lo z&{O#NI}uCG)+hx>UPB+YC&YX)R)@ZNgWe$doBRLO>cEJF1{Z6Vp3;_^2RsPATil2M zyJm!rxac#Nn6Qzb4S6^5?><;N+ooU`c}=)5lMkuT)V={jW$dMl?9dVarh>6llB__P;?7mrFwy>+R#K}KB=f1DFr$~QVKbWpxswm$(4M8 zE(3B_{!;Wof;cy)Vej3?=FmfBC@x%gYT0c1W7>eu31c)0pDobcY*UPQYet?eS4w^q z^Z0OAY3a3}lxpJwry*W1%`kW=Xg*?O?($e}3gml#8gx2OUepF(on;o^rO22eee43f zKUUe0vd$?8b$rUqG1h7SsdA+F1xOA+MTT2SA{ScriN-P;a%&10!<|9Hm4ybCKAI=8 zg(N6w{LX5(m;A?p@O2^or>}ib{IoXyrd%|ooF>rHh`5FYo4s8PCDT;oHgW1q7(cqQ z_CMmKc`$6hbxt8ng-L}7vtTT>AHGS^`gJoZ9wCPnp)o>aPn}Y-G`wAk35aoyevW@; z8Y5WLk`&*3pwPEUwzbi>0(TV(?|fFK*c_ z3d?%eUKPjS{ZM*%Yzpa{=lo7tK3sTJL^3*#%j9g|555k!`ZT>!oYnA9@;4>5iI;^t zMtPM+mi9T5Lc*8X6f8s9mo_gzzC81kv)&G=%yYtd9A;99cwW@Acye>Vh+QOiB5|L- zZC24yK?KX2zE4@YYL)e+vHHKy@O!{N7*b!hebkV*uXfM3 zScuq3;WJ-tmAy(#xBvBCr~ta&^diCGIr#Vj{@`IhvJmi31pZS=FL+6v$(BJ*NaLN&QiZ&c5hDa zUvA0)kTluYDs|;cc_7U1+2jfkp0(I|EfUlm1LaT-?_+%%{jEsH;id9%{MNX6Xm{7< z>lVcq-v^jnKXAX2MXc!S>y}1_k6IW2X(W`B@Zv_)lWy*;6_KbOUS~PAChUGpb zJx9%|GvNlqer?lc;b+KWpFt7xX52H9e6_fR=lcG<+4^c|0e8*L699S4jsap>KeG%oqsUK(U# z@Q3@8paM{mteXdOfB43!HzD`r%h%@)f1U1hK`_-bPn|0)Pg`B@=dnJ#o_Kq&FFIb$ zcu8i-ianx8wzZiEmo; z>btHqZdxr9pqvvUn3$)fKar=Q;yB1Ki~pkdRXLQ77*oM<=xt=eHU6$EF)7|UXGbk- zu#_`bB&&6y#_F{K%pjN~)9t+ zsyOx#*iF|*F*%Aq^${_x=DOYw{-uj^hJboP{(7mFV4YDMn_Xc}<3Wv8<^~px@2_&i ztGvYUzHrbN1qk#D0@fnyq(oqZraBWlaP-ZJ($mY?u7th}{Q9+2Uv*0hi@rgI66v~K z<7CiyL3hyAV&Y2lgvc&OH-{1sB;yEC#!G{`y@(sHUH;DJ`dYUR(*Ao_HO3| z-OFKNDQ)#`_ATF@P<_vXGKHrw%XSb)Sl zDiFw|N5 z+WpxaJ^TBGSdEM{_8Jt^Dl~=Rp+PH3$trU0pA~~~UVu%+7&>LQTK;KBqat6pV8!0t z5E#S#R<#K;ucAZanowD8F=qTi@URD0Db!DYf-XZ8TPG}4uX+9~M)2lSYKx)`KaW?l ztkqP1#rM@mfe~76smu462{97kYjkm;ynB{N!W7ND(=^taY zIAAeOYLMy`>@Ne$NUrvMjJGfJ|+I#}_7he`kol z&EZ7&dKp1Z$1YH+x}Tp&&^HhX5D$3K7|4B_Tcx8ubKwbBIp-Z%QyY->pvj`K&t6(jEGy7X{DK1sIfE747`Uh{OoxqnrFGs`nkW;@ox1I z=JVm2v{)`(ciqSSLZQRpyfg}i$d9}a_G0dhroDLZ$VLVXxQh+8j#&%XBi~Ytc}Z4$ zO(4YtlDEx`rP=J$g`Huk(WUiz?Q}v5J|?R*^G3V(WAho?i_M9T_8( z2@9D^7j*q`^yOVhq7M%T-7V{3+{1<`tefD7{UwZskKU*1vO*giucV70VYe~M+Kk22?zphlrm*hq2Lk-f{28vUnC~+g>=jFm zbc^39C+$JSJND|5ip_i&UVQh$=ApfSfyBvEN##>~G|GWUgSSsX#=d0BH#)8j55O11 za=f+srm@GD<{HJbuTf!kSpRgyk_6)eqTZB6J02tG(_JO*{r*z^TzU(%$lXUV0bk2% zj|u5djA0({Gqwf3H##SS`GX)9hz({34DMnk-upny=s1~EP2mTrm##x*vT`SN9zGH> zWg>#h?wGi}ShKUyNH7x5|5iF8qlgeg1CYFQ z{qAD@ulpYD?6j_w za{rz4);G-&&xo1@bJsWxI9$YN;(p8&;Q;{E!V<>w;Vx1J)a|>ePnWyE50i+e4z7$B zkR8+a@L43Ix*OAn!+vhH-xYcp`k+?S!ys{aLAhbG)`v&`{+ZUk0rMwgI&w^f!@Gf5 zZC=(V3kd|}w!sj{8b`V_IRR$1K!5Y6qyX2E!v8HqqFIo3FQKQtk*+;FWeRCJdr0Lf z)?B2qTfK`a6?Xi}cHTY)s+BV*vEt)+&!`D+}r zE$u3prf}?#?PBmfK%^cRPfXW_5hF;V!kzI$Fn2jFsYMYNUeXT(_9p3kXFix#^LSja z;2s!lwDRhs6(#BK0^}e0ZzU<_+K-DtUX;1+n%5@k$q3)vjUAUM;i-O~SqNp=nlU$+3}Teyn!9D)hii58RJIkZo|L}CmfJE3vQ*C| zKHL5h)E8tu#!cVh--j^AVEc|CS@;hLt$d~|5{c3B&S(zM@Mi^~=Xj7aJV&oKeMf=e zI^PpnnIz)XE8;#^(|guldS5-ixnvTu1!IqZ%rp@n=GaH67Ql(|Q-vjilQjuQ;aU%P zW}Pbv_uSPqpd_*c7~H_@XDtaXdG8FOParlr)Fhw6bc+~|4CLnjmyHo&ds%(!9WRT* zpi>8NYurzEC0RZc-lU9*BX9ICtFJ9OGR^K?S6vz3DCa^T9|DM60&ZVAU$b~nb>FaE zKff6HcC-5-D{>!?(0GBW(DljBWA%jiQ{o5D;~JuI(3q!BwX31sxM>O}vOxoQ%<|z| z!~wx7lKx|;u@`R&%dn-Q6}BfnvEVD-He=dZ6Acn1elxj9$o+Gx+#X+vV-XPF>b6}0 zLveV@HDI*-Csy|B=tVVO|2TMnni80)DF9(eVOhSvU)msupcE$9mpv;pzgWKWtD$UD zL@9hVKLh6**f2SJ_*jebofEsR5|qu=-k*pb>3^o>0A_+q5w}0p2NbSwK}s#=gfla< z@n-$)o{7f4Nt;-kbM(g5&r9hKaA;>#InQ7ee_GKENmq>it^3DJKd_(5hMYK>T^<~Q zVwUaQq}CLm>I~PnU!1d1;r)pHNti$tr>;0p#oIgB0L{Pd`E~uBnMy0gqs)oKY+x=miKVwO+ngPv)CZKY47d8V2WTgPaF)(8& zc=yr2Mfn#j$oPl#dNrvMfwCd1mQTLSe=85E!}vn)sD8yKLXi!))2615Q%pjefM!f_auq{Q~BLvJtKTRSC`jL@r}FREk3Yq`}hsUO>Z{sHI{u; zf4`5!>#mW7vr?@(?)XBzMi3W^_tAoX>4pZI$>)TlF*R*g0D*^gAyF}WkjRddXJ&?v zhkt%IyBo|Z`(pI@Uv`5A-dVM`XVa$2%r_znEV*NWF_#1aj1)ustxB;rQ^%-p)kUAw z@Ef+SC)i!u#Yj9RNr^D%uDe zDXEjLzczXj#9ZuqPUcLtNP6FWl9l~<^3jul68I4SxsYax(ISfV-`Z7}3p=ScUoJH* z04C=urq-W6KAswzrNJDfD<3{Xp7S$na{p}nZeG0$Z(&x-SHxE{|L4Pgc}j`>KQJQr z286(5zH@HU>=P`uIPbCNa0|x_GfbQ51rjf^hw;JRFtE-UpNj(_TImVu)=(nlOHQ(;3@ob-CC(j~d7?Dkuw46LH1_OaIF(~eBV5}#<0b?$YOK+_`Y%_d$W zFo~{q@o(Io56r_A>)4;*{JQdvX`G9nTb=}^UiD@LhRCk&2JE}FRYgfuUQtsn_PcMn z;s@XZ=#QK-{M>Fs?=)>5m0P3PTjiT00K`Ept54il8EBh^1qMkz?UOlNV3w%+bNQkD zw`bJOr&Jj@S7q@}*+Ml_5>q^qHWcOrV>U64JSdc*e6K|kCFDvKyv~G_!pA$q zChrtfi&__XYCcx1L9G_Ipq2}$6}F;c#D24x2+)pdU+<>qhs5F%(k|vDak?Zk5CoDY z;C?K!CFyV2ZG*71nr_EG;}}xUl;7;xZ#Ksi;HZ#Na$BA0_&&6tI+$iJ=~u@&yN#GH z19)FHKI$4-8Zo+RsiR|x;B(oWj_;wa1FtyNc6?ST{>mD>#A6zm~SW=S&l|f<2 zINM#!vH}lXXlJOlsl&}O&VA3ynI%V2>nyNxCEG+|{QLY}p-@lI-bIl7vGTH`W#_xi z*BXr?eGO2o^|LB5unXMLceB528ARj`Bqfyt{^`Q9oydqdN|f5l-!m=Cf)ax55tx zv4moGs*5i-3A)-dU5+_3#z9JGs!Mn8J>0YRAMA1wBWmzR%>AMOl-9akonn6}CC6xa1w9uK)CU8C-J*utIEVFp}U4PDgA#G3lnDT8Y>d736Et~WP zQ!#eu%lWR%3!V3b@~Zr#iNq#j?`=N%&1HPQ2r4O7PLaF;W`|(wZa+?=n;9xdoa#7f zQX=2WI%267>8pYUk)^m7NO^!=L(Bu*l}JP$b?^S_Ui!Z6bE zTtE2blW}6}xB#$=0}COv;U4Ngpq5BZLN#uMhV&I-g zA{BfcB7w-_(A*bWeKar=q*KEkCzozlJsZ2LzTJqlurI0u_v;e_s>Yu+hA^SPNrXnL5dkW zKDX*LrfGH+2|RCmt&7jpC&w7$cK}x(kwu|6BEzHa@z=Wi zYEk0NGEoW&xS^SchMwi4eNQ0zvT-XNaSM1BY@cP5v@ZqX&LN>ysD%@ULb=&=P#1q7I zABW)dQ+RG9qDcjcHZrRD#)R?_~-v2MYPMCPDhy!Af;I zi>QBywXATbiD{wXSiz5vqY1U$aQ=TuDX9Wee4#vDLzT_fAXwM~d#lK{b2N;cquKH3 z$JzN-`?yG*d_c>?t5R5$zJIiA`ty#F7QSET*#HijiLj`TW!_KDf)E*}OP685eNH;T(uQ z)6kCpZkuWDh%j6w##eurh=ZRG)RmY_=OY9()A}2=n?wj-5Bbm69c}H&$bC^?u8v9Z z(wi(zDePyHh~SIE@CIs`0u+KD9- zb^aUJs$rj1tA;vUJZs@_3p2L1tKBCK+xAvXRowdDm3M0O{A%|0ndDIKx@T7NkLYOF zkCMB=G87NOD(>C*YC3dm(K4N^Rkd5__`2Tk+pxPT$uJ>1C~GD5*_?K5*`p z)3+S5fhe|#*CFV1Bj)l29Q`U?J@7$_>9@4V_rz{wm#n){94?9m-~)jRtkv!X_(*|B ziPD~Gf*uf;1^d@r5&u`W0t|;Z1YK|kiy83GS}G9T!@$?a>*O6==aCZ3nGy_1pQBJe zhKrtahEY-I8sJZef1);SN*sPq_v=tXL;lwN~i6+cosO;ST0dsyxki%v87 z>yZ7^IAgN2)EL`#o=j4E8nFg1uxBX+I^2`5%qSiPg}t>veSu!qkBy9S3P01042GoI zG>$V+4+~fFrIZRhB*);&5KLC@TAcAo@*!`Q@~ z6z));oBBhpzVW|1tCSwOFgx$|%-bCNPA3Z@Wwz8jFmgGDQiqj@?iav|hWRgNlO22t{Qz;|5}wFt(2TbzYTjyq&*o=45P!;1{+X)9EWiPgpm&oH z%YBJ=IkrdHvMri&}e|qbofHKI52C zxw*e-87>R6O1nt7Fmdd@V_495XyKmUN}>wqs-)tRRH1?JqbQus(1KDZ-NRN5O{KV= z$N|aWB+V>r@)yX8uQ(6ag23PbJT zR(*4|^$OYprbfu8RYHS2Zc8=NXjeoTl$^*)VWa^&$Fr??>i-S~@PT*b85rY_fEmcC z4aHKkB4YN4FxXGfmzqmm!T}rTF7m8jMm75RQAiVm#X*V&LFIB`Z#jo`N@<1X+SP71 z0}@_6kM7(Sytqzh^^@q{SSK2aF)Jt4SCUl5^$M8f{edd)9Jznp!gR)*3fx`a!@p|b zS!SNd>U<^D&kEZYB=+B}5siMVD&uGPR;|i)pigD(jX-QZG~e1wC|aZyD)~#u11x)S zQN|1+yx9h$JAbe&Ap(Dc8!Dh6Xkwc8IVN*kjK|B2ScS@rOxx2J@IV| z4Fe@VQp>kxB&XWLzU3*N-#qvN1wH^XzMZ{p*G+>G>vp4B;$64mZOb3BHH$E9m;QBr z=%T5jaaWlOEXMuizuy(<_?akfHt$6R>mN4LM){g9DnBY`gKF#ZSM4R=f4Jyd7O1?G z?q(&_w!irjo=DWNpxY8EI1#UF;p*Sw8$+E{v0;yN$({tKy4UR9eML{-q2=0CT+V$w zbJ|aKvbLGytKlur;>}&A^5kf9<3f=8@LLmic%r&g{jioIjF`kjHSt|Z?p=M-&HZC7 z(LdDjKUrcC-Wh^b`4g4?Tk@m58{fBAUp$$cJ*dEW9gR0i4aw_#J}#*0kEe{TXBrVs zLm4i+{&){^3%D2Vx?9CF1MIb!NzigGp#HPX706ka)F??)`45A?edm8BWbuE)hauQv6cw>MpKD6zELP=U?-7LkT_(V1IB7>9~)#jnAM3?e$^j{Lv0oaG{RVvmbWcjn7-mM#C+DsQc!3 z;B|57bkBbBF4{;JjT(K8nd(HDO9Ym*kd|yDnv+~N>62%s}1O3JPw8Vyoxn)SPZ zC*5}XC0ng&!|sXycY(wZM|Uj$3NebNa8HfJr;kRp)v-z?#TyMW6LXgHtY&KOL@=D2jGy_gy{sf2 zekm5;iY+wX>n%L{-BA4^Nm>#wZ7jM^!SyzwF`+YGN|^swR~C@$fJ7%Tr^Qy*5;0yB zsG$R)a4mMk3d-RF6x2koLaq^fI|6ZZpV-Qe1>E*`tQ}eObny>6hjHen}p*roC z6yo7t8RGhAq(F7PUUBO_C@Vb;h~wV z`}cmzEZU~J65W*tzu^1mF0phTloihRLLgTu-rDOE6X>;R<&5j{NUyzIObvjy7r{Uf zfgLmsVAXli&9RH_BO30Kh@l2(v)tYI?Sf(!&~Q|7(Hu_6v7`=LLJrh>TVYd;B<6b$ zA4hsI6iZn&<&_N>Cuzb}xu_LQXfX|vn8b0yck*&AQ-1tkf~!P;A=07;k_$c5zUM-?}a?vyX>ct(APu;n)4Y!CZ+ zp28Vx?sL;t{nAp6{CC;s?yuc2MWmWp$NdW`qj&!65UYUEjwkNHhn&%oi^&+j>4vU5 z>;iU^hTjqiQ0)={i-VN5XHXJaWR?(oFWXRBfd&0Q6t>+A?htb8t1Ym({Kne!$k*z) z6y|gsXZmxidaFK7qnAwcc2ZuA+=*$aFZ=G&_^{s;uH}o`4%*;=hBOMU?}Eb%`RCJb znS?E=E2!m9NX#!r!kuhN5E&(Ei%@_wT)st2RoTxnwr4RRw5?ccOXx$ z#W@#m#*R}>@((*D6XUbvBP+=gCPD3!SFbQwxuTtP@5CiA5;{XYaf~2_15O72JROy- zJ7n%vw{Q5ia2S$FSpOey?;X`t*0&AMJr-0{R1`#nj1?Q8BE4kPQA7|_R76TdM5K2D zq**{z1XKj1Mny!VgAgE)NS7MvC4tau3N0id?cF$XkKZ%Ce>~r})|a!EOOkW;{_VYg z?Yee3{MF~9B&C|QZacuADk=zBV*b$)e^x15U~eB*$Z@zmJSBPUPt@gP&&$TB!NiZY z`@q6W&p2DnwUZyWUNi2x=)MzmSMx=tN%_0}q)a9L?Je^r51Nj?i@!oGh_=9HuQP$( zKBRD*Ww1?Y=Z`&2U_WiZxlz05%TJ72X-tWnHv^&T?+^V)>V<6pw|~}4=*cx>CtN$_ zrIUu?1RCT+A$#n|^vdHFuDYHzp1vl!G#pg!+v;+a=f`7Y6Hl91MalazUb2G?idf$$ zQzty9PbbwsX+Y4^_HAub7-(H>vj^98%(^<{s*mLDjW20c27W$=#(V;=9E&PGv#aA_ zYGGPXRK&E=x5;{gPlwFRHP^m!9fiI-p1N{-Aok%uIUs zDgOP`A3^F3tc)hDXv41|jsM zlPC9|L;L6l>ut4su`sIpUz-K1GSSEp;?sx9LJxBn50|>n1nSOf2-@e{6!a-7P3~;N z0fn4~XL;cpx^?qE8@r5!otQ0E%+MYpTCL(WZk+!59Go-w7c2CTbs-#^rufD3OToi1 z^zD6#XNxkSh~DjfLO{f1)8)J|0o;vC3u#sWLdrY{k^FlIKYF^F=N8$%DXXNNLy)_} zq7yBShjryK-yuCWLH5asZ-p3KKN7nrwS z-oJL%Z)vp!qNa3zHr<_JB{^)38c;f}?Y+6}@ZocX6$kfBLzZg%zV#hskpX6aG8Q!L zQZcOS(@SLzo^}iwRc+_KPERI`afNCv(fh>0>dYZK&1v=ZJvRQ6?<76e=X}`?lLm*dX_ibkQ@8us9 z`1%9@-q_%fmbVZbb}}UM>AY{sr17Z(6$Nk#YMGWRzE&t2bTf;T>?2rVsCxJ|>qHm= zY=TdW&_l3}P04$IO;m{Y>4v!ZEd-5yE=v|+HSZ>EP(qF5pNSUCETY0h&95U&IOSPk z*4)t{CzE(rZ8pJhqlN!q;AN%ZFCplyHkDeL5Nd|Q?M+>M4+ry2U3UZ`szSWaNPYC7 z%uU+mn+a-qw3~Dt>Y{g@;gQIQY<9YPjZ$iRde(o#(4U3U%{7kWERY7J1TMfq3Pc<3 z$*5_U*R<<0;5F#*^rHpbM;K-F)#oF|B>Ar|CHjha!eHa#adjAUvj4k%+E~*^xcNbI zJl{mkTX9=_O$5M$JnXsIzdh+RVy<^dIej0SEn$t7d)RLpPsSsvh8pX)F*MtA))qXk zy-;}iz@CCqNd#wEec|iah(rXx9$|7JpX%^|uej$!I8)me8=0jsi_nMocW+Qv;&D(X zuXUYAJC9Y!!s#8LwiM|WTW|;`e z=87!MPX+GQRBYG|J)fzozIA=-=a3E<|M8}`)5wH`o)l)+M_&>5^d`XBpI^Up#3rKV zf{ZW4^2i{izMZ;n9eazo5pxZEFPIQtf(U;vNb@T1ZSCIO#;IkQr58I5ew=L;SSPd5 zujjWhF4B8H^&+knN^_GpCy3QD0(;W;Yp#WtI3?JS4NIU`Gva@M<9kZa++n%S6NzKk z#CH=r^<2wuL{w+ybV?npAS;CPTB7pM=qgn#az2q-plmg}a7TOR6$|^PH3eDo^o&PY zc`RQZws5`zu7i2E0qs3RhoeM+Nx^cT^<5gSnZIM|8_9OE9~$hj->+TH4yUl%;nMK5 zyW`nkeEn|!tqLRMrGJsbhS&GH_8q>|5OBIMWSw_8-l8z+!zt(Qi>H{(cz+g}opSdx=H+U; zos00c3lRNBAI-D}tNMGc4PEQq=WskGC(R^g0q-Q*QLt;WB3v{_mRxw8O{ew-U{{F> z)u-K7S)mtK5ikaqbQL}L+tM@QmXPvw(^X88lp{TZ8A`F-4xrEutQm+ybMp^-K0 zwp&hLZ=W6@&WaERhSvyN`=&}xaBmYz=v_ou>1Y}|Q_lu>ftW`ft-USSD5y}QOcH`2 zYfp@d!Z%oYwqtn&m3AV@qG?!yub1zh0+C|2&z>97-97zi>k367of1l&WD|E)rD2Y{3^bS(+%k`rP z7}fVpaku&RF2aw$WEs2}zjW1jx4dP`q|%^7@L(9k()c~3=D7&c{pj0inUvh)(GgvS z7uy+IEsc9Ztrk4DTyc@Qh~4X%wd(0^<*wg;yZ4*HUnj4$DU`OnIGm+d%Lr15ig?S9 z^d7Gog<;nRA!#>vsNi2A`|xpPq-&=*IbJ(dCo>u;sn`DFW;Lh2rB3tE&3O z>`Q@oFDbu|Z=VablFvRx9^aF~W@^|cNkBx(Ud@N1MU%2#VL~BpK~@pcr-z(;MOfjB zA2;b-wZrR^qPBoSUD>m+dFn#1;48O2x)gGUEP{GX_rj%3M78Gm3dUKwJ^|FX_;AXu zm}4SZLyoL5q;znCB&4S8$rAM5NHZ}i@R{7<^?`3+OO|`Tt-Q|Q%Q@xY75g?`d9<5E zIY4Gr?qS@&>45WlX^)!UC64c%@H)LwX*Ws53bo~<$F?X*Oyo9ICZBtSsKQILsm3B99vJ36K+jLxDP0`GAe~+3uC0R+iQ2oy4XF>Qo|m+ zJMgI+cjdD27Myk@mUK8>Z*zia=#RsPew!&zFhw0m&)Rw7UO4yt9OO7=x0jKa2rbGO zEv>TW{} zffg)nx#IvuWFL}%37Cm=BeL8+DT+%nNID`~CrRVo0wo3zX`Mn}+VnBWVYrE$W}YaH z?B+40>U1MoZMxx8Fa%#_|6y;vp;wKm1pK-A=VVO+=S~bo=V(9tAv)bM!!R& z<_~Qp480ti5K*_XVRVNS&SX5}iIJv3Kn-|%*o!QKH{0q`dk+@IcXdY27_MOY_5qDP zZ|E)ACKWCZb|36@xOxPJ-K%928;wFH%u{MPJRPWrqEVHb&m2q~9pknrf!=)^JJx5~L7A}i`SsCqsFgau{IruY zX^HVFxNA*4h6w8lKw7>E5Pg+fgyO73Qrd2d->8J!R?$Jia{JMQ97ZRu`&K)hr{DBy z3)^1E+?QZ4^?MC^GgRV8U^kwH?)-y$`7fl;{H9Lm(TzF~k^S$D=WeFQh{!8o*kxRRQ9sg0RQlp<_k^FN|mR2H@!7qG@mfIdal@Wx2k2B+E z93;ehXSyio>irjweCsZ^x_of|>|1j!lU;J`h|H3U`$rb*Oshrg_a3I~K28ZXUC@^# z8oAOU6*_jUbmWt2xF%X~Nku<+pf$bKHka5K=q39kX!Mg~b4u=_DTsz4yM<+6x21S$@w0Nk_7qbnNvzzM{ve zL)Q{CTn7{5_=71_A$x_0PW&uF_zY9C%;&}>J4JnANoI*h(UodL*J9)%s!Q{>J$$w@ z`p8YN0k*m3Wt2!~wQTe0#c^JLXOMZ5+L`<}pTLZv=Gwe%n!R7%tDH>*FM-=v!13II zGP!7cJSqZg_cCZ)O}D?G=e zGblaf{w@Q;@)#8HHGcN9K^fQOLzso#(Aqd>?ZvEUjLXDOS@Z%XD~ylHdbShk+diel z>%rBybh8BpdvGD=kIxDAz+0a@>I7uW_s{ZPJozmQ!)Q#&hyl+~^;O=YzL7i>*$`;8 zkykc^OD}^hKGQcK`i)70*|A>buql{-OW2Q^fPZj2p1!%S90_Y*PPIk)g0oB6LZl4o5Z#NbKwu_ix3srro8k2d`F zV|wn}>2d*!-M16a`DNYS9KtW?;aP<*v>)Bkge*-q z49)jMq~Nb`0B(ZH=`LgsSzq7&JXA20%(V8af^;SprnDAdocIiYO&;AJG1P&e8C7Ed zz%17Ja!P{J!nW&q+-hT_YKL0+@Ptg#PC-2ujh~@>T1YNseH-)D?H5aXq)JBXh0yCx+ie?-a_IRTpu^oyWtn5h+ zUj1?U%$%b-giRlk5X~v#99BRCP`&;qUa;9R3-vy9r->3_);`+Oe+(s2GS@_0Wj?@f zXpx{2Xv!E1-teAaD*QY>*}tq@@TApApRRT*?lotg#4N6=#=8l5;&H8Ou{zvtU5UPF zVnOs(x)iJjF$sediDxYl2TPx2=d8Pz!bCA3SQ&X?S9DxQ^z@Qr0B zkrEKs+seSr7AJ^Il744F@15av;kc=lPfAW2JDkT}ktPC}0*0ICCV|!1^}+>aHd0=r?BG2B zJfG2=ktU`0qFNk@+K#PB;W4PM6ViMk1{*LMGlDH)n$efg6zJ0U#k`Ojh+ji&-omF| z^eKAP*F6?Gh_lp#yk}kLTeRfR*IL4P(@rNH+$6g|Ca;cG2_Gf0U;8z|lxn7a2>07E z=#yB>mW7m#f!|+e_U_a~Q5=VA=;(2YvqmzIxmuSRmRyc~$tJgBw60Q~(C-R8t7cx{ z&Bz`aMUG~d61^KJZdgB#y0ON*VNHXaKPR5h%BJI|`+Gub+O6Z&X@#Xu>T=46X}}4P zZ36y!=N|_#f(R=7r}&*6f`g0(M|>!hJ_#H0S(a-lfd>D76CB8cKnhWSIZk%gg744< zz93RPzOb(0bs#f;t*Ij>+ILW-<*k4m~u^7&)p2WPf z#^Et{w&&0bd-hA(nvMi|e5-<1|Ia@EEfDVwBE_QqU$Ij!wCCB4v6t|3f0@e)DKRLh z)*D~8!P-Dx{T#0eTF86~G-Ftgco$7&Zj{yY_iSiyWI!}+EnDc9zvH3rlK(`@D5dMz z-J)h~eA0cmy%wdwPRN1LyH&QVW%tM_EF^f{q^E*KoPyJENKS7de~Eeh(ex!Re5nrj z9vvOo4l>{SvHBAg;{@|tioL-xXrY`kvctQ@T z&QxL8gO2U>p{zBtzW1x(fYY7%26(fkq^okrP)Mo}-yyHD@BT^*|FaFA8LxqTR%L3x zUfUhlV`?B=D3Dyd)3m+l;o@&15?ybGHlJOB&&7uLEsb4wupE?wtF4 zPF!L_8}7P;>?+{;i?IZg&u?Qqn|D>8lV)IrilFp&v`2L^Ymj*!`@Xfl%-W} z?d-m%ziN0E0q<9l1UD-&n`{vFj9Rp3g4DXxc6b6moDB+&9XBbl^cl_;z^8bux3$7a zd#~W|n8G^eNchc0K>_OSfa$MfC4dE?#}pW88YQTnK*9<*Jr0NUd~^YuD$KSAiDP{O zpgqj|#0Z-3>NKX(zjPRkFTC-tvo6y;a)91i!=j(a^CcNfs8j^1(6V)BHJs_yw!9C{ zd3DBhTk4U_$5v}pe-(OA=cbdCbj@sRwUBk!4B$!^{-8+o?Md0gPSA#r)Yd(qz!xW; z_(?C@=aQl)?*#szw3bcnMVHo1FQ9xs>G}uM00oaoVPBx!8QwVbiW1zKDOBxS_2aQ6 zN34GkxaDtN<$@S>sZ<98dzJ*%@iN`5W^|;|YunPyHkfsfOfk8Zik4Xb~)~YtL|w>NSnAsrfvlPM50Ei8#CdoGgkGh;4sg~ z3QS)Ax(U0=;QSd6^SI`O#b6Sp!1pw04~a$~$EaJ)eS?Z720lU(MG+xc^CHS%?3A14 zWbhaQ?MJN$PcLGk^J^kf^36{WeJ5-xa51qn*PiM6i^8KZ58yv%R)5>{J9pyrDD;l= zX|qHP0`nE>a*CG>x>^`~gj3qT0uZ3%!|x7@yr-<#e(1Y%4Ra(b?-8sH)N+2-uws;v zsF&05#OpXCaj^m_Yhi@pgd7tEL?ih6|PWa?p`8evZdxed_ksC6u&occmait;|g zTyZvxzwn6wgTxAr7+N`Qlb>JYEw=VPRUI`d628D+FrHCb9_FQN>bxeP6|A>1nCSVk z&s_cY5^h+vw+r~wDs=P3@l=?`)VE+NLNCc3MxY6f>C2fR78>U5a{<5T@1<{KATz8t zIj$>JDp+j|&N}@5S<-^PIm4uKEA`L*ox(fqR;@H?Eze*Nlr||{*Z0Q$0Rkw%ZKJLr z%gk;wfAf1iADrBGrm zx+X#bV@Gv3c!M+$v3~(Lke+w`=BjLz0tP`{L9*~8`)Bpqs7#e$X^8eSO;`<0S_hS+ z#Z*`jB?>s9RNd)sJu6af>qeZJxNoZ7K!+7W&?`L_5GJ-(p990<(FLu>pkqy zs(Fj-f%1ZvSusEV&liW;R!Z??YIuAKi6m;kKlGi#m4Uce9h(`HiK9(&j8TG59 zeqCnpO6Xh1q8~dV=UCBpOK z7W7h5F`Nb$CwSt=>s}T*0h8JOybW;$plE#uwhi>PmU9Qq#vXDJG5gHYcnE|rQ(PoP z*QXPU%>~;wepz(f{?dsYM5oqG?U=J(BN^4~gp%+FrI#zNYh*3-AIvB2Y-JCv2$stx zXJ^>2pQ56>;5d0TSDp=-w9|K59!1pn=v(iRk4cCc(mWDNg$pSIlKZ~~;$R5s?-8cI ztPxNPGqWZOMK`UTLo_{ug+0FH&O{AeqQMR6J-#JM9%$hV1 zfVZe|@mbuZOyKUQ)A`ZlB_Q(S+XU#JO|Za^OOR5&iylNM(+h7BcpDc{OM?$c$OgzIFXtXV z8JL3YjF=nKugN2AcMK1#wClB_yl<88pJWA<-#+lG5t8{}fJM3tfSVqTf1fKS?yg^fijnFRK=t)BnZo5V;bCM;WMqdQ3<`hR<7C}oK& zA?yqS@%sDcCt>ZY{^-ePD{>Z2YA@W77y!*H;WK16yn7q??_q%3QRYbq#Gxh>P$yCM z2D5k0zqqNr^W0}p`!rZnG=GYElcl@gYMu?9IJ?45_TSZyl}lz3rc3w0>5Q{KqsU>C}rXb!uN*`PHR zDC)DlrOpx)BEp|YnrL&lqLOlrlP`Yp#HyKz{uFz`M2j+AC0|=>1pvBJrkTZe!BUt5 z4L>UQK8yYR*yQrkyQ_DsVC%3sA{x#mg}t&v>n2ZBiYfck_P2d9|88b<^-DX$a6F%% zzp*P*lJ^_fbd_6Qq(B7wR1Q@9qIBdMRiQ9T?1N~0yq*2J?O=w;-gkmJJ1hX`n0|Qj z@Wp$-Ft;E-_K<{9A-5+>F1vTkH*5aRr!=}68f2cj0x*9Geq8@4X@1#j|72ZjN;hgIGt%mb7TjQ>=6m`p@;nrlo-OE+{6GuuPnuDpi z3*o(ZQ5L$e&nD08?_E;xjWI=}RdbnzybqmJM8ux^>wi4^ll3zsUs9_rR+}etiDdqI{R}?}wK} zSt{sP6907DKPI%qll=Yp$4r*a>;3z)B+63LztbsyfAy=|{!#y5_R0UV=aXK64*tJ1 z7qUNPLq_HVYYXXQ>*NN-`IUjS-bt4jGRvmzkb)7id@*|wFU@CVu441& z2FyfrtCNcb7S-pfl<#{jR$GKf>-dqnqpiK$OfY_e5gsPKt`8TG_(_nwz28PQraezIRowj%!3aD!ybh=55DTnFPgm&5SvW(?haWh&SGJSKL)Bf=dG16G# z=qtsJ*d7c^5mRBf?(c#8Nox~DwX&hI3<4^o6kb4^KA+UVAp0d;#c_n-{7eg%`VGM@ z^K!f~DMY;IXV(*l{B}XmCEmD*u-W)&M+;ZKs?g4DUca-d``?bm4-{D)4!yzqWRZ!} zo9+u{l5|FI*5_%Hrbl^sNRhVzIxW}rubl%vCJH2&csZ` zSR_=C*A;XUyB4Me*T}PCRpRjTp*2`cfY43pwMQG}Y7LU4Oj+9u30Ryl#jxfwMj5KN z@>l@9PKN?pi}m_`*+^t*W-|6j0($s<@)~%Egx-zgQ(dRa19{K;MgHuJP~W&0 zY3?F2(3sAB>3Xh7am-Rl=D{Bo{iMm(I(g$k`5#yo#tYi53Y*{QBmIE#b4*6t)y$W4 z(nQBSJUkk8rF&{ex&+O$d^1>CW1=Ux&1?-1*~Gve5#4Tx?+#kaCWTWuP5O))#4mJC zy0h0KO)&@v-ql4?Mh-=?>|IM+KIRj(y(YyBqyH=no|$-R2U>gZR3WDLR<{&_`3eZn zTfydccHP;{Q{C^nFx@ID|7F?4;)U}T>zID?Cv&i4@eD-u6QGp{njRjUCG9Y;AYD2$ zi4q0eE_=x4PX(nwt#Z<}z^n@}e0G+;Q1}I!Xg&YH^~A7*;o}9`J81@*R;CT{?@v~@ zmP?n|dXPdzvNL#CzxfUxlfdoMh6GGv4fPg}F3w5la9=0y^IlBTF~Q7_bSq6V@q;*6-4%p{g_6IC#n3hZmpL=t<2k5{Pmxm4o{;-)j``_u6i9j2oU zpRRCHA+K4C9*)YMe;6X<1e@2$=MFTH(ZIH*NU_EA0UnG$mIl4Pc=Gaq-qAunFdyyd z;FKV=!}Zto#7Pa zCTo5Z2AqVwA6SBDVVk-&j#b7>S9PIDD>yH5XJoVVT!)m6yXGy(7ha<%Z-IuVWQvhw zbQWk4u!Q5)i%)^qnwyMs>;Gk!i6#0u=PRmzE}b5JI7$&!CIwD5W9&R9ar8%Tb?4iL zYT|i&4!d#c;xci4VW!m$F@pS5i=G+?j_R64;1;vErWl`0ftQ4n5v5^cgs7K=`7HT@ zjJz|?&Lptho&@4E)s+fIXMsvFM8yMfnQ+i^>kSP=6HiSrKJ-W@H>d;9`mB@R zhj7!dzLCI+&X}C`$BiA3f@U}Y=&ULs;?i!4>gP0rH|#_8KdGsv|0hE&cv7YIQBu(q3DofoD% z|0ym@bilLzTDUuLm}CZXZyZSrWIws!GHU$LfcG&bEwV%;yc-&XT?wf5BJk4?ZiIiwF`|~;Gke3!`^p71(Sk+Lxa%sL z#w^jbQ*Na*Aa00w2_l{8N?WleXjNkHc0z5jfXA3EKOCZi5l&+IuDjJ_WRQ?vLnGR@M-C|SZ$o7U&&<{A|sC&t>uF=+B>wi1#)0zB2;=|9SEtM_>Y(=o)H#zJBr z3*PiZa391#dc8$xfmd9~=vS9nO1*ezY=;|Ws4oQ~&Dj>N%YL=(2?prKn))|ec2VG( z1Jk1Jfck@CB>%xGdzvJE0D?o=#?364Vc;DnOpJXaS`Xhi2tUhIJ$%$&0HUJ<>ZTyZ z6lTtkJv89z8PH2_6gYRj{@nf0M9?Z~hvEm-u~QH`%o!0H@3&D=H@4ipMrityuD54QDiic+(d; ztWcEdh>aAl8N6Guaoh{66_CiGN3K)%sT z(qU9_C`rAL5oSSK&yfk@$+{`_AxSYAs{gTHiDoI(LpA4X>~Gu`U5iafb1mwVsm^p@ zVlnMq?L?h4&|7gDFQc`70o-tx<)DGe;>AKgH zqBMwTB3luXk?Q8E-KUoWrSPK{R;cbsfqD0Vey{+hYAVso4#kNiIcJ!P{+NtZ+l)Os zF@4<|GQgs7m9uDn)<~2A%%_13dc?8IjvySBm8EO-zIcGiV#^_F*G16%8g_MLg$cOb zeg;3X$Dcr!_$?4&Yq42<>;_3Ss@JIWe&-!FeVwlhy8!?qy|kpgU%_54$pGFp%q7&U z&%3l$c`*n|<`fEimxR+7dK38h8bQ3zr`afG1zP~ISgdVnWXIa+KNihmlyMkVnZBVK z#b0~MjF;eFE}o?rAjqhamm(0x>*9pBl09JGOQ8jy599?yl;ui0owb`U+&m;3XP8Co z5JrL2iJ4df@f9uv&S7o|CQH(kew9jEr~A6CFX1ygT~YlI5QXa=Hfi}Z#3#_+A2tTw z$l^`8@h-{*V-jJ0_Y|%|ZLtZ+>(3M5bk7PgAHu9a_c2iX7hB6q3ucNHVACqv-64|I zUjtY8;`9pYMrGp>BW`q3LnO+jOt8B@qcaYpTH7>sz39rhdpY7_QGy1Qzn?EnI z;L2Sim3s(!F7d5JSZ|?8JY?wE67axUqiZ<=IIleLf}?EKl9yhJ(62S~!ub;t#QfgM zqXT+-Ik_fK-#d}q`UIR722tx{mUTSfVL}+xxwgg-oc(ZBjoSaa{&+x_(LMb_7;0+6 z!p<*X;AcS$|4U`)W04zy7uA}QBE^8~F5VLaOK$Aay#eM1^jObPG!jHOq>?}kn6AZS zo^YgtsKu@uRG)tNi?sFY2#Cj`l87keR^?pTo_SLNIAtDPvYX6Ks1o zC;tV|LjssBW;#Ek2JN5LsGI8Wdk{z-jdkgi0k3SmY^IDty4EOf%$f@j*17=#FhXmO zAs>Sv9@h+Z$89?Tpe)W8$?!9C_j&SnHZ#1CJJRCZ)R)xxb)AIJkNc(=|A1Ri8 znF8)W(r}CbEOSJYGg^yoKfmt51 zR`8mPm*s+`I7eXwsNn9jZQp{dvE8_l{MppHP&~p4K9+%Xc*0{cOX%h5*5-QC6X`=6 zt$=$NvqG7_o2pZyU~h2ZQI|mWw|HLx5+bYysJq%pzTpvI zH_W7DlXlJG@F!aWd~Ad@Ap2WTQAE9RK>{bfH9QYp zIND)x9m;JO-=M=wxKWbJ$%oK#OBJKt3V8)z9!jjw+}^%;-DSwfnActe*YgyCj0^@4 zt2BY|@#cUK_`K?d?%IOBAvTr%Fu5#-A$tP_vVNpZ`F=z~0PRcvEUg?>)jtbxca$7W z)Lv`L2$;YBIMhYG&*c%T)&c zddWmUG@m<}oyD0LiSBwCkRW40_nR+U8ni6a@SHORHwK!v$GCrC+y_&SJM8(3NQ6We za3D7s5+ui0^0B>)QNzm^gjobjC^?@ zLI6&|cMBIJr>H3bZiVsyfIb#nDzLtLj5~tT=IOUoAj(YWjovyAfKaM zqCgi{BOnBOK~b$k=`l_U*-bcFFk~iEdY^UQMiylsEg8mPligN7awe8=@>%xA`Df;q zQv4;SGsl*FY2EoUJjzJh8>Zb{N6O?}=vN6msN9KM5SvgF)&fIMypwGIFZiDi++L1bEKF=L`}lMQev~zq?VYNf{)ZO; z=EuvUmQ)4eydL?PHU!Z1&BYg9`T%?Y1ID5&|I?&!97NBN`T|`fX3U^T!;zt1uUDS- z3nD@M*$bFxLL#c2^?IbefHHm9B9z4#f)wFnh8;&xFS&ha`xZAIs)Xdo`uI zl!U1yE~?lP?5mpGirB{Cy1Zd+!#)8}f~KKxvRfxW2wj--CM6u&>O5SIo(eL;$3#bz z;v2hFMi|ifKy|;%D0~p;wHwH6to>N~rfi9vie%sYJ4rPkc9yUKt>Qw(8VZq(@Eb9V z72WR9bRm-0_)1MqK$oD7QD)oxO#mne*(6ZMaH-iU@c zRN;ZJBCH!e25?IS6pJ}@w9(K?Hl9~us(7KKy0TFoy$E}vG?uWBDev13>;hWZd$Z#+K);H~nPY|1EVGUL zfrCr@gO{y-XqU5KDHirdxVb@RUVD)OhBB&FH`64DGYgmnJwYH~<*dBwq?VY5TNw_v zL|m&Hw1~gOCbzS1k?pD=$6`4Q(Wq#jy6wC)-CE=%>;4p@(5L)A2&7NlYhY;uUmFQd zC>|zMP^MlWgBv;)%op58oG4W?lJfhm%^<+@LCgEbo=NJN3y=MZynDBe55*#8mEl4G z98Ncm#Cu~TkiU}7#UN!{k>w?#j&e6OAPo8q|l5iW=U<);rGRFHxL%F z>ed*ioP@l6&w)E`-NFDdtubt;N#KWes<1ynRKn}PfHMO@I$#Y_|1WMk(+J8HYlkTE4(#T~ zZ~9J%0k05E_3Pb-AuO8UsGa~q6Igv@qjx2x^VNrymC>O-XKMc)(#77o8-t^Dgea26 zzyl{GNV>#zXbF2p|HuHkikexWxJ>B(#QOe`NE8hD9@ghhU+B~xDDhf<+O|z&CK_rE z5)Z(-Ohi^?4M;7s?*EXY@J*yk&;&Q;4lTfRuAW*U4#W7*>Dr?~fF}xDA>K*%EtXgB z{1mBA>eyQ&35t{@j*A6X?3x*Wxa4~n3XuHyAqfx6vL*e)iE2L|oEgIkJA5Ub#|VE@ zGWHL<$si%|p)Ai%|3s;8e9w$)_8X2-_yE!D%%zJ|eCoNxqW*kQ$$jnR38tUq@lbF1 zb3Hx61iBf_XDwI$Q|J7TxtpbhP5+-JW&W8Tx+lVdZPHGYmVAxG-*>Yv8)mptBx!tb4FRY_R(N3h4ufp1%9|7}5XdUw@qe*UFW*CA;^e|F$cAQ$JiF z@R)R{d+CU9W0q1orv&=46$8V=!|~I#5o3Q8?g1BQ_JifAr3cze7nrB|zK+TrF*Kgi7mRgk#!@d`EU)`o zzs1`}m}7V+a+}?#y}DPNa2@`ZzP`ozYsHxHCjxtuQK@bG6v#SIb>2EpQ2Px(3bDV~ zE^qdeJc+G{na~JAsX@i)$=Je7e)!<0Dikj9Rv^GL(4N1Sx$jC$(zo%ks zleZ6{7G-g$*krr@w zCRVUB=X}UKCE>&v3A9acKg7j(^m^8fQ#c$lc6K)F`8^V)SgYA`OuVXg>kifFTjQ9; zw{NmPKc2V+ZSUb+V33JD#l47y*N&;o5hl5-L58MxY^_PP%%@as@hcS` z;De?{=8trqA=A>Fhw}HTP59&PiImYL$CMM1Sy`WozHGGrjs{o4moBix)LrCtwd0CE zm;QO?#`%k%aqqr;lzf)|)xxu@ z+OpF3xos}Iv&;&#Dl1>4T2}h*LyL1v+S7>q>4%HR3>TfTMyIXxBU@Ttiq`RVwOp?0&oX`TvDB&e>EnHkXCN3SPt-JK{hmu&PI-xyVO z%9P4iSk0D_XZug4b-f=;;4k#apS5w=@^L3lbc_)Wk1x`C^Mh(GoHInnB+k|v z9!NbRY5z5><6Y#{Xc2tpI^oBDp$>gp(AoT%8<(x>g)7XILn6&;Qul~DtDO!8oh=Q3 z&Z;~_NE2-d-4lLG+AIvhfnrGG(O_2|;0)bMB-=4GDKMRhs^!FFyPz zY}eLRHiQqvyZJ;a>+AD7cg{gdkxJ0|dAG^d#1ulg%%-JS@Q>|aVD1tnTX(oK+B8=9 ztP4GqdaT#Bv!mqQslkm%bj{nj6xDc_ENG!2rKPJu)0airD{ggcpUkDjS6HL`XpZZh z$caF<(M6`0b6c!X9hkKGKR(>=@JR3yG8(Ht+!ybk6yOQ1rf3CBJ^@bZRAB^i9%9f+lbOMi?|Wd`#;+gRH)A@O33~@rL1xQ%PaXm#hn2PM^P~ zg_%Blc1sy*gy6C{9P&*r{juta>nD^K{VgqIP5geN3C27gg^U_}tlKPWqwjtb3zK6X zDyw#yFpE7gXy%01I_GGleuK7?JABDPHtX{{=S*Dm%oh7w=R8l_Run%(cuQ;bA-9$a z`{g}@B;vKJq;8}SEk=5arP&`e5XZSZZ+i{&utw%1Q+&gIoQsnz$!nco$3cd>~G)M zu~{70bDqN9$9`e47O|G74g<#no5=o)&R!K&O=|_8Tz%v$di@Iq-uVx!`rudb?|G#x zb=lM6GidW+f5(?Sma;V)5=(U-aEAZt4e|n-UpbPU3;w;%h$E|O$_Q9hxue^(-B za`nvQH(!rU_FpgGZF@3WOb&xI96t1i8E;}L8WhU>lQ;)=YmrO;Yr^zws!1!{>-;%G zsYLO_*2=XS@bl;>VDym}U$n+Uc@1=@;rgS**Jt3_o_!@ZI7K0T{69&J2Jy!tPbD4d zie*9(FRxxRlCM*fTWEDJ(1njxzc92Pxf9dWJzneLFiGFs<~0d^s* ztun?PV6Yx<9WQoSfu;75_uOUPWzDi9+b(K&O&z*)$HbaAAF3vRe7Mn(7Ny~zbvavA z(lmCk#G&z~txuX$HwcyQiZ*%#cN9n!Ka70+@>!kblz&{woeb;6jIiAIk52VhsjLuk z1{30{WgQ+Lys+8+tMSo}*gH-ELj$_U3r%o&oU;~Bj@f@G&db;u0jvYJT5j)@OMt6X zZ<%9YZhD=ilWf+$$)nldC}Ygk8o; zu@BuZJZ*jHKfPt14|1d~q0^?i)T|BnUKzgYD>W2)qHVP4mWFxw<%np|C*A`mnvWq6 zD=Y1P17mKmVU>@)MQlP);3vufRc?heY0b)n%9>q3+?H#LYaNIuD4MdmRWi9Jv_o== z*Moa!4_d?BCAc4lU<$@Zn_sqFJZed!mH4Yx)ZU2SrCn>uo|rnBRnpT_P4?w~>%8%_ zGWKp0PByK6d+KqYiA=?9v`-6R9dc#CBAdFMZ;u#)mcPDx;Y6oF-8p*R^OsLApFyO# z`MkpJCH~=dJY7l)f()2U#cCp5@ zcDsvrui#u{>(dT@?N_RLZ)hR&OugmXjhpI?9Y#h5cjE8w;MV?Sp-o~}zPRK#OPxxK zRrJcaF(HgN7;!4eRWFyAmX`E3wamA%g(&Ovv?ck8>ZKT`R*ZJ1ddC!=1OgQpvfB^T zEk+NWieBhp8deKb#e6T_Z3F+Z7uM{SuQ_*YB2#ZlHcrz(CKUwlv#GU`5HiSE%!{22 zon*t;Fn}Tqt#8}E-N^y3#drRocq%&4(Iq}ALbG48aYPmGY^DG9Qn-~&hh2oWHW{3l zzCEqx`K^}7o%TnqXrO09FGd}kb5H%0x|<=nnSD=#1}X#tdqbRtK5-@G+sB^Fjl+8Z zDp3^2WhfM6j3Tw$i_`|!cQfa&7$Z5C>+7Fw1)-hpXrc$dFMYa3<`XKd;^++;NYI8A zOh?z)$(UhTm0@jt&5k%`FoVIib_lK3*S|?Rrox} z8SUkC4Xk7r4zC3MaB|?~T;`jMgc>K8qU}CT@oyLRiYNR>!GG+8YGvv9?QZW+!n2VA zwFIjg#<=sIhdjSMp|atOcCX1DahjcwzfdVD$593Tj=pEz!r#2j>ATsibMV8hZzI{U zi?NehYH6SE_Lk`mt~Y1P$%@5YOkBg*^2rknEeMPNRd`XiaT0ZQryjGas*NqIw7YXM zEO%%>}B27K%+?jE(HIuC}s^?7t&QJ)=c7Ok%4^|UTT z+Le0XRJ1R-z~*s3a5N(>My@(f(Pq~yFP3Xj$K6_Nt?G) zJM1=OLwxZpb+q2{iGPdOddAirECebt`|(tI%e((W-Frqwm8Soq-6m8NLXX%)+ zD-?7}(~j?MT3A_8T8maTNgt?)@4;a@{LHeu5SZWX)AmT*Q?ss}1mRJZ@yG(EggdC~ zDLGu~fu!5aJWz@`T|Z!>*0OhC9V@W-6m!_*KHQLmPPf#CGANirWoPHS?F(nvKVyp= zZo!l-x-*eVpVDRw)N|~q8>1Gh^l8}}+;^+B;%=K2)g0+gb{EFANR@#I4T&6*L~=qMX*iiN$t=Hf9&`(v6_pL4 z{qR&D8#K9XZK&~;Cs&kh>`X<$?w>Y_HkdXnLKM!DkZ6{;nq{+!wzuBnSx_TjLgmEw z8_Nt0IlIbIr*wQRmpe;@6qN8_AAP16ce~j>pDlx#wl0BbAR3mHkT`Ms!YYfPrHgh% zhA;lRrz412Cl_r}cHc`xXb7u;j!tBsDyFz>B$=8EwJ1@~<0_b@8(z!Viz<3GcAbS= zwXjq>annLCECFYpCZrNVw9QqVo0OX$9j2=Ea;oSFM5&)i?lsj%(4dsdQ5yE=^U1{Z z#9a#7D?oKcc?fTuY}c$T{pQZodXn({Y;)-bsdh2s4`eRO%jwrsWP}(Lx=l#)m4C0wuhRG-;=YvW zof$V$X84PQ4(bt0DaEaV63n)8s`2${5|XW*^9iZ+LA+hNgPIH+$GZBQzRhNB&XHD& z6Eu>M^dcg^p_;#%xj)Web-c<)h749Wyx+2KwrsDG!@^58Y(Ac&Y*zPKUmEOxfrycOah^|E^46KmtL2j9F| zjfXmVK9_gMD~R4^rl~-RU$JKOewu_XjRXccI?<=Oc{tFFVY1a2#k}Z+8+x+u9uU6m|TA=SkN>H2DvTA|{h5 z;cGW=YLZ=dq$**H+m6lPa>s>LA|D+#ymX9vAe|(SjU%{P#eRDwJga@56Pa7QRst82 zl48#@$?xnd?%xiTp$AVl{c)tS$}}0d8~Y-Uvo9%?>d4@Zt9x&3erGL9d$)E_ui+&j zU)Pqv-Od;;Aw+tFilwpfK|*&uozje;qs5IRW;@5%P(YwF( zS0O`rU0R(A>WTGE`#5H8G6rb~p3J2cqEAW@i=}+-DKccoi=uD}3$d!ujn&@~T%bl1 z#^FQUftH?VR2lk#{qWf>F#(<;_QtEK%Yx)C+_sFh;#sQsdK`9 zrp6EK5Juo5doOmHXd{qbXhcglbRyY);jBjA)iLJZ80vrQ>4St1x4zSH^VqdSlzODH zAED#dj;kxPvg~wB)}Y|JP^T_Cs_omB=<)F|xiZDUZ)}vIgx8j@Hv3jnFlWWiK|+~L zX-Trd{5CaB$wB-D(yH`?*zO0Xxs&V9>XhHgNV=~cHe2Cb1kg=Q+~ou)73xfwh_E-9 zOUfirNh>72D_gL zjh+96YF}b>c^SV08NbBW1|q`DZ(Ab|M7h%fg|f2!hPx`vk?oP08&G(>^ZfEXt;t~F zZC=qe>Iy%cR`rO9|K>|V-_MxYJ4uXWv0HB61g=!O2ZZbD?VD}XMK0XaF_on@{@OR! zwkMYD-J{CZ^)ZZd>@Hv1?$cP0iPfA5JnUqXf|}Ws#B3Q`w_;355KmSlbS^>?vWMzY zHb>Q!uv*QXM9GqhJd}fS6@U0rqm}1|K8!`ruMovmc!V}|cm-Eg;KnEJRN#sf$7CO7f4-Apo1G!48s(Lnmd+NQ>H^DsdP|De|O6 ztb3UDzRt-KF{sV&=y2HFsB3H6c{j}S{&~bY!B%@qdv31b+_w$m9BoFyJ8nP5WuLAk zd6lodn9@Cm{U$Kso}jmZ;O63CMpsRku?+QnetlC#8(=IK%ZTDEFDN6cIIFe1mUp1t zzown9ld!~JoL$8J?rBa|9;J~rW`#(z)Kgr^Gyw9-$f;uhJ?|)aWaI|5-h`@ELHd_4 z`=@5JgrXr)2=X+nvxu`;F@cH$IWyY#MppOW(W-rJNmBw1m`B*b62oPv&=sW1tgTUd zcU?Zd%e|}RQb;coAi(ZIPL_uwU)QW+3^Oi@s&dWNM8ll|~kr zSWK1fXXAV``XD{k#=~yvjkkEGlOu|U?c*7(`{@B~=pJY$2lHnYU6YwZe zI{HW_ycuzz)T=^Vt@T)}jcu!6ZULY;e1sL$v3ex~eCsljkjAq!mut82;Zf;Vf2sPS zMz6nsCGsRBaByBeVB1S^{jG}phfer`)3e6t==+{u^`^J%4x1(uXMG3#JY0PU=ksz3 zoXG>lrVpdxk!U9;tAq8Q>a06}k#vp*R9u^0^8(Bj{~_#L+yz}3^iyG! zyWe<~eSd^7r&#s|ma;KQ(%VUod1XOE^?*6z;gd!vjA=g^LerZf@M6e`MIO5MBq=l2 zZ%q65<8XPzXlP|sG2+1rVPwV)9J4KP3#HGh`=lQmE?$zu9wygRJ2L9Yc+a>Pm-E zWAfzcffiEqQUtY;HCqmIWDyVGZ4nwu-Si z*i*sI)8`O@B$kO+&_GB*-6ksCA`~}%%*bi+J@xoH_&pg26001x&1)S{9mK@ag~GQ> z#D$%oCCNj=!4O=aaa@M3*8vZEX!6xYU`M$7SHgsWmX_*K`Z;XEYAzEN^XzK_dz=yJ z#nytYr7OF2=jK?2ELf;zyy|7Mx_sGIKGPhOc<$OCq4Y$)7I}H{FevpYsWT&pe?!jt#Vum> zz48kB`(r`eY)?m47Z=SZY*zYMa0<%DEf4b$J&q7N{`glSYrnX<%)iqc)gWL)==Y|5 z~#c*sE#GbnmB6kMiC1$5)C{`oU`LeTuO?k#E zFCNZ(S%4Udlg8%6kEe0nb_KR$B=(NQ$h8s*LJS~Cu62?K2;}ViO&dJ)6a*{!;Ur-& zD(?(-k$>kci&_2r-S)w8iJ}fbx0~8I25q+<8p`y(jEtZ|;yTCD*6JlL05TID?L)nP z@a?TYWPe4I6&@7o_6Df8Ini~8gSBqLBd4k$Uyt>q=b({6?YQmU$cV6e#`+v8k)aw& z56>Yc_9TGKxyN}4?mHWx>W@==&?U@nQ}C?AZrAWSMNUp}?$Rn0coXAQw7d7$ZEuMb zWK8wkYmZ*PP+eJ^v?|5zTvkca+V*(FnKU1F@(6uTty*~%a)Dmma+vpHN*nIWxa@M4 zVonhBVE_yE>hRGTM3YDx=?1zY-<~ix#|L)*%PS$L9bvu_?#Lc=`N6JSAYKhMC12{lIfH~=)MBjR6&A+S` zVy1~J>C%T5n+%nbl|_4-JNh>^wi&2)I@i<4W9N?Dh|RfIWUHfk;UvU4Ybn*0MM1ot zo9gU_(Ga-{E^d;?QZNmKdnDD1XEZ{LpkS`J3h__bvXcOVJX_l9unZ9a3L$9C8D;xw zorVE#+IB8Z>6ym9J69k%#?8Y!`)vbITR<$#35C&(Rw(T9Iy@mG#a8o^h)YE5IGSo9 zVLqErF%^+xZMXZ1QJ=EkW44t57#Rt!)Tz#8&S4I5-*bcf0D#)+htFdqCjqKm;UmEP zfJDK?s_J`Ou2stxjH#S~0$}9!BOvTZmYa}g`D#B++VQv?+a|t6+xWby6;@MI3|Ib8 zF0{M$tgc7y{3?_w^nmE}C6BmW(^6MfY0Gtr+Ep5Bl?cdiny*=q^*FG8d$9jn=o)#i z&CjMfqu_@fY6@z_O;+g-M2kJGjUTkR!4xkowe^={D^SE-XR!f18Dc9`nO75S^Owwe zW(NTn7IuA%8y7bAg3@=yW$U4hn3|YO>cbzn!g0V>{bXENAu~Q!tFt($n>V%rM(0qk zulfBai+TddS9hNQ?T{!2tm7o0gIxVLQt7GfXEaTf)eL2nCu93nn9#pI89K)88VaX| zoWqV%z407q1Ym7{)ea-%s;O1an#(MNV9-<$oe&pwn2cq0f9on?c*DlVuVc8MaUfh% z+fLmvZ9DT9&?c1U@uA8EppBxWog!6OW>+EW$Z>lM`Z`Z8B@w3ydk2>C)bQAt_(v7l z6{n8?9Ygq@QOmIpab7<&C;9&fZewI<0sf(4JZgH@m{%)B2GtQoMpU_DOBu)J;L6_E zvrhYzk*nX_&Ou__z{sc0XQeGe8>;b_WI7fm=FbrcC*Yhxl39t9b`N|3 z${D!6N4ln=hs=r>!ZTiN8Vx$J02X(o9=KCPy5jK|{cf=^+A<5@I>1o{l=7AH{cI|2T8%xac4h5;pt-VE8_=MKxXka8*YB7in`w zMA(V-5<4EJfO|60FS88`2h_~oj6hu<#%wQgy98Oh?j}bC>jf8gojJy=a3K0s62s$2 z?GpFX>uSx`Z(Y$@WN=*Q0s!O|u+r8a7gp^X@{4MTcOwNX#FL|&6ma$;o`lj@`D=79 z4jy={oPtwRU+Sk6y)`air3T0`&`=j5_m8WO40h=*2Jx#zCSg_!*T3m#P+-EmTvb)) zsyEXCSNHEo1sqs8-Yf-ZCZn`a?|`^#iZ(N&E7NGU70R3^{LtZkS-U2<7#He=NX&aPJpyIX!LL&$V>C%K@^x53{C`%*&yGtg@XyhYvo-5YGtR^>yY zgEnaoL>&PRAesl5EsmbRMn=hZo5?%Rzl{DRc4q#(p4GzQ;-w3yCpXW)Y9ckt^h9)2#R+5Xbv2WuSDNf&tqO>|-pK4y69`ULIeKg;jFL3*QN>r)lo)e4p@hL|Pb)%Po_G7p)Tp+#zm2y2t;y}`F|H0|)ZQq@XW&F*VP0+CdaDOH8owL@8&!cH?z(&u54dvHQNJ-7Kzs;w)A*9>>u^Zs*1L~$i0*;I+{ zOyS@xFO^tW2v)C$g^ywi4ka1P>5Ux_z9=~g$_oyyo39ql8Y$SGjKshv>tP%xTNlf#12&4a^vH#P2zkD6GCrRQ)XftrSp+*0;!a)8)kWJF5cpoM4hWRpGqdp^>KX z!!zuluh)3w3~?*<`v(F;3T z${l$Tr_>Q{2W8D^HlO1%s{*Eo)ltctcRk=r;?0Q3ZE~ve6K*;QcWR!9C??vak`sR| zl(yag@=PU?y-~B@Jsm;7lsNE4KwyXzgJw3fa9eIF9U~Z(i!x7TJ5&hQ>+;9N8<~yP zTHMh)%AkmhX5Fcky=#$*DH@AZR)6AloNwRXXIda_^{Z}N^FR9KH4!2-?vjN?#rMSx za}^H<%JQtNP2z~>V=oeQYMR(|xshCibI0-VD>KUhb&qDXsmaT$=s_Q$u6$hXky(^O zhy41vFw^auX$)i@CbP`%YJ1Z~3XSq}0J{K|1f=(k#JFdE?t3k4Tu#tP>K3bob{K5o z9MAq@2D(sM^#I6+P_u&v_jDCM;{XYT2)rmfJzKrw-Id9qM|+8V?m!&DKpb)w8d*Ek z(V2I(bI3@g@EKB)o}T_o5ng7CW&uo+xDQJ&936|vR6or|ev2uQNi6d&20aG+7FVYS znoihAWi|Ok$;}eVL-I9Ny~J+Vgz2rBBK=gcgc`;QnHM7?R8zi7(;olz+;%QRPPXETv*O5L#N(7vCnvex zV@y+^UEswBGI7GxWS1R@jQ&Z#CpsQzGIllRFr$Z0HB80VCWQIEe@!;12=yrp_ZYRp zGr_r1R^FsfN7VNF%;6AK$M!ZV!u2JSr&N*&3WZ>(w$vxW?d4zFt|y z*sGA&?)wTIF-un!dyk8eJ)HF91OGz>cQ_nZ<={|AZ{d@EQ1I!Fikgjtm?`|aj1JQY z@P<5(DAJth>*!hQR~uI3&GWn0{2*H=^kaM*BMW23T^2?r=dc4uNFY#0LUDfVj4IRk zk(Zg_qVZvB1_dNQxr>NVwU1{;%)a`&K_lR_K2SvJ7=8INXOuc;L}&QrTpT_Sn@46W zziPS=1HX%r6I%O(*nT}ufSc7V&^~bYUs7gl;ZZF_DitCR2co{Rc|>c&XSmEIlKLwG9b%RrSd={I~v+-obP|KR42LTclN2KJU(?G?P?}n z6V`iNRnX@&;KTxYpfVR+E`ZdFeA|hfiQ9=^@}upTc8&wwhoOT+uB$J8^LU5&jGOx6 zof(rUvW<0gEL;&LF(@C>2L?EU@5X?|_}GR*D-+`y{$;q3w@w*lyV)W{9{FE31 zPtM@qvYdSGlfU8T?}T{epLrqwagu+%;6L8kTQ^8e4)@?XdOpPkJAWEuXo z7ydtRkbj-a$&=;^V(R}ZVekL;rXRRx)^kOh904183dA*fm@{HpBNS9+2SW=Z{j$`- z71u~z=T@^|2*7e(#8bhLzwYqAM26>AQJuZLgDqyP*^H$(saI}HT77f4*J?-Lu-<}+ z3rd}x4>kVL8C*8TMBTddbXdFJ=jdIavs+nRg4u4#Qwk^Q*L+2i6{4D=I?&=>R;Eqh`(hx_WJ+FPNZ{V5B~ z0{r}Im2pMYl~Nry64utJ@mXMqcDuTiw5ZjWUX10|lvc|rS~i@ss)D?3bvM?wP+R#T2y#rRsdGFv@Bj$ihgY$Qb zxK4A#{l6X73V&5gE51LWURvAy=z?)&XoPyQo%xe6-oO?lh3Wb|;?DOr91o7hRb1<- z2hnyf_UNU^KsiKIR(LI}>g7^dN@TmGfa9~_U%*m`fpQdx9z9Gk0K1;+oUR8p@5>5S zKw7!y*;aCF`6nu~nDHKMQCbyg9_{bT`)6nTv8#%Q{W_gKHS5_$r(kUA|BAvdLF0Bz zxy;sti@b&C1&SQG7i|O1KDr^aK$_vciWhS3-j^RHF>lqoI@vg^p>Fs=(+crxx3aP{UEDvCa{;t1KUy@~5!%d* zzNer$SUh?*aR4nQkm=SDb*9;QnYqh(`5C%VOWgxKKTNYRL~A%LHfrGe6^X@nJ@ErC z+Tq)o3G;Y~AX76k%f9F2h&c_b2)Q7*9;@>6OLE>9w<;?F!$LaAKPt{HQv!j_}W@uq8xDc@oMsq|i zLy5&-?@1X8J(JlLr6Nktc%&c-ObK96PilW{Eqr0g(FDb1Et&(Cq;VKuYK&!jBzbA} zOXc(}prUx6(7!s~~5wXkTiN4)X+e0lgvdAE)&;r+O&EW-Jw;!?F5DJ{zr+O-*)tb?) zJMF`7zc>)xJl9pg;pfSc$1HID>NS^bH&qmdYnpWST>RzI8zh~bodI4{zwgdJM9^V9 z9)ciJztXjpAz{P3=!uMsn0_Bokrv#V`R*VZyBu+KP7#YY?~69=nqDO0KEv+xPsruy zH~JxPEj+yTj-bDU)5q2(T1!3`KJ)j*3W*t`zyKSOOkb_^&@s7hlXA%1EsPMbIij&i zWc8@u{PcyL-#wDnNZa~xWX$?R5b zBMZN_O}(I_B7gNj(6T-BwG=WJ&`)&@4ab{k#B_^4`Yjq+s#ZPMwk%}(xg`55j>EOA zTsuA82{STLiKrh&BWr_@$(UWLoj`xrD8&!17@PNF>p!tmRM53y_XZgqQ{m6K8a5(| zMO`=ZwLMPP;4@zgtANhB7G6P1dcZ*^ace8cw@+o&AK$nFyL!ITCExwJPUgP@CxmB| zi}je@(fcny8GqJ6XQUR3Q z1R8g|$uPE%@!X^b1nG8_m3=n{=m5?+Kgg-dLT{vZ+pGMpd%&V51@Ng{0{D}pz}^5z z1KJfJOYQNbAQZMm@&D|0KaSv5!WWtpHlkv!{lo_7ncn^q^#2fQ1cXT7&BFBrdMsAh35_V^CfuGYn!h5Si(eMZH;=W`z0tzDS9hY^K3$X*A2-hPU6NCL}_)BugtUi^&efCqI2leD`U&^1 zch%1?%|NIH3}x-OJx7UI`GBgDsWVO_#j9c^e_yEuC@%QKk6Z=2ap0 z>;%RBzP7BdxgVlU@BaFt$g-7Cwsx)cB!OITji9jA7B#+$!XUV-Vgt>XB-V-#hS} zM7>NFOOj8Gvahb6eSslH?;Qrmy{+I>WxM&nW_tQvM><;~vXBe6A>?1TUmmhbeUXpU zX|}fDi}xmP?uY8ijA-Hm=GC=@@z-IG=5lq6NJv06sKB9+CpJnm7nhNh*<@uR3A?%%RUtnaNjY!{`o z`Vv*gw`0a_DfSL^>b~%D+wiOmM}OMS%n2gfyU)KMN@Ha)`RB;TB=zJ zi-$*#lDHk2_~~OI#0uO`B#qDcRrsVxD;*Jsd+)mk9-hHM04P6&)d{H(E8HI1Cr9b~ zLUcJBFXVrs%lOaYX&tUG)l_#pSbisw>nJd1_Iz4#!zqEz?&bqxwI$}XOj`CO;@I;1 z_U{2@neEOdcl!p3Nw4hM?A}ye*sn8zlBDEWNx)igfWK^Lyh(?K9R9g;hzWB z(S2=xon6(iYIpY^RJQrxjEa9}2L*-R*Jfn+$J^--aX#v|5-lvak)hPyfNE?DAAL z4Wo-YR_xO(rCjwqT#LuUQVF@=wC9;NnU`QiW&~*2upV}i;9>sM9-+`R=!l3}TI07E;rH~G?JbRH3j1&4S`)qxj*F4vKPGzi@Th~G zH~gaT0Ov%JQA|}L#3fytz=xF=PGP&gytl?=VZl<%5hyt-uE z`usI(gqp%r$a^>hLoB1#>a5~=@JD2d+sDHiHm-paW5?-TZz?~&Fiw`IIm>1fcHfr%3DUAQN^wZ^c`EY~+>p2^<4Un2gi?$f7m_?<4;pw(Ml<#Sov%kl<9 zpQFT%oT5#W&-3tbq4v`k_{ckVDnUp2H)8Qmzdw!wwx3{VyV01R-QB&jIU#vaIQhb8 za!6m`(_Es;0(CBkFuWC^u!%1T&iXbPaCKswiinK%@Zm=e1=QZkS#{tl z04ZdBI&z2S?bohrdV2d(oyY^WxbB|&hvTCy7O?s6-%i~PI*4ch6VDSL9kSbcS=zz8Si3kya5z@mIF2!RB%72QhoH^4rjLDlW*WGHPqnT3;NV6mwT;Zu%BW9~-T=*QXxwd0R zbt|+6))TP#t78?Uxhn@hA0MX)2Su5s7G}n^W1h$I2A=P0j5ak$q+@Vo;J}`QjG}kD zp`Gf56oe@aMElJ|cq zxa3-W-4<}%Z46A8$Y{iqy?HO|?h5LZd_KGQW4X90+g0?o)Fa*7i8s+2&gcUhLMU@2 zTc0i2%>`rzR6fFUCp_@g6g-KHp_~j*lRj`;bh1Z#^%X||BM!}GfR?h7dQXdmTkNLe z@SDooeJsdu*%1Ys-{E)j;wChS)AfQi)mpd4$6RmP-P(O7;e6r0Zy@iP6Xn!T1S^3H zO>8QiuE6}(60JpHt&+nXt-02L(kWYedq+zZd7J8^0mvMzBku#8!=jIOe+3$f2TQN- z+$1T~{A4O4P!(O9Mw<2Srikw9089?F9LEy0#}qe z2hLPd&qi!vMH~y~BFVm>XhdFoUdwVTr8>UZ;^IXiXWB)c^)FES2zhST7~@v^R4iRo z_Nza9u1P*MnFvy*?#Q2hzk`8?^;j6097Qa7OlgorMqa}fx_iW7p>O*`ps}3h`AW9~ zmqe@E5T#>EZzdkO>LrSpT3VW0T1r3j7-T4!BbfzNBGw+EoS&8Z6#c-K{z3XJ@m*vg z66uJ)E7KYm#SoHAB}UAOE}4XGXm72#(KN3Von|b-_I=aN<;)@M7YN}8$0I3841-0z zr_W*k#9IK(Kcs@R**Zo?x>EYzZa|pV@Hc<51{MBNEV(@o3wd^WNJqyFQ(@Q`lRho? z>SV=5*$@bxDvaelCRbyWdDg%++NL}1O?Qr*wFLqK@o{;9v0<^53l08kEEd0d9DJf) zJVig$kk&H(;rUU+Qg!6V@pSzF%eaWNTbhX#-}u%H@WK{?6(L#&%^R^LL1p-JejTX? zXp6Wv`=Gz`b2{ogk<5IZ>H)>b2(CY%ULseg(Ib-aJ)?&0bRES|oiXhZ6^?#On-S%VoAQ_1Fd0>lFv zkj?a13Vh?`=SlmXnf&?dc+ZSo%|f)YW=XGS|EznJA&KFUrz?c@y?lW!_u>* zwWxk;%xdybnP^GCkH@+bjN8ChXnHPQyqnRK7Mt1CvRS3i9#W zCtwX8IPjT!u7yG_P5y{r`$&vEOX+sJ_-?I26q3Qg!@tI}|AT|Q#x0K@Z>^Y>&N!Y< z{FPl;CEs=2WzsRu%BkPB-7uf)*mkfQfgNGF9ck$&fm0a17q;c8$6qV#Dtkzbs;vIy z+D_K=6natSR+UXA_gU3|q0dTAE+fMD0AhAbc~y@gA>Whkb)kwe$gB;& z3aaPYuT)p2q-?9$PX~K>oD{@932s}=t4RGyzBlP!M^JbJ&}prJ{`)UpJ9Xb^r={l;-`7v6^s0=x?(7bEm4~hq7T|9VI4mCrt}Lv+ zGMk$rAwfHDtbw9Y)Aq5NvRY)vj@5*Xzgc1*SI^%7CJms0V3ek~M!Xfn*ma`C?cMlz9_1&ojsZL6Dbj!qLt_*_o{3_+Uo|{hS zji&GLED!NJ`gZJK1gKEaw1>=Co!OTX@h^hf$J&3h3jb8Re;i+~jvwpI-?x8=EA9E! z8l|wWUL`=kIr_egWPb|bqCQzCeIZsyV7K9hdUBePhzm;<83k7E&&X$sn<^`}yaYzN zEQYIzJ3|t;?0JZAnT59DCg^ja4x6<>o_58-h|!kl?{$uJb(7RUJbhw;Z|aQO`aN z%(4PLz5g=)YxF`xG^+3*bXMA?EVrt%D{N^DG573{)6-y~pmP{05z?y{V7mD1d{B1( z;B9bKdBcQ zKrDAGFwG6$kG=R`muF&~XOW%m+PWf8-YlI%#LrJG(?eTRhvW2|ZuY})t%U!I;-8#F zz2_%G_K?~X5W82&bLnT9jDMW@)7Q+bX%vAx&rdGOI{I0oET}(9Xr#r#)B1(DS>@*x zc42mT_u;3V{Tff~kp4z{e!Jy?3rnG=2Y$&!=`HdH2c}0dyeBn~Iw{+9mk*LyL=!K7Zyn1upmJe0UzdB;tF}Zp5#PusjSGb>u`YtftIIG30MwE^=c0 zi@*98>!s-B%AM|0<}~|yE-#d`aJsdZO7n&>%4Gjp;8-Dsh=)E|m+47?+wU_nKN|KA zFF@{5i6DxSa^H@Pen^O>I#_mYiskaq5Vf(H7@bPG7+dl5NiIq2$WGvH5Y49f(>8;P zI_%0_nr1)gqZ__aqq_R2Ooe{j!Ay}xJ)y7HH@+?nB~;^DASiZv;w=nwg21t1oU^kg zbmKafQTIplhri}*{jSUB6dT(=B=0D2 ze=0b*J2UAlQd+)XF)XOx-nREA-p#`u#@x;QgT-Gdv+YDOqs%cZ_PCqWo%l@RE%y&w zdlfCXGe{S^FZGJIy(B2%(2u)hc}K9e?Y=j}GEypJf?|EHem_?amkot)i9N&bO#x$_ zPX0NeUU8w4uNZwEybCJqyNX-Z`v8E`9}-Ukic7+Naz7%l$qt+_1uJV8H32!2AhyK zUarZ=2A{Jug#FmcqgK+;?KWCzd!M~wRAG17P3j|K^U>8@SwMjT$KDA2{pC^rY_BV5 z5qUB9?UJ+fKLt~Q?st(4PVxL$+u_xC(#Ib-s>5q--9Eth-8HGf|BdaTmjexH#MOdA zpUq(u6p&%pu;M~%39Q<3;zH|V@st+p>o)BPlL6U(Ey6#gD9p9V7>H9>BOIQHYkR70 z<{uN|@9pHLtv;x_*2PB37vRl&upP0<p4ih-=h)~@mT`U0-;UaU z3-8Zh$8z#h<*ha+LlWDJOoKYQN!H_-CYN?>hPA}vi~_UmsQTjFN1j;ZJXL2GDI?%& z=gZsR6q&2u$kHqCid@^=ap0Ne{w08|=vr{n?Ui5u`aSv1zP6Hs@=Oo~@2dgjfw8|X z`Cs{=`Uo*qRP=yy;Bb9ng;bqJw%|#k)lH|asAIbZm=f|dkFqZwLP*>T{+gDx6yoM6 za}8~Iog+TN;)PzGYW$p010n7GwlXr;QtXYlWS2$@)U;%>4=d0O0z?Z|UD_2+ZS@AA zk~;bMk7agsKy13_`Mm#*Yxu*CU5dDKDeD~TY_xFlBPo{emn>lxn%yq{h#Ii)Qo-s$YoXXN2vE=Okd+W1Qf zw=f?&9aCkI#cR);xgNSSR2viH{NjFO@j=Vs^6qr4i|mMw1>P#@np&#ZdZYicI**MM z)G2PZdN7J7af@QGXxY1P8sw+O4U89?3M0-E5d_HW)Faiof=^!n$;0|4NH;egE-kAst2@Gns61Ll z%{0E7Seit@G%MQ|d-3s}+s2tm`4f4?ibPpl-nf#Z+gbN{vu+{VZ8m08=E18_t;#mO zy;1+le72T>AN1e|#w0|NB*qQYOdWG0 zt!3P0;4{I)p<^80l-Wd0Cp=8;(uHa9U&E8P!ngH#AWXcJ7!fweJ^e>a?N+}RrM$0G zKDc~PEDaaRuFfK6pDZ`edDhe!kG&5XrMzmt?P1_5zT{brAK}FRB3104&9H|0ZMfjo z7ToXrW$s5DU2;LO)-HEmBk_%$^TsTyJ<64hXLTaXSd}LErs^)bf^2iGk#o{>E^k!g z5EI(bOk)<0M>*%=8UHnO{fZYFbRm>gb_)e%#scM8j1gf}>SWc+5?$9SI7~fO6y57T z;*^S}E~Ic{l=OwlOZ|V&@T?EVsB2p-N`9YrF|CnN?;q(L@H8zI11o>{>PzVUJ8(L3 zV`VfMN#HpHQ{N`ru*Bj6hoM|B%W=~!v0=p>@I%ayj-}oKngj9HlccJN4lqumT~X)g z9<|`LY0%%@$ZEclB&BGgbV9FvFnpkfIWH_Yj(5j%M;{B=sCkCxY+o;`#txLNq!)w8 zuaI&Kq(AC)Fo(fO*A&?&Z7w-ay=#a)8KG5&CUV=&D==GuxjRYnWGidO%@O#!Ghqo` zG-0XuAW?@>7WYe)n||WL?=fH-{eu~@-a2=*-M#kOhi+UQ`vO+3kBNqlM}f}eTz_#Z z?apT6uJ!Rg%*g|&B)PKJvvm#+@+bVUCb5{eA))Yywfk4K?K_IBt&x}5dl`3o?d-^n zKl6-JG@#zTw!0196@5Uu8umde8O>q`IXCTKj0Lj_vzw~+W3=s(d?6evC9>_K&gvs; zoL1(5GGL`p>Vn5PM4LdsaVBmexm2%-1C+E!?ewSq9Ao2(x^B*HZ=IKs=diJ}=*fIE zC>{GarEPGWZ@zrcp&8It;GWCY@9z_OqTJUe;A{cjOI+Y0l z??l4-8?is`Jt6k21-{#j7ewWxmE;FEjJ^|o)@@@HyV1(3KU8SlC4?=!9H(L zr}nG>_q1UL8w^a#36nVg8*5OKr!m%-1W(@Hia|JTAMLO%P(%IX$RLyD*O$ces4cdH zd&xyXkw2RbHj6DFq&^QyvHXa7U zsqSHRPe-0O6ayp>+iJf5%m`e|BRB#5>TgJRUA7`)M_voU4HPLT@&xACQ1P{zf64X- zFwZ|D?aYR!_~HwH?VZDh$KTza9FB-zU$|UC&wv@*t*9U9m5b{Lpl3|Q`>=;UL~eMuxJ=!TIt}o&5vFa6+4; zvBr+zuJJq;ht790#M}1q5NYV=RGoQsclMDej=|R)5{VoVIQ$zw*{-M2;4gzv;dMU=CHv;!;k$VP^^qb9FKsA<3zk{Vc+BBo@)olwT~V z?zTG=4 zB=3fKEig1AQUA|YR8G5`4(d+-Gy~@f95}3i5#d;jrzI?o_{Q%%rO*)6++=5@?#e<> zADTVaqgCQ63YIZ22|W;vU^g~eE5iR-aXiscUHRAO#66CF??MAOS+KgtvG?kgnt{!6 zJFX0BB|z@|@s<_~gk!@6cBv}`B-qJh)F2n*5}&ibGe=6=gy#CXWy3Xh-1OfymSLN0>Ck}z-hF$iYOI~JX z&ebY+tshh~e4NRX`u=P;1YP!edVY%i7VZUeKG*qcVxzN6!E_5(nO83i#X(2VPbeh` z8vEb|iAC`ca4$j5=gHAanku&kQ#wXxxuVJ~X|v|#B3s^T$_6lT_kF~JSXQlvmz1(Ib4H2WU?Q#fDg(^+D!S|}^xCKH9IE5x zSq;v~@)Z~;ap{3)X69`FO2Nv&qcSh$=`dfa^5UzmyD-C&4HsXF#~^XTbg`}AGFj_V zw;S@N&_l#Gm#AI)aZWLCOFXWqPImr_(t&wu@Ckbf50Zu3d7zN8Nj$B48wO9poWGi^ zvej`a7}?dRX4SwF0pCfYvJ6BKShr_gTqVuj}w!Wz7dQef`KrT;oGS(6%eFhhjK`Tiu=G+ z6v+Sn7picU+0HyPn!8b?+gyF-(MvEJRPS~K6WUU+Oq}%#3UK|}t!qEUHt#6S__Yf6 z4>QpT#H0W88@DX#I@+1KPN^ymgHLV3LE@FA$jgf5nU)vF#b6V+kAuNMG|uzt42HZB@R#KB0*;JH8QsvI6-B>*Q4R5f7ThRLT}gD0xjIm->2b|SMK4CDTN z5ty6iNw-fhQoY#I$^^y#k8k)`_lOvkAmR))J#~Cs(0Ur}@$|8d zR(+bl3nI=5Fg1ZccTZLhy!&9Cg(WkP_WhlvN@|s{w$A-}Gbvq+c0$~A1 zm?HJKhsCfy8milOR@dwuhH|uW`4KAeYBnHg$q5oSKcj~S{x}NjV$O1eA9RdCy5EP(0)M`RaKab5ERu{e7H%N3&YPu(c*GjwA`Z7|@Lg=}`g3 zK|`hi(_`%Wbm;kk;p08ieBo&djk^dlbvfJk6_?Tc-jz|uq5HrKl9B_05)7hV2KDL! zy;QGh;Py^xePCc&s=qvHh^#r11o5LzcWF`6ZXLIQ?-+e`>$Mv#b%On+yj>J+4YTij zG63)9?BB=7;tyzsNyc#L-OJ#Bli*tXp=tV(HY|m_KQi>Y9Z!LJ>MVWb7CEjBA(Htc zTYh?7dO=CMZD|{POc-b*j(wb?Sb?9P0)oWvhmpX{OV>>cYdAxDJO{C@FFuxM@zz|E znDX8d;X}Y(uxc)%pKhWYpoTFE_I}xoC>X|u~t$NfolNbR5)-URfAzGW%7chBaMqg_?Z6=jmser#3w?+ zL6fR55YIt2P8hbW8=pMBb!XEi{?$Ac5*mC3JeP5IZu;FobjOI+c!wkyzOyT+`n*L@ zc=<;Ce_-@EceI*;RX}xn);?4rI(ut#p+ZYfP^BnfL^dWy_-tAP&m7ZA^b67i*zKZr z1u7*v_&d_g(s-w$7aJ2Wgu8QmsWJ&)#2>QlW-SB|YG>;Sb7~0?xVxTRt@=_h$tUC_ zE`xqBCse+1{AQN$f#ohxsQH^wR#u49ZB8HbPWI9W`GntpL$r&52EJ`%TKyQS8*7b= zSENr$sR4Ret8^E%FO{fw+QYtA81cqlUiiguXjX84U$?>Mt`}sp>Dv0(D9I!vseTis zsr0u0jgy{_Tbpkg(9`_6bgR{BbzC#Mrvw^$K1(gQ9@ zKTmq)6OOp|rVwLxR4UBqge;{hEq;8^`}ZUi4YCfVlRe&y}`ayl$YrrMgl%P2!@JbNH5dd z4`k;6=7C@zVXnFMxYZ2wl^~QW(u^!609@D+vD(680~YCVhStrc{}b!9zeJ zMWkdr2+K1t&sobk*EdsQFDn7u?s~JW!Fg2-C$Ee`&^RY{0DF`j!B3ZyC-}f zkN~)==p9cTrCyv11*T+5k>X-NgDS+EJdzrQoD#m`v=iE1q>brRS5_EiCf&Xjb;}du z1Fi}Pp|Jj^Cw=Wd!+^ZTc^!P}1tB>ctnmg~07(rz+bH`doMe-y8k$4E z064}yheZSVE8L^)XYa5-AUI;>8P~Gw36BUsOq(~@*Uo2AJb&O}uEXdhfE6Isg-Lv% za@i%`cy{rg`fJGQgfjfJKQ}7?#ol9~8SNX~51-xpOb}iGuLhoc#U_C0AbtdrMK3)a z$wJ&bC(Qi=dpJhlI33nNhalo>A>i6#U~vU__cgoJU?Kl>Ct}YME$1kk7C5DfZdupNwI& zSIF31{c5!=jI%>#C?%~2!@p(Omto5SxuqtgwMV3Hf#wIOsIc(k=Ur0etRvRep#aZM z7SHAy({-+Bza+!W9*@Au|2?d8X@N!qVnq1Fz!;;_*n;u})J_4mIkeORWy}4(#`*i+ zAbQft+=AlRs}ZM%J903%L6%0HzcKfkWa{Z08K~W1qk^Or{w{pX`)wD6RsQ(1gfKbV z;Vpp03y@F%zq0K#tmz@FBN!}r-pw%*FW~e)Xj`Bx-XZ6IJngvu1=5C+h`PzDzjxP^ zpi%~VBk%m48r)*ORM3^3B3K0ep-7DhVD_*B?xrYgga!p4z?t4EKiIFy0mYFgQ|YT8 zN->7b`PukYY9bu;NrEY>)xEjqIa}){G+xdi?#Z%77$TD-C#KKOOr~r5T$luhfX=xIJjb5l7xPWo zKYDN2ElFlWvbBPnkqQA5U3~&9XV_wu)JKVY)Wf;SnG`^RwRTScZYWGGcPscQEFsad zlIPbimqM`{swBH8PAFsiigauw##r|6LA(dE@bKp*{d*mXXo!vd33z}P0!ptKuEg8S z!d$>8k~f~m>ttz8_8bn2szH6c^YwR8CCgaR_*hWGH)bpXEDAW&Ct}uBb*E}D zV&9xOW>Cmlm{>;>bg!4kGBl#BUx4Pb{Igu{0)U*5RXRsvI9g$B>)mpHtN5Z)QFi-V zBB+9@&9)lO)pWSf8=H22wtW7=MG5u6xS~B~w493l0l+aiERwL$nJY&jbaDV6!51lm zhX|JqfQvxXb(7FkYsCTU(*Sht^d6Qt-DL4Z;Zk){VD3&XCG^AZYbOVBuXb!Mt;024 zE@gaygR&Zr@iBmw1_C6Il$I-bLW;3t@32W_m#)*r0D(NP9u}i;BUUza?KX5b4f#SX0hJ^B;?ZIMx!8D$+ z8Xi6Ufwy7EsK~8i(&>!28fm>c=^=+CtsQ>1zSH>1ukT9H26Fu6+CDSq0cD|ZK|)CG z@`v;V6gYJ)nDX;JloW?+(~;f4I$i*Mh^AhWRde$dV3~7Amti|J&tHdx9-@beL^x3rWh9ya8-@DwC*Kv&jM*>kfNu%q zm0peN9Eh($;iRhBWdR(Kun}c*lMzR_tfVI^Kn&{tRbTtT2u@TfaC8|c$GVjqDdeIjUC^gWEd4}n6dvJ;N_ zvg#_Wqad$l%6ksBEovoAr{W6S83EZ@M%kxVpiDj$IP)5SKGmgN16C}6Bcpnl1`#c3 zL-3HDH621JxIz6JBLmOC^6FVT(59=r#>+US{3HD8hGi#!jOAeCpu?K+t7g>FBLkQ< zBHLPXZ#IC58O~^0*Uiq(lTwtPRq^xL!lE9nDOIr^V-D`5(O%yf<>!@RypiiD78rxN zT1|&mo`CfYESwB;jSl_4z!f>T$h_ly2$N8N+o92E_`A#l1uU3KgfSimAXm@Y7U4ygx!Z@z&&G+grw}SfXx7#x*qlJw~r?@%JVi z40qQe0e=lrD#8dtrs?8#5aR{fS8dD7g^qy~u@ZzXJ`80`^1<6- ze@iSQAk^4e(E&>zkXXX1(6?uNoRa(bd^3Q6jMF4-fzqG+yH`##!@InDdc^G6fT#c3DD!k`e5Yv9)aD6i1({W*;jK$!Dg3OuH62GR+r zji4G6+Sw23B)kI#5nSNvgSiOq@gOia0XN7kCVBqHb3jkwuR`e%t@4T^&XT`u80&dEg;sMf#Bzo&yUGMvMLX6vwUhUjx_XBPS%a&Ea|`Blh>C z$3#3p3Eq{b1A}ica|4M!AQ?Y7_}tip^AyN%hg#)k4hp91+zKt9d2j#%`PT_gI#d%* z=NKc?aLnNy?(Z>=%%Pm)r=ZeoI5)^P7+>#XokR9^yz>bwQ#G6d>Z-Y)j1OVn1O8@w zx)+E`z$VGX`v^3QFitf1?|HBz9P1v1R4mE{zNGI;2UN;Paz&r=W55yXTsNI>OqOX@ z(h4UCHQp-T)d3e+(2(B3L&C$Go6fExrf)Zp_#!Yp6nnWE@(`7wB)lWOa2?xRzj&5a_}XNpefxflpcU z^J^xEfj%3u+;kDN*do}5R|>=y`|Ict_Cd>7E?BjwAaaPkVwvo6b(IuG3W1xCt;9MV zR`{ZzJ*{8g6&7Q742;{>6oc6rMr1G_U^n?P0tcEalkRagyjz2!oJWEY&npyzQiV%) zO3lHtyQ36o)JV7C+{ZkN3lRQo2B&~Hd42@xlFT(`ly>Uv%SE?fA_3IDlZMyqV7~Gw ztDf;w5cFT+;)H_-9s_&?9*2C&NX_2NJ#O0%5bOGGEy5#Di!iQiloS+Ve6k+JbOkip z+~z7z(_dHv${xbjy^zaLSIom1RY&H{uvtPY9gev3T*mora4B)cPb&=&u`7Wu3+5D> z#~-LOnO#=$a%+YoFG=^be`);-w`)2tcKa2D5W=!8oR1Z4@qdp%u9a zJNu;?dO+bYKG(|Ko#qZ@wt)wj>~RWU` zCT0p15(X>4bpdmKcuKAf{&_4R)R{{}ehcDA2wavZ&2<--O3HSOh>ce6D#BTF9qC;l z=0|6o)o;b3UY2(nhc3CiB-p<7^>%Jfm7pOK$Vo9M^2G;^N*dbWMgdrIuv~*eDm3OK zdq@D&1jjz8MXyy$3rXq$qk67*+nCvIV6OixYL65Ksogq* z*cgl8XSq&N92yb@d-;Mqz5Dd0v`@-F+(bEGZNZ16g_@6$-vO>x=*QJl*2DWolieLc`*hX1|FZR48U08jn@!mOmbo0F3m9T}zi1jMni#mE4` zz@L-ydxW<(`3ZwAE`@cJlx=rvmhcX)O3AM{rz;%k+VqfmbIF2vwlM81gg|6E6s~1z1qTd*6 z0k-%_Ck=qfjXpVt0UYY~v3?#)()dDNXIj5xEcG%09tpeX)1KiyR5RovV{G0ZRFuDzHD{uRC0i-XGMfP|f`KV%g6N9zsgm3e|IvrSq zVTDk(4q5YfcNIO!hdcf}ru$f{GW*uvi5lo%Bb=9c7PNgWrz?d#lZYlD`M@Km#Upp; zGTVQ~|CUlXV#@x3%Ql8~c5N8k`W__y&^gL{g2f5XXi(}Z4JkreZNONNZJx8l#%|D^ zbXHquw7-n~?*wBvE`?u?~N<7TCf zUAZ@1jfG)C5obkP`u6Jjx=GU7233oE%@LdJZ%xPfK0fe;scwC1KNtH#F%izZty`OL zSwn;gc}imn2CN%=X#8%ZLwg?bm~~#uXx>n`%!GLZDZFzI>kW*OW?biG_Tg<&wGl-K z8mqQt7OT%QtAr7pKQStJ`d0tV-JJ<=kZGUUgwms>(9M&Ua4^90P@gGJ&YW#7^@EMk z81{>#))`1?n>TM#rq4XFZ2^Son4szxP%Mm9Nde=_ciZouO9Ia@yFh^hKGY(U6Cfqft$cdeySpmp6~;a!%gI1fT$>WXReQ*t z)%>g(UVeKI3zgzA{#Pe>Y@WgiEKM_#o2s+wj&|?=K$2X1%UZ==t^Uuv?{=T#Q1LVl@+Z&)xONW@3uIoj9}8^l82L{ z#xSHVkg0dP1SyqznG-k{c5lkPfyRiQWCYCEK_VSCT{pYOLpe{5_PhpDUSVC*o$slH z8}Ez6h0PNB{u~(}?ngcSG%^HeZ$?wY;9zu?-*n+h`#Ibs&@n7n%kn+{i26Xh!$r+N zWBr>Gw>i+Lz#z}U5$U8Nr1DD#Jv?Ny?Q)A-o7)vVx*#lS!g_+I!UjG@+UHaN#T z(qu$nB?5`VWwP*V&2$X1R`JZp*8%pz+V>M7rnE!V$$+-vbm#5HM(+PoPdqj@@NQhU zv!blNv}8e^E6U?`l29<*=oqOCG0SGV(lG?mw2h+EuTDmC|XS>l*?tIVJa< zKk@tb;*r|@prpD%z5~iSIB1~RfXk76d&e<#O!-EAYd};tjplq>gdUdOSv2Srxw|$p zE=Jc0l>xXP@XWJ)R?h-B5{|vRw;hb2w==651;MAM@R0iQ$5;M+_u+FkkKA1!W_UWS zl_yXk0+G*I17Gtkm;!{M$8v2QGyWVUT)KAyu;SC3fyXFp|XKf3>6G< z+t$m^zst5Okb}DefV#cHYC)p*{cW)Dp>EfX<>eE|RF#xOxIh--DAq<3vu?a#+uiVbw3_fRffHom?6Ph(ak8vxx zJpbl2qA21LQTsnkiQvSd8n{Vrf?Vcr;5*rfgPMbHLwzH$HFTwJ1*`(2{NLZ)VV(mD zm0j_Vx61VWxrZB7X(<_nzl(Azze+mBkA+UJVIOot@ika1MOz_TXby_6b#aMzAHP>j z>8xU5ZeUWNTI~$Qi$|7#j^P>_xBuzMxMMd$cL7C8_T^6QS@KNt95Bbk-jg)@)?cgl z7Ka)Qy^d*jDZ+TPpfGteGhf!4#hlll;O=IAaX&0Y-BK_?qU$?{!5h}yA}~1gA5QJr zSCcT4jmlk1@8uwri!D0*otIpvFfeqImvbznvYXvKXrfr>eyXPZq!`>Jp0P#e6&EMK z1;x+9kPB{myrAKMDg;b6b-F|eOd_?R%-+zMv(@nwyhzF*4WnXv|KZ6DzT95`Hctlx zJ%pBzhP049lhuK;w1ofb9AcSf$envsYCl6R4A9-flc^>Vk7|%mKo&)mxY-!?8Nx@% zi9$bwpe!jZ3Z7oxS$*Q+q#@%Dtm$u^^3eH*mZTlc=A}M_Kvq#Y;Ho@F$$gY|(qFsH zDM+k;PZuY=;r1OoH*Zu~1q!C*O>Lo?O(!hu$pIPegpS@Owa=Z1N%Vs?JT9 z$(R~9_I(h>-_p5#fa268(Ja2;oTjjVI<{Ff)T!ZaW0}#9lRYy~8Q>&Xg>p z`<4qFE7nGd`o_Z-Y4WO?VZmrRiUS43H+itEU^_0{)PqUK+<+wru1cskK!XHP0cnFf zh=i4NC^HEhp$3m`MPu6&thaNa|DGgsN1y^aXq3*rr-y+Yb3)9cCX3(|Wu8jGdvMD# zm8#BYyDKC>U9ae~`vbX<Z_bm) zK~4u?&Pbk;3!G37wRJF?!B%jGe|ie5(PSS5d95}kUCPHD1sfq4#qk_zGuyC&M_(sL zDhSq2F{(-+{i0SS3WlzwE15`*5CxC<#Y`RhbLaxlq~CdVgS=K1Wlv3p1Jws`p7Yjl z=WnPjE_P}2Z2~GzZ{~D74&acn)gb1F<}Fh+9@VfBtQPaMz}$iJW%EsX2AaLW0D7pz z0pgT~JO@^!ut*1JX9Drvj}rOwjDMYOs9BTaZZ6PPRQ%i*La#ONhnJsl1M=Q;n&BP| z({7j{WqPm5#+y0@x9DRDpt&y2_9M>8FN(pQ?tg@;Gj4oX3EmuwM#tUH2ZL^YTZ_cg zlCJ2OpkG->PDI{2zA2qrH~ntsB-SOD$fnaAW$298 z^~Ue;8y}udI9y1SuiLZK^2=7%(w(p_S!^vESWhgACd+{FHyE>SG=Wn9Mw?(~q)V6H z1pxCl@l_ZwJPvhnVbta9o?*n$kl;;p5CuT*6hvl)j{Xh9-)?U<&ZfYa06Db;Bu>EI zJ#(`F54wf$%q08?nn%VrgEH&EfHV3>nDZC%JDbfuD-h9o|LW*4pMIv7Y8CsKa!woT z{@q)=fqx6^K%8^a48XNFntW^sQETD2N#2fCneDT`KfPi%x5X%vMtfGC>IJ=bb$v=& za23EiZ>laXo@_y!f&b*z>kDZ8+A#2VN94m8reGAm{rLm#fc594hEU%>i;|F1zIVW8 z3$^jxMoTw&>?Ivvjej1%;er(Ig$ax_Cp>unT_IAfr_KC7+?C85FQJ_;luF`p5lWX zgJe|}XmR$Fq0{S9|k_KcF#!hT7vn{zB1}9p;VB3j2Q3yWileby--q*=c?v?GUitdq7aNCP>L~v zg5euxcvzb_=`DIodGwrr!p`&)*=ldq@XxWj*h?J)?ZfKMtQ$|_8!kHL=!NMC13XyxoE zuyYKxoM75N{?w3QZ*%H-&6uG8%vnVx9C)GD02;4m^zDCDsDbKyphB+2Jq3b-{rc1^ z5Ir0})8X>zTp@hiZEAQpS_(eHUQ<7uei->0T}FA*sS zOTCrxFMQyjFkr73G*$FN|`%W^&oUdqr}__5BF(#rzXxBIMd_(M)VE2S6`m9 zr7fU9g}1fQQU13%&bx(&^FaAHMs?)>�Y=^Jy!OdV_`1YB$&dh?f-&A5o$jg3zx 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/ExpensifyHelp_R1_CreateWorkspace_2.png b/docs/assets/images/ExpensifyHelp_R1_CreateWorkspace_2.png new file mode 100644 index 0000000000000000000000000000000000000000..600e5a7788edb54778073b265a082cd4bb8e7611 GIT binary patch literal 216090 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�^{3AJa!MhCilpgQf!G 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

?Q22JQ3Y)yua#U7NkosBPUF zBM^Jh=ITgdUaagZh{cvZ+|*Z&OKWj_mo*m*H2^f3YXNBpnIe`(j_m0Hv=C&SO>Gf@ zf(Ngt9aP!kV@)V$G}o9%qAv%0)SFZZyu!FlgSi)i{MfFLxXBd~`mudhJd3m3aZq!5 z>F38>D#FJzL5}+(amjcT9efUbNdY@ArN_vujR;Pi4lKt{uIEz)%>a zu*;-8UAzqyV-W|Rh_3#-55X?_AJGTm?-H4DKY9!v_^s5YE0$OiW731B(a+ z1*QHBi$JF-hy~2p^vjnfYCr(V%>og<&=msiq%n{H?4VS8d!30!Km`-{^={(m#Y-4* zRO;H-`?1Bd%0e9#zbD3?krI_Ge?i+gBx<}m1P*idrn()e+^*NCF6o|LVltAh?r>ru zYhVfey>a~TW|74+2})^pv$Psoq5@VKrWke+(^(e}f^ z2*a$mJG)QA1DIx}6o-f|d7y)A-wO$tM>@)Ol&omQJ<6nk&epbQz z2OI)-7%K9HXPJ-zE9}0>6J~8|dzCp29P7Nj`>*}No%NmfV7~@Ki|4{lwKPFQV+%IU zHCqH0Z&i4(V_Z&{48lu=mmd5#fw9Kwc|o8z78X_w+QrybKLxXtE_o!%)4;={ZR{>z ze#yS_e(?TINJ#j4-Ke-0xv!A^Ghpf=1pXr(udjbM+_im~0I^)@`C(@rbVk|))aCIL zHO2fs)-qTf;8DM@7pRJ$E#H?O6OBOZ&60mvaGa%_Jg2GY8Y{t4-r3x1yuJR3>8%f9 zJniTMs`c`DM6+OaLn@vp`uJ|$;n(c^U-MBD-cmpK#Ke{^Ju59)8FPDIvgSMpe?pYL zPvtWCnwAtm0AH+noZJ#64_04P}RaDT;qIo=k|J#S-H~=DjJr9o7B6& z;lssT+z>NYN+=eeQZNwyfl!Z>$rW;AI@0g>S$Pue8=eM$d)&>AeO{Gi>AkLc4=o=a z=HOX0ygfCU%25IwlRIZ~62E>t%Ctyo$EAO?I>a)4^d5}g(mLJB96iF4J!@Z2E@IFHuX}?4z#(k}n@vERr3x319QZK(A8?K@yy984NA^W zF-lE$Yu=Av$K^;c{^ZYz#PVjYCxhlHUWB&-Nys=1D&iihxQ~G2@ai#}4J2w0Tku3z z6kW%h7LyQ2%m@E|oBm0sv5I;xUAuW4|8r;MMIrIY0YB`bA(?vj-gUEeYV{#!Gv*PL zeEV!6SBMD7T3Ym^6W2TWbLgmIy$_iOxRSj-e<1qyV@LZ?>QRSAdGots zzns(aJI^os{ZP9Tqv)?17}2$q+CQciD?ZfmLzivIG`JAVRKf$`nGkdpM;)bua#d1x zgtk;8X!+ag)1L>ua;biN83q5fTD3{=CvJ}Z>f~Qw``f5Q5YIb$qGm5KH3IP9wNJ?u zj&aTt;S$d?zJ`X4yIDYCM5}`^nUK@mZ;<=IIvR=H>7V^-UjrE;yM{WuI)fd%^Gapq zgy=n?5-7BYdhcrE@-|sx8gG{@KM`(N1mJ9ye98#ufk-#k=t+Xy=$Dv?H(YOyfG!3S z>>UaVeN8#^3%e%}p_E-40WBG84&Jw!Zwnp%poeN^<%>6mp$lR)ScmOxT=uqo_Xm@L z5AJK~X_vDs5BnS_Gu(tR$EHHC@^pM@yTX?3Z1{y8D$Gyno0{71#s$mGP)>j_fKGMI zwYr#p6>m@EH2WZGGwkL5t3GUT#H&8ZPKdE!eZ_?ORyt-+crVu{pwX=zT7paqkojcF z8@g9`KeXHWmN1PFZB8Z+lzwM(6KD>sq*x)YtFZxmhga{2pQgJ`sLrcJ2}d+2S=)7) zO(&k;0c5+!PLPaFVAbWNM{bp1L$$e~JQTjzKXhPUkZif1P;a1Q6a@cUn;iH`WQGfD zUBa6W%Gy~OQ=bmib8I^_;P1d3j+FbxmK|OCHAOUti!W43ODx@gyev9iK?*=fe2y6- zUnoxnxGsFJWo?pr!`RR0#=gjf9Sg=b4&Ly9bvGmg4e}qm((iCvukGs=x3%Vf&dUik zHfKQ@&p(E!`#}{L@O$Z*<;KtkjyL}JO(<-U#u6VGNvW#QJV)FM=%GMIrX*yQ@T;SO zbhKoI$}s{&Yfx_OX9dgZ0fXb6p~*6H#Ss#GeV?sQk=3d)&u69KuN11ppgfnF&c=#Y ze5EA^JIw?8JdJV(QJ^LcT+TyU4(I$e&ApdzRN#$0|D3*k>z!ZpS%Kg+}Mop1!f#~X`Z(3ml>m(hIyg1#berAWP>D?mA)dMJ5c z4X%1G9|^K zK`z`$iWPzCp&SZ|OU;>p5yuLR8`N1%djfAI50OiWv(y#=g?|ftY>>`EJ!p>jK>Gwu zwrg^<;>O;1v)lnUqjn$|&$JLt4C6P)YZGiaN+?k&ZJ|Ybhr{GZiU}?dFn46SnnQ9A zO2#7O&Yi`dAL=RhN|v zI+C?Vibc&5*Bt`28Fg5}2lJwW4j}z**8s>ycV^E>XX;JLymYNxAvVb)?!oFS7YX+g z&cuIN)p<_er!ww}(XlIghawxv&9D{7-trN7e`$3Gel=?mf`v7#%SPd#&7eoB5wJOD zGb%vYEexY_>@E&Qu$(k#7t%@)_QJSYg(AAq0D#4}A7{-jETE&~JM)q=#R1?*9oc*l zE$sr;bB>>k%-|~Y;cqBOy!HEs2{CPQcmOqxHBf@)ms;2{r=)VD@N<4ir6rsZD<(E9 z#DJ~P`PE)v#pbB>qb%3D>@OzmT1+DG1}Md?Y;6af-vj-pS9q0y4DGOAcUU;F2w?=a zP;aon6>jCI!5*1iWdMQ9yE4HQU9&K2%i%+Zfg=E#%!MVvZX2liG>1p25mnzyR@3rI zp%MlvrJBdLfN|VYQ%Jqxjw%ZEbm;ZMe21JE>iVkUC%orMHUP?jq{A(<$XeQ?Z7@mh zLrK9hJc{A0^8T6x)No)#f7BEitu737Zp_1p##ky{%xYGgiEP7Gb2!lM8&Xa>scH^J zG#nZfdoeQ2WhPl61=J^CJA#J+)U#K;kP29()R~GKI(JB(;`f%3jlf`#`MUI8o-Mv( zKJ8GH^itjAl{R*BSm7b!=p{)WSlH->*qouLYjvtNrnP+Gm_(1WR{?2MA;Qc_ND8ShK9f- zGm?upqjzct_40n%fJCJ4$Pc?~YtMbTx{Liht&|y4k;MsWqxEygx9?taXu&6g;|{*9 zyq7O-8!A6niICYpWDDY|9CZODhC32k>OxEFLpTD*+Qk-5Mg%y#J@nQ-0y1_P?|_2y-pB(gn*NvE)JW%2873@_yL;hhPz&DK%7N+as14)UiWnzsH=`qDp+15Ie)sgZQfbXJUE)y zY@lg;ycgGXNIXf@?d?qB6;bMrS`E2f;x?6;G4wrWPW2%Z1=^PoscMaK_nBkw8gco; zh;gd?m({FTM= zSbjpz37;ku8}-x3jH6@=VxgkHrd#D5ZfYf&GEgBbpNX*B|M7&T#mq3iS&D=-`YPuO zyD!r_+=@?J_kTQW#EY(@ z5~zkm*Dh_HUAndaMXo$G+>=i~tqnfTqKyxDWYH&>BKr1qQJ^qGh%eY6|Y-Hfz+dX(R9F7M)4)57D8egf^KAPm3hWPxmYde79s{AeUy z;@sbv?~`B%{)7ERbiTWISIKjcd?M~8yj=+?}i&2hH2VG1EPGY^& zi5@7v4H$$QO(gggiFD31Q>RIdAXR}l?A#{Wfi0R~zltyaI>G3={xvpo*Gftti`#cJ z#RC1dl#AP-%Eibu*_I1>_F5UKO}ffxGOmlYT8n#`>1@Nt)o zHTs57K5;#kIA^PELmp6;00g}yNY2ODVbapQ!Beu{L>jEN`sBGis>Qd!tr|LSn(&z@ z^vTMHE5pz37M$F(ZKchxcwlMM4QU+do%ZI^Z?fbrv`Nb8TFWi1a>}(gwF?1;a8%xd zDoggXj+Ig~6+TiGHC&Jn;he>!UwSlaNO$GQZ@yCvKk7g94JrT?#@|v%#S|_UaViOM z&wl@qBCB(AtY>5(@!@#08yDn2w&PIg1fV8t7)#QbBPD5RyYO!ldAmabY?>y83#@t0 z5HrF-=q97@qW9NNm3r?15U}Al0((#tckO~-JSof|h;hdj3Z{JbJ2Kofq!SUY!3s~y zywl;Tu3iHj(!Xt}n@AFS*;qUD$7lL#YpTi{Q75X(qbC5N465-HKNYzakYOY05>W)!s!tm(TH>t51dzQp_Wh` z+H&U9uT99m4=13$iA<-!e2*o)&F{NuhdU5;#Jx*PyZr-0Kyp60v2VIG&gXT?Z?j)% zvNTNMwl1U9)}tL`+JR@J(XkW>9F9K6V4ba^BNkFwIVgKumo4=zFC$dwcif-%`#wXr zI%C0E)QGZV9xT$KesIJ;-WKefXpv@xiWqWV?$Xuq@`x|e8Q({;C23aoKWN6;xNth@ z*>U&!(oXL4RnOri^J(>x!$pm;uL`Qvj6i46S<#ind&N+v@=X*8uI%vLfmG;E9Rbwr zfNNPAFWFE{iA+mxaokGXdDjmr!l`jr#Qk1>wf`UvC#39DREZ?3EUC?0pe*LOVc6#9 zBzXN%7!x>>7miaxxO}TzqPm{e@H9lOQimkpRCX03qK5W5B)X@WCQ6!T5f)sLkc(Q<2|B2VC^-Ec*P_;RWX|n8vm~FgDh5e<9b;{H}T4 zser)eIUIk3zw}u!1XZFt(dt(`ERkS!!B@-7UjEz}{Nty+nV)@2;S|XiR)2krQ)Ub9 z>QW0zP~%!Qq{Np4RE71WM`px2&Iny)-IIO=&E~_?JEmwj!?^Bn4dR*>#Saj%)Hs*( zVl}tIv`0H(`rd!tKe%7nF~`MAxqE(GZq1Kq{Tf!xi_Kg{m7-8cRux;-=?8k?>^;Ez zPCWY-SPM77fm5E6bZWp9rqz8UWt24RdqOh>u4>Z-&mV}fsJ%XCSu_D|L2z7-v3v43 zZ44exi*y$uoPP2`;IlOlr*$lUh-$Mk>d~A~l9!s?8v z61T(U@17Xwp}BiFquG+>K2rs~n=+&X%LSF&JQm*~ImbM`eTV!hQ=z`Nw*t9i$tr%O}^=8i7cu`f<;q%mzqDYMK&W@bk-rmOf zQ>XZU37U7^uW0#OUVn9juysQ5H|0K0x!eq^Vthgd4}+!j9Gd$f`R)f!)WjH#H9isB zTU;6eSzDD2!q&bOPP&-aQZHXsJ{)5BbXA>Otz4vEl12O+!ZRk{Jd5D`=t1kwDn5oF zBar$I`@++?<`x>mNK>tQKBjjj>c?AvLcrFbeE#?TS4Vt8>b%VAwI6v|QXVJH?beA< ztj~B~uYSlhS1E9vjIzqc^+wxb+j$=GSjD87PxgEYNd9tqqpN8Tn)H3Ub1oCvB#Gah z9;hN`)jn{h_@fj*75tA1AB!5@x`?UQj+7jORwkUgM^~P44gVOyc5_b7T|w3PNH6`x z^Jp>6bSt^9cRa3)OtTE;#f0p0o>H<@o?`=f`ALHbBBd~wlTVc9e}?uB0fs7maK7NT za6hG1mCXj>^^xK0MEQ_*;JiC{keLwq2}wQT*cBRnZb#OhmXz``#=AD9B2!!WZVVHx z2iZv5VyoH^L1i!h1BRcS*z2Ci-zgj}#Onq8TWc}SUXF7Zwy9`N7yYFCY0FaS!L2$G zpWg4tQ1X#p`-;c??W=EY61Y3K8Wb$;Msf*8Ga;XB-+~7W>3=^%I;3OmkI*q&c=BZx z|2Gm}YJz;v*XWA0%@!g z(L4@)+^5iI6Mmf;*7lR`V#j(9bc`6{Hbx|1eMvt zge=w_r=U$UB541JsD6#Qnz}w4#qMf<*c`F+r0wKC&CjY)==v`&!+><82+eT)Qj1zo z(B3+NjotRsx1ZPT~>BhJ>-DC&njR#`4;JAX6`~+`^T7eldV~<*cg0|wH;en zvOy00Tw?eOpO3_eGWz78GGCT*M=O4ra^F{pX};Ge;=+0l4DQ#9lycLiP{{dTEbB1f z)^V~4=ONytLCG9B-ZjvVu#;ZL2sXWX`AUd*bB4%MuWkn>Im5rAZEV>F|JSX@Re}G0 zA6w>fQtEPQ|1aAHdY$pZ*>KKsAJMb_bURFQDt!L6GWoyjKKO;L>53bQI(G}s@8mWf zi~s%5J7;MqGkif!ehG$mLfXZH>#&&rnE_@Z)^a{-gI)}n|MUD~M4qz!=>@E2 z6W=f+2l%I4=g-q%+jdf=gZ=pL@{&JG$3NdYY4rd8BkZsK_lG;V`ak3Q zpX#5JJN@T-C!IKP1s@|x$QNv_xb1pJ49o1D2>$=6VL4d?PS%(IR8IXn%Kz^^Ixc79 z>3EbW5*wzPaL#v?A0GX`U55f_pzFbQYR_rCx<8wBeZH#y?ozq{?zq!GZx358b5H`c zHU!Psx$-d1_~9y5#Bw?S=YOl#CV4h*2aw#=q@@(G7EVcXowkVRV0O z>0#WAug5#OU%4mu9QU$D)}&BUe<3uCa=m@(%hwQHntwZIHEzZ6iOl#|G81LS1CqA= zwLiavZ6iN-v9mi?tMlg_AO3~2BmeRNw(;0!5GzMa=wAGFH{cj~=ilyMO>C31SK}f{ zctYCm^iHwq&cfjaK?Xn5^^9Le_^@Hs`a;8>_+!JGlPB2sCdAyY?VaTCzqnK0Awro^ zZ4=yJ5W@MvOMiH}c-Z7N7|h-Hr#R`~R#R`*jjnJnZQ}YqYLsdasx7-+pZkB&_MTx) zZC%@_dvCE&M5GId0@8~#14PKS03uC#6A)?At3(KpEeMFTEl6)lFH)3F2oaIqqzeQ> z?}Sc(gyc-z&wiix`>yN!I6uzCA6b%>wdSbv9`_g%BKX3OiffE;-#Pa4oBkXh1`!cbI{5$er{ieB;K5KEp93pSYfuS;D1=Fi#^aZEG+MH9M-eS zY_pb4mc5wp-~%wTU(N?C5MeSldNBMsn=SR3>BmfuHd-9PwSX&F6NQIo)4(@vNbL$? z?FP+U{Gu;LUBut`=5nhjP0Lzt`4WS8oQd^qCu9D0S{lUaMk{d{k`EhD05KB`oS@iRyFWC256Cet-xESa2ZEsGlz}OmE8BA+FoB zulbnKs>Js>%~?iZZbc|N-FCvd(wr*IFH=6X_)R;P{3|-5&OlRh66-e|yujibH7PPg z$Z@Km@3QA!#Eh0g1e@<_^Eb_(Cp-{+cB^RJ=YG&l>5Cu@5FE(lZtAfs=`YB8C_yoh zS|46v=8p@F2$j0X-=bp?V~}sOIZt_EMHry2Xr7 zikAfIB|mRJD#nZR;D7S^FxOJ{IHFcB&-C(V8x~JJ)z`JM#4p@A6*={J#X1_Ab5E9m zGx-%6PBps`#eTEnSu8DZ7B?8^a_5+Wi1ch&>5HLT^4@+SO$FVWrhUK~zm*J%?48SP zD(LKAiwBCsiZ$2L^R(&q<6-GvVg9X5k>E*6A&{n(>;{L}7^PB%0y7oko@($%X_ft) zsiJ*^zN>cjNgYju?%8@^@&A=p0+Z^;KYu&JsnU~9XCFrkzML6*L;$9L?xKbg$$Mu!0_Dp67FBWi*eE{%W*untZOm z`&$6<3Ia1|qpNyv%2{gFGkHI>zv^Jj=DqE`cjXe-=zjG@{u>2|geei`jf-cd%TwpC z@q&E&=d==dP9RUMFdetY=l&>tAR7Bd+1~=yR4}Vrx@qD*x)$%6FW>t5iYPk|)-G-w ze``m5apeupMt5Q(RFF&KJCDxWa?=;Li=)8_;r}EdzkL4%JkBYDHhk;s8Fyo?_`B|u z?Q?{)>I&)n!FO$M6-BC4_2(SC{8VSIOSoP;;c~7*xfmk2uac`(R&HEbH`>X^CN(c> zR_TWxc&@(|^(aDFJ*pw@)W`jgCXf~RtWPh5eY_k*d_{|wRCxG~{DcQ*5_FT-%1w%; zgNXdWAiPd<$o1gs-H?EzK3g8LpmL7tx!#;PZ@%>&x7l!GK6tfvTHZsL`gvK!$s<1sO`PG-S7x8DGfnMGJ2D?*va9T8_XaDXG0wa`G{iv}f8Kjhj zSytLSSMNoFzx|&;dm6_6Y8I)@f5xZomu;mjv%XO9XY5VFpFwmBj!<Hem&eiHMXWxo z`uqLTb0M0p%k38b=HCD4>Zvv;v9w*5;rj5LTbbDQ-P`y3d&`NCoQ4#AUm?gB*8k|l z|B~M3_14Sc<71rt@o{e->E`BWFtlb89n~K|_-i8`)}?!{Zx%ebBA#mQR<*L>qo^8# z`H*o5u>nr$$g7#4>wkm9SkS97TEr}TZD9GoZ_fR`Y4U!Z<4$Pn`*+mLw$TF<=d0k4 zTP2&&LHf0VqvYsEhN)WmB3FhkfE{+sgaWXs;2>CDL*t$4ip|kADB@-*)-W*9SV4u+Gcp z`Gup-5lr8GP!TL*HW3@&*nrNCa>Os}FQBOLoSL_C68WA4mWgT9vJWJ}sFYNw*ap-? z(4x$5R7h6e76{`!cOmLjvl_P^Q5BRYZjA*8p1<$srQJ=B4=jt~N8iQpF2f&NZT9jm z9wlC&;(U$k&6KCG@y}*|vk+d7(s>{=8}k}VvcJfA|9in1=7Z4RwJ@V9A$R67PSFaa zcN16PsjdDOkVA4vTDxxjhX0d_Fur)T zu?SK*qH{w#?czEAgVj98#(>>1MObZH!C%c*&JJ!@!15Q*wYbo!RPd{~WIoz_VRn^o zzp6*}s(IL>(I(6zlYlzi!D|=mWX~z*)_M{JQx~r$4z>$ylBP=s+P}y8>6AQtEK=lJ zWVoiVytQ0JdH&r^rg+V4?ezpqSkNh6RzAIztx7SSLvwX}F(q_FA=_k--;H57zRN&2 zVJGZjzOG0Yy1v{{fAop;7)lWwc{hzK=sh%_S2IqS{&i*$KeVGdfbQ3OA z1T2GD*39H#E7QTD1XV}?`?;FO~O^X|;g9kY)dr!wax%a~xomZFQ z-)j$e#_Nj~ax&;eKR{Lr$cYNHvo}30fx~T`j%w7lVz%7Z5Hfq6HQlE z|G9JR^Za?ZRmmHqpHlkWCKVFN$`t)<=?~$Sc&+?!%)KhDUd)sD+E}D~vhKGBB&poj z6l)W66XpBLuG@_uX8vIRZMuyet21$`kpFBaPxl`1^BspNJf{88gLXT^v5p)I(+Ao< zeN^zOQr_u`Q5gdo$Jfks%(2mSd$km$#uCYn@IhMJ2bnFe(|y2f6VcGVf^c{vkDE-mm*gr3H&Q ziVtbL6rxDBiI7u#=7m_*>%QLp*AotlmZjBop_U)}&V#AuqctNP`Yv|G3Aw+M0u0`Y z6qZAJ&jwgHx#(3D81f~^Y-yi8bLc?@A37b$^KWtpa%--G-)%1h9sCpwd-r8kFe3Vk zu^=kdNBKFd?XuGN{tKLg!I*_rCL!FfSJ zNHFI0TGXNKql*|eoZa9;YuS=r|4)}=()5&IAw5-Eo!MeyP2y-Glv5>T?~DG|m0MSP z9E&v*F;=1=22macK^Lq44N?C@&X}DarPXi17=XmMNBs{CBn0AzbBbF0IRJn#MdJs&4kY03jkUn^{O*YwC^^@@pCpgTaQwh%6LYu@sj2D6VEyHxLG z*g5bbL+DCg)X_{EHAOfoUv*IxucdKPzKXts)E+W4(ZkQZ26__qrDx_=IdAsTZ)XDa zo4Bg}PuHQyW*@}KNP8<|*}2m9gDRD|kxw#m_8+t#xLIY!!- zE~MI|go6!{!M3yTX#O1Dh#zaFjvNzLTOY5@Ygo7&IgWcl3m>TjL1*BRXWvMM*GZHk49q;j&&xc zU=C~RG&O-9gYF%A%`P-yF7eGe6OY{lbbm$AAmR;XEN>*{UD|UwMB^h}hun2h#>aY# z=JZ}h{oYTJ=iv#|&-ZtZ6HI|igMHbhCSU`L6oO;>2|l2By?AS?hM%O+w`T4Bw` zbpas=b-sCrgttd)pU1teC9W^$sacBGCJx7&d>a4E@l*HJ<(V%N`=s=p%|Ff6UCv7X zi){iIe&@5Dm;X;utm)2Bb&HW3acgKJB;Z*YH+loSk=W6s;S4ft!{ELm`&o%!(@6;T zZ`69xe$3H8nM~BsM}-$OR6;d~S9wxA=r6z9xv(*TYf|hzo2~yBKe}#V3VI$6_MUBf z{DpEVRC1xy&%Z5IRg0M3++oQ!X;vYD_W+T*?$Ook-#ImZ!G$?)xC}G69^0-SM;Oe$KeN4Wi`E-x1E2=q+Pg<_y@`2#x_l= zqeS3}oOVVw41cs7#=mzkDxMY^M}qjz23{j{Pqr%jXkP4{>zBtmO&BzI%B#pHB^46b-Cm{E z)Hb(t%UhyH{(@Y0Nx%P-JQxR~UVT|SP(8U8fmLHxChosCsElC8e?EaV2f%}f2On28 zhwC;ByqbSh`B8Cfw-FRhRU>>yt7|SXw=Ma)DkDp=p^VgPb7PQ7y*ad(U-yf?!Otd? zJyf}CFJ3HC#$>d^D)foD!@xz-Ii30+bP|}t{oLeNQ&!qtBk{3!!N9pdz{!cLbKN`A|~cP-a&B{cB(9A)rr^d z@rEOO%n-Gfx~lotxEm|a9b(_gD#)uch%*0JR!GU2y=0I&ndkOScDQP2M0T{Y5~8rt zD#^-1D>ptb2K*IBC-zJBH{KdzMpKAIEk!P|Z_R8quhqy?OhlR8f6{5{dIYGuxOi!r ztDAcvvL{`?Mi>4kr`~ElOL#T)@#WLn^%nEogVMy9&lIA47AC!ZzOe#Fnade?} ziIdx+5|um#bG5PFD-|^wfk)L5Q>fh_Dx^aG{0xpQ^H`bC)fNe6ufV^#PoBS@E-K7+ zng$0E@3LTJ-`mm~)*5YueUv0}-1qDFkV@@)(6+P1#{A~>op&D)MgmK0LHq%A>86;` z7L3eWF47skX+gaDs*kpkJ=FFvp}x1^Q5M z7tJEbvT4^ZfBOeHrq7$c_N-w)$BzKfWPZ0pty>tLL^%2ZUgaM>K74l$td>=8&Bm_7 z#1tDx8`M(4@HmEoSPxaVY}kJ`r-zx&fRz&BH#1h1NUJ)9tTA4srSBnxjFWXS)=?!t z&r$U@T8!V&r7*NdHyAp_x#&;aY`hJBamD6uh}@5w;xZ}8P-IS7nVIX*d&sDOE;bM? zEc|FeTvVX@L6UK0Ss91N+A^Z8r=ST_Ih@$N~dg0;dp zuMIf0J=kqBiqVB_ch%r)r{hq4Ua)}KpHCVmelEpWo=mg5O?p`E& z(5$Beaol7#3VKEhgJ`wfTr3mDNtB8uZ6~5w{deO9mQ}gW$~~vu+b6srICuEG$WxFG z@0A%%UR03YF74Ha8|9VdJ3Y_WCZ0kv^vC~z8vlt`ja_O|l6}=w($#1spULA^Oxi&= zH$Q|jH;Ssr33ztD>{>2zht+M$V}=AvAA~JByK$mij_8Qi8Hj4>-EZskF)1E5GAlAO z_Iu&y2%7r_q$ao`<@+moe8U_P(SepAhuI|u5VKUm78dF%EHa?Q79(%(QI~7eUfO#B z&(-5(j0u%XdCD7jdp0JvQE(+9HZXzuyC6^R>sZbz`8c-2yGUP9$ zH_j@GT_wTx>KA?Agex|@%3}|$ZtEuHo;4}rQ6IHuGYOTom4k=U*wkK_QUGC@Tit!r zrbevx*^;DGCS@fJ;)*GEYS>)iZ~MDhgg<1y(gGoKe}s$mLB>f(l9#JF9QQZ{+ZI0NP2{EO`m7EJ1IsE1cC?QcG~_{BRQbfx|Kda_)24a1o;)8{YYCktm< zV`@&^!uT`%XKD$XX?tUeOSzVEt{NF2|aOt|JC<3ZuNfxXHX}*6Hvy9UTu=bHJp4K zihyR2CM_>P{N;vFzT8ujov~4EPXf2W3iuz3VdmBj9Cfz;v{=0gsnwQ4D5h?7Yq)<+ z5KEOF+xrS1u6*K-*~&<@^)tY4H#TM`5A)#o3plZS41Sa1JK5VOX$ zz9LU8v{-6i#tx3@i(cb6yrFRYYg2U*8s4?&9dy$~`0v>QvDCpo0u&ixwjVGx_UhHr z%yUWCRnJ!lm11f*{;Op-YI4%sRb)--@2JN|mfBDn3t~kLlC9{Hlejm9!7d+wq+u^O zYS0Aa(F|%SKHGjWAaJEQ-v@KYCo+}P^`}YRVQstKk$`MP2q!%Z> zdgCA#JEWlwgF)orofD>&$T&|^`?M#z?#CDjl=mW6+&R^RX8H!d%6%LRF`K7eXb-<| zGBHIQF0Tl*oE-lXxw&}_u?3ulJ?@Ce+=AQbIr&^;*)h+&n;wkncR*7X?D5E>WLxDm zuO%yapQcgE$-Q}Adz{CKNsT2D)pm{Ky}#4jtKrHzB4&15U1o=98E7|P4oMFn?kB?h z`&30(kD6a?a$r#?R7U1WlVqZ$|4<~2k@N9wf?Ugh(}UE~mxtQ+xWJPm_~gr_iWt^W zgJ?C1{`-`pmf2!*AO(C4;(%)uxBE@+CY?blO5vyrK{|nGp^t=>YPB0F)u&(BA6j)k z_~c0t<69@ZAGxE#4MYAkQHEaDt|9G5Efr6s9P3Q|=A*R{e1cXq7mAM7d7#icUuKW% zIg&mBvzr~nRT#nr$0}|@|2gFiY`H;kC%}c?&iH;p=@iI=40RGpyUX)vS-(%voH^tE zAsF!u}toMF<_&IJz+nC&52ps&~XKl)Rz_Ztso$GoT z6xb+%qwGlE6()rtVSW#qa&TDx_<@}C>$Rg@rbqTCggLmE2dT{M4iXz5*QQ~L^c#WF zcG1!u5cZr+Ol$G4i^aLTzAn&HI+S1XU&7l@`b_T3mf3=H##4o7LI_xYa7$@dRO@v4 z)_K(LQ>ht#^GRJ2*SyF}O1_y3Ke0Vign>cpOL8+s>XxMSW*}n_N-A72KHWy#NXq`l zCUP#vC}nR|NR>%LVexGQ(x=CkG<$6M#OS(XX`3Vbug_IzgjZ~oyGDUXDknA~;4uOP z5qQRM`^wKR^3wl%xyzEET{5=3H;IB(OClXoV#!I2ZlJR96+qW!PGm@4krCx&e$*B9 zH`d|nG4LOsPKX_StQraPxd%lnn6bz1cD_vx`_fu2Ns{&DC$L0wzfEQ;LXY6f8F*Y~ zy=Nz5qW015kc0LUzm+v)?XBH`&vlFkXwSWTLRt;EFMo6Eo*Tu#)@9}~MTxDtyx}?V zYw!lo z*1$)iw|teB^_~U5eB{o6!(0R=5Big#&c4Up+LU8r;oQi9OBvVEK{~5wicjhDV+RrH zUSI#?_YU_>-Iw;L0ubtvQ>LP&s%1x^^+@{^0rsf-s%PfC}twjj@`6` zmr{WT8>747IIb-_sC07gURsqUX#*+IcsSO5>webf-<``g%oIQvpD%dT7$A>OjC%`4 zW83q;`ft4@Y?LiobWj2R?SR&V%`+jX@*dhW$0)-2+$)^LJzq!*sU`d=L(D#_-qh@0 z=8Xi2utRili!6m~BKHgA329KfRduov zH`=3fE>Y`fX+h6!Dll-LH~(@BMP|EiF3duyXl=oI*vSk| zo9=`lP_e1B8J;R0uzNrwQ9lm{?N|Fv>Un6-$rk9S|E?YkNlxg1(kA$xB$W)ituN4x zz$Mbh*N@iS z@iEx8^8^8yzt`-IhYo}>&{Z%o(AK7DRg5~(oS)=meB?EhG}>c+bPXd`7gvt(07GQu zjKOgkKM(pZ1&^DNx7W1sO0b%;l}l?sEamHuxH058*}+6C!e?)6PEVVgyO!`^P7@PJ zTF5uEoD7UyT4Cfy`>nq1>MczQ97m68nUTMa(LaG~yyM6#x<*+5no*J&=-9OvXNlU* zDou=L_u82;iW%QZ9HgOmjz^>N$+#(v_%ZD8(N2R2Np5GZG>sJDlz*~%%#NuKJV$8< z;son^*V2-JKTFtI^drYe^rg$yS)WipH6H))mSV>^+X+kM?1y?020dG83|8;s)hu+<{BFIKTby7vMMRi8F*T?vYW|feUD@WU~n;_T;5tbE}DH)g7?x}uK@v-3(C*Esk45>kuPZ=qlrr&T_A5b-rY zzy}7so$i!**pg}gq}p>_9-@JHhF4rt@|kXyWFJW)ugBgcje_KIbCj3Zqe_&^+P zhRO!aVqgJ>p@r6_lybCZ%w{k5r6(`@xP4^H7eHB5#_7F;>sP~6zCbHrv^-`0}REeQpgpOhE5 zTLMPfr!kVI0@lsNsO?E;Jls5utMjWu8wv}vbWVqdWDrg3qB!gL;A?|1TtMb&&{DVM z=Mx6*OR&u6?`zOf@Da4c$x;?@U(4*Q+t5Z`9qP}_A5bD)D!->z5TCBn45k*f|9q=^ zF2JbP&3*5WlE#cuHf8U;I`r5Z=Kt;rkfbWb1}~RB73#?Z-H?WEYaz`Lf=}6ye(evt z%YyR@cb9r+8lT&w6KAdf0_*rDT&7w!65+c*$83t`xxMq`l+kmRfF2kHXOa&ey_neF z3wOhM%=C8kjV(nZH+$7+@QPuG#g_-00y&v-;=A)6BN$2pc~hW zt=rADKGJ*)IoXHASSl_gblH>k33}XhR;$?%jR4?z>CNF|nc|t`GLby2=l((;$;xxD zZVqlSPwtppf|J&aj_6&*j@usN5)@HQv&WAbMJ=~$5IEC20!tx%N=g0{7t(dsSG9KT zA2y-ED1qfAirfNuq9T2QaC`mMb64ad_aMcSz{uUeZr6U^!Z*|n2NL}{i;?Sz-6q5q z(!OO;&+#NZ{v<%rsq6O1PW{Shved&}dhP1Eo571MWZL#9q8?QvQ6A4B!-_+60XM*p zLqv?(GQM#-bkW~L9<3Pjv~pYT%AMLhkhUgqmwQ8Lw6%mA23c{OYeSau&HK(F&Df_%x1cCK<1ffE)fz^{ZTpo@+)E{5_-^*^l%14F zUP`f0^kUMFujD85r}gar@Ec%z;)NQ!N#nf?Eq+z)1q@%vv$Q6aP&Gv^@%cB;q6M|i zM)*`2IST6+7`|C=)s6n?pl4WrqnV08_7NN?8}Vs>eq+*Wbp!@H_BQ zK4=Ji9;1bUsnHKDmG4twa?p*rz0M=Y4YzA1cvhZwD3*?h9QH#_!I%qpL{-D2$mGG) zrHC<0)J9ejCbMC8=b*Js%WuCrg49PEIwEA6kx5>QV~mY~%X>~`4YS!O{t~|}4I(nI z`f$o?s($yIS!u@h#{GQhzRa&mNYeKyjMKmuV&BwJ$nuib%dO)sKTCPPy(alY+IPo_ zwW!7^yqU^kETl6R8tJ;cnO@Lyrugy1Ki93y^lIBYn$!eH6LaD`sIGu5 z1S%7`3d|hr*v6peCvWabjlGA=W7g^fqU%Vrb7c+lGZ0Hrr&3D&J@@@=!Y*WI zoD@Smt|uP*C9sq%g{@+@4lPIDycIFysJcBz1@eV&28kJ7OPgi}Ts~!bc}5ic=krH* zWvH`R(9D+z3md6}lEOdGH!BjC#;}+L`J&n9ZRh1jsSHhOBFR_OwBZ76ucg#j{_7j) zJI1x_vffIfa`Nseo94DVUe19_RC&GPNzBzRz9IyDAYAt_njuOnXC(j-0>T@No9od*^fM5ntJf{#ULJCJ^e{&v^U9vnbMZV zE**%N8gjy;s-JexK~b|ixYCnd_Bnjl@lFZrN+zjgnRhc&=F^D}J-&CL~r66A1NwX3>~PMPk*xfP91r0~j%LB!hV43GXOZBozbRO6Xy<;fnD^l%z$JlEKlc#;%>E*m!%)+WE6owfgLX$IVK|AG6Ls zT_M#SW~n)|KFYb|tOpqoX~9h5DkMn2LJmKN>O(CQu`g+&58l%RA{RqO)1~*v z*`-Uzxt28Q4k~F%F8n#hrl3;^@cwYbI)I%tkh+x!KN`nyEeJr_Z1R$E8+||=G@yA-9a+bd9 zU$i|^yCVS|G43ND_gzvt{2CK-fYoxhMi7ARbMxskj}e%UMpIXQTr z8i*j9LzHB9ks}TJ``{!UwV7jpvK&;Jm7dG>Fe28VbO`=jYyuNx8(&!Cqg z`rN(C5niBYVWUaZTsp7X$$%$SryN?S$RH}^K=mm6@5jvN-iNsQdi-hd z&;jy;_u+=hi_{-E%>4J}DiOhkHp82hZ!)gn!Pyv$pd!oznr^I01d*Qgyq z_gjl)cM|BQsI4xGc5~D4(&q=GojacmgK9k}y!L-mE6?e1Ex2N|Xla1w@oGxXeRC<^ zdp-5Bh;Gq@HRJj|IKKxl1-0YMjIi%5>qp5)k;kgqK&6&MF`J(NXnd<|n&fs(Az+r* zYpUVs+s+E+T`vHqZN}@=@lZt2+`cyX*@*cP0i&Q`V7GRBK1^!ww{}MW>vVWaWkhP% zj#No>D$5#Xk7sGy>dsvQhqf+IzqD0|7nvU89_{%4Jbm(0MJn8)F0;ASq-40DdKnZy)?&!S0Je3`5zhsu=Cz^XM z>J|gG1k66m{!@tI+;B*xPq3LqPQnF+l#sV9AB(dEN3p!)bSXX`Ck5LhA!aHiOh+3x zt*`Yx7)}oG?m86;O6M14t@wL9SJCYd6;Mg;S+a}L>g{_9s@-*B8u8v*2!1?L);Iu6~aVAdJ?nob# zE(U|@%GPp+1kQ7N0{-L!a+a0kchs90-P8DTJ!14pTJZ*e6-v^44gjPFX;OcgDenO! zzvPCkf3Z?^KkfW5{h7ea0PMX+N58i@9GOTzmX|39yUK{o%rCCqivfEreg;jCA&W+y ze>dNNf(rUUzB>T^r|3#ls3Ict^dIWCJ`O4M;nM`v4Hgpd#vhDtNO0Ig2h#~kbgaH5 zxsHWjvjqog;*D)n{X4V%uD_Kd?%fq(+ry)dxR^UOh5e)GUY$2-P^wYWG35FBF}z5s zxsG7zuI-`k;zbAJn_Q^o%bH4vM*bZS+f(~`hP#^3B+ znP>r3TCQ{E=hUZ(`4SKQ_ivTu_;dP24(rjy)1_SUf7(CB>$vALUrqjC$X6sHZBm&m zr+H4%-zu@)Opf2C`uX87-m~g`?i(i7aMkZmB>Abb{arGtKQKh=tn3wCHP`&n@0 z7E)lN`A3B(#!F$4E5%Xf^R?P5s~WA@AIVd$|Aj7bVh+)>1z)eh57Jv4o@J7Ym14tv zY z9AJSkux94&VeH>(KbMm|I2`_$G&`?B{iVRr$YzJmbOAQ^5g7x39Y)#7X0F6v9m}AC zm$jMRD4oBL47$0Y#fyy5$`@kHHyckqjA8U|Cu&Ac>hN9RJkV)t*a*($kt8X~GBdKa5@sOqFg&%zXEgGPh`X6dgH2;lfaCoeS zs})q0D%M%9B^GBCOV=idbS*?Eu#DMLik9w~6p6z85hb~PRnM2`w7k;O_gN>Rem6n* zT3d%?DSvp*a66(awPise{4agC92t(^JMY~$E37wQGjyXZhCJfv0vAkCuLhifT-6AN zP3gRED}{A_)Xf4fqg=(*D$ru#c36z4*<{B)w64IJGSdcYnW(C$XaphcIKIuF{`wTxIOI^$$?FN_*dB~ zAcHWiI2l!MGujy|B!v$?Q&U75Fs*b!#o|FbETRBU&2{k6A2d@?H%(5|Z|rA#>Oe`j z%0@=Wr^l)dB}{ct#Rb9%gB0>8!xGMaXAf$DoWT)J7T)2e zj=!E>+IOMXFFVBbKyaS8Dk=jcEW{W8y6l>q*JNg&u^(lujKw)qj5i~&Q!mlnbSDuP zNi;>5aVoBr?iSkb1`#>hE)n?(0?%v(KjkI&%0Tdm11G7t$Pw1VM9p0>M2t%gBF=iW zh~Aqbt?Tz`w^_0&K=a-tq`d3qZUEXWD+g19VgzD6`SUEnCi1}x&>TQ|ed+Ub2F(KL z1wIP<=m-rPE+`1pI5ZUL6x_`7&_n#JQWF<(auhVGynx-wdSmBpHdJnxU2pI-HX%~f z4)-D9g11X9h=|%I1@Z59=pDz;zB4~daLxfHDT}ZC>=-({kw1Nn56de(a`WiCh^k>N zG~F&{qO(tJ^RYUkvmC*UhO4u>VOmRAW`p!MJZ2&Vsx7y?m|wLnTno+*<7SsAU|3A_ zvk1CrX4^wD+PE}W3q~X6SE=L{lxi4@c*;d)9edu5daNkL(5N%;^*rISq(X8Shx|ou ztk6Ik<#W;J@uezafVIa@$UinIc9aa2v2u4KE>RQ>ZsqzN7y3(58m1eH%W8LKFiNCE z%t=6N55ast3^wVxD^{jNnD2qZyhr~)rk*S!m1=iMfFFYQJ7PPoW3)hTWW{VMl^t&i zz!Y2@U1Jf=k$T)IN@6?f+CCz+7@zs_8meC&Q)d9;>b}Xo>?<(t9^_>wo{jtSlOa50 zhZTcic43PfkAe64XB4I#G82jQ**Wy5GCD&=U;^;-*BODPQ2Ni)*XR&666(0Mv9&_B zj`IYz1)OTvM4_lyZ`lMxU!F%|jXh6DAR_!zRrko}4q*|=N9q~_S5lqz9-<{ju|gZ? z%DxEZi07#IsO<|!9JZNrwJ0ew6pj@*GYih!7H%CjDYA>|c6PDhqVG?wq@ZyMFR) z1PJ|r@ZA1)7)3YCw3EJGGHIx;p91n!5EGv<1jYyC*2dD-du>KeT1lBy@<-gRqDQ8K z7O+5>CdD1B_GyqhZrN7t?5^J+9S!z&E$mPY_7O?iORk4q4x4ulCkUIVo(s$vG0KDx zvT-+W0)Mh*PEg!yRiyezA=?1Ad5%Ji0|c(;&6ZkDpn%1Vw(3j^+TDd~n@gUgRncci z0*(>@b=+^AgBMBo+Apt3DxR1=i?2wXq5qjAm9~-rUHpsV&2Zfxr<5Ed)2Wg&WPmPJ zNC%s5I~4)6e;#zm9R_e=(I!PwNIH~?5OrOv$*YVDEJEYT=Nuf0Yd@8I*5DNye)z~% z^IKl1XMmYd;nZ>htCJ~Jk>RU)gX?ZA!ltix>^{~Td~g#Pet34r&I%FN&MQG(2 zadlcb+;!v$5%((WY5<<|Zs_ht%ydThAV@it-m5E^Ucg9e)H0_W>>PUn%o(tkB|q}1 zKVrTDjOQ`0W4vrgkgL>ud~q&meSaf0uNCy+w`gZD3@6BQ@(ZuOsOy&HEgl6h57WwA zjXc0KM6L=itojsdmO%;CC|@Sz`SieHtFgFkPD=+=N}6oo&B7n zq_ktIl$jp0G8|=KSe!vk?0i)6YEqtbRT2| zw6kzO4<(M&Xm>Mj{4BMv_3GoM{9Mqxs*+H%+jNo|ro|n&UjP!&Va1~^d$;5}hpRft ztT8S?fK}QgDP%G!kv_wBY^c}`wZ222Z+<<)<58e{SqeEdu@ohDjJ;@W;hMH#h9j?( zm(l$)RLQsPdC#DI?%I2Ba){{F!NC|Ge|Mv0jy0CfFCoV+(-D%E3b97 zX)Fp-@$OGIg57Cj=N}B%3N`+w&>yFQFZPvM*-Y+bz!Ip7`*gEYvjO~gaIoW{_j1Tc z)P<#Pp+(77$5jmqyBYeJ*)-?o?J<5Sw<@Sa&eX#K>gLrb;8e}4!?{K0^jNB^;x`?O zH0~JZ=)TYONfOpev!Wvk)k-rUom4B_b264>9DVKm8h6sFOjvr23I!};M zb)bDKxx_I1_D~#l*Im19Veu@$KZ$Q6cAy9? zP)epiH?DNR$Zp+wtz(TZMogNm#EQ7jkgi|pcUS18jfQxdr@cs@JMv#z4E*fYU()o# z`r4g-d8Zfm(9p8lTQdO zSD&-=kJH_FVWqC#0uYVcy3dC$2=!emUYCx%!c-_h9;R9X+Q+*Lf2REMJ z3{w20YmI@ZL;FpK!Ulu9`NUQ?dOS(=YOq?fHXIayM83!K$Ek=qB+1q8;tct(Ja)7- z;O$#T4UE%Y-yPS5ir<3EY5Jdl4pAN9udtfDLU4-P#w|kTMF+ahorX}nI~y=O&|aaS z6?Y@%iC7O;YuS7HvuQ%2ZlFI`KZtnQWlRAvu-u(s6mz_u;iagZS?eW(JUO6Y)q=u1 zD!s1N+l(hoD*-!^nDk-T#$~!9HXc%>Vdfqb6YGp(zzmeI^xdv)GFO<(IVFUVw5>B| z1CPHG@C_dT+~^tOoQ@p3Wqo)5kH5Gd@Hg@OY=4T}thL6ndVI00SDLD;+g#tY=~yI- zp?2S<3yC+yo}edBX_n^&YwfQX&tE#@&ZdT>xPrz})+WXGRw+A69c)!RnI$&Z3)g6v zx=bH1^jvcK`A6ry0JHGMlJ}39cVZ6XL%#68GdIMFmOict=hKWYVtHj{vo>_V&rmWs zy)0-b@__LyJj`TThQ@~$AI0uUah>c?zHjwS`D_{|BX;;Qv()@Pah)W$Z?5*Bx#=(I zhqbYiJBYsJrGkg;>WAqMzRGVK=5jK=Rc)?Y%lW1hXi}e(eX}EWZiWogVfH5P_6|`<1&sgDi-V1!SSi_5y65_?{2>p z>^WDK^>9QqONJvy(>74G<7`uUc_LfYH;q8|d?zW+D_i0YbktxKCtbgzegoubrAGYF zNEIR4B#OLkz7*4e1EsIsO%8G2r#qGQ66x4m1Dyb-*q!~{g@>+fbBLc1dQPdDG%(_v zFUhA+9z^K*>2A^AGBuEGy>X{hr&!;?DL~d~3Rq_&tU{{M zlJ!jvfHr<-hgdk)Af{b|_OYQ9tDelY3dLATEJKJacB?${(n;NBUK{>q{IoIv zA$oH*uTw@|!Am8ZN#3Sq)$r9PlX)YSVYO@5-Mcl= zIjNO@aTCl82_imlmYvu+(40INe@C;ah#0ig=Fs~}fwxhucCtW;XH3UN^Pl9pqZ z=mGaU3|T*)=j7_^*cu5D&pgIP24N=M2i4(EMoxD6kGh6&sUCO9*aLW;#bJA{UIb0= z-`#S)W0hWulO7gir+0nic|ffIBvOU10TcOgp^7~ZPxo$G@oKGtStt?cwpFY6j>5CB z#lQxy#o(EHd6249i6PuX`qK`Z$Z;eg2vjo3=2tY{Mm#M9JAsdt<%;aQgC34$DRM!? zjPr2Sz{R|V7JyG`IpgljYO**oWsQ$hf0I`r-&_{ek%>s-YRR#)epvN6+hqQ4W~ZCE zclQt2@$Y?t^%~WL3#(Fcl=3yo;`N7y+EbNt?1GDwfBbmN;QoHT@9jr)%fQG^>tZK~ zntPvhO%|F%an2EB^vc4lb7E7+zwgH$8=6$~xIQemY7jWBbTYR=a|Lf{Pg|aAsTgRE#ygSgsuc9q0^kIkGvEpF*4>FTVC=q~b`~&rPg#G6U>-a$OGhQ+v3!kbd?1_6{ ziO*7j{{Jz1q>wFnwm>6j?7SvtQ$Xf9!h-@qc5&*T>NXn-3TlOxCO-#^T}Lk7FO8)& zX=iA;;^AwI?jLU~)O=!>$Q-vyXR21HZL<8HwJW77e&CS{BE(SG(N(alti;)|;8rC~ z`i^d##!tS|Ppn41pK=|(2;OJ;LVgx!DCi(m)AjbnmAhVgAwAchl3KC$M`yQwm>WbLv~@XF787zApf;}D&xi*f6l}!rfYQ$dGat#)0pz7enD*{ zJ3DeWK7hkn)k5f4?%Uq4DyYtCtm=O*`ZT%Ay0cQs6<*x7)UcPdRbUgxF;~fa6*50$t%oj$^ zl9u@h`I_nYO=(nKSk&2p@a5@0B~JTg=((}LMS`{QbTxHLj=w{c%pCOe0G!39%X%CiA~w5|w@6)9#dKQn zc?vVk`S5HawJl0q0J+hATHgmvKdt(k+IYE5q@Kj_|HIZ>fJM2jVZ+<4qDUzztq4ei zbck$`kd|%`>71dZ1_eZE=@tc%W~iZI1O%j|ySs*F7zT!K;oj$*{eRzoIhQCf@B7YL zPp{{>@15+#$NuX}ZR|>Q`c!*3keFk1)<2}+pCPP$Sfwc+ z+>*A7o>e`sol^$w81vp!Z?|!~ zi0nP-+jF-a9yqpWTp(L<9CViddg))6zt~Wdp+`63M|mjFQA@eEe^el>eKYkdw_~VB z>DTqtfo5&m5rz1&%a%)5(y*4(nR+#5mvsiCzii{zz?H}pP!dsYuhSTLKRrwk+{Qh; zBC*tJaRz=OD?}kV?IYyw4gJiUs$$Jg=C=~v^Np$q_X=|g|K&gbhSz0Bp^a(J=0t+3 z1~l-mur9n)8_sU-_1%nC(fg$GrpQO{Tp6{^VDiI~y$7ZO5e9g`dK5 z#my(kvmVh*$P6QVp;bv=ofUho#V@cvGM!(hw*-SF;zrNC!nVENmNv)?vkGnog~LVZ zdAj9ptw(cqObQ}I$y`4p!8BC>c4ng6(fHyo*doejc}?Fl1M+&G%FvW{8as5+tp>T+ z4wvUip5Q;X0K1f+BC*<#NA>vixFG1H+CCYDGc{a;daXKnf^wk zGLV3p{yBJqwYuD>BJ)ezvg`KvEwmrSlt6M^Nu{)&;ghCEsUp@u6u9Xf*O1WfM@J4F z07OGMhJGw!<YKU7D!kL+o&ZP41sAfW9Ml97H*;1-cR`w&|9UA-ic*=EUG$#}W_Nt(;NA6{ z^X1O22}UgP$3Z(N!#~0_JBLt34nElnb4RD|?W`vjf2#D$7-kvlUA|cCVW*mwta-Ut z;R;Sggbz9iIvJk`dE$N$v?E<6Ww|fL%x;W23aHTv$J3R}HIlS0md4K(+B!j&uew1X zp5p1lucO(zxJ)mG^NBWpdCbe(eTFDmr$n5T=Z!U{ zpO#s=ip$+$kEEXHL;Q1!3_wi3<9YU`e&GN`XKEfno1i#rw;l=5cc>k@zgl}&kO>@& zloo0AbNo_L3fz#E*3X4-9&v_sZ)YpkB<*&JX;AEUVy^Hn)ONnf{{=Rp^48`?eo(wn zX1-lw4d}{Njs5O8K7XfK|JARX0v0omsq>jyy!uUn+&B3#{^U1IoaM6$R-QLiO?5|O z(!J_(j*;G4T~fH6eriprT89D0SY9esDHV_>LT>f?ZtfFgG{E)`s*KLSu;CMr^SIUG zw0fI~8pNPlPedeUa48^x`k|6_+K}MllG?XV{>!qu=a#3I&B(KF==dyGYZGs9%82uo zLq%_QO^Q4bukeDHJA0}n_Bc`vYbWR=4hxU^oPC-~+k4a``5bRDj-OTh)M-#XUw?!n zmj~{UJCaI-$=Tl7e54n#d^DUrY{|{9kaTNxzzb|ie6{Kesl6Vbi2my z#+uf~iz6mi7cQP_%*)x9f3B^sta-bf1j_8d1WL!c7e#;@QxFL~5EHoVgiZRgt=LdoSe##2sZp%{LYY~rdeX?FNI#<^GO~8$EmfN zWFBcjAXS~8`;(8dVi8qtDGpXR!zm8P;zH?}l8`~faD+Q}JYXqu+G`40TY2CGm9j<# z#yXQzb3`W|NmC8k<kFlF?Juvg6Rw+C@RKwl_$jmwRl|<=ec=(JTdZo<;x&romFQc zHI=V6wDRTY`T}*1V2|i>PaaiY{Z_z2z+fUU^5b2+UZ|ChA=fNd^I#K6yYpw(msge; zItEAp!q|ZO6J?2LL=7j_-FCjtRm!B+W4IGC!exXwJI7>rQ};&39R4~)say}0nH?<{bJXRCdqUL$NcZJA(|%XI9E`mR^0K&pvpne$3O-xJds zH_Ykf6PY5M{Q%rVF*%Rv1x4$NnoXldT*2@=Q%?^o&{jsIGYI7V$%V^!BJD`=nMY5W zB|%uH5}86Ts?r~~Tz0vNxHGkcLgSimyQyH>wn!a4UUr?c(WK$!a2ZPhau=^21g(21 z@th-Y8tS-=(^`wg9HkXrV3s=}qdZ0k-|o=-IvJ)PrSlw77ryP3|`o$h3o`~rhAD;EDswL}3n}ri5HdJp%m>&{czZpJrbqd#qp8BtSJ} z&K+&?rudE44EWE^ocRQf9omyWMASbbakP$wLq8a)b3q}Rjf$9ePH{fE?n6CCxm5vY~yq5>NsOnih$^V{oe18P!6UnHoy(H!LinkgP&-vL?R;i2j_ z+NJK2B~x%(uCk|uo0ydumW>NiMIj2rXHp~usHWJ1&tBqk3WSTT&6Q0do{u|Wv#T!B~p zQtQfyV!i=svr#!ME>^AUY6QY(xv8V>#@xw&W=+W0opBCq4{(=kq!Ux|Jr9mPqzH zpurD8MT;b)$1=6%Wp7nL<~{1It?rF(7o)(Fu8>bO z0c5^$e-e@G05FfK;JD_MGRtz?x~@v-@V@6tH&9aZkAznI?AfY9u1#qZE5VI3PHr2| z@@q&A-7RCCS;?b<>%=vEeocWL_pWsNCYF-@0few?J7O=XqWIcL0y>L%C)4LtZAF5HY29NqR0>{B%@sq)+yuku=vz%JqfPbiYV7=V|Bja<%VMJp zzt&fcguS|)NIY~d2U*TP&L-nakzwMQld@ivr2p9hwpSmh$FzhH8Xuq*Xl=Y(oKnlk z^;t;VcnHh$*{4F~sC~_lFk2hWYNOLR86Esoy{;h+X_A0!?$ZVfm;3l@I)n?4D~DJ- zu9{t`jUme5NzPDw2nI%pqYeTw<+KL0u8Y&L?8S}Q{T2e&<#~|nvI0^WDp7@V3~M_@ zw#63~9llk4JvS^7Pg``iq7u6`H?+>oj2>6+PYPKg;=x4B)vFEM^f3^{TXnVK6yn1- z4y-vVI*rPezExA|r$+69>YrhyLow-SBhWmX@cGpa-&(gOIWuQ9&%|*n-0P0VA@!2} zWj)Q>UBCmF3>-GCW>m6UBs-+!2-(f1NNRF9GKf?or7kqzPc~%~RaN=S>vkm;pYunD zT8j_T0=7e5i6k~zjrqO=UZX}-!Bo^!pobvIFKj)ihe3F%S7EB& zwRNGLN+`)pN;pnYgUL zM=4;2*6)q~l|TO*SXXN7~bkl)8)kQmf$iXHTzPnTXGkw5m zmopR`&s&DQm|=>my1BV|*&ZW=h^Kk?^D9}3Tl42E=7z9neg^xzY38x{r}@lejAH;daPrD!}A{927*;z5Vp|IYSsgn(h;Em&^tya`j5d?>aRd>t_3uk zE=_*JZAV~Zg+NR(CDf;1dRci;;s{#AL#t8tt&S!g==e5xccjFJFjFm#EpH+Xbk7`d z1kQAI*d|Ho*f1UVYw(!BaB&uKXs!>}upfYTMp1UJzlc)p2W^!h%;@zP3@~+)kY!Tb zHxNUt%M+|N3i*8Ne?>>LB{I?Nn!x=Uf@)V9h3T^w4<{cbD|1|QYOepNRiRxe))T}* zo}Wws&#gbLmw5465e~zaM-ft*^Hfi!9oI+Lb%7X0FfDOswNUS{=<^5DJ0$O4dF)J= ziGfnC9`nbS9lhkE)A8Gz>ojYd9hQepO}M7FGmSIFpSZ`19hj)Y06s=jOsYW0+eXGY zUB-XPA;imbpH^}i0nw-1F7ge)5%gZhdZ`r z-1D(IMjr`QDb1u~A9a-iqtt)5d|`7~hV9qrWRLaUG$9Ivs*ODCMtesa4#LJ-Cbh55 z?Vf~*C>R1?>Z%Nd&pfK`Gk6TIZ{)a0$yQA6+5|8Yp!pG290>aHgei^7td>Eq^J3=T zqi4x%!(Y^WAF!QTbey4A{Px{#@6%_4hFWWGV6@g*Z=%8)4f@#}sa;LURrZm-a|Evq zEn*O@w7?EvK^aU~J5(c22Ia8s<`OXHwXJGrAHVG^oFszn|xhmQMFhygDKfEuEwP*^z2&xz)+* z(eJJhPQz<8*LF0?M@F@Ug|ybPvvtNxdy=w_cxnd*T5lZwJu3HE2fDOZX>H z<|8@sAnrnr2_ICXbBcizW*j=9gYnE+V+|=qUDvdZTK8IB`&s^w9JgGNbHS&7vBZn# zX~HXYP+@l7_66rxxunTud%Altu900>E>K=m5F1urK!C*c&OH$vgH+JWVjL1c+*hQ& zy}4Nmro#E6JD5R)E@j{Un1_LOZD$$e%3|@VyXA^Hu<~G2+!n!WAgdm>+WLy$c!bwnI&YYagOz#^KZmp#I zkjfgZCC?bloBaW7rhiC6h#eQK5v|4>D z+?t%^3UT7=h}pAw4LL2Gb}AVsbY`t6U@acxOd}pldfD^nenz`h`MRW&()ZPSX8^Ml zRYFTg3{cZ&v>O>8knV3B-r`>y5A5=&Az3|sVU_`)>?L}z zbN*cY&{xeF+ph&3$~V%9%>!ClYcC6qQHSnCv|&{Z=LgPNH7EVCPwG~u07BH~{bu_}Z7SH3N}w5#eDYqS-Q*^_B`OKS z^h)%BPPNa~nJTM32PX(9T~U)wJy5pj4V49TfLk$5O>Y}Np?H!FaJ^~zM@0+Z-|uuV zAiw<)!wT#0;HT!zBjwhwi|H#IR&kGCm;hy8FzCLW9|^+gC$3G_1W1FKshQeZ=y@ny z7d}x^{B&S!u-wnDAZoWqztl!$PedyYB&(AH!{cm@Ue>)_HFD9Z^E?THt5mB%jvm|h zPxU2mFI7FJ2Nj>pLlE{Q!VQ;6P62pPm7BX=!~{sUQwUJ=&(}ceRmgLeVmdoLJ8Q^Z zY+PcO++l??X=*^ib7WaDy9a$6hBP4X2a4ptb?UBQ2B31Qg#30f4k4MKlyE8W8AF)4 znek+dOG_dv#t zRmdi-nWP>U6apURbY@D8&gsU*({~_iDSy=;Bg9FDPuxULtnp87{r)8|&(9MMBM1}r zTG=i>eK>JNq_g;8-8!IrEkoOUqbzz~)kB+6#;PuAvF~&O|C;82x{;H0N~eDn%%!1U zWYB?BR6y(~6FCio5{^|?j!6~FlgqT(Y`IcJtFhbJcCz|b?Y}a<(DF~2WNSxty{cMA zJ4Bx_fF@5e7x8eOoaB&eE=5v3mnuoRpVBk&c^0#XkD>!VR3==%XbP+w&Oh*WAoHb( z4wdy~Fl3u+zU2u}*k;>%jQ24kXfUhuImbj)6?X!E(txc8qg_YClRSmKOXPMr#%f-B zRFSb~2ctW)V(X2Y-x@$JeiZd7?e%>1-i;>z*PSI_ptB>#pqLV&fCe6%`_#@$_L<|C zT#K2|R#zRa&g*Cg;Uf?}9yIDP<+6iH5=fX)l)l{rl31J}${n70OyI;lBn>Tf}Gl&(g0UkWMgNWJ*!& zZ-3m~YFac`Ab4@_BKkWJ;geY3dYc(gMFJ7$XJq26iW^8G2)eG@hl$in?ZhHlXMd1^ zhCS5TTq3wh62fK%D33oUm&xI9D4^;EZCQlR8br{GpeR;2Q4MPyEdZf}#6=j3FO-pP zE%s;jPVf2a^$7shJlvcTDqEo2ZSXki!ZM(@w_7A26AdbP;NwEBy{jXes(I}&9DKyc zb8`9R-Eshny$gxM$2MSgF{n2FD0D)%*t_3B!k=V zI|+1Emkop-|Cz4=D6?zDl$C!h6mb%})K%a2@@$KL@vrY2zO`~RBO=+pJF>*EXQQ39ozZat+BJapDyIET9xsF6QXoLo|HpHMU1*i#PN%&w4WR~f& zzzu9Ba-!PATKF)c{sqXbz5IkOY@0w;IJE1!TO5E1*xBgR3EK=Bo>VK#E-0^Qa35}S zKQqi3$a4|l7aUWQ&x>eY0Jq}SFL%kZiIv!S<-juuPRjPHo;$`=#%YCAi>CT4(LRmV z8>p}04C^JhG|iWVPvDsu10|5XlD)SbepI#RrAM4BxIvK>&w1j$q_zASskUg_06z&5d2>TN{X zyt9<_tG6kgu(rXepxu!O&xno;Ot&>Kfd9;|hRd@zZ}S7JXZWPzdp`i--l}dJ2__ht zzOON%*iM)=&zPX_mO>ogQK2-lWcFbFI}yT$qYvi)t3$mBlH4Y zc0KBX>ks#xz^%2$Xz{%;sfw=TN@P#q(~D)VjVM7o{tlbm4L=h=-cw>waU~<2&|8D9 z_0fH%xp4Uw!F7@ox;>jDf6(@-w0u7E*XyOpCdT@f*XJJ-k*XQ(oicwe_U5U%l9S=@ z&N?IedNqC!i*&`@Z|*U571+}@|tKvDX4-Wl=Q&Ah8sIw`MYjYc?pCz~ZvZpE_IwvXp5SfkI zbT_ZZ5(4Sz>-Z+Q0;#>S$Ii23z|8k%C=e1Jx;yqBANwM?SwtYc zk=Ta2G#FviL zphtfw$UM~&P8P(=0(2&KV5`T&Yo*UWKvR1RveYg4ZNue2Uo&5-P|e(@P}zEhf{w2X zBz(z2!l_TBs$JcF*$waYC$Rcim5*2rVjDc_rfmfCxhd&q6Y-IQi)FjBFF3XYQW31N zZ59Jb%63`m%O0ti%?{IfFqC{KXUV+Oaefzs;7z%NWGLk{E2b-9vR$)rfVW4l!YWpr zYHE;RFilycBk3>P@YGf?FE9G7 z0Emw2y5+L$4iSY0f$CsjhFsoDQm5f*@&)Z5s_#3T1a>nh)Xm`Ih4abEG=boOk~K?j zQoDicr<;5cVN+p^7&KEXvtV8trj0YH8onf00{8nM-vTIrmIV)XJOWszdCCEt{!W*T zMl!bnu8Mkqj^b7=rX4fNPosSWX})^rB53x}{wEt{u*`+`11D#fL@(pH2eUL0O}S;` zhc#-ffK19p!?4HzH)+kspxtw2$QZ7U zfu{x95I&B)kBQkIw75tkt^q*B=#8^`BmY^=% z0ou5lIaNGKx!BHiLAg9YAY(fKDc#r)l(+-k7ZdG>0ZVT+c%ZiQu&+9;jhqUQhuxm{ zkWgWd1fAQIVI!~lHNJ{mf@saV-M!=}I|kH7T(U_$237Vx_Px-!F3U;-cTmefCUktg zANWZ|u=_G+%okw;W>N8aw^h-!6EILc>iy5ZTMYt|h}VKYZg{4f+}RbAlUoB&ZOTbFf3nrRx(k4&hRs-tVEdhTM1`sNVOcb7Kam9qn z8WG2uz{53UQnEBkKY$<8#yK#5pS?7(x$Hr+aCI3b8ms5X z)=Z(h+GqHe()pS2gbvIle+UL@_)<&X@pQXMa_%=zS@12d#eP1DW9o1Y9Hm|;kZTxR z1+IJA;PLg@AEHSC67Vou9r&cd$y#LvQP{W4qOrqDTI3pFJG=aIi3Tl|3!Nb}mh@op$<@oDtl`ck6GU6& zemHa}vw3Hi{G642(Y+#Mh(EgLUeZe^pA;@Z+jn>oHmkALYZHW3kmF!_ffhfX`5xNC zr?Idsg>833U=DUAzz$QpMLGE^-r%<42IFUR%PuMI-m*9&z^K%99c{t2;Fi=3NXb;? zA6x-6WlVBvmV$YHCK5sPyrhH=VfvNi#5vb9*YJIl`WK&u{QzhBc;^XI!O3y#a4=klEhk*m_iElQHo*n@7;W97egN!K>^8Li_?exr;Tki zDjQQbkFF_g5OqHP*`;fn)AA!KV6VDJE>^rUEboE2u*!1R>t8#{&RT49Lx3ls`Rq*} zFxFWTkp$@KqRT2Olj?hg99_La@y(mD`dNdVXC@L-O}@%dk>sHov%NFryXE>VrZwY* z&UM`w$UWIpl?MV-0D|Rgl}snB_vH)yB5`=TVl3_~?+~0HoT)tklQ!Y3%2tS(&lM}v ziTz)N@5XD5C9dSY_zt8A5a&%h-TPA&=SkC6f9V*UL;yw}5A{AxI0w8v<>IC2+Q>S^ z*$up=H=Jn69+gF)`8DOv${#Y=gWPWZal;bYH`+nGDdNQKWe1?gt9oiICgrW2e9*d+ zGml{vMaZLA$DK3Z%kQPSc8pk#lIYg+I~34O#K>&?O$6|pX>5&e>UC83QN<&yPuq6qgY3-`d$vTB&vFNFa8rb57+O?f57U^8l7~;w|8nRc$<6*guQ*{UGne!lAQzV^aY$QH@D*}SnZDbCN9Etkz^q< zJkMvpgWK$zpkP-;4ZP#bXE%u+eBsAWp?%!%8F{PiyRB5%=4b*hD6YW3I2Kr7y^gz1c=< zFK`q?By~W*+a6Rn0?aK%nCO;Vpn7uWX8GCD-u44ay@7SU{eoWV0k{ZT0|RG!(9h5B zd5;JwfC*N8-@k)6FxNQ2UqAeLn-q8T4-oU?!APjD7ys_{*-Bwm4PjRT$0mU2P9y8(_4SR%ZTK2cNpZa3$kej_wjH`bl;tmkO|5*2AV1yC7LNyLTDOl?_U2Glo+GAPRf&2;f2JFdyKTKnK7-|M zpLIKfknPd^Cna*yCct*@ik*B;vrs^e0yfK&E4*%FIU;QIk=p`tFcf@7u4)hF*;GZB-7syQ7yh~Il$!<0QPT5)iWK_kOeBN_^G8P8E9JpnuYJCY7G!gh+jIjxZFI{N>xQzK+H$Xg| zhL`1nCGZfy|`*!2y-rwKVYtCenQ?(a>97wgZVPY|T4Ev~f@1+-R>igJw&s2VccH?S@l( zQnnf2LqRGA0-!McE+ie8CI3xF_rJ;y;Py0ejoK)S-s^hJq$M+^)Ghwj1PJ)GEAk2s z^~)Q!Wgm&iu@2b=@z3Fu`b2*=tH(@PX7P5&3}fpn0pTXHdeTYc^l{}iC06sVgJyzv zwJs&Nw1$oqtcy!ZB^rHq-6NR@54fvcuR@?E78;vJicbJnr&~C_L6LXhQ}A1UCaK`9 zh7~n)y^tomQX34#uROh=`{&UgMQHH9zKXVC{ww&g;CfhplToi~E7OxG703(mEs#QQ zxTF9tH=MsXD3;M&q+|Tr;y@d=UJK|w#pNDG<;YdaBE}ET6aWDz;Mly52F!#;R)J5~ z-BQjNQYS5iX@+$+kM)ni@k}|nS*Z;$Fq4+YwM8Cv{i6KTtmsS0SbE=GoyH1y9~tpc z?2!wQk!8W_XOVCE05=Vh90eef>#^dNI(fG%rcwIyM^pOj%Mq~d-85BQV3L!LI17{u zd>n0IR}Jgb;kw>aI!tqiUJf8meW}HoIe(Xa=|&?MsDDgTsec4GB)6wv65z`s|3UJn zTRuc`+2e&rwM8aXt*`olH+=CDyHWv^>0h*dm$i>e#X5e`^9wQlQ>JSy3-=0+&?+ED zD0Ri}m(e8`8nJSY7RZ{|17vXjc7}X6$6$A>g&|xuK_q^Su~p;1e*a_Yu-(l%%<#yS z3`zfD&(JLCpwx@}K{Jcz$UgfcFUOic(t+N!TOl?ut}brBoJ5u~er%VGZR5dUT}fdI z&g9gGV~*Y)7L^jnlN3Vl6Wt1fqbG2`im&ZVAecq|oZ1VT1rFL3AGR7h=7`6?hJTvQ zlPKmdF~T?RF&1%VOa@zB8=?}osiJjB^*@yqt{P0EsW|~j!|r8u1!uT%Fm_@ELcZLR zK9F@O?PEAY!i_>&oW4q%WQ=aO8)`n_>}d&_bee^g^So!Lp{CCvi@25ss0Q;7yc|08 zf@_8@0kFxjsj3!0m{jNuxN@s#rGq#xULrlQoNRDj8x^qQ*3w1CVLa5n$RlfXpEl^ia+(9frG>dTPY^UeCXztt)w za&vQDzIYWkxmbBOBL9)$SJa5*stF4vHM$d-_*$^Oz;jLl9&}+Bz~Tw>b~-*qpW;~c zU37Wd{cTrAX%5ixB+3V%3=1oSb|A*{D_Cg5(&Rdt&Yap?10%5jBt7T7xZ6 zPh#w2p0GhPH*sZee`(h`c?jB6QxW8kVk|oOeDGnr#pZ`Eu(8s6ZlQf;DLT!*{<_^|0gSC>eIWzjra6YItz~FuXUmjg53Gv^W z^7{+yHjxL3^{Y>W1zmjH)cNAi;;q@tf;l?iyUEX;gD2v?C<0?iUbN|I;b-KLW+`Ix^)XXifSz*wv~@>~ zXYIH;T65!Suc#8Mn4QtOXajQ6Q(X1^vl(JUMP*H;q7mqNDJ0but`eC@|0b%$@TXY! zPWk9>4kbK%k%fDIf2@CfIO-{6?5N}YK-Br@l&159MZZocCqUmx4`DeXl=Y1g+NWDa zOQi7#+<~6I)<~84H2v5xju<>*yolEGct@1;VAuLKqjBJ zXEpsR`Y%7F^v`l*6aD;7EUOtO>0v00fc*N)_lg{a6x7`*J3cYfyq08K*zJ3)GyMtf9dlx`_)RZ#qF znnzPnd}v#z?onIN3GX{;hIikLwRBl??~DkJuBq7N45oFVj07D@*Oxauk~K0%I3Jr} zlS0!K_};$JwASj3ivbvL)><8Lj?D(@fQfO~X$-^6Vf?<`yhjS3e$UXsJ64u-&7QkqBNleP=TEo5A>*DNF=#kSuFUTUs5&QDz$EwQg1o*CR9@TK@hT+DE zI(Kcf`udr!EP|=@>nEo3af_i%R{%zrSmTsJg)(1P;OoM2s z3;+dTTT*b*5~e=F(l1m7)2nIButLn_Ly=vM?2z2s!|@97F@T)0M28vRvGEobHX3Q^ zT9wnfGSXIb7;?~XxKbIJ=$edbbPYUhoGW)LF&@`3F}>eimz3Ye5i1)u4Dy4y0H1&+ zBqvD0u^+$&3~d(`foPJ)V@ijFaW z6Ekg*Jz5s(5h^OP5?`=Re&Mbubn!#SE6j+SOo`?ssA#0)HwXF@11D0j@u>z}fK9tL zvNKrmX+(*Jk*wymjGti88}oxVL9oI@P*>zP$S{prokla2S56lf4d(7&dYt(-xi;H2 zfO_1ZJlmgl-vq@gtCH4 zw7>*RtQd$dsJX;xOg8OIY#fN4v{@iFG1hwpJMwCoPN4WK!$nFA;BF%TvYx)5*wgC$ zz`D(2c*8yBQKvg78q<(kj4`OAgyen`P|FwL8W!EO4PH*5I_;iRN6fS>TIUuAQ*a10P zrnVr!mkJ&LY@^iZJErq9#oeiIdF+vPH2ODp+>!%>B%W8}H}_NlY^h(H2o^ELyl8*{ z?cRf^K^!|(#Y=s65@D5BWy+^e_sSsBlmFIjf7l6FJ%?tJ{Cms;>Sl5mE^>c$o^0Zi zItA*tWaK|%QTf5d8Wt&~?dV$6QOI(Wiem4fC!H(FA5gFntTmt)>|dUS5g2((X&_fH z`l?ZTM$ceS0zLKhK+Z--4g%ivkZW4CkpSGz&)&~iDZN^yJ8_f4nc~?UP_wv8wor~M z9@`35=C>!b;pq%q_ME8Bc+nF45?-tu+yP{vrCSi9YOdTJvA7$$zN{ zkkh-##e*y5Qm_k_J)#$jeF+eL+|Av+jJ?3cdSjwX;0hcop3gw9vaOwcu4D0e?;L}5 zhY?gHW!NLfnGohIsdNL7`eb!o0md6&g72e$vavGsBapR z(Tr2^2IJS7jK54XOleOhq*p%F>yA$YWkgs)m>aQmCFDopi%TR z`Gag(hYg47L4!}g9PknvvYd?7=P+y3nH%$8*V3*a1=@l%=qx>xIybvoWAGH@U7y+e znWt78-v`$5jKGpqIki6C)D}e|>Kd(NKV>rDNZf+D;Tfyl4*A6~8qScg#B^=`)=4_~ zx|)mD2k7;)Ug*!%rCb@1E*f1j2-FzB|1!Jw<|_SE|Nqajx2kV<3O5GphHwH*wAr1T zq&)Ath9>&Caw&kk0zf<2QvrOrEZyCX$$3HRONTW^-xj?ZNrWPb@n)J^063TOV#Zdu z64tz=+19u(H}mSV^Govq?hLuxAo=}-A;3;sH$@rA!aks;`Sx{qH&UxyB|`$A9-mpP zbH{T;cogvUQXDNeefB{I`mn9#-PQ#z7MS)gpC5u?y!69NZoX}Po?YPpO`MS+S9BEs zQwP++LC+X)%)~j#vv%6q@mYL-ekZv-^~eMdY|wxFHb6jYr<=m)^EmG7z`mU7Au>0< zZ2(SGkDOA6r4m3b>ke3diwg^#-cz8s=)1RrJ0a~f_x;8#vqwYyc%l~ zBKyp$ps_MrSjt-W1Ltze@tN21Bi642on8Cl2tZ@KdITz-t+ww6wFdQi7&T`#lw{9< zN)uw2HjYEm6U4)``_yW#{Bd$W@Y34fOqIGM|!YEn`DPj*3}|2ymg3bGhC>Num@BuNgX zZ}!i4a8nnsPy^QR7Fz~Ky^h>LNA?0vvZ0&6U@SdPzwyue|C7Fw{h6C*`3?Np)v@jJR|9obVAu*UuRbl2eefnk{nC__Q-zwpA6@}VtWq7N1gp5 zO*y;+YoED!hbI!BexgQ$*}2gvgUAdG4&`vRjIS<}HUb2z0H>?KZC_Mr0n+gQ zM8y#3`{{Q6r@vXsixP(b2RDevg%xN)9Qb}P?K>a!|MdaDam$$Bx+uN5G$F<3=Th|e zC2o8j>PgI3e;d7jn?4}5mv->-Z=Y;9GGlUTM}>H8{b{Lx?$D$9k$U%RvrVQR;Tgr2 zk)wp7KUbmVFQ2QCoW@=aDaPSoUwJNF?0-&oE*As#U53_AB)a+`UIQ0 z@8lMs=#Q3fw3#04E^RWTdv(1TMJ1PDO0SDOh@I&5{uGk;Fg7eos4DN}9|3i9Jk?h( zt9|vffj-rZ=B@pUnghKtKijv~d~K{IMq!fMlTkgVGrug+YLl2rjQ&+!c{vA1>hdht zDO9YvrfT@ajIhPC>BX>p|3?pwde!Y4kJh^3PXJ>X`($6r^uuqTj8Z-8i)C*DxWnt7 zpymr+bH?OT5)!Wv+@&?t?GMvREB#Iq5=LN9N!p zy`3RB5fdSAHFdHy^)Qj5J%`TU)pha)ya3bmAqet#|LlCw1FvhoE_~K+AH3&5gj_B1 zseB2ZQN{r3OX@GScpI%Q?7 z>qb2nnyz$)D+_)mELH2**?db)D zIED2{yguuG#4jRs0OaF*>Vsp^YR6huWfh458GX`S>PCd+*1IDAis<6KW%lgrs~{&<&@DxbIXK<_q;y7t+m^?v8@5M;UQ#+93+5aYi#M zufVpr_dl=xoGA$BFw&#qhBy`4LL4{35$=c+JwsR5XDWUw%m(U4`Z_Q4Q%q^OA@;Uw z;&T7`h}uv{SgS`oUFu02V!K6H*a*GWz4KTIGPcs@>VEKrcGI5@IlnPmf3kk@X)h1^ z2|EB;IeYnI<88qMf4=G{RaEr@r)3e?!BmL~(KKU5jE9T-Ua8*JD?Bv%u;C1XJWM7r znMUt4o{e{%!s-j0Oua^nQavAf8bJ?g*P71#O%7`OPbcEvB5?~jfj2Hr2{Ka3efvv$ z^$ZQW&VDRkoFRB;c7OF9Gl+v;{7HueO?yp0_lo-5GC^c$O{8{YWv45=)>PFV+MN>A)+{5ijBilt7I+89BD zb%P~vKjTZ9THVeRM*2*C5*YvN32B`WmzcQjIdkQzg}Aw6k%~}sS?9pnL_QRKv_&QA z&pI+Q@Pamvt0yXfs!Dj&^Va{?q8K0L&RsfwW9D}IVx{2p6AKK9d?7;>c1ZxA!kQRH z4gS@~>WEF<3BM_+em7L&4h?Ld=v24i;&>G%CUGup)iovIg%x4+f~~ckqDUIO*O&+s z))}VI3{QSZ;!uie*eMbx;(T=MqPz#B9VOCOw#z^Dhrp2L>vrvWzV=tQpnsC-Cj=Ma)IOY^FCTX-!p7Xj!&GPnMp}bjZdnu zT`c~(097ynRHOsnetcC)uF2uetEq9`{FDwfqVgNc*ALIzQNy6KyA>XpEa}&_fa$<` zc+R>aatlR871Z_jqU*EZEX78t_1T{*Y!-{R!P}0lt?FTn253twW>!Z<$!hrd5klWZSS4r8hs^UW>xRy){X;fUZW}wPAP2n9Z9iwHA*7I$%ma=rLI=pYDO?ViSkvh ztb{hd_W~lH!2Z2#UL=?tBMMa28iIkAzFp7wPg7gxVp@xps5OM^C5fG#+Eu%E)(nCuG1f+(V zPy(Ts00}jLgd}%o&i&V!e=VG)1AN(gzwLRR{qFspDY;&7r4#8rpP==!yu+E?l$XM#m=MFbLs>Rv2Llt45o`(8!}ZBDPDkh&GR9#~V357}?toaU zA#QUg$}sP>rly9Ho|o8loAjTbFth_g@=Hqg1>RKfj8+6e^CF@AT}eZOfc>wg{LSPB zPeh~k1&d5HX*$dH-F7$bC4Y%;d;WM)T`{8r&f!X9&%rBDi}8Bd)d9JTeU>zV*<8e#Iw<1A z`L(;Qy3%ELzC{weM^JFqo9XAgb#~d*2m@+suIbeFY5Jm==n8*dcIto!38A$krW!mt zNJdk^lR{;5PMs{}+&MFA#CC}goi{y#CTwI|$1OSuIq>rklYHc5 z6)X5Ps?9F8x$rlN|sXf!v48+ zE#%^5!mXt!O}sc|o4{+yFKuG<5&0XZn=@-mYEs&r?|Pf!zLeC>{Ce>6zO}DGPH{!m zUv=e%|46AJUXX&-z)-4mM5k8et&q03BSO{O&Aa>jrA2xEz9v`pL+Y67ua0hAo2xQd z&J-dy>%^GcN9s~!C|3IH@XsLNDk1|gyXHhV+m#7%%;C8jwp*rl5~e8j=J4B_0BLmO zW#ALWgbYuO_}kS3abV|Zk06MoY6wD&nz!K$RKbBodn4t0Kr}xe2WCBP;5ztJ8D1` zJZc2qlwFEk)Gj)4<9AVH@z(0^?_cqa4mG$NvnNY$nEE?kBvbKd|2(8oob%&Cz7n~%; z84bWs3H$@N`}7!!4QGRB37xNp5G{5dpioFZ_Z@=Jt}v)rz--#+=58kux^4G-8GeZq z>07Ds-2JK$GnCyxrGo|5#qTcc$O#c;DH!d&&O0U@B54}*51pH0qU-z_PrDKDF)Z8t z0&uaykE#Tem#3>o;ESFwf)(YOv$blUdgvCH0H5LNz=ccY=ay&o-*oer%>Q=ZvdI8) z9~T8aPj{=LY=2BFEF&`^iv+_7>@~Gh#F6hodABX@?uz)u#hg8-rH$He0WMKjl=9;4 z{$q$XnM6v!p@#&y0vH*78eW{I#-@g|1$9*bMT8=?nl$YhGZ}Iw2=t09-skSmT?*OB z?(T|Etq@PI1fe7FYF7Wtp2lpQJfi~+gtY?Zi{Z|rOjS)Cl4lrPdh=i3`N7}5a&<*z zdip|M^z=_7#Xx45R4Q068A;AHUAPMnndCk{YQj3~%?7B<|AotqCgG^60{eF9)LOU- zk|Dxfj5VYOK5eHPP4RXRw$N!<00cv9LQVy&eiOs2lHr*+KR`Od$s-4IFyAnTwU;cd zwB2O+l;d{h%8t5AfG=bV`@sE|{v_04c5AWkH3Mx8zFgt4gtzg#6H-f7OWJ@-#LbfV zf2>8wH01mH+q6vc%BZ{t;ATKs^}u4~({Id9zt*o1_E9Lh_Uk~`cs=dv_R^1=td%#} zeaGpU=htg_i!cAWY82{V80vlJ7Yj$3`dNEl^Xu9eFZhsdDW~gIopSh_n=rsYbU9tU zt9({1{uKBTmRQKA(vKdXR`aN;3UC{bMhx}3$a402=<&E2#|D z1HI78A7{;dZ}Et=G9iwp`*Pd27&5ghGm@;h@u^TpV@&Inbki9;T;?2MTO>8fdNSxu z80wDR!0KC0_sspEFQ}!(r1^aLSRP*j1$ z8o`2c+v9Fyy!c>w@CSLGHlagM?StN;DbBvp4u~6*THDm5lr1(h-}5NF`5jAI7GDN_ z35(lL2N((aK_w6Tiyu5`p5keRDpvLf#4BUzc`0VuX)>GxiC{89^(^Z&cs9E*us*sm2sWj`1o*ujXkW= zXbKOu&aOgQhEu()dn@Y0%ZAqskk?!pZkm%6>-1~-+tRLbo(^(mK%-zG#s9VC$p7_ z5|oa-bA*pn3WAU{z-|7PF;^ZNElZggPs5&pYF#0ibN3p`Emq6>Mv-q6w1Zn!L1_%? z$A!ML^5qOTxD0@8Wo-2TK;bTcbl4-@W_>F2 z`=O;sN=51nfz@+ghrInxPg2*IrqZ^2g@1H4O4iKZq#hjyX z6V3t}$XhcJ1P6hP;HIAl7g$0NT$Vv&&9XlnM~50eYG<6^2)s_Jx5v18B`|nQN#HLg z?O9S3M#uqqGVa*(;GZdyCDyyO2(}w=1&q4ezvfo0OVm_Ia4olgPxnnAgHXkaR*z4X zT#0R37+BvgF%?TzP|&1K`$$0Yr2y6*nXX#_U=1&1hHH_p#( zx`0D)iV6UB9>@;oAM7W|61*+hCf)iv@W8qWy8=^ey#ig{9(ph$U&h#FAOwF1Yjb3- zbI-UDx|Yi4GIg5ent0q*{wk6M-}`Mm6{B6l@7gHQNx?Mm2eAfvbnPm%ASaXV!8xrj zvlH!Y<9gJ+K7IN)_v;ZBvnHkS(?K)Q;AnfMAn94)JVpSKMOyoQ$z6hDxX}~LwU{<5 z&FAj+h%|4K1YMS}pPnn>(4k=;aKKBwqn%Y5@{GJ{_WL!agA670!-<|C!dC+mD1BU} z=V=gQNjn~497viDEmlrRPDPI`X$vYke~(^E<<$KhssY)N{@=!9{n|q{UGLw>K#y)G zhQZ8NrD@j+uO$xpU&>wA06K|QGuOgtEjKw@0M%Kcba7eUqNxCI&Dlpn)kcIW$N6L^ zUtzDHdZPB+YRtmvg~I`iE=|v?N(%J)aw=wL#w7BRrydLk*()%bVwbQZOwv1Qs#MS% z$pE2RG|H;0-F5;V{GVJpjt)4TboxlgsYrc~g9Xq@=~=e0{?;!!H>me*wdbbR+w#SZ zE^~fdPjl*dnVL5i97dJMh9<1xc(v|suQQ4Vm%Ma)LJB`l?KOu&H=Raq%&0Fb)AKPNr%Az(s@mv2| zj=1@e&vqz_qxP>-3A{M|Znm|M(jHAm93H&1+)WQw+?mV8_)R1sG0^;uZd)KJ>LOs{ zyNLYUOf8$S{nOzbfg$7C#H8T?jt3c1Muunht5J;Omn#t@)?6)|{RluQz_yBiJ@;)E z58pHVGOj_uO#^;{0S4#4SYHZoT0?qxgm{mIP5;~TfEBkDB^)N%#97hhbK8+{?{28M zhb88vz(zpS$VL8oFlRs4CqV(!iOrkNE6rtLcK40kCM%T#50Xc^!w%2!cM}q7S(F z9!;fJ{xGn8#r<1L&1fvIc%D5RGG@AyVqlwsJ_V+c1`X$V8@)i0@! z_1x|2RarugIj`w<-WoVDkA2yIKHfscAu=nS1I0F}9;IWOe4j4YEa`+>|Hgfw!*V~0 zrswnba%EX{zSC6n%2dCc)W-|%O&)1yf@@Z|)R209R0X|kxAnv^_?fK!T|@^%yDocg zG<`y&S^*bXx;M%xJ(x#eHisAuTZtbPv`MB#AU&cggbi~`Nugc-_U zAIydci_t+UD7##G^z<;RZm#{4*JfQ9=ey-l*h_|>>TUI<%MEl*Z?+76!ZI;y0xAV4 z^rjJ&xh{kX#!#62!MJl;7$9J}G%i5lVp-e{q&DUT=R2q*Svnj(p$vT? zaAPSPt5N;FsmYH=TL8|P+*}O=g4&Qx-P*$#*?!IsLvU^k5P~ z@k2hErv@y@%gRC<jXOVHI((HAyAVI;fn;vYizg2gJM3x_d8x#Ujz1dh!b zwExVu2XJ@0Kcm|tYvX0QE@np3M5wgjEKsb_Lnb@}bzsnoK-W%g3<&W08WhF>X8h!Ltho}Z zwNqIt9=gtJ2-ANsT0iq5%+1rbQF{|`aoBy@%WhA0d*x8O`8@?g_me*(QQl)MPa&kQ zC_v6vCQ7Am`nr<8F@Yy@j%aVrc-oBY-u<3R$8%}esSCJm|8b@2(oZV2CDkh>85bLJ zw^CZ_V6Gh9ihI39V-wrcvCKlRXJ~_kOXC`*K>zqbu+8%$E1GIkn6BxVkCmC$_9t%w za*B2ha$zxH&#hM_LpAv@!nicMjoF`=`;nt&<4ydIjhP7C{`cLc(iKVeOydv?Mh{#r z&*+B=MQEd(mX)bulUnLKfxH!`L*SMH?#4)ezr~j;c(SC-QJASruot=HkR<-uzYd}X zSF!Jh&~qenvCPjdq006YQ2A0kY_?}B4o~(P+2GY3P?iq2-=n5%k;rZK`H8F#=lC06 zoY+P(m8yPD{&(n&uW}(u)?XMK1;H{UZbK||*O%%nj* zz8#EoN84fDLd}4fEhK4TCPgoA*ShIqvhl?Kj)%Vf5TLPkHZ@P_g>AaRK18jxg=GDx zRv6-QVV>(|{i`2L+Na>3si5K#fwrQ|a^|egT@_t&JiKJ|V8Sm2BjGnNJ(kH~{TTP+ z+c=3adYV$JtUH*0?tVIZoI;H~yA}P>NG$zk5I44D_pKky!{r`n=B95J-<0xiz+qK` znLE7=i4)^f8!%mW^mXCUYxK@KU9Fu!b% z$ux6Q9Td{+oyKIVm8|TD7#uzS_XMdcL*YTDQMkBqPAL%S-CBx5F)^MUlEfE1+ao>8+JPl>;?+*4I*z2XL zP$Z}p!I*BwjHE7Ru*$97YAmWsF0N?+iJ7*uBHs)mu1sqOq7CADU>>YaDn#k{B-7?I=HiRV{{FHd z)R7(Gn<}Sivg%Dg@pPl9oVWSE5r`rpnliypk;?>AUe=|WDZbGvVmNNA&#?E`4{bE2s z@>%Zvk>!*gjP`U~UWqC#xMfa(ugJmw6yrKSUM34op;qS^$E`^A;iQ4iau8L@&IYDr zIdNm7(`5g`(689LclA7U+~sqENq@_;T1lOkr z)QA*XQ01!mri))?Q?KtGN=zHK?uz#P=SYvRz`h<>2=Uswa!xqd4Vuyp+2t_OB!jP= z3%)$QTKd|YAKYGs=-T5*A9;Ob_?1j|sE(cNBXM@$C{%0985|i!tnFrQew=Xf6Q)C0 zSJnW9(3S51W6PAF=uZ@tK{6(@^D*j}V8`x)-cUs87$?3s9wv&rjJZet;U9HTKMdt! z+mSO&SEe9|88h0z|8Tu;Yej4~A+@6H4FfJ=_gf=?N=Ay1{YXYEynE+8RpzHjm5)pR zhlTYNnY;kAk$_W#!R&m5f8f`*uYGT&>5HkPhF)BcBXaBFDk?~l5U&DIgC5x|KV9PHax3iv+z3vgmwg1W^ z?`HpIbSmr8H?hyhCRHvB!%qfl@e%Zlt{KvDAIZ20$=nU=DR zycKC|@FfrZA>fl(u$NP!>jaq0_-+)$A>*^_Nx^d0JKwf?JSe59@8!Afd|pzI9Vw^N z=SFv8Ki)(Fq9h#D7Lj(p>eKE2Ej!8KpjGX5uosOeJ^sM^YL?NY_nl^L7WudEv%djQ zGsp&$mLmT%P1Wo3IQ4e}&BpXbJ^>8#qm(oQq!(HWDSU=o7 z#M2tLN(0IdXlv-J>u_;GS@~`TrE&OLx7^TZ(qX&}5cG43|0?*nc(UodV5ou)j-M$I zJ^wMYK)2s$E2Xeo1?#?Wsk61Y`(i?@hQ$nrN1TB6h*DW8_I^tLp^4w%R;SpccY+DX z7>dBo9}`(U+Ln2{dK&$RyA-OS@&1gU$0K_?4$l&1O&zQa-t5e5-Y4ufd;pCgL%TjE z%nXV&eeDVN-|)m(3u~~$q+v`7n(8%7l-?#JK)F5RJoqi4xaf=30XF?UyM3`t;1vs( zr2i9ef?91;IGtt9jX;}ptZN6Yetiwz9{Ykf&08+g<&KKNs~e64>{;WxP5 zSvI5hqkI(6=PM}D*_PM_r{5`yd8Ojay45jiAMq#N_SbLsso3M^KMa$0*Lrru?^b6@ zt||(4hEz#VsH)BP<`MwicU9LtU1NN7bx~-vyCv?Tjh&UP$;hT|Y=pC`tFv=4O8n3z zpzDi>RQDQ)EJ4C;1LR0k>^x6Lq`rxc&ZM<^t86ZJu%|LYIQ^Q5tz{Z@@Ck<3%2Wl{ z^6*7^x!e!ocykp9#s6dXh`qbwK-4U)YfztM2a@!8K`YX~ya*S^azCo7A^FmIU0UTi z8~SkBiKYnb$_LXK0>OQ4ESwW`++%%rXas}eC_V# zM%b{un_Qe$`P9yqD+@FERG;U%cu;5U@5Tua(jZOM`x$byP5KPux`nqDg*By7$J+V-cnudaD;X0FsFwVl5 zed5_IrGwXL(yrGY_y7m~M=V7i23Ite_Z|kCo40iu*fC}{nI!ayQ$UU35v(I#0Z$$nI|@=_0yiDzmq>oMhfT+N{GKU)g*b9JF*dgb-iYY-)z#KwAh4kH@#G09i!&GBF<+--j7$hP>Lb;^3k~ovSA*hdPpDrXEQ_jCzc#TTwwW+?~J)h*QzOU}NsdH6P(eQy@>F3*2Noh@1 z&T$#|HSQz!>tafze(m?Bx*4(j4QCV=qMs@Nr-SmId zn8s;4Gx8WZhBKNZP6&KPG?&c^;T7D%;!$qSPr0wl-1+$&N!Z@=;E=A(?F`?Z*uIHK zr3R;iMY@>bxNk-2C8psqI+%Z5v>n=gf7aR0G){>!Hjrig9_rpFyb`HAb-B5zG8<-N z$29ZVZ~KWpVUoaU6VdS6`x+GM;^OiEo;20}NS?E`WIaD+Wov0{YWLzoWfsle0En2f zW_1OZ{6AvIgJT1B2otHR3eN7OgdES`|I3>6P3^44?LjvjX72woV^=v%JIly1&~TQa z5Q~8--Q4M?3m>Pa!V)%jseR|rQ`PHp{@8=bgJQ^m+cyxPWVtyLqtad&j}%!`Tdk&x zEc`SQU(X(ox*rrbJ#_+ER8+RE@mKD|z1L1asAQ7Bx19YhTA7Rtjt@5#Le)rw#^n(S zq;q5dVkG!-D`dn}=gMl_a3T4c4t!skJRwahM1FF@zcBX_vnyYC zJ0Y*8syaMEK2kOXrpIURg2$yMr!v8ILDBC;a^QL3(@I^oGRtcg7u!p>tE$zYD#O*_ zzfjd-(!Fdj(E2o)>?Lcfw6J_vWVU-ruL2n>N(b9=A|ig13K$eh-xlp|jr1jVXX1%| zs?C}-K~I;9Rjq>#0e44p$bV#nT%!W5sjXF08xcIawpK-Dc!YE>yp`6Fsfe4NuKZm3 zMoo>xI`ap@+WLH>8CNQRu_HBZRWFKkEB0hCJA}Y?7x=(tT@zdJ^-W9g5LLC2+S=M9 z0oki>fh%E?Zpv3^w ze&K(3QyAw`3`95kd?K^)BU;SP+_%k^s9oK-W8;0Wl03uWKQ(i9)+IJ-uUP>8u=CKg zR#$_+nZKQ7_t>8|uKkBSS5?d?$eA<++>{#dtHSvHX(Y-L_hO*X0qjApNJ5>5hmRFO zOENcFs!FG)1_!H92-=>M306iu2SNF3CUI6=?V=jqP9OCntDc=!(oka*y15_f9iAnl z{>S1$s;F%5+SwD8{739HvR$m1xgXGv|B(G~d$kUyw`reea1Q1^>+9=OGFGKM>Y(Cb zeDJZj^$w!DuRDu7-sp5sY*jFVs$<8bPd21f1srBM`;7>fHSTl`9#&M$@1BhEE0XU` zvwLEECS$&hY$sZZp=C%(C#u1v;hz+6wYAl2-J?(kW=y`WXprl->AjUie};ibdqZuN z%4H8LD0jh9zFHzWzc1*5A7*?{GVd++W=TQ8g}II9O~}LEE^XD! z?1DOPkODV{cav7I`{~pkJDhpv?)sW@+2`YBHmNuMI9Q&p3o*th|u5^}^6*S^Z5I|B> z(BDS>I%A(2>YM=bhfE3*C*T}agFc;=1ZovLHj0hiY)iCYwkCHRiP zWG$d%=pm-!q4sa!N` zOfSsJ;>iu~#VYwoc!Lwh%4_tqi#Rif0V7FuEA&XS4w6oov@0Ugzj$*NSA3mB&cNJU zW~2V1W!cS4k+ud~%x5pR%l3BD*$Gd<2!{}9QU!&_4R5*4zR!K50Q@QIrl%n#XD|QW zar#eml-QcIns?9WlDy|wxw|ec_QN(JD*Y5T^a||gvas28DebG;N9mw!htEce$v}Mu zi&v1)GNaLVw_mg@|6o7s>YCjwS_A-q^eK1_fn!);*iZ^H$C?1ihv%mYqOMjL(n*ewL-m&&@2*WUU#cGY5Nk*%9=IlOuEK z@0+AJS?4uO)IttCPgSz9c7D|GnXW_G(F_8g_2oB}xuR;H!LWs)E_Gns?W z`vm$r@p)UHuHR({QhagIHArE}wdiV9{;^WTKdR*f0_Y`|87orFm>XI%nnpzF>L%`5 zGzILpZbj;VS79C%(e&3SgX5HUvhRMB*Ed>EWbOXS1+jAJXQml#I{cE+?D60)`~HkKK5>^TjL3lKk&2 z;8dl5X0U(OH9Sv{M|&dmhYoUuu~M*|je%D8zuSzu3Zu+Z6*II0%r?R&op7=}T6@EP zHouW39}(d?doaJ=^wzuD2>`Ud83YqN|1Q(zDkzraOj6o74ZLwkTiMn5XUZxKnMcf& zfIfS8=W*zl!lqx1Z~D;ofUCSUGtX4TiABjy4N}hh{N`{7f!FfN?B}o*Q_nGNdLLfEKZ6(K>NN^SIKS@8LyWs zKzix2rn3^U%7K*cz@Q%JCTFK5N4V;9uNJndqM`v9aWnK>GZAcBDq2^%nt+$@@o&&* zuJ;TwZ#-M9DwR@oSh!Rv*^^FqaR=0RA6h90?es6t49E%0Ne)v>)Bjsba(8_giXX4@ zpf$G{1A8B|TyP?M4x4_eF%u|$rmNyYanc_?pnp#fHK(n`05I}<*A~cqHKg|1gh~5# zMZb|`iQGEB5sB0n*-!q5)J+>n3iNt#$Y2$Zq5)Q}>xOJXFIRxJEV#KZpW8x-R53|*d=T=at(+gPc1v=4(SO&X_wCdBc;RjZo zc$^*?=coK^@t#z)tnqz&!~W%&1_Xn3pEI_EKsZc$LufnrcI4n z$Ra&$@oLXNW(Fy2SEO3pNn4P6r{`b(a!;rkCUEwxQ84@?lIPBFDc?>cb~r3KU{!HK zRM{7*^gEla;%cSpB&msXd>KeaTp?C~@avLjGsOnbEh_OgCjF+W$LxEN3AOWG8mCHP zU&y{hmrmQ++KzCahk;A2r6v-yn83TsuG{wS<{2|{1<{1$>8n-`^sM#Z-fSk?g@pQU zk>tj7&q@<-8N$kb$p;^!s9EEOa5z^I`{YRq01($Ln?eBHu$@DKeebR=efho+4**D- zS*Hclzr9^oN>sx6l_^;d`-K=k*y=x)E#@dQm`APdZOU!}?YN+8-qdb*_|f*|G|>5fJq zJ&^?^MN*&?g0MfEZs;j>w)A$Bi|b>(fxq@;0*KhnTtF9xF~j}O#5*3Q?NYX?i(HXKpsBDy zw+DpCzyRLe+y_i&5*`ia2U1NMNQzY&gOuSfC~6kCT%IMXD!`-L5aNRedUS8Bn2h=; z#G`*Irpc*ke>@!}pxVo6Y14F#Ppn9^i6lg&$djs>P}CCkR_` zIO0DiBitJ|u3go9a}lt~nL57F*&1#ks`VNIn^3bl!096G~51!l=UL{tWG zfeRDQf(||k9|X^8jhnOc=hX|}H|??5a}R&{016d=JtM=vgEo_u$U#6+t-d_hv$odv zGZ@j2USxFN2koFmB_%ST4rd%Ld!hJBtma8cS((UU`_56i!^|L{45=5dPXydRKRWpH zFK;rL9Gj^f)FM1YlXh)@%z*m+I;~ zIH1bMw&kzA6D~qb|GOh-Ar?T56$&_`_v-FDRc}m3;-?8INfKBEocWU!Rr z8K9vZ0+Cn&^>ea%@CA)gr9xBQ5L{#0PCGDwPDW|`C412 zgYtIv?5e=A{_M1GV9vN9kz@7BD+_I9X7{>4wJ|Ud0onIw=vCgrr81Gs8ydIuOiWtW z$crLp#K~Og*Evb^KV(N{rpZu^2Ev_Xkt{8{axl&|7aHM>1awtD<)1 z%M^to=w2-;Jqy5d&%Uow*|V}Yr8WeOXRT=hq|#6$NDfyo)gkGk%w8V?J-((AZOIOY0ah63N@%Zl=3xK8 z{1-0}PYdwE^Ky&eyGuK0`M%quBOuFhXA3t>*$(M8hKghM0 zMejNvlx9^<<})F~aL%6jpL3?i%H{4ol(Bx4gs>Hdy_oOEE#+&$p5Hh3!rnr) zf4$i%=5W5SsHou2BqE|_W939RQ2){tr9mt|7)u`?q>PRY@FCJ4rkoAS9dp-KXOJZlvr}{tjG*>Xv{Nf3q zJ>cq=X}GN&mXH)D(nyBWqTtJveF(YIN3B6}MpqKCGBifRn6U%*p= z2*1^}vC(NCX%uAyPqMQWS5#8Sy5T#noE<6CrEwkSi)UQ7cRycFBIN-YrYr5fi)qkf z2g^I)>!Qt>k}IV}rOvLO|8sPY`^M=zIK8I%_r??^OVIFldi75SQ$IsPO_T~BY=AMe zxLr`0ARfM;)5$Pgy&*~5JN>NSKx(@@0vwRF6zqDCn(4|+?Ds<2+A{7vBe$tZ)xp#C zz&A1L9M26PX+iSv+y4ZVS+LkU;VYX&gJ8fYfa)VC=K%u;0_EZ`>r+AtsI@Qwn2-4O z)PPmgEh%zNoYnLB*`a%4(x4X1wpWXkmE}xTVu(AbPRS|B8TLQ8A=w{y3?^z{D0X?c z6&e{%s)q^!phgfqkf)PLAsG>hFhWfv&Ok2VGH4 zeb^z0$0Pn@9Uy}J(cU=bd%9=!CqX;AK#54dod?heC?FsJp-a_4wsHOH4}ZA_qzj;6_sI$}K$k)bc%<}=;875&0=EJ}0{H%6 zs_8Jv6oRO91^*Us-kT0KV4*KJ-cVFn60}_bbpw0$W*~sH7APbd-CLnrbOgu%00Z&l zBLAj2ruyNJ8RyThkL`~QAwoA-fSF=qQ9u|2bb2B=`j^P4M+j9_DhrEC=lV2;cc1$D&i#3HF0VFfe-Qto@ z6^%K?x6fn@f}cdZH-8+&mbJD;8-zZy%PFit-a-5Mjl9$ms>#2YFZ%${ce8ufeu@^Z z_xP>2NmUbqTFSBo6Nu7}`lLDl=94zQT+r=YOjPIrOJ4!I6ohE!Rd~6OCEB06C&x#j z0U(nZH3w=kg()LlMIw{uCFYOVKQpwovo$a?Bms4=VbFi!^t}Jb#`N^`1MsP`fCs(F z3Kj;cwytjlXsT{dx_a9UsEt6X%v+40i_;Y3B%~sh1p~|#?3gsPcY_XGiBk&!Z#!1% z{U+h5Y2(ho0xXQoFF;`a{|65c&R$|q)cmh^YiM8C4JjhaB9i#6@kM2!&V#A4XE433 ziG=+Ish3EM`a-u@OvB<#Csn#)C$(}&7wfKvdioo!Gg&uI7rcmwx(|?Hb&!))*RZ;> zU7$lB?JZKxom%hBNqMc1ir?tU05uwTzvsfdWgQTkB0VWJmP$YVqfz2N+fd+8c;12i zk`-;r!L94f>aeVI{w$W-EP zXgN6B|HJ>`JrCy;Tpe*Q4^Pf~Qzv<$0i13xzqS=eQazI`MkGu3*m-}4k@7}7{LW149*jNh_>+721b!x1=d1&$^b|T<8 zdTO(g*0)$=k-v6WU~)#@w4J1gZkKRtTb+c%;p#HU51^K?#}%e7kA-`5X7uHgd6l+)cYFG|5{>S-V6D#bFu@x)HhbR_RTVdrN|>+E!qcUsfD z$@%(*EGkPi4!mAFp5Xs~K%&90j<5!2GfLam4%dB9jUQyww!kq~T`wXLW+Q&JBs!v7 zf7>V4@kg;mN7)!NXK*tCI0*wBk})_wb)uBO1{#OXhB*Nw*F)2blo00&$@q*=i4fGGq^jInHPQaVd7Z{fz7 znq~NczPH8rowj4qlBHHvH=cQiPQ_QsRPw*l+lo@b%gdczW(Q|m*5KXlJ-x6-f8W^_ z(`fMSXdv>%ga1Z3^TvN+a6d`*B~JM$m)t*y?m~sGBvyCTU#~ zDe(A5e}V>u!>n3Aud?U}{b--5ZyGF0w$wnEeuKR$YZ`y$*=Fpd-X!9tv0YLX61lO4 zy@@k_B@CWH@EZA)ylU>~BpYRxGHloQrCL2`4oo1W%+}80>4=uVIl%+~7~xE4<0K^= zu>(Ux!ds%|NsHv)A7m%D0Uxfc9IU)W{du9XQdH0**fRUN=rnlC`n=a7Z@M7u{tE9< zfj$BOjx7mBmo3pYQxW#*)7oG{j^VAr1Msz+>rw%@@iY71 z9*vOQ42!Qr3d@ur*Ln;`zg$~hyW`K0p&*O8e0)UR$I64eX9u79h0L~(6rch~jrby0 zoC;<&)}RP_Ifp*^!P}V;<)@HxQK{sp zrt2yp8X9wM%b&e!FkZLNvt3NBuPMF=**jWMDdvxk{}Q;HFrBINz@kw>RsH)ctgjJ7 z7lqQ}?9kcerx30|UB4x&WZCq`OyS*zA^#t{X;4qNYP942_(C&LMx(JTuh5PEa#-1@ z;rV1#Yorl(G!bvxRt9lF)Hv>w&ZmcWklpP}>{6(5xYSgM>(&hi zPcq@}tSsIo`>EJ-Nq)lOry+VaY2MDBwki|}O8B)Vn8Ru*taBuO5WUhMDSzEA=}Vyf zARFAmU|>2HFSl|BN=>Tz$c|xLXvy7o;h2Qs2qEiRNwCgHQAW{m$vpamRECzzQVNJl zgB%riOxNs)zU1ZWhU3+$XXGkXgNA@BD3Fxk8Fd7uvq}n`)(z@6|72XctL~5+Bo)a# z;u*9_yVPKuIHb%>N?qhXZiX!{S|>nrb1q3r$S8g%T7h{1r#CA>NUXJ3J$Zlr)PC}+ z*%9IGhR`p6{ZfRl*Rry#0C^33OgCAHNQBR(f=>M(1YJXaBNt5gY*_L3T7=cO`bZ2}W^Ue(JFHt`GcXMU7Grh<2I zJL_-d-4A*UuJvdP?rhfK7^1U(zAECg4Fbu>S1iExp4UA1>((~0!qi;VuHpJ+R2A4{##C${4Q7Y)0Sqx>16!4*?^a77{!6 zu;{4d@ZHwK`hl_f z_6y2sbT%1emzFPHMI~e>Ujlt3wx|RIk(8euWa(n(WigvK;&3Sl_}gy#tBP65^!vi7 z*%4{+Fm_|;>iAo|)kDo^H*(+Ti^-~cT>wqW8_R_vMPd64TX{=@-(dMbud*_wvcC(_=PQCjv?v4H6Oydc zZFybi)RTC%2X6d04e>Zd_9~?Qlw=U7$8VDIav6q{jQ88Y3EIA|QD0(Fz_UM0p3X@< zwQ$kH&<3n=TJIYWhd|H=(%74HGl8SG)hDZuMS^?#P@jX*%;0A%*RNV{Z{LDk#OW$Tkv(lC ziz|qI+GlKBa~f~J?1`kzbWkv^DfaaO_$Mg8ui7R|YD{$>tbUpS#(V0{vkXVs@#4Y9 zDxEEjO#(9It=mEGzJmjf^ON}z1aRIMc;E-imF5?m5>2(#NZ~LcF$elYMx(dyR(tCQ zPImm@`2xN4M5qU~P8C;3yRY}a%IC{4cX|fxccl9txHXIuWcAQxVEKgu1&`=h-p@uPDui|a_s5Crx6Ic~^x4<}htKH<%`(ufXaC;)i_06ho zqxHOE;eDVHgP#~1iwwhp3vKVx!0XACnQnShI8f{E7M*t2n|dOpbp1R0WEEp1-OTCS zL(La~h{4hleLL#O8U>su3a!;wuZRrD^$_bL_;nPZ4a_|sjwaWm^|#tfy;XoGfX4&C z-t18d;K^8x?=~+62JnuOb)_3{MFn!n_3O8-Bt<+&gIyo+!07+2ct?(UYgSsl$mo6-Leo&CES+VVu>dB^V{LW-^Alvsa3jkC6&T#2m z_}%5^gA`wpC+ffhO0G>L*TZmoua8AHgax*+lP|T^0el(c68hyQ?f38SD&8xgcGcgj z2Lw*%132!QzAj^<<3XSKg@mpD{&xwgb6eknpP>NbH#W+3+Y#Be3<3TD*}0jvE2k^^ zqw*i8%j_yZfm}eQ2z9toYIw!se*X(hZUK%p?!0F}X8z04yDzt)v85$j(ST`x=lg=dvoj4P7Dl`L=Q@hhsj_BD7`_GQ9*ZcUY>0F`G!QM z)7qPifq1|SjF}fbr|{2ONq*Kfo)0H$i;6F@Y$Shvo3ut8t+Wpq{D19Tdpy)z*VieR zNS&t(O6XL=kxPUSx~mXJgj{pYeG*2-nBsI*oKhl&E~r$L>$s z*bRUTMf;C{)?yEXq}MZz#6`f-#TNN{gl}#Eehb2Z>17s{i*KeA+TwG=ftMmudzy+B z>+yMVM+k8mrzNfA{Py6A4jTa{n`yHS48`W~769tJwdB_L8C#dGI{?ftfrsmC3k5S*v050!0Iv*&S4IZCdFw_yf2JT;#s`EBZkYQeYs-tW zduk;up~yPw=W5}4gQS~9*{jVREGD11L@1t3Cgh5bUKXuD154402Ir`(tMIQKh)Zq({GNtxH5tZPo zdd2GD28q^W8(YhL;-VnJ>RVnHg6wRX7rO(3Dv*kRcw8J;GjOK{geN;Os&*G_|E2uy z)vUZV=Apgs;)#p)JOX#yrO`H{Sr;x&`31;odaX>;+fjLOu{%3O!ucg;{`#lyR@6NNL1$~heE-qRa{pL*&=CaC*EcfH+8qCRf}oaJl44z(I-OkR z9Wt)+&7|}zIsZdP>@#Z|N%H#okHim2l0_s$-)HK9w%GN)oO2e--&e%!+eSFiEo-S~ zI-kY5pmZwj0(~$F6a(uv6$O8$9hpw_7^4b%Wxb zDGLS+A2f^qz2>`Ea@v`GFMsk4*x+yBe0t%F?N5MMzrdfc#Lu#MQ`lhTzrFy0K|Qcx z#5XYiEx_no#*%$b9_ZQ>1o%LiPkeFzyOU0YuYoKbWD%we1=|38D$WD-Aj9~V^=4QX zs69|Hvptn%XXfznDZ1_2w%KATTAK0B41#!UF+}8N91&i0nm*Pc^RIMR-^n?AQMmO@ zHhW6Mkc8MadFrDQpC4L|?fxfv{`*`o7@2>fXDE(fZT*K_>}P|HuXe>m0m#sE{KS{I zY*yIJM(N*TzW<9tyA_zIZD2s4Nbj?N2e_)QmGYF=2Cw~p%~5<6=d7^#`--^OF%j|> z5CoX%p+Di3Kk3OoQSTeQHxCit>caqqe;L}bA{#c0`Cc&LFL2AZbI#`W-v`V-Ih+MQ zOe2c#gpt17S^mwO^WfqyhoP+D@n>r`@cgAj;r5xwy%6Lx=JeTMa^;8KyBF{(%do?-c_P zCV)0$BE-RS=exZHlEcQgq5?e(Y>yZutJPeATH?f@o4m>;k{Q3BP6Hpe;|-f0I_~i8 zR3pB*Nm1WdT--3@r(&%7iRJx&nc%v>PVsnddnzBkFiBpuuH zkndNaUN&{q4Qb5Aqj;(4vi}9^NCP|k^9A>m4DU^eU~L_SW(SxTAL@hE7-tOpeGQs% z-B}-OW`qze`L=z~He)c;rc`3$X$wVTcBg*cq{U&!@ly@l&jJFGgcvqcl)5|o@+O<4 zGi)oz19`#dG5Aj3n4TmcEdPeC@NDMEXv2W89WyxBJ#eGxnhY|rh2nI-_F@+8?2Pvd zCWk2(ZT$OQ`Q1M|gMs-=*NjjcIyyA0d#zob^vUv?suKH1`b)!(S$TTaJ!S4!8;ro% za1tsZ#mfF9<~8_kSiy5>&^SM+mf}~k$8icUbm0fk>q<*2SHfkIX7o+j-;rE8bb&f_ zjTxMMgK_bBMO4mnJ;aR$?w7A1!ANSaW8Ne^?47EP+?$4ES(6z%HqgMjK4E5|OYW*dO-TS(&0 z9h#{s%DUbr~O@Gd&%kt(M0M3}G_kFQVeg9cfkV-t>f_$?GQfXtzFU%N7$~gGH=$ zaU8FS-J7XR179!tF!ofG7;_>lVumIZD`Mb|9n#t%0q@Gu;TcRpQ!zQfI_J&-A>z@l z@LBn1ba)qS?9d7WTqdr`Km`47ACeoE~o!cstZVetc?G7tM&`*o|kIdzM(`p5#e3$5h z-Ve;q4!mHcee2xiDTxlAMlT|yd}DMa?(28R2k1Y1eOo#qNd2aqDnOhOt*WSDoCrEeQW$T1W^wF#eZcO!*)-+9YrCzR^N3GnQ zre`6)D<`qU-GRB@Q&XL8f*L`?%V}Ziw|AlrTj~_b;Xj0!hIyFI+u-|H42K#|k&`7C z_9c(Dm%^jB!Tj5TyW?$6+3OAIy+1Mgy=!hc?O^(S@)*kGAerjR^vP_Fc&u|!dK2oDh!w22g6=yQK zA1}ih(4tIZ5{}0&S3n@ik3_uV?DrM)_dhwIqQP+W9LN+bP8J_5zjC%OF$K)$w_u^x%3$As)KUOh|SEiR+k_jEJj=UrFlhkws z&gf$L@QjK+QgJU0!Fb<<-FvcOP^vW=Yl-m9ee+n9dUs&V*EZjlXGTu0wnSE$%97Ax z7PnGVcSO*IB>hKR9maDJW`}&c<1)%pc?=X{!$px8cb$ECq;NQ%@M@_LQKj>;^f)H3 zrZ_b}U^{j%fgjey@>eW7M}2Wu{Q)DcK~~FTe)VegA90RlnIw~hJd$J!@z<)&?LmeG z&&F-JR#_sZLhrH&HBB;8C!67uCpCv^b!#}eMhT}-Kfk(nbqite_7aYhath<8`Y7k* zjeK~jQ6tAc;;IJPe?J;riFJHwQ&AG-9mh;BP)@AjIv`c$2!!V4_6{kep>LXwKt%C- z!efJ%dSw9!_c{UVmM5#16d(mN`BW;_%9Y=mg z*Gc1K`a^?5$x3G=gorl}TlJd|cOwgxqm?=@`*C9yr&&Uj|}; ztY#wI3lsq9(}m#**+mso;8C2VTSOkbY9}g{Kw@u2X-3u|ce3-4$Q)`TY%DGz?tO0Q zO=5ILpg9jO3vt*Se569%JQz4sCEtq!ABg^#Oq#BMUB);G*gqsIKy)FR3zf?njjne&u9_hcA(ZeZTix7 zKzz+~jR z>?%>&GU|ur`;i;5#C7-GiAHhLtRf|-Wdr{tIi*>YP!b=ZOl)*R~(m59QSJ6N;<{tdV+}u zCd|GQL%!0}8|7THX4~#`fw#=x#$EuXv;1+P+wuKCCKEfYenZs>>ZX*I9U8DaP2P9x z(a^KD;Tcox4fy2!OVPd^;(+-5Ffb3^&2QXVcwe^h2>ylO8vYRnHH_)pYQ~)-w!SE% zPA8_Ba_!qkMAcFQbi93e@Rrmb6)!RWoqA|t#Qq%nPCZK0?aef|Axrwp(-v*95(g6- z@B1OFew^<5~%O8M1FZzmIFo(&keda9hyT0-a4%M*9c)Ez0uImkJcG> z*uNndwSK7k@;qXvHf5({n?Za{%Yt0L!Hr|F^&ZRArM4ETYQiQ~i5etHC`_77;)7=2 zqlwe3o$=}Qk$?#~V^papRx(4}*H~&}GNHQM9g(lw(mDK?G6_VnPFo&vU5gF=0ZM{M zKf`7GB#+ocAaL*n+D<>l z5vw-ciy~G9q$4I~`m*wgsEJluRz|;3zFYChfY;rndE(FF_ROtTK5eD!hfiP*F2GVz zx5DdW^Azv>!0+Z^YRoYe07yGn!cwG5-FA?#yQU-M#oYzf569?*K7Nr>vH?@B5?)E# z9jZf%YomHR^+PWyCd(`uh$!p5W@l~id+6r6mvhfw0A5CB(7X0+c4VOsBZPi)Ar*~r zAa8pD_xza`U1kNR);`&JJ9Ya30V;TFAX@*ol<@$d^X2##;(}D~3yI9J80y`&dy7`e zE?SiaPL@=s_{vlt2gbH+Ojnq=I6G%$T5+fs&t#77Vk8DmdPmYS#P}s~%NX607oxhPvW1JxLD2J~80QF277ytV|U-5;xWr~>VL$RV(T*bzE& zQtp&Vuz}`=QzZS@omHd#w&BQOi*sQx6nugr9)32KmaqSlxtc;emD1)*itY^e40B@` z#CBNZl&B9P4`nes9uVY+!eTfDSMjE`+Q04Lx?i*96?!i_C(_&QWr!VLj+5KAJM&iY zKuG$)#V&mXHBw<&`b64opn1;8 zHA!ePQ}%hDYcJ*)v>VphLdNlH7Eh?WZWVp}dsxHuuvE|6G5u!vOUaf+S zIzJ|_H+Ki~Nxkaay>{X?yS62iX9D|IPS&9hG;}%T%Qn(v3{g5tI?QM3zW3TQE9@xZ z_=@8iHF3E_;ll~n>@fP|(SaKx5EDMuiRH!`y78X1fg9UsXDzS7YIof=a(%_cHNfU{ zETz=%y1O?|{zDfezZ;=1z@!16<^ZnRDp6W^9L3C9RqJ+RvQA6WV58Fhp@JZIucK0e zC-cd9gxrqZoi?^M&6jIqF4LU5TfkW6L}vTipFf5pnKKs2nTDKvLH4f_eC3ECS#i|+ z=#~Y<$il(PF^oW9@7u2bXdJb#q&%E_Nz}V@Z$bZ)c=96UyEdV2k6$TDwv;ipD~0bi z3-%0qD;JHUm%3nUqM5@$I4Jw#mCQW#JK}vzhU`$a!e$#r>V$6hCE9|rGzy(&6|$9l z{Z5Pz<^k<>mZsh)qo{e`u^)!|&cDo#b3CqsqbhR1!=`J3R3NwOgsMg2dwwum0cLcf zxuD^@Diu%#$_esC&`-HumJ96%qx~|UPq_MQ|8~pwJn$2^x17j?ntoiOu$gs-Rl(1? zY9p>d%B+QfqvwT*zz9vWW#s~|Ic%U*zPzxq4ERRYnye6Um8AnERdU#B_YY=5>2ur! zUmEg^Pgz$-GJz2|9DZEn>LxIH1HuTNsaDpNELD5guTxz^Uc8WR2VQ$KO^Q&yv~U(D z3VbLe0C*d-Lp5TZ3*OuD-5?GZHET?+qSvyr0IW4Kz2(2WRm$AMFM%v5m~>B-8RLeK zF+M2I>eTwEeLL;>ZoCV6!Ecgqk;kh`;echkcP}QfXTIuwAU2U0gJ6MV3eWo?5xd-9 z^{sC4bl|(;yvNyIt&wYJA6g4RdeBn;xbcRFtIARJL6tk={)CO|H^lRR>9upHCH`8> zFmu=BF@D%H<1@91*x`3e5%t_;P56l|#w!~s$Ht3CK`Xtp$#7YLS6nekcvk=us^7d9 z{)^A;IRY?&36lwm9AcoMXDbv=vsN(XP(K(K8CYrnK|bQ!5gdr9yHJNdS^r@XPYv}e zE|2WoK{N*r*#$^E6iN_7mlq*TgH?H9?|d-UFejLkZ)JywSKKLQzQ@FfE3)3Yl=<`K zC($Z-0{hpu)>G-`mi2|R=TX}!XOz%_hH3fJO!3`Vgd3@wJSj!*TwZLsVzz{sf0q4& zw2|KvQdUFVvDETx0IUI|sh^c-@=CXx|ue!Q$sGP#D4z>xO+B z($=72y?*bUXih(=e9I;v?k9CVW<%4}uzfx>lS*k26&ntPbM9EX`g|x*4DYNPyJd51>h*1p`6UVmV6R@Gd8whIqGi7TPwb&#JKJl%Y41O%cWwmZm?`UDF(n3TRT)HE(HlMY5*=a3E(Fr$ZdQe0_dA1T9t2v9E#Xg%`?MsD9 z#V~_5;;uarFFN z)LQNN-6J9Mh~Cm=o%PfErJZ{2c0MqH$%wl*lvePRP7GWp2@|^?omB~IvslV*g%4Ob z>Vf+{HF!F#=~gos%!iREE=b*!)Hf{en$ogo8O`afY}RIqT;ebh9)uo8P1{Q30$ zxQ9c*75LTDr@oG^yBUC;>@L)f8R*jQ7Lf^8rku53%wCdtc*hD5pBz&VL+#S1#ah)S zBO-Zzgl~O2aY#C;5&_e)7680LJM6le@3did_=@4O;wP#U^GO{CRQTEJAF$B*&t{`- zU|O{tQr-nuAgxPjHCEoxK?7C-->bMQvvB%U&MiU&;wKF%{v@T%iZvzxGEP(#5mYF>KpXajRP8iO6~DJ^Po$AV>^;gl%m+O6V^wY zqCweKcR#y481iRfafWr0WglK^F)N#M`a1X?js-P}T7{F0a{PzEu@sjlhP%rI9*zyQ zWQA=x0MwrkJdh?r51=1weVGr%S)R(@zulA0g#0I;ASJ zWCy7(^ZFSJ*9lRLXwk)1}|u>E}r)dCr`rx}Y_~V6XIwq8k9Q%P-|g_@djb-=P$_0`>cf|vupdFZJAq~BK`+))0-p! literal 0 HcmV?d00001 diff --git a/docs/assets/images/ExpensifyHelp_R1_InviteMembers_3.png b/docs/assets/images/ExpensifyHelp_R1_InviteMembers_3.png new file mode 100644 index 0000000000000000000000000000000000000000..1d646d3d5001c45920e7c57998d55716313a3d5e GIT binary patch literal 153513 zcmd?QcQ_r<`Y$etXbFNKYNEFw(YqjeXX`C`-E6&=5D_(c4WjpM>ow|DqqmK%M-Rf* z{YK6?zkAMo?s=Z?KliU|9>dJ6nOU>e=WU<&U7;#U(%4v}SSTnc*s?P3)lg8-f1;o~ zeuME4I1~R-Cm8sHYAL2DhJsS{^~tsIW8nCesf?N;3W^s!3QE8y6qHNgRKPD36xTN> zC_5iePy~`uP>3PlnpA~=3uq?t((h63?ziu)1#!R`Oo)t*GYSe3-Tm(aSvA_^84 zoKUu7KYr19BXd4T_LYtOj@*+11?3qWcmhf%@L$v+YJ2%d_r)~jY)qPlmtO7HqfiIG z8$a6Bo=p9J>7e^g{Z3~-{95jZZo7mBkC_KKM zC@AkB=)h%EcVOoR6>NGNcy)UidO6DqWoEkV0Cf7_D}Ng?!Va`|q7YHR`~Q01U(kfS zYh%3|CuUKN#e*Zko)@~;27u20J3fD}zp1`R6O~Ywg1m%TUPqqi0Hg4a&r*p&LHWSd zW{t>VrfI-cgcbfKCIoCn!y}+8_xp}tB&}|>=BVzaV4#bC`|)?*A>fXRl-M7x&{}a| z`qu~C_b}j5O=>+}I!UMRbW#1N7x01CRR8MA-wr|E7+#vt*_^lwH+=QpOO)vj7tQ_W z*!**Zq}o{hm)7d38vF|~+o!-kj8y;QThS|Er4o?41Ca}K&7s~*mH)W-;&l+hud>Um zvgQAux%&@A{KQGTnDU(gp1Jj!-6*_0^FLo%c9A9`0qHX=0#5$}RrmV<$pego^69G*{5R5WA8>vRvQVoSc%!&lSp(g(;*1G#5$)T{P(+>cUt-!Bp{+Ai#&IY zYsc(aE*zzAZ5tGqoov|YL6eO>Jg;5R|81Jj?Y&%11p(1&ZzomyUMivi9-HvH4@N*dEMQD}8dtBrENArNg zR8r{E&Ktf06HuSdvZH62^ve91$tkIh0Lc%dl7HItzxZ8dlB%EpT3WiMMb#K{45M9) z=`Ua=jec&|eDH6=)uw(O`X=zo@qq8@QU9(xh$5lOOpa@NqtWHLf91n}n=hY&R}H}E z$#c=4ju`tI6TEmH^zVZOJQvt*80l1b$q72s7ie8PUjLt4^ni&dffh7tZ*fTf zzUQhwkDEZA;YW%YUlN<|r#Z9k?OIzd-C#LMGV9El1Vv+v7XWbnN?9PF2i(~kUa~-e z`^R{&{&|1wyn#})W`(VdwY4UrOFSF-AEIi<<0+63trp{ZlaJztd72;|9?d7+Cc=56 zv@{-yfRgzu(a+#`f42v~A-ZNoLAFhqCWyhtzTBh`OUj5U&XKO#t7Hn)-^&U6qLx!$ zvUO>f=KK-+0`WQ5A!nf_ukB;Ow2dC8V@v73L;(Xp_WgDb>QHeWB{J-60mJ^P#%FA{ z;qg$(0o^Whq9%RD%^mFck35sS7}@2D>++@1&T;RCoCUxhI)8g+-0tEEKAfG7TDuol zK!E`p4hp2@G15$kF>zoBBq^)xfSu%7mR9oknz`-ExRYGlJP{Mi`+*m}!TLo*CY4X` zMeWM5oA7tr)v0Cpj9;zCzBEkXIC|OdHDP9}SC4RoP>pK${?7cZL6q%5Koa@ZD1TZu zjM0V$nE3l)j`_t=mZB{}U|R5t8c=Po8eZzI1ZXi5^|X?O$n30ed^N9muRBaQ{e=#W zrlY}DJ43j-6e$$*bJuk>0Z?J@AfomV^VOPLjfd&LUq(~HTQD=XPnVpPk4ImPnU&TBGX>$CSft5U9u_jO;@O{h&I z-#X$ovaL)}A$#x-q~JQlU_SoFhQ3xy7W#d8% zZKZ>w_QN45z%-z`0~@kSZDDRw$wPm0=p&nxDB{{+iuPxS;%0nYl#Z*Ig&C;ZPEJ5U zHe`}k6tQ`a5sU-ryaki_$btYC~$Gj_|+3ahr~HuuunH ztOM_6HBH>Hdf8@n`U3N?PXRVaN9S|4u$5jwptqRz)s<0P&9*^HoV^#OA9~w=Faz$| z|7CSJHwQ(wy3~SMpZcu_1qn7*#2jW@T53s4Ux`%k90!r#a6Y{M0Hmo%L%oFwo$Uf< z=0d6>1)|&qogAJQ@lAGim}$!|>xV_T{-=9nE1tR`k+ArycH7Dgx1sN5hE|47 zi<=@B-v0jfS;(XN8}Igr4}G?aER#kEU}R{^GR$$89w(O}OI{n9>_QiZGnsnTXEg2| zdOnZ+`Q9CDaE|oq+uG+udyle=!cULy487d5ruKjBZ!4L{+VWI1`=5p1`K-V~mV7n_ zi&=Yo+xZ$;to8>SL>Q2#?UD`}Q#1ApZLSbTEt1oUQhlG9!8;l)mWs8*U+|JN|H>7X z<7je`B$&1DNte5kuS4kKuGv>w&;8qrA8~hHrzu*?dOvLA$$tn(LqgPpGAMea@zoOzDvMi#jx-qeDX&y7KH-m43 z{8*!TbZTK@acqpoVc6ThWhG3#K>5`Sl~%)XmbV#c55}m;Z9xfaU+8>uP)o#R6v=kb z9)4&fbX%b;)B%2GWg-=*0>h_hG)!Qx3E$Yw_8UPmxjCg{5?SNiEdNbK? ztDC;DPMS#4G$uW7lpv=hQff4iBQVj^jpRd%|@x;uK)XB77JOjdp5 zVmmJ`(}+hjK{3nq;a|TYq_dTq;0gL7UD2X7ufVP&{Rxl!EcMt{j%JH(N?>%FWWFfK3`NOQjmUMPb9_IT7L)FfN2=?|Iv9xRak`LLsvcA zi5pqg6BMx?8v`xf;)*N(%|ZBKV~QC(&&UtX|3+-1%CjO4&3BoM-3}1ooM`zr+hYpeaURaA zQG7Givli~dbfHsy{ASDBtuwMruV1(`MpEUFTd+TNA5E8Vc;m}5GY6ZY^_tQ1lOD_K z3zNFfcaYw0V7_jadbZMCPw5yG`9t(Y&U#tqPEZAE9QPu%Vh8=5hlg~KHz$D$cXDT5 z!Z+1S8ftj5C)A#g7FJ<*Hy4D&>0IXIjlZ|F6ojn@_!$&Qkl`$B)LMK1h+d8)_k#;r zFb}$MEflU7U2Bw@UGOiqkOh(cS8Ez(=~saHGW2tQ>wO{Vezz9uzbs{#4SB z2mn?CkH5vzoyF3>z2Y**+BO{AH+?YPH+Vtl7P5_4E&(igpAJO1H_*g7$l+&cax0HC zcG6fAR!lNW;YMA5iCkjW?j*Uj=|pGd=zScBihMM^2$gV{)R=?}F!R{0Bo1l}hcGo{ zzOmjL9u=aWV05v#oZh;XXS>+Ym}nfIFVkDdFygt(Em~7b<~oZa&Kz35vixytI7%L(l2 zqZK3hR}k-)(Y9?l{G;~O#3WRAr!@8o{XdpRXY})`Ry3lpAFrb?k9trNaQcQax(iZWuAt+&3T{pE7k`T#I9lXHy*vb!UcR+lBy{+&zg^yuECnT7(M;3UHt+iIJ^Bn>@2{1reOGgkgi*PdEhOp#;QHFGs5B$M+4C(eSPI^{O@;Ni2s zX2`iST_KiV!FB5VKD;v{&XXZ8ElugHTpp(= zdB%_3eusI$@{p)~Ajk7lk;faNGmE$tyz)4uPbS97^dvv-P=azq8;Gkh^K@C`G;o#n zRgqFbi8OHF9P{(ew3lDyG*?qJ32jAhR``nFt^q^Lm(Zb?litVuB5yIdmDc*N%Vd4fp z?zx_+%z72YB%L<45{DM*d|9+Kktc%%8Gu5BsrTLN!_eohT7lSW zmZs*qL^&+T`-lbxwP0^V@;F`m7!~>Oa=b-(iGfC+e%Vo77Lw_)duovc9;B@I#3SWKcUR+Y6cr?zKrW<^e#5{&Ih+ zv#^G@oOS7O3wXs*5n5BUg?8(QT9696b=(UBX<3NFaJP?0v-m`J(r*v^jPDuCx$*o4 zo6~zsT7$jWRA1$0sH3rf3x#4m7&o)8GT*;=S}fJJRK8kO=70-47)=|A?X!bs%+ zXLbvL!3V{rK8~)2RZdtZLMKmXg)%<%CHx!o ztUr@$1-RZ4Xh=H_1l%_0c&pQ7xZHq<1&{|dX;D?%`FLKM{ zxv|!N!mMU(xwdW0sgIi&ClxybO4e0!38gMB!h;PlG=Pyl9w&DY&O<6 z)?__^*AIf3mfqAwM{aSxZ694KwRt{y0<)dTw!uQvFQZBP=|cU>RY%{gca6gmKdX}+ zkUizzhxP?9Yu-ztX`$)sAF40m3r?6dDR@&y&RN*rHr}~IrgPNKXFyLp5`+vRE2RpG zF&22~7tMLP5(O~p#WeS!V5KYGO$jog>0#MaB@5OT1M`_srzyf?LCt|ddCV{N&f&-Y;a zt}S>7+p;g`D@TLFzE$%{UO|8GJ)JPYp2jgd$7_(su_J|ZP%m_)UCynC5BC>3d6=N8 z%w}iHE+mAUT16PD_E{4D!1ZhgTzm7e`LAI?SBK@TTnS1zI0r_W4#qFXv!O3z=D34` zuHpq9{sceT;})y~`+6NM*zwjk*lCF#SH$4C$ z@`05Hh;qA(PEYlU$G0PjmQIT7tG^B zgXNZ!UjG#8>9uyZG%1&kq7hSZwcv~DWP{fwbn=QcRJgKtgb$+@z;sokD{rcBE3|8> zW8fBgY%#K*VZjO6#ZtlXG^Mm+qLin&I0qLlAkj+Ol6OCxn}*hfP!}%4HNuKPO+?jv z!s$5H(IamU<{1Dz)KyZMoCiGr|8l`lY@MmOpN_;mJ@nxZ6gVxxGjTRkM zI76TqC)Xq7G)ZT>EwEV@4e*tLoni;9;Ta z+t+jBA0sRQ!u%N==?=b<8p)64sjYH~lPeHX;DjSd;1X4DU;{u%usWm3N~M=zc=1zs zPX?)qhAc0qK#qEbzFwvTRHMdecISEI>E1Bq4}>9I8J#o&py(3)PhrvSU}TeAkT(xE zUjqPld#+C3)v}odA)K?+6rau8IreCFVdyVb_YUthb=(;Lr9bT#37QsqZQ0{rk|7%pQOuM?FPnD=ok#twp4)K2_kX zC@P8JnyJE0rzxGBu&I8*pA;24$DTWmmG>|UqyqPxLjWOQZG0@ClrfcG6I8jY;={YB zl)3ik+*go-v+Il5_TyxeSc(KGwIg_%sb!y69;$EGn;J@3?HHFrEuAk1D*MT`i@jr!5V80tA>NCpf%qj@H7L6E zJ#mtCEXYu@wZpxQM&N}gqv0sGiHbf;K zX$onH!^mtC<~N%@u8x+KI35b06|6Jx{&KGrt@Il;92O>d;$dKMHl#!QtM}ND&nC!Q z0MAVjOvGYp7NOf3#em;5toM0=3(Bp(Sq~avv9Ft7uwx6&W*A~f5?a27cdbk^# zi>|aJZdzktm!HEi?|WTheo+_lb)a8?)H1aeFHD1@u~=2QM4D4h*MkV}A#HD5*H5{AjG*#~RtpvT-j&Y3@l`kxK)$$W1DGSiFXvigm*NBgN}}bmUTo zeQcU?I?oCa_4*x8Is!qE;NhCa-k0BFqY!|(zF;CwcLy9uO9SB?j~^aw+$=LC8(z?P znSJNaR}WC#`SV1Oo3{N=k$|T>y8tNMekQ2Q(yLfrKA(dzRQKv9yCOkXDOySk`h%tw z*2pHdrV@Xw>#zz@@Urd);ufRJO#j#$T}<~522HNm5H2UkOsbU=w-H|@z=m3JNG%MH zvU-P5gyz(9U{piMS)Lzfd#S=47Arb zNuYwo7iWUFo>>wQhNQRz1fb&NX2gHE^AL`yVBs4!uBNK|H0bXg)(mqojtW>q&OMp) zpd!OPPv1**=K(kmoY)%vhd8FwNcQfi%RDF9i+916(gV*qUvPiB&HF`t>;w?4^iL!= zGXX8TZEWEW_^CxLcXMwoilZa-_It4&6abhZ0nLHlmuW@+9!@?jOL-w_+n=zp)2qPo zP4Tlit6H5oL$+Tv?YFnPSI+GL5^_N30xK&z4g0=Kg6-{`V&w?IMbnSaQ4aITs~oqt zoW&(zbagu3XEu1ESN%NI;+Pz^!i;ke=;ddH2%>n<9v8VyDkm#m2QnNbbZ#^$?;2}2 zwxeCg8@yDGoTYf`$+q_{X4(@UQ-~+~~*>bP=~# z@mNxY4s@1-aHY>fiL$*9_k!8b2}CC?M*xpj1@nASk(G7ICqt#5Fub@so4Kk`mv;Ra z74BsXovG&EU)ILJjae*n@#IfpkJHHWC6jOKCOAr0N?SDEc+zl|82NUwDcRltR6jz! z+)XffepBA{N8d_{B_1nWbduV(Xf%pXQ3T#VDjHz( zuK+&TZ-DFuh;93)|6i-n<51Wwm-4&S#G5%Uv4eyKDm&fgsac}F<=)}R95%-_U#@ofpQW_zJ(aVZUAkx%^SWy-~k{eumavv9}LB zC(DD`-bvSTaYj_)PSin2)CqDoV>=o~b5TN;J_b7}j zv?2{V*&>x0#IY1Pt(V=<)%)q}&Tfl1SW`FOzy4Wh^-2=fVFic}(!3e$`)SnWjf6mBH#v6^?nY+r`? zxx9J-CpceK%}i9YVWKmiq&0a^F{7!maQE=yCd%yfy9WIm0`CSB`=d0oN*@7TIQ)jv zmTTRZ0oFjS@Or&--i;3{$eW4`>GdsJAT+lw%z9~0D@jt8WTyP2Xh7juk@b|kEqY-R zv{4VXr-FBk8)0NS%bcfnfHrJO~_1plk-se87;vBdqewf^s)^WT91?xqR z&usTLChlAZMU6b1HvR2IUFT6b4mT!_t5-65I#KVnd{y?5`^+#kan#k-lzZ!+c7SMp z!~dE=iGS;iIOA2lCq~c}K&{^b+~MtUe>=mH*J4M&sUvRNDMw05ob9m4`SjpkR>S6) zw}bcX5s<`L%Vk>YXF$o_NsI})+9D)_wch<1mjzt#W&W3?9;dBzNw-^>d$utzHzyx= zIKE1dgGh4IwR0-+5M0=Jd)u1IujLO66LOQsLGOO-FVuzQLg|*N!LbL7m$lgUN?er~ z4lA{+802VZL~l7$;D|u@Sp_vu+3$T_8+Ps4?c*$Zqc_W>oBjoTCvCT1R57uYGGcj) z5%Yj`C;#@W%$lvdWaWFa+t2)>o^0ca+@h%GnR2QL?|xJ`l&jmMrYkwy8$AjJyU|#~ zq1f3n{fe4_Px2mec+ov~iAl&1FY4HW#@)3`!9{6$_Uq1+lZ&>b!>5gis~z+58}GP+ z#C6Hx{F1xV@`2us0bNRI)@oeqXG^h@YgJVxlO?t#l4@BXHbDP(erHMAK0NN>gtr>% z9ktFL#zGvxYC$ap}rp|Ze)gAt@_qh?-)pb(30?x{)Mo&0e%r^Q3da3sb!i+ zRi#C`K~+^z6ip1sIz9n!D?c{xVAZQ!O*IAEe%2c?ghrsD3M1&>VU`H8*I7_u1KS9c zDi3c|S6YrSpA(|xSTsx|9(_?BXI$c}FLoT=9(Pa`+M#LJ!n-dx>hygM^-W7v!(F0t zRiCm5%fgYx6gWpLEsdQa(%5TGI*EPTv@R$(8UO-H^kyH+jdK*>&Y<4ut-^~(F4tq8 z6#!OXX32t%tMSf${x^9i(=GMj^O`5Z_k1_p|9WF^ z=NPB;0gzjnfp=6IG(Q-T%Gb_NgsA;yN8(f%4O6tKM8yVS8 zPhV&i;l0u*FZ_ICUhnB&EK83H>;bxOszdynA z1(YC#Q58uEyyTmR12?@An-Z2_jT^zYUu;eA4&R90KEIIc_7mBT_AlN;F^e@eq`7oDZ!ck9*h2mS0_R4cNbaB zhn^cLNM4^5hs7Gl>>e<~^7)_D`ni*5dV=#wen)Q`^(V*QoF@+%wtf?yT(@!7WG^Tk zdgN@_vRUQL-h4Nrm*Hy%OR^0d`v8jz%UcClipHyrf(pMsMoEkQTSl24h#tZxL*=bf zozV>Ez!(+hX2&`(NFR&V7y(-PPXD$e{k~!3o%gRPWFp_qK}Nd4J|b1`)kv~x zZEG;M7S~zPc|*S}++EcHpNd1C7f`!Fb?c42-pV}`_v7C}lq@=^14+NL zy_H`im5^P9w>LSq2MS`s2_GuesPQ!Dna3Ju&Wt3V4l}2G&lpWa#*!S68=J#gwb6*O z;;!Sv(09`=MLmE1q|PIuFwLrs52WZ;2y9*)sid(#_C_D}m{eXLR}GIWC)ZAUiPMy0 zeE1hVxrZ%I0t!gJ#E9hqSVR+9(EdxgZlh- zB;}bxTJj6Uw3$lnNclzu#37>vIWf@;Y${QM+;bmAkC4 zm)*h=o_x=vu@4L13nr$ZUBs9T50~C?c{CtdU*pNX7Zz*hU3XZ}yhAY4S&Ve&SJ8uo>H zhcXH-wa*F(e<>`qK){1i?h7)khtf7Q??udj`Ds}Wp8@P)=!c(@y3Uae`5tefGp00S zKpgGZ$aI^M3I65}93$4JDg69~a9hc1ghZo~xzd5aJ@3k=uF z%BR(4eJ=s{e)H_2_x)yBGOvl`9@981_t^)_QCbEEsOygcw$&edS-qa=Od-JI!>|J;MQ+c zA63>62E=bvp{&9%cCPK`Ot=Ox0+}9-2Z}l{u$P88wK24BpYLI3tL)qd=Rb$0oh577 zw@hcAU?3AhpAb>?E9A)mfFyDkUS?9hhe{e?s0uSe)*}+DXvWs`F8tZo%XGGI-5Kh{ zsbe~!_R$zc>2GY#2BxePQCc*c0Lc?+DC<`MwOC_I$}5*0iu-NTt)KB}rZhG|A%z|1 zp0TGqwf%!7CfqJHv=Ii30+l47>>XeZFRHWZ6V^+31X&n z;ZtNb2-ntRu`hLPW-Uuep0jzzgJIjPFB>;|==|p^*|Fe8v6Pr_Cc_Hm&PAY?SWdRs zG&L9`6IX@e=LD3^>fs)w3kp2f?TK#AC4I3|srdmVz;v;9K#|7%?6U=vsqv4oS0qDI z6BGNmmq2P5r;S5-Na8+v0swpWX4eDKAPmCw%K*ynU?k%ov3YtpVg}7|(DZqlV^FQC z>ls2ffmmjEgS7R>R?U?!4r`tnI%-X4disGH6{24wQlvr{;jRnjTJQFXr@@K}pKePv-dMloHo@>KA}W1=eFl6IH0T3OLpt#yBvqu{$*GR8%WsHdEhk&Mgi|rhTmJjb^$S zO}z@%SJ@mb-nqyfpN`3&Dn^|f>X94Xi}`NphINvRL@y6E#_b?LjS}=xyHA)hOKhfk zo~9vFF^Aq$w*u?_`^29fxE9dxgw9a3ye?}eKE>x{Mb9-fLW?8meQkM^MDRgEOoLYA zV-a=5b*WlfU96JEk8?<4-}BB4zKBR>i4nViX~5-R^#3$qAqUgn$nD80IXxJ;1xrSpuy(A$NbTfwJ9Eq z3w%nltQT>VcU_oKeTb!Z*aUEz`BN{QMwJeYP<~8L9WiLR0hFyodzrC#yd>2c9G+{4 zU%5@AB(TY`eyzavVMLnzqEL{)(c*g3r^9Tr4g|S)_+VzKI)?Q;Dlt+VZ}~$m4pQ9| zplL}=hP;ji-;dKO5k_ibqAvz|wP|aTeLW{H&kFK>g($_F0b#Ki*gqlb*5iB|*VBQg zc}(Y1F{31+U|L0r`lvnL?D(=tstRWE<&*GAbecu&dXlUwYm!ARby2hhV8dAO&*t}} z4mub<2~qAM5F>=nX&Tj^EkgTD6}ulE6^`2E!0cZFJf#|or7{)jBc*E6MGMQ>6Ou-k zNwfU^L$&$^-TvMjyv#*o6VZM;aN;C)m^oHaVbOK4ksq-rEa5_lyDT-lJ~g$D8^<7Vc>L|iVxJQMOrHwM2fRm5|7~Wb}g=O zP4RqTK3jTNTU@7`m5^j-De%YY%g4M`z|WI?<}gS%YmI3ZXgPfYVy!5QG>)N{CH&1en8U zM$$>srK@Qf24=sqIZhV8%+|KXa=yN#Cwyv+-TT#*WdLLA4cAN&Z%3|^=_k&m^wI5rJozd8^XP-IGlDN-lmqL)FUCy(ZH}K zmIZp}CqKI<<>uM^S*@B(<|zpr$otALzuwZaDjW|z2~E!YRt$PhcbNFGj2%d4_n9tm zdZ#a1OLP?BIkRduo#)Sjc|h}tot>?KJ_9GlmzvejM`%21R_`{wc`0raEkAHU$eiA? z9`D0UNqhG|&3eP`i-RgJ?zP+&-~a*Ri0w_7x=G}!{^l1B`r?J$<@(elxU&=yiE2!)PON#gb17D{oRd%RetX#IwyG7ysY@w#9QM<8ty>td z$(LJ6n(+`Gd4QkiXzZ*D1dXrVm#b%1+`Xj@Nl_S2jg%IrEQzH5`aaLrc*rYhfnxwu zeC$gSysgWcvgP+1!QU$TIG-a_*!eL+wLA8!s@=hLDxCo}4IBWszrK*p<_!C@wyLO}t`xVt_2!Lk zf|3$FfBaKdSY8fgMWlrbbGm+x*6f}FGalA?`nuBGpV18Wss$2?Jka*KuADWL4E<#Y zkOhmwnA?+T6;lLCbKjy~D=B>bxW?UJd)kENr~&zz?Alt|QvG>`w%AU6zi1y^>?&pL z*$RrqO+J30F0yH%fF_pyetr_9#}2l#iR~vHY`peLd7bpM?laht*FcYk?lj9*Ah zF{dGx1yKS`HGA!XnxX4>Ul~E#8u)D_9x5|ev!Y zn)*YfQp5*t6E(LlCp_b-v(80-2HWY&GtD`B(A^PME<`@M5}g5(#DJ$VC!TOk1jyzd zLtKAfP@o?Jzm7KfCCotj2W7RF!Tf7u<*8jO!V5R+noo<`+?i3E<70ozp=EypnuDjg z%IsFT<8YE}DrY$gSn>sw4j={GdrimzzD2jmXP8;a}k8(K}dcbOE)vFdBlQ(EPByCYFy=ns%>l41wa?( zJT(NUHZ}tAaJN)>$;HQ#{S&k&bLUp}kOt}4!S}F8a+tgBk-^L997P;czn`5C!auC*QctB6VQX*S++==H!@Z1%Spe@lEIYvv2t%535~m3}w=LY@ zy2diAUAq{N_OS}!gGW_Xi+8B*>dv~9GjtjN|2+>f0q?I)I$7w|7%>vtWX5586n6=Wx0SWA)-o6qM&R{I9zrzfjeIlAMF} zalY0RIh|l=v6Re4%ke&)>fSK#=@gz*>m|T| z(+_uGxqltALQI8iU`Y-+;LaD#H#LQkejJn8$SL>v`3*O@c3>0DnET@F-9#_Fszy4< zhJ$na{W(Mw8jCP&@pp<-BMQGnJq_HMw@Di0(7&%bl9?uYu38v}gzsacS9VtRB5+eU zK!*b+1>+B{!OGMW7n3>Q%>e00r68bE^<>+sMox32qOiOS=dpfS%IpU~XIKO^cUcR7 zI$JgANslqBd1p)QtOn^)Lks=6a1*c(q-y*c>dk4_$JCfVf>fFszZA-qsROj( z^=|-iV+3%R9Z66qsaIVDPK`MV%Gvl-qk%-xARk%C&@XOiivo{ixzyWB<7S@?`hq@3 z?UxMqxdl9($mFp1;u(;RlzHzjXZ2)oT$cL^m@0^u&O1lBNPnj=Auf@_8eaJMH@2D#%_&}az8}oh72JN3 zz%tk|BDnOd1hmv7NUa3khP?|=^k-JK4umqO5{WKZ?l7vRDN(l$k%&&E0bjP~=m^Qh-y#MiGqBk~;xo}!1S8wM%H@=Q3 zBZ8lNq5~Zrh+uwfIfJG&YvQ!Sx{%Rn`2Yzc-NCe_g^?E+8!3UV+t|}#g|ticdJ*W& z-%iavd6pZSFK|2+usoJ1KfC|*qM)IQ=k2d}A1X5U=CbEGOerfsEvb7mt9a3?7Ub;; zz(L@h@G_a-nEMy%Z~^sZ%k~gUq{<@SBoKCMI)126aTumoKU#5dw_mQ%TWEs5Id+Fa zH=HjN+-IWxkvxEbeA*MYw)C8Ve-^%@Cc^TaE)-yjuCDgV`K$ZjGN9bxY*%M*?_g-F zW?KOthL1=l3JvDPCGCZ_wb%iPkhp~HgZY@jyj@bdE^N=yt(uT4ynETa-@2%NrbgoO zqX0`nZ!m=Lzb-I6lefdxlS{1s`V8*u*K0dntV^1fMmiMFv7LY7_t}SOBP*CXtKL!l z>bo9|#7e@dT$Z*SGzIr!6mX)d6E9s<%SQ64PZeFwKGqGIv$eI&nY^NCEO%6fe3fhw z!u)E-HlJ-H*Zpu^OWl?}QR$NcQJ9w2M6TTnayZz{LIpCj$JsE$D?hsikUzl6jE_F; zGe^KuUZ9YGWi#=F1>kk@zh2HcV=Bt&0F>8D8y*rKJ#2kP#Ul&~iZW`>IajnPM9!9r z4m0XEi-b~cy~{eTg28o>dkRpaL?k5K}0-ZaDsgIsIve^V9%MZ)Uak1)G8T8bZ+ zBw{nfL>y`rl-tHe{WcJEvt!xPDqCz|%N(^|ZiA|I>s8v2m~%wkvUNv}2bV18DSTdi zLI6829-V1vKU*`iskkyP9STHh{j$2bje^5AIE=tdSHDX}f3iG?vKDL>RMcDpXdnq5 zB(s>Sr((}%F;h!`00JGCTt7Ix%_zAif$leSlym#XNRSYS-4+zaFLCA=SKHFoCbG!^ z_@ynGu=5C}inlwtfjq6l-)l)h))g_e9>!(;tYiWW^(E7U@w=tidZ^-Uu%TMYY?|oN z?jKZNKdU*RlDB=bbbkZW4#1vXiEfr1dza>N@v(U@pStQxQaU9N#rPNslI1H}gr$EN zsaS&+roDJ#{>CQv*efbPoo3TZNb{K5LOq6F^6r(Z#F*}JtThjiclX8#@JZ^CL$WI+ zh0gZueGDkk9bzSh^ba7lyS3n}=2+GM5lUBld~sQ@T5Dm#l~aPRaVk3L)t0CR$eE;V zu9IwDVR2L4{C4&8>Z99`VjCdB0R3i(7vT2}{7Cpmu;l#|;I?%ZD$SwD;2@={e)jrG))ZFS?Hvwgk63k~PQk*%=DIqgrH2XBF9gx5Q(PY88;zL}pG z8SrV@{vFj@|{QVAG>(clwmBDnBV_+ZBU| znIn4yKg6Zxv%El2aUI#?DO{)c17UKS5D%LAhn;I{)CvbkAIpdug zdniBCu?8@W+&&Not+GLu89`E>@NTGE^J#RcbAeUDJLX@?qYsr74HU~1%%Ed?kp*#C ztDULMT?he7M(n8QbO8aKu!SN5$2S)TRY6%3u2YCnV96!b(w6Mo1Y=aD)_ z=F0A!&I0W5*FN24eJ$b2>u)TZ)7+to7Q%B0Al*NCa>jYunzm4~`y$&Z6?H9%vDC}W zCaee2ldmRKu)-7aBX;J|RD%P$@HBPzU5<3ZTsXRM+}Ks=HU-F^roawdQg_mJX1DZc z%JBwmPHUU^nhOZ1I0W+5KpHFr)=UXg_FQ_{u8}5Dm9aF4WU$Mw>hCCEr7$Y;W>JFs z*&m8ot8*Z9d#|&xd2z_dun{HnM9 zNNk-AbARKP-)g@(SY3T)WHso2K2YlS0AgX<@0|6SgqzBZs6@oUbXKDW29G@y_j0x?ry9S|Ap-K^4 z$+lz5&dyr1pKQXA{^c8UpCJqy^RTz48z!>8jK74RcbUBg$ZKs)Jr;scb86YR2FXS8 zua_asBBuFfSk?wP4Vv`D38CH9x<&fgx#$Z6Y-^h?JpMv)VZN zmElYO&`&x}t#?VrAV<60{%MF1klSVaWv|LBo7!!XBJ-MHiaRVVo}+rrN&pYEvmTo- zyiAuM-yiGQ9Q0NX`~PF@J)oM}zIE~Av7n-IlmiF|s3<51C{+l>3L;fNKoAh=gx&%K z$WatTnu36Il_t`J&_jrb^d=%TgwQ()H6i`KqQ86ZyZ_%C?~Oag8^ggE?j(Efwf9ENmTYUuld-*E+5?t2J|%`Cll9i9lcRkf91r4 z@1y23Fr;f)q=fMuJ>E~}-f@JNisk8Q6{VTT-V1**UiI1fH1su%lXCSprm)P^vF%ct6pA}bnm za!O*5E~FonwY3t)mc7x&eW(UAxGTb+M=%A^5KJQ-^QprUt?5mjRp~>oIU0~Cxzv|5 zs;5S+Kh)B@BED7hd3DHpDUrB{!|o*@hohwhS3Rzm&#i{b1a=u&=XZLQOjTpPE8Bfr zS;Lo57zn-~k+{7-bmAW+f%rGYiMU30=sAJ2ZF0#k61+(*3+Fy;yil6l;0WEYUou0E z`dvPC+F;6yICs#Ce(3pLKs*Rs@zn9B0ARc`=io5sAb3?!l9Ciseof0I{>%4(UtQ5B z4Xok1KS`g&p0u<~a+$K5<%?B43a&kLf{v)(;Fh^C+`luoW2CL^We~KOuj%5BHpv;3 zuW6@LP5*OWtMPAd!yB(J|7`HiZc@v+kQgPARYUV+QgsC%15TOvpLx}|a zXFsA06?yo5-iJ!_MBNTyGk!jxV(GQ#xsT!_LiK6fQ8{^c$Ix8!vgi51$s5H~r*JJNMC`6ZbTDs{!D< z^7puQ#?c76nB>e3yxJWbeDx{(EPvUgS)XOy_TY10ytyh7Ss`;&EV%93PyPI9U~7RJ z4fUTIuao30nQ^1$hlqm75D>7x`3ZQl_=nZ&;8%R5*7rntiz$v$hX^=a=CPXQsQ^D1 zj70KFcbg}xvle5|6C3Ki2;)4_8Zxxtc85*yt=P`_VZI)uO3CbrqGl2a6|HcfBv-rs z(V!3hOSsvhiEna`r)kxz)Dr^X9)n{Fvn2Laq^4UEulVSdffD}aB%`32`j>iJW>Ui^ zE6+Ef(daM7z0AT$?~{l8VQXH&8QH}wpWYvoGU*J6)9BMa#gH{G$esHs7t_?KRNwa| z4Z&+|o|m%7t3BCr*G#HhQjjHDkU$)_q7SkO!_2%PVe2o}- z)osr{YZXL`co9G6&Bl5pYJgCUXz*A|@8WH&_9D>lcU}F{LrY8Wgv1wSX@IAvXKb73 zlUMi|SmJr)HC7i*2p8!pGrbNU;}@a^!U6Gn=I1@NdH3Vz@4i>E!5Y@ zz*~*iFMT{TdLh8lp^ARld>_Fs%u{iI=e{x`|Ebc2w%W7BI{XEO9-kt=xcO)#a62nL*OHPw4JFR=)-YY#kghKH7H zlHrm9c=WX0bQ$)770Df#F<)nHrm5WP>n#QD;YQ(Z$z1f0rDx4E=JY1i(U)RALCR&z zJGZyamV0>`)Fcn}J*b{+F4K_1>UxwRjlN_e-Iyuq!-<8*^=ra&w+x067hMvl;mqmD z#;Tl>VxKNBdu9dpyWojsR&p$Ko>;nax(-AwE=V$^n7*20q5_(rddm3Fjm{Ggq7;wf z3&wSsmhWH=Os~OGE}KRaPqTcssNma`&OA}KeiD2dXiJgN8s@3G;-K>pw5(e8jnYY- z=kK4*>RS2Gy{%<~sP@`9jKYHRy8BzClmsEb(7OYmXZg(*-*`$}etz%Mbw;`W&p+_I zzl=rHsEaD-bH*vPK5zTi!ujfk2X!JwRQz9MWZ#oat5vmj z^J`KQ!=EnX*=>++IRC5DB|d4gRKciBCd=%6v2DsDI6Z4WQHJHJ^T5*prg}UR<4Vb2 z-n?O%Wz~pw>yc2b6_jcn=0!^lU!d|Oll-s`tHIYrPK`6puzti((DEO1^B)`lU9NqG z{(3*$JYF=(rn)W9_(L^zHwWV4NH;9Q=A1-Ial3lJn!@2z&1LE|V6#D|>sSr1DPp5z znhP)5h1H;MCf+VG+t=Lm#LB7WepGFlR4^p#MMYC6cp|c?CLKq}H!Pt^FO)pzPSoW; zS33yqzh*wYiZXPHQqbXeLVIOoQr&5Z?t0vF<;&QXy+rvWV@@Q5axpa$ba#A$CRBS$ zy(&{IoCUvI*uDyU4Njf>GTzJ=O0mksatLc~4*1)&E4&0{T9$!HU_Gyp>PNgOa}Ax8 zqU6yG#dA9UQsEFi!@CuIe@6@9HT+h7KfUQNJ1Pad?|k%%rkrDDCgbc0FU#4A+;m~( z+BT~LugxDmXhtfy@%Kp8NDOy;Q$^vP)_|@J(BN5qV!Q|%YukgBx2{dkJoLXL1s>Ot30fyK3-O z6?qYMm-|6%xUh~Csz(L56&60+?1w+`I-MNTW36Iysff5bJ^`k0$(#&pHx$vH?b(B_ z3pq1-Qz1$Jl6e(9Iu`$VuX%8AJ-_7E(B|{mrbIx%@%j-i;tCb;A&rj)H>DanM|BpI zB+{du3d?5Pg6%pWB4xB2KYo7U^?GU}V^JIYyv5_901dg5zIhZpW-ZxZvjq~NRERS4 zP+nO3+>D9^3t(%_=+`khsWm=_AQDcG()3oU*DN6_W9-?YtixwAeAspQ*|&m~#z1iT zo@L(udhYKP1m(t#-q(AYQwPd{o^8~MAWDET5zRKipv}Z0*8Gc*gS+^jdV)oP4VtO) zj|LKZ?&(lcYq8%?CniT*cCJ({*N1Wyoyq+mA!_%{lCAgH#4tZZaJX;D8@gUv^zkCh zuhJ7dwO!`s(2df2qYbmoN%J3S0g6bJ;*z4x_npYxoMul z;)MBTT#E-=FJyn{mZ`K=->69l^jM7@z)m4iFOCxQB$O>F+Fl6Y7L}44wx}P1&bkPp z_#{&qXN~1U*XP8eH3DIz1lR;)d#_Z9s8VkkpA^G63A^A}Ha=Jvs-rho#JRwGm;#Dx zYle3=>Sg9j%`2UEUV>?rjdW8N96zu30~jh^uJ8Cn99W2gmqW4FBkd3U zOK<1dH@iLWKM+2atO4RP^LBdMyc=6WXXM<6ruqY^_v;-%zU!g2spMob=kmVC<)(wH z3ed;WH^-pel+>8MlfDAQ2abRbCh9`DYd$zXhrlM_Ivs!S zF!yghA72n`6b6-wc_5Y5`dCRPEmueVVI5dQkE0e}#mi;tq3gXo_G5zATFW#fX%Z=Y zBu|wzJpe@Pb&eJk`)mONkm!ETE@}}t)yDCLFnE8hFS1z{)^fHYZ`rFU6kyH4Dti2I z=oMggkT|1?_m8DhylaJadX9Dt6{lfbQUKbE}5GO7=U-QPG&hD}(y!bYQsc~!5VQnS?_QUKJf0jKE!g#tMpnIVO4 zwxsQRGfUFqlhv=tA z363brPRrJES}v%_YUj}n*n$)#gPujl$ekH~8|R}I2@RlL_GRugFi)$SDv==>fTJ=E zBTWI{nOOsJ>}MYv?}G4K$utF171E#Kz^ORwHHPK1FZ#iSp@vM+h}7_~3LRHVODNl` zw`_gw|9-G3v?EdyrBbu7IeJ^90ks$o>#&V#6$KOb!A%`I@|Q$c6GiaSOXG%+>G`Gy zKaGmcb5ZBPNCIZ+!CGkT?6$1St*_26Kp}yy#6q0=sWT}@3HtHAQ?xE6Uz!N1m(c61 zS^>Orxo$-j+7Lwj?)}){h_f6>q%Z2_54WlN^$d^yvPu>~s(T{M&nwrvqGEs=+o;Jt zM8PksrFq zBI`6tZ(B~s)-;)O4BH$kt{GXcf^@h@LEiHQo03I*g zSsv!=gNJT3h$Us9$L(vnZK~V=Y(8Al>Fn_7Rs)E=fm;x>5jswi`n>)6F^si5e2EUAzh~jpD^b#flZcdgRrhk` z4#}_W#OvF{GIK_Yc;%?Gw|S8NS75O|H=%voz*5>-&D&D)?z)(Gz0@TLvDVh55te_WAnL_h?*y_D}|%iLin7EhY) zLt)IjQ%j2BdV;qB)fU4}lmIl)X5>ZuCES!=%LBl_5*Qx)xq*8WxQi;uVGB&@c}|;l z1IQb))77)mC830D3SHa!={&P$4gBF1BThw-M7&rC=6PCqDUrKGj*1EaP`1gXgqVdWKXW zn8ASH%0}CV1?llvZh_`du!78h-+Ea6%CZXpgZb_Hp%8QcxGcciaNp6VEh5EkrX3w| z#q{8QU>iFnYA%86`RKB-zEQzhEjK5aQ)2yGj|1n#!$vRQw2IViL_d~+DDGj^d&DJ! zvplT&kY@0T*wG#cXk;jl&fCeo&fCUWLENNisO*q+>U5BAvh-W@Y-V3)qlEDAUhwFC z6|kE?73aBB(l6E-0)44VpWJ3eI@+y4i~Z~9<)233_fzzqZ!BD7FA4rV**X^{Z_f&n zB-x~AYVKUdSSvG2|9ofqr4Vm)--j+rDk!VTxj*=)ZJml?>7gX((>Wh_-L+}YQ^8(( zMUT-n-id}6-Z@L8v^KJJM!~zwjf<;xR#lyy^sm6X$P0T&&USoBZUR)hyzs=mO5)8S9J3NWja5iyrPZHl$GeV zca3S@!*XvPmAIm1C^;nPryn`E;2rU2R-pVV?FfdoSxM#lx_e^9JP@IwCh}lfY+KHr z?BTfpQ2MBKd9veN`6u?|XcB6?Y5#Iw!3IGf)q4RMjeqgGf5bIUP9*D`n|W`c9h&n| zBJZRN`Depp^n?1_62-~w0#?#+X(1u{tp*PcGjmJP6Oq8{R{WZ5f1C#mqL)uCj*Laz z-1D#54^pim2S7gR?BCl%N{WMrgT!2dZdfN97xzgHg8*V7X$ARm=Md!pyqP!Zh2%#b zs9&0&s_J;M;B&W(EBzIYL8>Rd{MI@A^;CYVMgD=WW8dQJz?Ddx1k{7~=g`oh+Sm`D zlE*qVL0*}LmcSBz=LIfgKz$aFefNm{nvl~uZMnXi~jl{yEsCWEui~f^05EI zL%&Y*`{y8)`aigf-#`4%y8!p_za06Wp6b^a{_8HlbNPQYp#O)bV!Hi@Jn}Eq+TRxB zzbO^}pAP*my36d`G+Tx9_n}{Z|7VAOUH|vb|4)}>Ujt+aeqHHzg6#JX|NEi;*^NaK zD>JRoki(&CQH>AZ$>grdc~b?FckXKp)DTJ=<4cz<{X0r;FA&mLZDG;9xGJAud;wz3 z5(cyB;S7DL5Nc{|GlU-&Si+?d*2V%Z2|vlo0%hN*8km0#aU^wZWT}VzJt}MdQT7Pd zY-ttiyhdvsuSp)g9n!RF;ki`wnY@7uH9};o56$$F>{WutV5{Rpb;u$Vii3FJ-=4*8 zoIgnj&F`75GgiQCC|h2#f|ic%^b%p1%k$S7HW^kr;-t_Zs0|Jhx;@|csXsT-1vV|k@!R45vfkj;0vq1;TF5VDJ1^VcUqOp zut0O^VExU}Q4Y&IEV}jcijHGS`@lli&TNf83^r48@ZYahS{gU;!j_M#jt%9W;5ex|R?jj5$Hl<*sGw7{I zt8qTsht>(gTIABf)$vgw>D6NLPU)3Z>JWtXNW>7e5`um|lxcNRcJIGE0IkAItI#W3 z(u8OfUUkb^cdf-#AA6q$qIJKMq+4r4x8RLegklTPBNj7+)@wEm=mL(L|C`ZX_<_!m zSy`EBtb|X1x#+XpZ;g#IYsApPC8^shaO_Ov>}fy006}iGmF`gDN`S~*RVL1ShjT_+ zVrZZqEjTLlTThqWy2+Y~y=1JvQAZX*9=8!mpyL?h+Cy4l-ROmG zE)OQocsK^N@G?rtCV1-pK*3+bHnNo7u08~F%y)iby`YRmf#Sk7dQ^89HxqFw2Fp1$ zr$$W3Sy>+NdMEVU_goTeFw}Q9s!gMSVEzq79W^Kzhp@h)@G1*LnT*hZEhqdoy%y0B zIEC}HqV9gesFEofd|ug7Nc4H#GDETuoe_4IIHU=OTp9fL;Wx%!k;TH*^iUHRKeCRv zi1|Drgm7-bPU91UER)Qb;euI*F~4=l>8maDVXhK4Hxi{&gEm^g80M#A%ii6i3PeE(60{Sv1p&w{VC&DSH2Fjf=TnJFo)n-@yxzVzkhld zb40Rx14hYZ1vjcd{h5Uuk|L3WyN{$Q?e8dPd`vKJPiIahuu#lGVk~Cr=a#36-8=?? z=$TodGoEu2f_*zN_*CYX1b!~*%#Fz(E@YXkO(INeoHeQUY#DZ$I(7VG( z_@BYVEpZP7X?8Xd&!x`XJJYOj98Zgmg)v=wkJ=F%=yVnYF;uufr#$VD6R!37%2&e@ z^M53Xw^8;dYay062Xa&oHVtK-YTKjlW;5O}(@_>TV- zlw2KjpDS!+b6aIgGUH47)7cxNLwQnGL|1A`AEs!usxlAyq|&|g!q#1f$*8IbnyJEs zJbb2-gO@emsim(@u9uTRd46>-!)+=qR4uQg()K=}SUXP4b#JeJy94_-&v5lb^&CyW zY&C4Fn;|u})|YW2kRHkDL7$nuIKc92>ek5A*wR2`wb#*7CRohNTR+Lw8gL{0mbmbj zztc!g`iC?&_HLjtffTB*m|iL~a?2?bK6T!JKKGDuQ)4Y~ewKmi;WHRRKXS7%AI8@C zKNJ1z>jXQE-@1r~4u%bp99|OYK5XN3ZZF_AI}K#&XPo2+{IIQPn9T9U+7^h7h566Q z(C76q1UKcdKmJ4h8u2Gz7X2kb(l7qBGZSvb`2A-@eacrj((#CX)nb zQJ3p&tO8i^VmR5U>S2#G^hVv$xaM-M<*oFG!x;MD2u2M)_7jVM@8rN_czfqtNJ^-# zn`kU*Jpz<7{&z?e*_?|E9d4z;F!hM{4NHyLxZtJzPI|R|^jv--o(`eqXsEAiujE*h z2n-_EZI-%S>uo+(;5d(*Or!Ib6=saN${b%>&EC1FF0gs}|Z z_<(;0Xn<|@4e4Iu-zngJ@5vZ_t(BmBShxc=75hd%!f4~silK%d+ZeCo26>4zY8>M* zzBLlD`O~Hs!Wi!=(95h|C9;P7-$H1w=Bz@9GE8;okG?(>{nL{1Ef({38&aI8<(nc! zbdN@Ay+fibh1N#P-mm#Wx8M#WU)t! z(|N`zFs8*q8zDSxArtif^bT#Hwd)q+fJI5cn@gSVWMwUiQa9mi=gUEz_n4bz&OO0+ z>c)@Cxf8-QNwOce-~6~%1f>3+;9fNME?#typA}=pJVyuLb*bUU>^Nx&M|HWha)#D| z&fn-H*;K!!z`wNi0tm2&1XMEUi-Z&{6u-;VlCe5!O=-a(ZKHtGv6qGwL9-ZBd%B%8 zOe$Ek3Go_cz)%YxW9ezC=fve97G5Nd1Ycm*$6plJ0-7wAd@B#^Mii+0vMh!!tXIRD z-tiMF-H6zTPRB`_ptTySxpjDOT%ozOlfB9s4eRr%@r|^vV#60ix@q+||A`6r%-!Pv zBmbU}SChjb?j~5bN?h;AT1=0Jy{^jMlKdkQ5&fFY9sz}LsMx$unx2@Itnk%w16AP- zPJ^_LY_QX2@eR$2}E!uK%jp1*g3#U!4ytK|$Xn+EcSM?rlvPlws_D zi1cMsz9ez4#xrXdusUlk@t@XGjoF@SM!I1Z#_e<;ztt7zM5_A9$TJQ|(ip-DEUhgO zmI*_*;b!q3?le?dV@=Db3)dye#;j!@YHrSH*fRdhAF2K3KWo>T1~=to(8PrSVk0xj zleY^NppFL1|4@j}Kc>vA*qb=O`Eab`qzd0fM|IU;BzHD;VoSx@* z*8D0xTn3c>I~dl*PmiU)pt)GM*YNvtq>X`MA%H``JB-LWXUte#RMMIoXLRB98vLen z`PsIGAgX@T(O#`D`(rI@8zPOFj9=&rq0}Q24Pt8_vBJCH*hJ9f52>$T3hWc#{y0=E zV@9GA1-F!y)LHDsI#*}FC-0^vU<5B$a($elvB5ORpHOEs<&}B;nKQ0ir96T7j_KSAxz?u&oBpR;glU`1j2M$aHKduG;EDO#nva6aOVh zmfF%1w3T5$&eQi0(#u?okL&(QsxC0lR^MUF8slYDLpv{E&a*H?G^0i%OPN^#b<{1_ zpw65rLqa>gHP%L*+6N0*5NLMxB?(3E)5!9{Dl4gx#}Bm0-X?>6Nuq$25vJY=qE zjD<*H>Su>H@Q)H-(dG+)hWSmw7_ccAqm4hB7j?y~&hnn-YF(1IEQy%C#(RXC=_to@ zthSwHhx{?S2`Wnt*LFMJHMn^3u7jfS#^;*aF}{io^ARZW$KQEBjPH(p+z2XO)qfwO zJ&aH;xsradARKhA+zd1O;v_R+BhSxie(69wHZ6wYZklH67xhtN5}Dp(a&>WR#qWlS zYn4E;X>jczwPZB#!s6NZXR;r=9VI4VpWShD@`C(QLC?gH6CO@L^h_Z;ih@>5)HV>7 zYhHY+uH~JBFPj9qtWvz4u6d(}6ra0|6MfAuMVR;hMe#dpuW0O%l82z`NlcT+PHO5{ zA1fOCi!*2>B}ajKtG>ihF6jjoh$436!c=;Irl$Q*&l>&`Qx)C~o{EhSm1Xi+Y%4Qe zA$4a@cBa~~RQnOfyv$?9vdcB2G4_#vL_a^w@vy}J^9odUsH1xBkWRdFiS2TcUh3WJ zDIUt2sX6(z3GMN$!Q2s<)nFbVD8vchN?klS^N*WiPIK?Kv)1W@U&72(r@Qjb?#Z^B zY`Krhn0Iq6GgHhw81#@gZRnNOinpcF?RdrGJC>IYV1|Vc1+~+%^9S`g67`-VJ3cqt zesE68GLjXux;$x*ho7sJ6SIukpq2T=uBWB z6pe*z6nIGqYrF~Ne^3B*cdId)t{Oq_RjpP(z_t~K*H%}JLmFsR*)fifqG{zKdYHv& zn+zBQqQqSK%u90b%W@0dZp)q^VIk5QEQ5tU)hPqB@-T?^&`~*YsfML^DRQ=O2%STe zkCjgg3)r|lkguC+3Ma}0>y%Q49)ymS1;YY%w*ACw0?OWN-Y>@&LfJ@^4ObH)Q~FYP z<9dHuukI|bKZl`rqIH=53y+&Vw65i(O4;>o18fz4fQ>fTC8dxiHC|HOU*lV;ZwFo9 z9r@(kev|1^ZrCFDEO^}XgxAr^v1>(AynBPXt!t8I@1SC)GkaJ9!0u|=%&f4G4L2Ad=S|3UnwYP?ciBqJJ4>WdB?E~+flR9$c zQvLrf`49^_pZ+>lf5BqzvtTqf_}uK7XmVufTIyS@L%uVQ9<-P@yyeEd13V6fl+XYl z(PI!hdDp@xTF&JHKRUj@;`qK&zH~9K|Ks_{r}+v8EO^$HM>vo+Z2e7(k^^dax<^(m zfuL0f$MFVXNqG96?3)G`8S0Rzk^t1}hEt|RO>X%Y!e1)7K4mi5Gg;KkOGWR^b%%F@ z#~?u1vw-`$(W~$vksg>&xdOgsbEu=NAJvr52cuNwMQEGpB{C+vBsl(WSQS^2K@CDEL6taEx& zeyl*}yTiLe&7~I%p2cX!J~0*KkL~|hZgFJR?O8{zud?2O@J_d(#G3jnqu}wOp(i3= z{LVU;8-g<{8XrUTyA2s10FTqIhEI%mEu#NQO!cm2#<5n%oQvU|kMrAM_YT~bUj>~~ z@+FF?eg`bvt468B71>yaX$K%YWZvtI>}=^AljPc20l8(`it zY^RI$K#b9bq$z1S(vadP7VYNzRQ6>q);G#X{11ar&u33AZ#QcMO)qb?T3_CJQ*Oqb z%6O2H0pE~XunHvZZi&3TywSVCM_+5`FmBajQASf((+ypoZeaAa&Jl_9Sbgyupj!7;ED&H# z*cm0>ZTS<-pmDf20em(3`Q2NL!obf8fUCa2E7@|HQ54#7uL|p&HuNpp^f@0VhZUH& z@~#Q@5Q_Z0V$J2Bhuz*g=ZFcA5^e|_ssr90DRAN*LWN(r!b1L;by`lKO1`Ar{6fVl_`p)?K=}2{nEe(=?|AH8 zeiOx_Gnog0Hr6jql>W*H*^lkwJR_6(18H90GxZ`mOxWU{6&t`#RvF5d9NMKB@XQ(= z2MdGW1dQWVEcnd+(j&zce$5p9eWR151#fqh!;{B4IMZHobX>Vq_u8vnkKg1-j!rARWYkr8UN+Fsev9s(V~vtNPs?tnlhhc3gEhJ?>Q|BkY2s5he zoO*QUjX3ez-V#z!@u*2Hi^r*QR##J27-*bR*k4(`nCCvZm-k$4qQRkWIZS5F-AmV| z!+^S~*2tPHSc(I-o%vs%yEQ0qb4HHO2DGCSC-qHNfGzP!li(!@#0sRxf)~UnGf}-( z5k{EIKeLCOMS4HT_a0W#7$OhF_Qca?rwa#K4bskFSWclif}#Uk^e8|{uzEBQ4Dy4- z-o{7sMDcDaWA_0@P-BJ6?Z{qpAjYr?91uaWXx8K{@pAIxkVSDaGiaJ9)=QlmO~D0D z%--jtKY>upzIHg>70*7C?xQ*I#ztOOIVWtB|3in9k65+>kzSsX3GYu`c&O;U+(JiW zUioT7Zs#sw(q3*E2*O&NY8d%jb%_C(z#pYDo+~Tupd!_ixXKHM<3(CD3qiQT$8c)u zbE2 zcYJb>#~RVC3Iks$x}HpoQw>Xi#KtJ9f1Xc?tp?_Hq3ShJuVt@%N%iPrLXgnvj+Em| z*^ghZlP7p4^!g=I2FBB3YhpbjfS&9o?bP|muaDm!seGAvvjQVGt}P8<_^j=2LqPcT zwSWf~?(%TL+Y2o;7(gS}dbnW!T=TCLNt+L{+Vxp7cPjDLjfiN+`Vbs<=lS zisdjJ(sIs8`(Oh4RzmocFM^VC?J}axl=Zg9nc+jbLcw?W*T*_8y!{8yzYd8e4g+;O zF78(~i8#%ahRnmGfmas;lzXB+0yqU(ZB5`S!sr=)GW?=^!%K!zYWO9u;EgHgefrb1 zp1*_QKy|$Y?`fxmmk4v&j?bgIS9Dps{+q|-(+j6pUPY;_J`?dV*34-I-p8(`)QgK( z=q2b3K3sdpR@^(=*6;5;iP78?+seQ5I?vq%jh@0gJeW953%hc|!oYvf0MY`%hRW%p!X_m(^tB7HqjD+ni)+D24NTor={PjGPcXj z9{Lh~8pzPCn%~H!<YE(3*hah65$RM=k)Ym;5Ih1 z`w^J!ax$-cWqiooeGsfRs?%eD2W4l=zIdM)7dobCa8Wzulyq&P!xB8g?(M~j)}c9h z#|C~ZF*L%0dInMvpWsxBJto%R?L3DTZkP$D`%TKzWarGHubUc>d6=KP~CN!riu_P+bB*)xfXyWIfrM~$FP zT#$sYZtI^*fv-YppIn;iJJ&3h*z5e${>1w;@tV>+XKp&)o$v%;e~gw1HuR8-QM|W( zB5`m!0Ad`X=VRX<&2y~&XeEGc8OI{fq6OjaV+GO(ti_uw$ahWR&XwaS4-76w!;ar+ z2|tqK0MkC-gll)^zAgT8%qPlTwf(Y6`rx(R%vZ|0Ee44=oqzrg04dEuHRsNA~NT8wdI(^ zj0Z9Xs*%7P(?BZXlNf7x;?M#Mzx#m5m?4YGlh?TmCcHXkk>XZEyB&gP>=p>JQ{ytB zu_#TXD*Z>>1Z{L1#X{fk`GSU9TZK^>(HI0%qxB)_>)S}d)^2w}B&gWEjfz~q>)ajM zaK)I&qQt;GGSEwZDUuzea4D)4bge{>x*(4hb-pFUN4$`G^VwfitA>hzp1M$Mglfk} z3=i!w+dB~vUVZ0ofES|ZdWStfku!SWS^CMk$u8}@NjUOZdTMJ7v`)!NX6)s9nx+js`?D0tQ(PK>U+m6Y|YU zP{EXQkmVA7>pNIr9Fewu_KV7b;3Fsd%JW_I(NJ0bC~%Q*yk`@7xHn}VY+z!+`TjH#^BIPKNc`$GK zx>{bY^WbCwh^GocCn6ynkpXl?ur7+}9g=y90t&}a<$+DVr&?E)nk{x`A|^C{tDRe8 zcWb-QPUh`s2!1K2c#XmeB~BH!W(V~0aOu7M?6O(rAS!LLpvRn>;TF$OCREtOVOCdt z9m4{rL~;}RM#{$Yf9k1kQ4Y=YW_op?lvs_7RAWtNf{aFpnQZDRAfOgkOSjhGB~$>9 zc(_r>$uEGIdO=iE&h99X4N}b_sYfJOl2bR8umKK`@4r|b1~yrLA452Oz{5}Z?VayQ zZEy8|b-w-DTx8PsRhS-cOuSgFQ=)BjDmxtfnca7b11dP;s&HZq!$UX*xygSQQ}ik} zy*oJEmdHa0e+q$I{9@IQBq?4?X$ol-Fm0>w09KQ?V(dNYvVauy* z9hIhk5-(}11C1Z)6EIZw)Vp*=*LJtR%Gy2^yxDls_xSzWCpYvC;1mC{*{nxe1%i&< zKn@NVKn*JV6|mAiC{)PryU&ud>NMx>sQ^LX{2d<|vDPKWLl0Q!4gG_Jf2n^sZ}zEdR*Tfm@pZ&ANjTzquJvXT>-?2qMw67nSX=q_9%|)sNV2`ae-}cbkA(gTpkbI z5ixIjvX6X5!^HNn-)vjrH@}GfqZGSA4bHH)lM}4;bNq47(P3qor+kqQ;x&%3cd(5+ zjNL+g%EB#NPW?Jipz1fb3$h(Zda2D$jE4t}z}FfQ*hLHro0uaTT*cVmr+K-GX9sl! zCH87KwMOzWZEIC*Ae8RS4yRaE`+SehR92c7)3eRyQ}AR#vwDLW;-||6agL@0fx*kE zf=-^Q?#mi1YUi*{^yapxNRiF>DnDb4WMe~FKV(c4+4{RGzSsJ3*zj9;kv`Z;RAXY? z=YmsLrJp|h(MF%s_|})@`PXH278umU5mZh|Y1%eOaQ&fu>$(Z2hAbP)G1s)e(SPl8 zasmjOZ$gmG#mDyk@elDAXWhJ?Y(Ap%!|Upzn6jrl2teKh-Js+&s_JBnfgb^ z;3CdL$NQyTTX+Cu#@n*pKO%jKKprKhStcCmuLR^+>IZ%TV50!i76jzL8hPx(-TSiY z4(o3P0`U5#^0R=47-)JmaDa9M$mWd`t6tAEtIrR)W!U-w@mt@e3(d}e4Rcg5FF7C^ z1yT{;E5|&PerO&=eN};6PROgBO~^FcdGlkXoFG?=Esh9LxqAZhy1znPb(1|`L?QX4 z_#W-&LdQUCbYl;n;J8bUSR?uEn|Ju@_ax%m#y}BOPS{JM@|^BNp8e?(*->M~2ZA3p zsnd2vuh$ITP2}uIecME=(LF0aUcbAS6G*_ZCU>Sqcx7cSBp!SX16tCs@auZVa9NRm z`z3BbKp>V9_npne$ih8UU+F~vP5BL=Y@yK$V$;NfEu!iHsHZ^PQt$Rj&7y)gg|>=d zv)XH3k)rhtxHF?_tazI4LXjthQRu{?41h43I@U;geq|uvn%;(V@&>U1b!Ukuv3E?> zWu$6dP>eDE!F!-J)3>A8SEezDo(pNU+5PryLnc$hV`9IZnbj@=D$ej2n6=pwV|{wO z`M}0%7uzwDuMyf)J0*-Q?ekn-`xQK_tXg{#uukb=9ywbaeDqN2O`Q~Z;v<=mg2wf9 zNs+qk@}%fFh^AcJe4jz6{QOf$o9b94qAK$(R(*bq;?!MF28pVhwUNuwma2$aQk0E# zFdkbq`nrsA2n{h>Y>NMtQA2S06yCWyX>Sa_65rKLa041#2Z7p_Qu_APJBaW`i)f?y zH@?HQ?La8!oe$4>Vn18v?W_Rlq;u71u{h0XexM(04Mc*+M51T4`T0wpm_Glr7xWqG zu!H%5Cc^_seFGYPkiWfN`(^1r^I5ucMo_$|d=|ADkS6=FVJ}_*pl|yb;hNiQ+PCHM z*!T-5y!pD4gJG&Jh{Ip$+^*>Gl3!Iw^{c$soQ!90*04OjQawL#uj1RtLRC`C8*k;F z;JZsZBY@lo5ImmRzHGNy90`ABU)>182z2%IhUjdo-QI9myWKlLCJerMLGAF3I?{bs zyb3lu+1t41>z_yC3QK>CqSMehK6Qk?6pV6@6hqY$P@j%0H*bevF9`6W##36#r_N zEHUl;49nNpo$M730Ic=7W}xPy$a82n)BeV>2SZ+$o2(2jf^3WY>=}c^hPmxGvMTGw zGg~7U08#Zmq5K+X%FF{wtdaQ&Vu^7Lha!&<>=*8D=72q@wVx`bf^ef#thr?LEglLR zOSM=12VcWZm*b!Il5mn@L}a=zfjP%NBa@Dp5kX}^T(*D385ku}ry z|L0Pon1KfQt4^4b_s|1wX<7%!zN-^HXo=~*m366iY4_gpMc@|xB9r`x&7&k)~iDA7qW@#uTpxHgN;c_AfC-CQK!gzEehb#LL?x7F@L zDUIvcA{Od%`3yj5DV=Bxtqak{TuX&5bBfv^fAkLz#)_O`=fgEBWIGJMJBd_Ob9)qA zn<>)dgEO0a-2K z`1=MIV>L^9?qc0FPdvp*%b{}BfR)ocs#oN08s4Ls-V^-N2#8>jn$1BdYFh~yrYj%~ zkh;$gGpye)QNg%Kv*P7U(vEm3o(IIzfR3Q^h|Yj3@SVzfC8Mv8xu^^ItLXjw^3W$e zNi3S7=Ajcdc`+t9H)iOOA-H70fPIzW>}fuw@qh5|3*N|=h!q?Kn|?hpef=r@6jQ?< zOq$d)&DM)PY1?lS6kT7YJaS5~Md9w;lStGC=`BE40#9C=J4<{5cKHEG1`un9cX}uR z_BljMv-kC7vCM&{tC^1Jv5Mba0o{`lz7NJ`aQ)x}@GM||qD->o9ipH6DC-5J_qRL8 z#w6q9lODDyuQ#->=z9#!RDbr=sp-0LJCh zb%%08>4MRv%dcO{9z$Kpj>=24ZOt7pzKj2oD#)(+yZWIEn>igC;0uai(tkp#sV!L^g>L^=`?K$%qWJbM9wr+wymg6>NyUdwHig>a-$v$%$6zQL#ExUO zUI;TB8Q)iE+=p38u2Jr~FY5lTzV$OUv*lmm$kW?m$2Wp-$;VwG5NokTUwh*z(N{Q} zM>J5))d_65b@VIPrEN)`ODWzTkvDVwL3Cw)X}(1_&k*P1<7ER5Q`&)G2Z1GduzyiU zpkb-&tWIDBuS*99cF!M;Gi)iJv>ua<!PzmI-QG)F-| zL9yt`zHLx1a3TO(3~%gO8(YDMZG6Pr|A1tQ$>QzS&+#GwGF%>cL941TJGM&|`KSM* zV(JdiyxZNr30PUn3-Mj5oB4(PpChjv4a@_-2 zZ|?^uHMOc4<50@t2$R3 zYUYeN1Cd_w-0AC);a6lWd^oMkq!wXsb*a-z_e)tDP_ioX9covzJ=#HWB@$kK*B(In z=M^9)o&Kiv?Cj#`U5lWN=-Z!a08tk^+vNN!KUmJ8dVD8cR|Sv@A)@MKnYMl{U2Ae3 zp9ft(KR60xClz_TNBGlw{)!J43b11#FE26F;T>GJ!4P)LIjrxNbmT@qBVEdE7i&I} zuZ-)j~Mhr13tDaD@ZfoExK zfQX8s-HPVB$izBFg)$;e^3~0%q9P;_?~CMjvMFr|U&H2jj2}A_(h2W}4ZC zs0Dbc%mzXFrY$$oV7m$`AxMD4vJ4}a)sizt!ID$Lv*ZT%7Nme;kGC3DJKvv0Ib|zt zr9;B3s3X>tuxzVa$u%|4g3Z>T!89SxAa)@Ulbk*=xSBLCLVq`>#r7p1INEd(tHX$} zK)?#*Qix@qSH0;75ezDLdHZQ+o1^~wgnP6W%K*Kb zgI6u?YCnYo8Q=_?d)U)2~1X4_YWwLXMjGjkR9z^p!%?8~$O zAiV#LO=B2S*(_UWXB$~|74c(xp;X8$pp8An#?j<|(&C&9<|lmT@lJXwfayd)JbgN5 zVH>k@Wvb*47mf21B|RIr%rL2eOG^vZ8#CT!8S4c_=HhYa<+hp9tM21G;>@K_tQZZ% zYLFa;xljfS^27iRbSJnM6~khZyC;3 za$xR9q^WpNUF^zE!lusKj5DFbb{ea~<`?lhKRZTg7(8XxdK5>)i>QO5x`Iq!O6H8r z$IK8h!SUybh@k%3rD3Zd8s6%l#_(gL{($PP@!(z!_j;n!4;G!?Bq^RDOX_6lT_qy8 zdr=7bH?1}UbML0?-t53bL>ni<&WJTjJNvoLv8S@*5T9`CPm7Jy9bCO{DMY6sZ2S2x z9*79_&J{{ljR9&g?#cr0>ioO{n`Pem?AMJ?&X#9-Vj5PNl3Dagie4$tGP;5$JJ*}o zYNa$k)Yp1xQ7FjrCpS};{A@#sh4(jL?#z{WhNf?&ENIZ0s|+&aDOud5mh$sSUaUdh z?by1>xWqm*!7N3?s|%Y^fVqOH9o=egTL#6vqe}yXQ)Dt9psqzm&XOU#8wf>4DcH&M z>ZU@Md+1uG`RuPkm`KmLN3yH_>0Ixskuwe-;D`&f%llz!CDP23RavHHQJ?O-5OLVK zU_WzH|FK@{pI{>~Wz3BWJh_QC%Th#?YZEOsL-qhsq?z55U07cX)`x2YkGh=z#7#KfD6 zD_b+9`r#1#^SQO3{*0YiDfnZd@`xe94FAFvY6lK=Q3Yl1Qr4i&h}ylbogdzrTvbBZ zLDl0jm8P}SES=oBZN`iI2~({%r7ACpSxg6|!)1Jb)+j06GhfNItV6eX`fBd9sz}JZ z#MsKW{us%quVz_xVOei~JnVIKeG?6xtEsRs;aK#?~5?VIQ@A!@*?4Fd?+3mdEz3ADI{7SFoKS zv^{q}FzJ^tw;UZ_oJDrrKEY)*o_3zmZLs5UG^z7>PpmCGd#t$s+ ziT!_ceRWvWUDxhofrx;LbO|UbNOy|@ij;JNbPh4V5JRXaAtlm{(%oGW0>aQR#0=dG z4Bd4$`abV>&UJm~A7lpRlHcBIuek4ft$i~9Pa-;9wpB#yvjD$1OMKGrCn++rvKG5? zP_r+~du;X#_q-I?9`TAk4Y;2i6|4L9xr#1p(~_?)j-0fpASd-1k^-g01J!vZx|4IEtdCN3_$m<37!t z(lOt#a1EUcO{G^|L32R%oD~fA_!;fEMi+gDYYambUEfGaQ#^^?>dqqK#GU8y*}y~Z z$)P8T#5@yk1?$hKx2k8FjTsa9pZJzh-+bbL-p4%XN+(~F4EoJ%GC9?8e8>+P@gYG+ z?!46GZOpHy-D0*4w7@SM}h1$9_k+lGjN|7KT-$pkMHR z1Soyt@SYkeoxaw5ZT6c{pImZp2h*o}r+w_7@7**!55o&HqW4RRm%6z_9NYs$ds!Ozwq*HNC^p!?yBMMYn`*=Qj4hM=y3gcJpxZAY|{8r!Tx%!X|i zKG@Oc^jEu25lG?|wO2bYRf=smcgq}T2$0I zFZ`YC#w&c^e1`$OnJm9?0sZLuY{kX6bDXxQ_S-!7n>@pl3QDU3Y+fDkXNq#x$$T9i zdJ-)f4d;$i<6ju&zt`B(t#8kF$dxT~w*j0e5n3iadp_4sgF?KC6fu?>VS8I0#{!6< zuBljdZhh!LcesO4#s1R$>g{Y&y_+vLS-$E8fsM_G*x1BZ*H>I#He$=Jsr>FJ(*x%?QG{l zGI3fRe|%FE1tBg=u64$EKr#zAY7r9NMImPyTjQOWPAZoiPQ8;y@dR>QG?LChYugy= z0nb!8LCc@b260~FS*u*dNKz0TjlElYPH-{^kjMm~o+fnbBwCf;a+s)uW`b;#LavW9 z;AdmpX@hp}yN@>-EGv}Z#*`d-u1h^HTb$Uyx^Ae&;iOOx zB|6+4-aloMg!zE0F(7oB*cyyL%H6d|y!FS?+Tpqo3SX4s92`byN?##}43oO$DXPd6 zNB)^GSn2wKh0*cT2EX4w3tW*j^A}VH9EKZ}3j?LFre0C8p{7 zWGPBw4~1gdO@FXVO;MqDD8`oW939S+I|a!}#XewqiX+OMS@qBPz1#op72p{>+({Cm zP~mFPSntIPffv1eR!1p4Be3xrFW6#+@h$}0L)C9~t2>Z&RV(D$w%)N?-rCctbHi&^ z`c=;H*46^gTMWYrW++AL4Jl#T(&{I=Jm|-k%(Vi>h+h=O3C}jqc&N=*rukM@YzGE; zN4V(B->q{xgUM3gm&f9s67|R5X>sd?WuwkB2+DN?F`uSLpnm;sbRW18Uc5Ms_l&E5 z8Ffo7P;f!y(4J()qo1hrEySxfOmiuE;$4{Uc;?qPtQE7N;H&adMRUXDdN`%T#)(=MoX<@-)ZvnY0f2v;KJ)AN9T z_go^Y*2$|DKp5`P+C_b7xf;`5&OVKM>m$fMZ(^tH?Y*N7p3sZ1-9C$6>};z4q>*)) zx!m9Sx-1_5h8<4f(t^ra%QcUervqFn%<0WAet9(-G)vd@wB3ihlv!oB+57_D$Sb}W zsZ(*}nr3hMx1Z}WkYy%6ZV9py9aWT?i?YF3+FDgO)G3@5^sw1w=BfF-CB$mH?T!yfPe>0m{6rm9%x#wAi?(q$q*{`m(I_|6zrxsls;qXI{zg9; z==-SfnBMN?R9qq?dXk&pi+^fz^YOL#8F!c-hw4Z{t?%F!vfvtHab7k2ILZa~g>9Yt zYQK&=X7N$M8h*lgg0DOZW{bKkyF*akY9p`}pZMB!TKQjL6;y=`6}BC*ZTmhaTrb$s zXjYfff{aS+&Rh_6;}z~6EiJm#*g*DA228x`kL`U&3v{8J&5Sjj@6HW*gYi23vMm+L zG(BfTwvL8(k>Inwf_Y;1A1;qG9557lYxpyk@u)`!qyVU~&_sY`zBym|bOtp0p&xsTm9;rs))!adMJvxQf48%@x8v6XZ0 zZPXQz`i*io!mHQS%FS&Kdpy5ogoK&8sqA>M}io3U`BJGHWGJ=HS`QJgH$ELc$<0gg7wn--h zaaAum>9f=DyizW`56BEYe}o%e$K}{OIZ+GJWL~T+QqF-!gDOBm5`mZ1h z(*>@!N0@2a`xFmZJ&Dm{Yp2u8??B*SczVw0Q|le$tt}0u^%=(r?TP?B6o0#(|AYjw zy?+j(tfQC*s-57yybA8d1bJY1OKn|Zd2#P+&v^Kbx5t*dl*dFHwyxUK3c2@oEr7D# zC?z1Ex*%+LPb<|DbBtHHKWm58D^CS>Em@O~>+NVagVcA!oaiSBN)Pspk0T;VDlTy4 zlazvM3JeSqw;II6Aw2~hEL$Mv%aFCy0Be4eIc)6z< z>%GhxyvcpzuNAWsqpR0WS6v2z@?Jb+T_}zbym(`;G0C&1w~lkL3RTiozFlK%g;)7@ ziw(N{WchV0Vy$fTmIK*GxbtTL#=uW(WtmH6PseK{TUpJxzl_~3{(8+D59j}0_N{H0 z!zBDwu{EU@gtBn(C_!GIJ0&z@?uD?Ab*VI*oszW1#(sWVqVsC>?P3mIOu>wkVVfeP zVYh&>Kogj@V1;j!EN=FtRhAlzQPxIb8WlDt8E4oicek_ zRdKU4fyYe<$yf4xe}4M1qs*EH=RobdsKXBbd6?Hj%{)QJgSWMj6Xkl7tSfU9wi{bd zDMcL|4dw)ChGC$v*^npImABKofRDe6UpP4x$n~NpEYtSojPV=AzMv+2z$aY0(mRmQ z06!6T8s5OX{c8Vd=lJQ#My^=iF~zB-1TbU5rnA87E`~BnuX>r8(=HmXAH;PkQ;HIM zaxigfcbJ3dX~W0JMc>Tdx*=ooR!J#o?V1nVeu$WfJ2OXDwWE_D=;kiLR$x%*lbK>G zW?7cB7e-d6;aQKH`kN3hgf8#x`P+hj89K!r>=n<|oJ9`|xSZZsc<%byL^DqyQ!6tV z%@Vk|daC_=RlFg7SH|}{k1YkW3=?Y&6Hy|QY`fF6lp%?NRour`m+w-OuFvC1$_GOg z)aH`MSeb8a|L*vb)|SxpWU^i8Q~_Ww$d{eia0HAnQjOk=(adt3;&e6lAk$e zMRWrXL^obt*F1TdN_}s)9lbZ~J}ds1-i`!e|2g^~EW*X7Hm>axi)D8KF74@ZmF;@r z@3U^w2NkydI&9E9NRd@aCdNf7-|+%T7tQsKUuo_qtc^iQRa$#Jxd6g|V)B2>*CFAGG=X)ge*rm`oHm2DMy_nQ^bM(tJ$9 zQh1>U4@rV+UHm9kQn<@M+3|L`eJPQU`rT#EVCUoPb>IU-KSx^1xx50Ut)aa*YkN!q zr>-l4F=y4v9V0lqv*JgWZCy#zk1ackYC*>PuV|ZyZwwQQ>OY{mcQ^ATdA-(`mSf6Z zK}zQS1gzMQmm0fItp7UOyd*2MfJAWX{@gKli739{$d@W^4knhzRZ~Y=rg8>uqFzPa z+j^n5RH=#EEq$}O?x5-adeAFP^%*6qPo5~eVZ`ypeFAlRF8NOAQMqoj2I7O8oqe>L zKk%22l@#y)`8{pzZ*fWY?;lAzm|bkXPvc=|{B* zm3=PJRNo^nYVrHdflM6!I>FK?<;v`{6C)Z#8DhO$zMMDT-C96MXBxck`J&V&$SF9_ z-Ixaa1ZA3T%J;U#tEgatT8FVxM*D`Mm$g+yV?@`SKn^nBK*qX_eUDt!fqT3`_%j+x zzx6Add@Oya4Mrqz?-?b(^W&0^+?Hvt0+Lwo#>$zX1q~wwX?2Bh$HLm42)^?Ac;tLQ z?FF?_BTnoQ%k0){{*rs$b9Ef!plHLQIglO)M<>{eZl=^$;7dDlajoz`-(Rd2O?)Qr ze%f(-eO{LZnt>PV;Fy5vVQgX`v4a${!`~nM&}#Qoqb61zJ_rS)|PT)~g^T&A-d=R>Y)p zY)tzCha38Z)W^btJJI&|fnT<@@^qc92)mnk;RQCO^h3E;sfIQ%_3dEC5^?C^q;=IoRJNCOPnMUaU%am|Ly%w9 z3ML3yPM?3?V4HdT_~8W7anO}U7&3Tsj()uc!lSJ+c)VLy>?}NNfL%ql-n6rd&=9rW zG|h^8Ja<=1(7l=Iq`OgJpGV18zRQ zx4Fr}4M0BPgC><>m5coFClfoVynlHq_5Umt$Y{EQHj$~<)b8(qw5WBCRau>2`2|E{ zvD8A7J#Vg1+Svb4;^cPOE6jKwa_^+Wu|laL|1qsyv5rB!KiyD)tgkVy)#wt$b+1M~ z5}hGkomMf!9+&g20dv>*{ZaEmwDF`4ianE0VGJ1JmPjj-AlBhptP2^1_iY~ou|BJn z3}K4SZckuA^M?c-aj(^y&UEoho>CZ>X%4@mUeE5xd8_tVQ1wf(b9<1ZbQ|5P5cP_) zRpjlUebu134;mWK8VPyx)gSnV5HHa_-?2_d<4haz`w!Qa-=l^|6-X{?fWHU+(m4K3 zbO5P)B`KPlt^$k6{$aG?(qF{IJ7>4D7sh*foY(KeyLQe&Db-4(U6{%LVq`xY_uxmc zr>_NSf`c+usA|b>83iy5(Y{)l^SW%Mo$3P1?lAi!e0A0KeUe2{Al zp}tRV9v|kI-;wQZLUp5flxN6xcssXv{rZ8*UX0pI2QBQR`c#gwM35kryMAIk1b~BP z7h6`8@K-&2jPZjULfl`q8q0TvX~qh3&b~ZeW+bm4D-Ai)Wy+2#=ElVIKFCc+Z43$v zO}k557o^>7`{UOBIDhc0f9Fnsu-EX29i!bGn*Dlo&vt@zj0#c0X|*~aLh*S#abg`I z|9Ca#Iyn*JEN=b~FL{cox9crF=e_s4yi*3Tf@bC6SRC_21GC_ae2m6YMnTNgjp}!Y zw_b^I*9rD?G>={NcHDo`vnci@@V7Q<%C5hN%yyzr{Ft4VOSxtLiml|UrZb{cCG9vQ zzgei&WIhr~5jy$F!!kAJ3U+>R?C~jZ=PMSJC-J|zmDB*3#?a#zHpkUEcY|y1Rtdwh z+V*6NI+b@`ZPT+rUb2zXxH43H`RSWA@Z2#^$v74K?x63PcqZf+HPqe#e$1$Wwm&%# zEF!=N4kJ50g?I4Xn%&Y}padG;LWV)_CURB@m`UZ?KoSE&z}%$i+Pvyn?zC;4&300w zmxATnEd>`b#0EsbczEwRN&DBsZuW&uMx4Ky--W*Y5-Im|q33_C2uP0)pCzf4i|A)E zMC?@VCcO)o5>z@dwyH(zt#2bZQ_CPdx&67SfdoHN_*~cJ1=lf{JAV0()FBdPTx$SAe0#s1d=z39ANP(M^E>hK9| z`*L^EQ3DCKy(PW=c1EwrV(M&6*6gDDzvu7bVNREnF5g`E^@HZCagrS$8ux)G`a4GH z5`8Ll)t=mL=OM`#vGX)gA>P>;^gfQ6PAYN#`C1e;CM12g?Il3@{3|AK%qKnw?Z-Iu zSj{E)S&tg><_DKOTQBQwTOK`Rr(NZA)@3JXe=2lX?tUD<=M+L|q04=|@?%C*Pd?Yd z7m2?{5ER7fiy2cM*|YYlpZ3i5X$Y^dL|`;5M+~GHPppNg?fbJl>qzSH9H`YCjsPCK z^)39+G;@*)ZJxM^DG;UDa^14hI<9Nvkj5YH@dIc*-<>e2(653nU%^+%{rRFa$n^`k zgpdbOI$!5XDrrTu12}a85mj5OC5l6^5eGd7R)sxbQ3^Fdv_pOil8QM5?;W3bt{)xe z-?ah_pZ`|80O%1mX^u*EVAd9NSRgVc$oC{8T8BcGAlTsccq&Wnb1NRR?4%~CmSPKg zx)e+Co}cbPzsjx&^Y0GF519!aJ*TM!fO@?XQ^nDMJ%J7jWT!#1y%>kjPnYMD&XinK z^!l=`g^i$Oi-JLyvOyQLh7B7xqu754n>~SvCQ6L&H(a2l>|Wea8OHgZX=IZ6*cK+b z`P|v3;j8LK(H@Rb$?>qzmR93s;?O4O9q?^Z2KX)Q0^qghHHYJI6^9vB3g0349<=9N z`a!PdPzB8XVUcR%Sm~A`fb&{e#R_K0d+VYy_Xz$yYkvl7{T)#T3Vu6jlE#G~-!Hnf zHBOuFXig3zuhmkciE1ovH;ucIzpJ+wr?k={94VTxOQ}{fBsK{`4 z{@^W7r^ob~=JJ@8=ulfKh*){I2HaBqE!EPRjbSqit+U0<4s#Y3hOGSqft%xp*R#dt zChWE?qk@KtCJGBl{OHh3Ret0|G=;`c6!)EaJg*?L;oNFmEp{DyK22vIvFJ?%biLRA z$XA0NzCi4hIe78beyUw6DB9S`+=wapWytF(xty`2&(GXHCFFruoJe8Tk#i6F>~m4O zs6({Puwd{CmN}$a);il05cYpjD_{WsIT;{QPldd(#q>)sLj?gEu~A0-#QMaAzMQ`{ z7XTi4rWWOIH0WrU<^oO}D%ccW4!WoKicqre_BcwjI2B|-G9>ixkW=@)s2mOa=ritK`x6g1^erB_D!NC zi_*#9D#?Ns(l2?|Y$-x)T@HpKia2(eL^@SS(29}~-sU{k!|am71jkDe026663W~13 zHAc(+wc6W|hskRtry=v^9Q4Xq*hEiEoUxk!U>IP;yrIq*vzmKjGTyw>i*k%m?GS3# zc0}D#;@CIQ$-D!?-peB2c5p9jjz33W5vDHN?f9=Jxs2q0=iy!YU|2+{&cWW>yWMo) zPba{rmK7_KeXKRn=>>oAah!TXn>cejw#!#Mc!X~y#JM@hak9aUbtbxAv}{s!??zzs z=gDz#v`ObDik+QP1?EcE!L8Dx@8;Tr1*dL3`F_5GH$8PAjJXtiRek9`Bmox(f{Y+P zeuQ$bz)FLiAVQYM=UNY8IS#%=knb{~Q_Hh%wzoHT)>z7q?>?3S2jzurQpttb58<=! z{Y>jrP8@upCv&VF*~bTV5#u*-fBDZz1mz1uH3#-(GgreX8iQiXOqW_ti&bFn>}9{k zHZsI3hlxHjQQlXVFv-I(D7e#!4Q_KO6|y)s`fWdfo$jhwH;-9c4eCG zjoyp90NitPm0c2z5w9zZY7z6ycQO7?X!0zlZi`Vgy^)|@<`i4An7e2zWLVMOAYWhh z*g{*ecTd!Eo=5gB8jg_@ser3kk4F+%YsALKyke(|sck59wJvNMiO=9$QwFE#nOVZl z*^xMMU6p+b*)rBFso0eR7|2KkNxS9=8<5*sWL@X(aYId&9hfaYie`XQ^*krMsSk;( z=>Q1+NQFDR?m6<8A(Q*Nyh>vmG{;~8gATWtgPRNcPYcCY6-wh`UKJFv2O|$KrqMF; zCwRIbFL0+s{3J)TPiwr}T?A3gwP|eH5wBNF?GiiFKD+(*MEyk&|CL|nftb1z?P#}$6}7qE_#?DGkG_J1a}rLXqV%x<@U5sKZ?r2;zzt zvRwSAg-@!ZkT56<_i!P|bgS^q%m`jjU8u7>%kiHgx_2Q&?R{YHyHs3?TM@*WylP^| zFgC6Nt|lNO*wN?7v!8SE%X}BEezw_rN@pBJgwQ-W`v-F3?Cx&BR0Yab5I+7f7N8r` z^G~pR0V89ub+fZNskj|9HVz1Zk@KjUU1gph{8VG#e5v!FBik8a@G0uC0@LfQUUbkB zg<;NG@{Vk>j%xLJSAsT=YqRbv^-c9%z#CjT2ar$vC+!9CQv%-PsmM<Sc#oBnMi8{a)alb*?OtDk$uPe z=rA=@?S^yzTJ8b|V)U2Osm+olK2LsTXtSVVWm7#|6wYK#*k8UABcxuF-`=G+k%V1S z&_Yci(N1|8-N{v9>%I1me|_hlVUOfS3s+k*ugaYceu$F2v&7gTK@Y8<5JY`UfJlRy zj_TgS zpKX1)IF=;k-*+TMOwkI9i4AYxbd`TKE%TG z^z3SS);x7Kl=_WH^=`l1%moZ=Pl&0(+GkEpun=pT@416J#w~)jph0btlIE1sc1%Xa z#fip?r(1*bkd6HH9${}6^m+WMu?@c-ov3Bt7h|vVpBdTzQw{!445|1iT=>g4;)^?N zy~p$uPZW4WVLCL%#Tmt^R4b08?{u{%`*?C)_Vl5w$Ap6OFUD=X3FgX!ueKPijSMSJ zuhTCdUOKHE8`0E;I&uw^=;l~&-aIh&z$HteM$_fq#?mUOi3=6FOdi1>`$1J?B9If>^8{s-{U#M@Z%%$NSbRI^*BqOY)X z48kk^!o;!AE5>Eh6Jyv8NurbP5jBGg+TK(|t97BN$NL}$9J`ZEFfwR@)SAs}Ib{d<-;nEpJ*~qHC+RZq z^A|SguP?!a!SoP~qK*Jc3kO*68e3INXVXh6;_i@O1{o_Fm zJ#Yv4%RU%XL6;Sl6QAA*hbB*Mm(l*O-n@aP{9BaHoSLf5qVGmtH=;+53U#zeQ{iM! zls8DylH6B76G}&Y+Vk)L<^!+Ssk{NhITnyz9rvQsMuEyoO}HkszcMz{dg%9b&+*Y6 zcVdRXcvWY|Sw}$Rl$o!ebp%UC3fj~M2&}2_hM#rY??Z#;=v!@QN}>nH#sS7Qmf+i; z?3Wh^-|6@*6qH!Ih?rPEzxsS^IUxRS%MJgE+~3=SG&CMuInb|rT!8aYO=uTxtS0>5 zpM~C;gq0{dD{C|o1xJ)|YA@x1XYu?gWt`@_K2=!BJds&wnrG^;v7RUksQm>LJT5NA zE;(x=tE{fxv~oNUIH6o>rk&N-F1#;|y8?s`LwqYL!z#^r-HGqXQmTELlg$oRAw1>o zgKj;(jRk}tJ>f~1v05RYJjDAMoEZAnKX#kjh=Wdx;`B-vs<)hhwl{36o%1mA5`TUj zG!~a_)(9VJWz{+FTwVTF@KuNH;V`=Z)klkJh61v%--u3y*2wr9>|8+x^sSOnizx7E-YWwvd^`%%77Gt+e^E$Z_F24Sf zn_RTgtwgstXwANx+7?1cH}@GXw{cy;S=ceWMTI90*67B%pCQ(++n$(wu41k~J~q($ zrb`6v`r7;>9GUZUSw1By=N49@gEf#{dbiK{Oi=6msZZ@7{k$Z>?AFz>h@iY%FVWj! zjLP#>w*@cbETe682iMg$8yabE!V<*AHRal7FWOnxJ7D}DFxXy`q%Gx8y`-R!f+ZV| ziTxA7eI46fpa2`KW@P#Jl~;+p)OmHB4Y;4Fv#L!{KW=YPc`0JdMa<{uOh`63!$wY( z3B`^6H$MdHNaiOl%q|!uGe0%4v}!{i>Y0D5^w6kuz(MwmGZi1w7aukW?>ggHjwbU{ zkHm&?bz`mg%|j`(&36v!=oYXOCc-sSvBJ$AqedwqXA^FWLOZLNggtxhs1I!|s5&%F zYJWpj1yP28WeWcXwXv+4P`jG&t@^Q#i9}FwHG6(77-g*e)h*W#u655z(e2A}?c{8& zG5IZ;Hm#aAZ83RmAkngrYhCVr30q_^r>wb$?svvg`LDL&1Nvh$Bc@Si-9hp3Mm0au z6fQnj?T<8RwPGn@x(7f6zK0LGPVf5p+=Mkh?|L+vZL6|>mKwvsZF+GAoR^EZS+;8^ zj|1bW$6s3LGH*G&?}or%!|}+Ev-HZxJ;})$ZH*Ksr_j01 zN-+>S&pJ77{V9o6==E92%xG9#g^JT=;uKH0Ge6Y!SW_=y_&Lo9fDYzvL(~OVO!JN! zvK=uPP)aUaX&*Jvpi{SAx*I0~*#pC**3o%MNnW-RTY+U&;_#0jG<3J_zteN+5t!Y} z{#XkDfx?f%+HH#Ul6>h8@M#%JyE5%0RcZ_9hiAAlODm}_-^z_5et&p31?jnp~0}HWMRBBm+HaXmN2|_ zPDvSINj166J1QQmtJ zO4TtstR&6+m&WzTb;SCAd|+W)yd3GhtL75-6%A?EUBAW^z7Z-_qaGD zBd?7eMX)V@Rp>zZ_q_F~#g%Um(WllYfOv%2P2Md0++wV8J4la{127t^HRp+VSXz~K zODkfH|6fe4Z3I3#NIh>~5Lf`U$jnq~ z@CJf*XNQl^yc#dvcjk}t8{Lpn7jaWVMc?Is)xuYMIW+A}j{DoO`f|Hk=5rXYB2Amd zg=nCIps82`^nZ>Ey&IB-;&fad_ zLGLf+#dtmFp;3=)pYxU*ElVg0N-Av&j85##Wu2rhw zI)Uh4ABf^97kc$OUut$Uw^#Ak(zE{qoKWQSmgH&ORRa^ozNwa zMVe{-({^;zsN@!>)(1I(4|%R1*U}hI+&Zq%L$mIW=>*v*C^?F7bifvV?0oMWaTLry zvdA*&|6F89XwAtd97ZD1v1-qY$!|$O7FJQZFiU56Y$D-9UQ9btdLimtIA`RnCYLLeE~mcpEiJGSBod)-P1=j>CGf7k5j<+?hgQPIxvr>Sx{pm}`qqXGAu?dntfOP+vWv*oXB;L@O`S#DuTjMykU z)0<~QDQ>E;l0?)K9u#%__k3n^-ECL%TZKZ6KG|Zi^zBq(xcb8%7 z<#_(OrA zVW6^$v5Xbxq}|7|;E)rQ_VLlB8#*@G+niz+6mK{Bk2Pc5l1!&r0 z3Z!Rj6#DsTVbN|#*7;b8(Bw9(?4n+=@QRf@NCpI$$ zPTw(jy>0Ulb_#;K>9w3CEFP$CcaOXZnR4a$da(rtUt;82w;n)skz>VcCjuSKuly%$ zLC`ZQ#w#8T(zKPxbGfu6)AJ57LgSr%h&v3e|43lpErLRC;`@WE+sxj_b3;Xe*idru74t%68-6T6k5#MCD)g1SC>oW?AaXX^DaLi< z1#7lE1JQQf6oPUsSXx_?_(>W+IuDdZS$qTRsu#yyaf>)MubN<`l?wgk(l*Lbxx`Zc z?d8L=>cGaqL;=ILt0RJe(s9)x9L}QEb}GAcxRo}V`3zP3HMuk{H2j)_*n)z4+|rCc{?2+2IsIG1^C}u*Mbv}QdcJ+cf*=ILvXJE z8khP$EIr1h$x;xScT4cW&%9tYM=^A-QS9)stj56j#f_HUr`x8{KQyLZdmP9vh3nt0 z(6X(W4O*=h>bHq`4DRy2^u?Ep@bLuP7N(|bXd3(c7hB%&!jDcaiM^%j7Vwr@^&PRc z%ijUw4YMG4n|S_-drrqPL2b=?OxC)EZSxrVm9xFM-75EM6t?P0h5VY=Co01q5Kg%k z!ifr}#t%{3(s?xkEIR>?%2+zV`HCwWBDoC59@gU|2l>`pJ*9!k2?}RRS@jqZlBUGU z>dNx$mFqMr!(FQe@}Kx=IW@=*>V17eqK412xtZVm0(zOT9bc;09Ofeu=*~ySCUMPY z<69377=2DUFCU|Ra4jY%C^KbhYQrpn4v9~H%0GfL#1cQbL5k8N^-=?a$s`T{4m zTXDY}yI$}kt+Fb&yMi~)%!k-+J>7k3NXJonf28Q3=`4#p$*b35UXy@I2f|%ALgY(M z#5+)u0I^OZmmJh-Q8MVV`c%pNc zdJ^DfmltEbKcfd0roA{)B=x*WOT?}SqP8h~PHL(q)vYt>yqp+x#}|4EiuNlb&NJ|l z7fBiJZg3-+9enb?rRKj!rSTq``)M}fs`fCdvRJkCd;dUx;fp_-5kNDs^Q$rOXYIZ9 z9u7p;lMzs5Sf5xl*$?~mBloDR-_>i5a1e?MToGSZOjQzKmCei8lTYRBWSkgTUO5M& zFv}L&qRqi?6GVnwmz`+lzEi>uR70Fz9o1+@M{4l!cCxI_A6RT?&3hdNSbQB;&Rnl# z^O9^91FYewJ4Hz=uHfKqwbhA)5)r0*kVt%Wd^d)#r&V+~ww?%6Q#z5TN`if>BcN7P z_Xh`_Tq$B;AybRmVtI6WO9l^^%Y|^{Jug#=Mr~$QPJU|ONN!_?Y`B7>6uOyq+@38^ zbv^6&{`Pfs_5FVtg-xkpfB-CKv8^<-)-R$cv}59i*HtwfG|vibtrMKQ2a1k}`I&F> zBVKovkRi9KK1iccm~K1D5Q^`HaEG=SZywor@xOUBX!Y$;gAqKGkA2rjqf(Z;ZFi)i(L_MqjT3&=s}GQzAf698+Z(pMRK-1r zT_pV8k0&3z9SwEURNCQyYw9XxwXRn)6a&p^R zC`@@WOYd)$p8?I;Dpdf`EEiPArX6#5n>mU;v%|eiL|mA%Rb_6F+|#d)0SzwGn73+e z7aeOrsW|5YCuB|i)RorHwe0kzYHS=i9x%|d@ikfg`?n`r4}Av&4mFxY#pAmS%?1aa z-oMBC*hdGE^@Oq2C5T2GOy&ytABnZAfsjRB`x;G7#+ zk%?_=opU>ya%Kvoy!rl-feobYhJu0=JlaCxu^>W&9RYz??J0|e;8v0YXE4?ZPz99a zI(;JtDxUMfW2wg$f~P5l-u?DAYba|JD7tC04dK7-*NEo~Q+XhK0vHj{FI7VYG=yGg zXEeEIyqISD3}pqNVBuB*0P+Lu+aXr_#FH(qr3`YgYVAu&1o2i6+6r}L4Q$Z#1B7Qe z{3mZ}vb5FcWDPU8Pp9IyL!iv+#^y3bAS=6dIhvMG`wWM*jyeFSO zumAJUrW(8RhLt0bre}YIgT@u{ez=;&xQ`k5}~ z){GATmxz>oZ&w#{^k#0CRI()ka4a!+4!AdY`$h`^*r$wj_CLBe zvfFJ0BV~ZzsqoU^=UFc0+pp$!NjrI%&sadI)P;*zx$9ny8MZo(ny>;Yg4FztrFUjO zvLWk+?}K^O%UM?;sr~M8Q7t@cA@$sSive34Dl~!V`#2;hco|m7dTYXe^3zqzxxJtR zRwYHqP`tOrrJ_<%QV-3~TQvVTI=|ybd$QNm(6v)9b?b^V`ICoDo}gdpoN1@6c0&Cu z_cMkfpJFzn4d;;l>ZRk#^~Yae$hzDL2#?E^>j&PPRU@iVU#|ZeTH~Q)6%`g1WoOT= zd6Bj}ZedThJr)}=^zmw(=G&lq5%(A7O$JtCzkmtznNLXLWo2c#o@UG8$ZtU(p_}F2 zOlyNLzCU;%S?YfP0nw%rh^8a1#I@r+qUQ#sAG`o*Q2Qg3Ee)g`a2`lkjo4qmd2 zm;~k)8O!RFTp@sDmhUPo&y(%SM5)%kwk zK8Pf~)}#B)LIp#EL>#of3g6spPE&IUy#ng5*g0-!EQ#}#Wh;yiJ@GzQ#u{v%J7a|D z7KzGqjT(+mO_f#1UhIPczN?|J7FA9EDvb^~sMs~-_!BM8s-6sr)g2HnjG*;xP6rMJ z!itirSz_Bt`hmNajHid-G4G(&Oe5al$$h)>&wINUQcnwObZ<7D8Qca)6-|*sV%^mO#nh3=UuL?~|!B&p*Fxjk)Xv%MV1yzua$h`37I_ z!GhExh`UHZpZED*Sb}^#P!_%eCB*)Uj?}b|lz~$6L zl@eW#xLu?l@N8eYhX=-0ZcOTKWaC2bcp<4URN;;AN)qx~8R+WQi+3J0gOB3bdhc?_ zRxV)SzQ0eu^~XK^xUddzfa@-iK%)NSEwFR~UKbe|`E>G+CygZN{*%~b#RcfC`^4H2 zKEla5ufKm4SUY`_okFlMtv}3EMYfQ83wxvrtT<3W)rvARMoC5MO_y7FsCE2^vc7v^ z74*_sT;dGFGCH9Io_3DjGa0tVwyQQD*wKfHtBlq#Cvib%w5BJOEMx~GZCrs_@hCLB z;J2L@W*qTj@8cclE2GUa6xT#GG)A=mxY@7? zD$yWmwf15N2Gq3i{Vz;p$4{(JVwn*0J3t-p-{lq*#Zn?tbjBdQ@S|t#+7hvW$LaRI z)*qc^Y~51f0qxQI$?X>)mHo4bYONe{pcZIgO|M%el3N0esSx{D-l%*LB0a$>*J?`>{loA@j!*5F=e7fj4S= zH@uz>xONzNb~{iaL6g=Q8|AO~<1)uYcun~yTALhiaNwiGA}_x6Z%-mUfJQz>Mn^h$ z%JpY5>T}lmT{Y9PWdWnQ+k#Kr745}!eK~bMA}-#4iZwaDL>@iwsv;?$oS4UQcH>kiC(w_3-J!~Ll01>IHireaneMWa$nBRB}#t0Y8`FJ8m*k*CJq?HV`ZUBv34-dFgMpE9TG?F{i z%>|NC*9;JYruX0IXhv3h#u`I^DtT^}2O(3M7jw*kXzXg234DJ>ZQ&K3l$IC-{bX)G|A^%o#H=>D-_0usji%uj)H4iEqC%BuA_rq>uW z6g;_qFY-;sTN#kaHIKO5`>!2q&FkOkcZW)v$DNdGrQ%}7X%c?)FBc$V=U6HZZfbLx zpsquxxCg_IE6&PkhKhPX`z#nt(KrYl;wy=>G4(KAjHyXng&;fH3&^W}_PlNH$Z7QT zsjpbU5v?!v9Tk>Nz1h~1JnaX(!Sy-6M84Mj5qr%%YuE9AYPAeTv{5!y8Hwewv8adZ z5yKl4{8P&Xq}3jMGjp`;$>PA-b|rPuExB0TJFaN7^vR2kWfPwRN`TL8_3fD!McvS# zZiUvwG0<|O@6*KkGDF|Wd~m3=yJJQf5fRuXt3Zn%=`laPe|EiKF-SDE%}#{8!+WF2 z#gcXH%_s}WpD_etk*1gOnrW(5pXu{QKJZw7mibbWfKxq^dkra{)U=r19((s)1#MiM z!pSNL?9ZMmdlhK@WFvv*7!W07vytJw(d?A3`yrPipyOQqy2Bi#ZY9e4c+pyjo+XFa zdv`V5Qi4HC-QAt4gpWoruiq#GDR#MEk$;u2O&YVNdXA%EJ=b?vX(oE*FIM1SMD}2N zr;9TNq0(0aSU(mQ7ZsmBG>&vlPp4&+?1%x%0BLtDZ9u34?3hk&RWUShI&57(!u zW`D|%#?SInHw>;%*eibqnsB5oM`7(k&U8zo_?W}gq=_iJanOQ`SFyW_V88ZF{fwjS zr~7uROmMb0D9ov-<`LU%Q%^SNo&h$+ZDJ!$OuBS;k)|eQw*)^Hj;Xf+kl*k#K8AQ1 z8tiwWGodyo*4e0${jCYPpzfXx)+k#1a4!>xII)KCfLjX@Y2ZYCOrl`YGYhNt^~zvM z2Jk0p^iMx*f;*$89^Awla9!R2^Cv2azf~L9j#t4X9q{i092ZxY2ehQwkQe&&d^qCD zvObwezL=YNN{J0Gd;3b4*DF?3$aUoopvGAf#XAQyd$`=OjN>T^S-S8|DcnC~ z@{@&viaAb~E)y?n%^l>F(-l|_s_FSTIB|Y$SWt`shqv3tF3FViV!s4XB^_f?mCeUj zuC&?HmyDitGq&e&$ezK;*<0E71jwHp#teCZ6)9w=5*~(BoyDymtN_-1gNAA6LFElE z=|8^mk4nn}M3P6jhogac-)OP{EC)nG@5v(oQx>8>qj%gj4VhW9|Q}do|0&@*q zOw$FkSN_m>9P48zxB`$3+a=#v*L&P2Ls`Of(r3Q2#8=0Z@ zGK(4JIbGY-b&8d}0y)p5$QQHX)1XXzBCgsbX;%VNN(;h;vYEA1fv`2eKQL5n(w({K zT$jJov4-a+exRL>%Z^xSEt~upl*C2H}znsd^|75psK7=PfeE^@tHLr3& zXXs4urx&k1koybut^4zC?LnUfUq&?~&Z`$L@m*7I5oowh_-(1>tZADMRyjC!K9~No z?VM@us`xRb&Wv?h(61#}edLb0D9J+0*g z*8c?b`x8VNRLpR^d6Yjv8?enz z`8RId3ZnNPU0xc8e3&|GEXbGEIOW6ZHE$l>wmSd?XZkL$p;YPcH|uQ%2eTNhs!}PV zJhG_PV!*e6Rm5R)U#-nIFSH;|7ImEJ-Mpbs=wyCh|KHNmpRCw((ocB@cM$lPP?Fs3 zJo?oDKl~K`Rj@j6XP^#B+FD_e|9x(;xZU=paJIxBqe05 zW@a-(xvU8_);7I4(#ucxcg>r3=Sl zozIRd{xB=*k~Zk7b5It>RP|Fi=pO;D_Ilbq$Z7W`xR_h^>x~aV9|$^B zHJ-cGNKQ<(DvMV$xmQ}ofkNgDI__UhfEB3DblD61c4~$ov^_ge#vG`@U0P9LevwzD zF<~(TCwTbLN!`nX*Jg9GPLqJug}q(TZ@Sem zAnj3`@}s$I9TfA#y=gJIBb;e+s!4D(p#yUxHh$qCPFEy<`PRZ};XT(h3!S9vQ4-U# z$sA;Z?vU14Ob~VctU^zUjIb{k{{qLbZVfu9Gtz$1?o{_KiSQ96KY7lYrP&;KEHE|V zc6l=dr^TvE+9EWs0Es<-tSO$(>;GqojdeCMD%`r&@FHNRenzCj?ZHFs{!&g%03rI- z+zdzuT@KD<=FBYlZqMLgtKPA@pc%-fBB^UGo(#8<3iBp%NZqSRkQ+XXT-@7~yWYCh zgH-e1G_mkis(Muq<%wjgd@}c&h5MkXe|k=gMPq}$$N3s~N>I>R)}6b>u-!g2&68I1 zO1HH7zp@BU7$SEN;(?LbLBX`2&K|#U0W@RHNSsH>|6MIPQO(Rc&Qxj5#CokawUs5$ zW664Xu=hPSgt@LT+G3Yib^5TxiD-&_JA|=vinUtJ&;qO6w$#$31T?jA?|DNvn>f`r z)~Spf;O1?Ou|sm5pwbqEvtnFVQaTB@p&=$h;=h<$?}vjO7!Y5=fYy5VGvB;HP>y+t zS_`@YXUv+p=d1=_H$?xgxTN{;#`VKzNBZk^zmzbk5$b%O-%kU){ssC^j{;;?IlxBc zV9;!Sy28XNsiJPUq(X?sW&}Uef>Eh^sI$*;n)nBYjZl~Z(vsQ1{29US$nM+(|`nd$GHXX<-bx6UknxaK=))tSaAtYKH;tPBlU-C(&z zjd&JS2V;3KiOxIXxVz=^ptI#v0@}Pj(u!E=jMwUJ6YaY7uLr;r8sMImDY?1l%@=^q z_cB=r_QN~3Rs6N_GG_JKM!-rv8`$V$zsmcs8Uj1~^hAKIcm^id+`_3`+8?fbwR5QI z+vh5uKEE}2@Smv`Bs$v%z4wM#DyzpEs5HS2ViWaDHs7b)w2rBu^?&S3s!mH1xUc_A zBl%=LgkxvhSBuReSiO-0CfIn{LWt4diHVM4Z(^HoT$W=r#MM(2ZSpK^=B{%#pG5IK%SODV%d!!Q&UIZyrDMpvc_V zh^Kih4nV9|~Z>tg@Bx5^frD}7}3&LG!Tj1&=lwSEFmAI~`plZcSGu>!8l=q00fk&B zgbSP9Gsj47{px+7VHj5RQ18$+u4OpXhKb)bH}#Py*KIJ7-k2z=vArR+Roeu z)uoKys49puDebzy5MP z7-^g45wq$ZvC4zM^<`H$iq+DaTv=Sq**=B&`1HN*)(? zvIZsXYf`3x{Wxuj`;ByF-jp_*bnGDOwr@}mQHZ(nF6g>JR*J__`F#-a@oSvIDNX*F zB$(jIAtZ;@MRt2Ei^ky1hC&Zrj`=@Z#~%)%8)DHR1N5vFPFt!9?tRs5`Ygm(8tE)i zQzrZ2vVys<2Osl)yC?pRpf!!)^cj?Xif$fLTh%Ey{Q1GXk>OGu=BVScFJ}6x=0j6a z1|)T0;=`JNq4?9M0P)#&x|jM!S~hz#Q-%6J{8}C{YXr==SZdd+MQsq%>mp`}Jsvs_ zKI(Yg8M%G>RvG@&^ntlz-MOo!I_q9vzdy54U&TmAPyO%jCQnNE*aCIQK%e`u!yj1} z>PXh>%7|F2`s09tE3-n_3~4Ru6@^pV-7s$SRg&i%CoETNM66JF;BQSSI!dkeb-hs= z3MVJ!?B^E-O?Y66G3CHDL&?kk^lCyxto5{DW5AClbhE^;~=At~dmZGwZ;`H=q-0n{cEFr9IY4E*=N$qe=o|qxrK;;&`E(~a+ z4)?zY)PSMwQA2QI`_Ls4+(#scjDyOA)K{SR4IAPBej5Dk^XiVuWFb+cXK=Y2P+4Y8 z##7G5V$%jgd)rgaSGQBLIx2L_st*bCN%pzIN#heoCp_-ZYt~Lq>Ywb5blw-vP?fCX z{a9xeF^M%8n(HyW_xkP3lS}e-CW+J(Wr~SU_vxfPd|J8WJ}S^N<%kXRB5w%5j@@5V z@Vd%)ew88AcKeo>^>*%_52n`$M%z97wH zJzu|GGDEYlo6sK05_!mi-o+wsoq)6Rc=#l(+d;k&JHB(}g5{+Y1+{FYNAjMJUcXPM z)_?RKPBW@_WLD1QRD*6p$BpVM#zdlDgZvt(KPt;=3(DSNR6M!WmV>1fazhR#Ql+pi z6#D2IIrN~wml=fV{y@20+h zv0)K}KzL{7K2p-Gue<`0HP)7rqLP8%k;uHkVZnf@MQa1P(!GiDkJ-;zq6HB{;Z9x7 z3!gvMW*I_xsgSxx59QCSjl_ld*S@Eu;UXZ3d5sYkAsF>)hU6_21(ERaj(fUyXmCHvA9;^uAn8^FuKtDSMCMa^;-!MW#m`Jb-M12RqI7()u zkYluDzDj?XskCKEW<1G%(0TxaD|wN>_4Tj8qua5-i~7o~ zuB@+6!2eSasXr~N+2x~@?rX2`U=0E`#+Pn&WZ}G9{UqTl;JQ^53cUMFFtqFof138O zI|j2jY%=m+M~m6sd{VAE`@S>v)#L#`ckiwEl9VI!0z9GsZX|MRg!CK$i zN?PNyZRyhp#xJhc@HdY9u8uId?zen;ZJpfhP53&dmBY8h*(lU|0P)`qqa;Tj5>-HhZCK=hnM$w|bY4#-a z0=fg#&R+m27!izYC0r#MA$$JUPY(uG%7f9vPhSs@87uXuiZHu9SsMxN{MRFj6GBBd88d(X+tRVF8OW^O6z z#AQZG%>E$(D*!eCQBakIog+c?l9E`deAuA8E9u*2yvb9Zec9r>VZ3zbA z>Q-2zPb>fIaYw=Sws(3~^4=HAM?;HWEpFxci2M;4!s;woP6)0GKpCT;=yS>FA`zf+ zPkxPzpCTsG0|ciLj|=IqzaI0K5UU`CAb*BA{OQ073KH(n|WeGJRZ&CHI~u zm~tT6pA8;)Rk(YQOZg+s{e+j^Z!n{az9ud@C?qIA+_j3KN!&6v@I%LR&`7)Xr%V*W z-|q}^{G&ZND7d7{B8~5Mmxi=9TM!TGz#KX-vFgJfXQy2`>~^bk>z0-)tt`Dc_gyla zKdB%XwX`r`iFBGf*3)O9{8KN-fK;fu+_{;zCSfm?p0+hW1Br{ZV*jOOJfV9y*iygi%@M}m z=3l6&H>_Y!zzjVOfy0kVrg?wq12*zM4V(OgPrFJ``#25U*#H4d1&8viCPFZBRvG^Q zinO%%yQcZSU)`a7%iFSnhHND8VJj7A{Y{Gq2e!_nIOCZC;d*V_`Ef+(R)I=qK&!zJ zS4tXn!Y>}WmX`>}qQXSLxMdTD_(L=U-~{*d7b3tyDJ8{(d*gjdj~I!Jg<*55i@I8i z^N#v;*H{$d$q^L&CiN|9>f106s?Sck3HQB`#>+%!`H>Y^R_U3XS6kNUmm@EgpoWSTD0v7=q zY7+;?(4sfraPb1O&P30UfR(Q#3bd)4tXmM3Xq-_ti!THmd`kRV@$X_1qCNfD9i#$& zoxZ-E-W{ZZ^e1^{wBJ>eQo~T*K;9n}1rIYN4yRjx6kT&L-GCpJXf+}OE}m)KK-jzU z+DRF#>FC!8@ZhDtO5-~68XKv9(f{XZ|Aak|ijv2mRxb6paUb*pN$&QMxMA@DgX20e zf|4T}Y9u;T3^+%h=d=}>k)oY%ky}2O$?ifYEB8>X*~GUYxdPSrCpGbpph5H*QXWmF z?{nG<+To&qO2Vu~j=ijuBa&AlinlU`&_>Ic3;K zi1Yck%l^;t{BgD5e4cC@uC>9CMf?x{_@rp}sv2WM`4r+M$S)^eH7yqDK1%T& z;%J45MUYVGw5x*%?vG`GNZC`a06fN`irHo#u`+YUQnABDHQuDZr*4F4d=y*_2!a3a zg?YT`i(_8d!ufVdCbHkxXwp$u&Hy#13t7xRDP)Md2I&+K3)#_`Zcau;7<+5%Z&+h5 z%Jv;oYB^($xf#YcugURQNAQGWeH9VD7=DLrP2OCjX2F{t8?{QZ>JT;Gq>EB6*5}m- zt`7S@YzX-0>$#R8dIsi|T6@gu{;L#DUk7_%d>^s2Fqk^!<~>def?X@@*+S3TS0q|4 zFv=R8P77>kEk(9GurqY5{fa-G=a#=XST%~l%FaW8)IZw|88iEI0=J3+ z5K^GMle5SYp`=E)mMaX4vRxjSl+kiBf^mjI_mhu->Fb!2ArPW;f4sR59772RYp0?8 z^4^eI!5k)*0{yfgyN#u!u=a#@5u;O>7~cxz>52c9yC+Kl5yfQX*`WetpPCtb`L0Ve zH13=*7+n-zsjFI(PqTW@CAm+n*n4@X<|XAOH0&{b`m>58C+FBYzlS|d#6<_!7pMzg z>pj;t=5&UVu<~Qv0t4|4ZT&6$@##q<5KsQn$B zXN3R>syEXFM)H&J^NoS?`QJMT!unywSNUPOz;DvneE9JK43kApOvaCXJ$kVIlK+LiluW+{4<V3xTUAXRqpcMb(0YVe-t6j%6>g2?7b(}!dEXzQqttbrlE}Oj>eFluxO7YuWS@p)VPM) z+#mvz8i%s^W(D&#-cQ=TUBfkJAMX<58>hNFnYLJAp8_wJXm3q<(k)#}GCkt-%>Yut zlR6&@!Ftgv5Q9|KK?}Zsbu0>nKZw?QepUbq$3r%(9y208D?o?M8Lz^i^WFblC}vU>ak2uIXdS82g>lUh_&HCkGlioOV|S9TmWiG+AWEtytA;I2O$IPZ;-3S8NCioAy2@Z}Knp*i zyR;w%MFJMK_;*5s9JI0%IcQMRjQaNc1s76iziC5ofw!bs@TZo9L?I{E+6vh1?WhS` z5o2Vk%Rx4uBx*{w>{qG%VunijR`-2nX!u?4ngeBZ2W{qt6Nm^vS{GtYL*j5BxgK@MyF9q+jr=U=__oc zUKsZoYN~P~Rk+43L{f4kO`Xq;cm+_#{*W%QeY)oviCM{WV>!zxxlnGkXbi zm@(>r81Lh&Qw!9&QxFa=KkM^DZo3<8XNNs-x|Vwc*HpZ2sm+SBr)!W?8dyiOWP7>Q zSqXD6x8kW-xQd!tkj3zm!+%lMlf8KSv7|w=92-<8gPd#9*Qv%-;EoY-hSRF58i%oQrJH># zZ^=dH4t}0c@l=iqM|p=3aXD{4)2Ky`gA>>S4$4xJKzhcc@G(s^R1Lzic|y zIH@U!#JFYD%t?dFqD&MBz;Tx(^okfq0e3Ax$bvb59XyA=q)Q10(ufIT_v(tkvTqB3 z0z2=ww)71EuepktLXnVglPFk;2|a~lB`GQKC%miEnxRq1Py$ftn4v>S6m&Gg5=0=3 z0aY`nO8>bLLQGqZorHviUIcjxy;a=`m2kD)W-FfUOzaF39&GnkAEbNo3Dy0H zL7s}!FTv#M5=zvlpbseAqEG34`(W?kh@&9Nj>ZDXl=*BQ<~Fjv?1rLWRLq?%$@^l9 z^S702$Uz66NN+H5xHE_y$0PAD!|{%LQaH=W7(1ybe8VEQXv91w=YqyLW&QV471Yk+ zl0*y}9@MdjBN=!!ElVO`Kk4v|5Ny93ND3T_pv+H;OU8eTzW1cr z%T7jwx01Adwb9^n;|L;QPfsghV+@+eUZMpf z`cDu@Ubo#<*f8j>6LQzQrrA5DD3hTNjfo5?wwEM81@aj!C#BIRDlRF5craOF!6(Hp zMW6W1y}q^+{wx-Dxh(y^%rgYO{OhkZ!MJ*vbUCHD^`VDiYvj$yhZ5&+MND;qN2H#L zM|jyeSD2gNe&v0J=G@vID#qZjw?bcXxV0lWPa~TQ0~WTAn~kiR>x4sJZX4r*7GyCnO?1PyxD7|YQ&moXUmGQ8wpI8X+E*LRk2mYMeC zC=9~`SBm&Pz{2o^@(L^xd4Q#zaUG+0|=!UbynSVTfflNv8C?^T{z z8=#i?==fLt82*J607n1YkKKBZ)G7*J1^VpEXjx@vWr?&sN<~LRFc7GgO*GYu9rZpa zHbp5Cohc$NQr9E-h&eiV$qE?6mNuQ_H46tkla~ILU)Bt?i9Y-p_=-Pnc0Ku|b>pQS zVW8lN#5PpoeOKyz7lyU2DRzRU$N4&kr-$(7D1IN>fnrly5a(OJ<82|Ir&!;$SZh<< z;73&(*!Zi9tk}wF)o6Wstje$cAAv2g6%mO(8#I$7Afxnj@yR0g5d#y#!SzKlDT?iM zS^^z@g|7~-;VFMtLBi-JQwe&n7|=G?OHSKo!CD*iveQr=L_)|XK`6p7Ti)0K{!~<$ z0$qNYiX>~86v+yCZ|Bfm^6dHLWL~WQn{0sq$9t1kz`?lYNr0N<{be`3R(0gQ(cL?& zz~~cvj{;T^3bQs=wn@z%=Q(p@Its_6h&6m%Y-BHes(_AE*BTGAjo(%rn4TAWdmC+)ox11*nQ%_(JgC9dzc z&tV;)yg(yTrp;JnZwIV!z=|dfaU@EVCkGER7c%aNMo$*ikZhY?#<&VFyxDw+>r{E_t9VAwt$n}fFl5R3@taU7Q{Bf zo4H|d=6vo5&q5_LJcE>+_A;uoN-Ze=#U=nl-%caX6+%$K&zf95nUm<3mt!bXg?iig zTrN!o-$OwThTs;J#sYK7pD=p2I_=1+p&x?K>{A?Ml03{$betntqqma9&xXXE2Z(s& zm>jga{>Iow4&9@0Z4#vnI(y~T_->|<{2ZC*o`7PA6&R?3totR6UN?S`V@yoQR8q8) zW7XX1H*-`Zu6%KjpxDy3l>f>Y*Dc=vjre!|H?}Y}rQZGg-EH3dexJQN1EoS}@j$P+ zU7f#(=p`J=JDUyE<~ZRFPNbipX=(-P8PCLY9Hpfk?vfaiT+FFt3pK6-$7? z;J$PK2IoHd4$?(H8Q z8tUyC>dm|HeoO+8@n;L}+~3+n3i$I4*AvT|!@KP4IXMc|t9QMVLYG~+xwa>j!zo-% z>!&~O$Babq_6w;Mn5)X+Jnr!#Uf-Xr2T5AxHQY>Hd4pbmJrUl6rY!_5H!Wwz;o>?i5c=5mMz=J6b{MbaYWh%e z*O-Gnr?LF5ep9nB^nhj!BR!N@FDLnGUq!(k(UtEhP6T5Xi_~5`Roya2>)n;mLORq> zg}Yikc9sAThoUIak|aZRe7Rrrv1Ex`M4VU`*=>dJ9yQ}`eANvY!ibFf45H`cFx{YiQvizeN>^;TEz)ONB|2OOlq($;}qit{-I?m%kkVXh%RQU};Cm4HQNl1>_$C z=iE%-4d`^d*xt=DnI3-IiBeBE&;T1vARH$r*rb1a4U8$8Ek5`Pf~~7=PBs@a!gE3O))@NI~C` z=sfOK1OS69h7{t=mn-W{B5?hE@2K|u`cjDfwIVA4h3~LVG%Q=4lQQ69y`>)WynA*e zn}z8>nCL-Qn|ifR3FRm7oq6c~dbdAzc#&(VGsu9DoJJ#wNDNe#$;HJq0z=VmFmj-c6^6MhP|2 zm`OPbJme@?gbj&pqnyN~=m-3k!t&q7R`FLe75+a@0AT$3moPuCT&||o?so!`%jyw) z`qBDR$r+bxF-?I+jWU z;*CJ-xAG6u*_lq|T^nS6X7g=F>m>O#k4?h6+ZC|5}$b=`87Xfa9w<9nwuZR6vAWod5p>^Er5 z5eRIhBX5!N^l%5$17xJll)$bd~9e8T+&d7+;m3Yk!Qb|%M$?Kry~_T9Y?j} z3aDWJ#~mFhxwt|{0TCAE@E$7SJ9v=-kGPf-w)^(G(OrN_%f8|Ye3w&eT>0@*2pWKz zcP`KV`Z}nepYjo^&xK=f^;51 zLab7R^6MR>=6HlNehfv~2Xxe6!XC(^izUerIYw3oSvOTMxX$h`-SJsyGo_153en3n zo{u$1Sa(-xp&Z~^?(46H4rlwznTAKuygvBpW zF`BFTG)N`Fqv3djEK5LTxM(1X>?%x2ArnE=>qM-8O^lqL=6?ejsaD9KfG4gnuze)@q_guo zrP2bRJT!GI56$vRe5aFko9o1h3iG1}t!A@)r}vDC;aZ!5`*vUjCLSC?yE^!;?#{IJ?;0@=;0#I<-d@gC8WzyNq+vezq_ zUSryB6&e=F30UH<^*DPZF9>r{u?dI zmrs@UGB`n2M2J#E6o6#f+_duVkFAV1*?iAJJGB@;biz-nMvHVdo{XV%+QEtjj_7S4 z_m+XS@`l3@*?}c%I5}urBZ|;&iZ2zXozGb&XhAt~px5m}zk%O}_{;a>$HDN@4?C-+ z@8A&&+2&`Q=2slNT$Fu?8Dm8T-gQQT8twc(w;y19thBs@-bg;Y^Zc&B+*lxk2p&yJ z65qf(>C;8dg@X|TO0S`1o7sUT3fkq7`0GIVWxAczb#(dw>@4pyIfmdi^rPQu@1uD) zVMNzXoI4AQQ%b%2(x@;Bf=IN%OEKY0jP;^8agyT~54_hOjBRlZPe|6Pu>Mvb zFy$Kw4VL??;Rsl4(4gMs8@n#Qj%{nq$@bC>ri_2?=w^Sd9P14iVt%3_9nYFXj^271 z?8v43z@`+o?HN2QCqZabGPb0I@BlIWuYupWgQ0TWLz1bQsX7|rNt^nQy~IV|B0$c$6ATGih9;yu+hAp|2JpN-fc1HZBNs0+u#MImJhq@gT*@upZa>hF8@!Y%n(nW~Wv%YD$#MUY&XlG_^qD zliD{)^&&=Dl{A!#f60Dp)n{NUVyW?`+sI74KxEZ%d|>j6_tQ{9@%ipf^!qIlHG0k{ zc?sfD8Q??$Efn~iDM>=RsP!qJFTwt`$)uk|M=3^czCR5V{ji0E<4m^L^Z@15BtV6xTDdt1HbwO8``w z>wQ6%XYsu;hNp|77l$e-tb2tP#i6u5&bMLLxd;24Mj@l#7YaLxP7G=%?NLfC-yQKO zM^*Efv`A^D=m=<;{1Seqk#&*qUqku4&V1E&23<5EBuxK8>*jCmN*<0yRRPP*H78ld zJ6$jt0F5w`@A-k0paNw*H5XkdtOFo}-_^FT)@r&~Uf#_wIxBC*)26hd$21lPs?A29 zLbJ!sxt?9NHO)qOK@4_4MD^WBF*53phUKb>ql8S-S@W|Gd4~CiP?wa-lhqa7UG?nL zJX;zhh2Wan$nA-Bzd0fC>dvLod2u`VO^G_oO9dfeR&sEIP+|MYr-mpb@;`34AGIN{fL>)tK#-1JL<55_l6S^t|(OZ@k*U z!cupe;}ybgcNR3*8C@IKcQRej=TAq@gNR5~QtR(U72HG41D&=iMrt@+8}&dvdwD%d zi{*{lXn-K__{;&IFy?uG(LP%gm#>akL5BsK`ayNV8c3mD{t^ z6y~NLs!4-^*MWx|Y<}7m*3IDiZjYu6Ru>d!5}fg*d0OYRRNBrGRCCUoS>4eyjSc6m zAB+h+=c#1weJ#)#3|qUBZ?Wh{ad11b7){1f`V9g#AB(g32k>`y-rMcstS`Fm)w$|- z@SE77nsq3xLc5^)F$bL}eW!ilP*VCXw@P$Eyb?GsAQd#Zp%~UPz^J{|Z|>iaM`fi| zbf*Il#I9k9ermFnktr?HZY$SfaU_N98J89Sir|gfB3GhAg$KkEo89I=LZiYX&UW{G z`CVNFz%2X3j2c@lFk>?w>q!Si!aJlY^G7PHIqY~3>zfp+3RIrAL72l5i_MTXU!6Kv zyzLP5g~-;~*V*fa7OhAQ9mjR%zzhR58CXT7kIU5LH}CLHC4ua{pO#+`-Tv2OCuJsEHCV%{!kq;ADC0VhWPgipO6aPj-xaIq7*n^0Uv`%PT7D~ z&y@)kVc#MquPB_=OX3MSa_^M2c>ymC0w?f1>Oh&|8~S6smT5@PL8>7o%4-DL)wv zU95h!fKdZt#z2v6h-!Pe1o&HUdKgPG&VwhPceNc}z1)R5&3V^_lPG~N*sqhgq(Qhr z$FViF2vzgtu-cUcHTZiMT+U_LL~5HfjdS={`Vp z`bOmqZoPY1aWM-gh56Ns{<31ktr`6Wv$53G4BzRutdmC7vpHr4q0u5FK57?AiqLkl z`!8K;?pLm-^JiPI1`@~S<+|@T$G41P-&$6vv4Az+k|}m$b4-;ZJ$I))N6`*q69|g+Xor(%SfsMl76W>#y;j~^I zt4D=)PtXRilJj9V+P;O?kYye`H4-CkvNG!M;{E<_FP>PuUo*2Z_#A`z83h^n(kb1P zBT4ic^ZXq2j6cej^*;02(!n*+%kEukyA#Cj+dpKDHs)i!Rj{~Nn=wxW&nYwat5rh3 zolGetafeB-f9H$#8PFdFIH))Fk}#GIl@bxFrEy&j&E>HQoY$cu=DonXYb>7!A8w~2?<)k zhn_pD=NXu>{vI?B42uP4{igk>4md;*it zLBSTGPFGqeKW2^h_vc?S`Z{kN&fbq(sWn_}wpeJoSx)Pn7Nl&{LoAGG>TK^)F*rZ2 znIY5OA}__^!#dY4-BH^PC7q2BgcSxWGxfpxRp|P}ZM8-R(Q9R3K+daJ)|wu0RTDX? z_xFx9Fq~_z$A=c`oX%V4XUyL~|5^>+kj&oLY*hyjMDiTaGxT&el7uTCA4%ho`A zM<;)AUQQKxj;f%qCYfWQTgGFJIPtt2>1~~r(anY3y_qF=30fyo9Uyu_stGlBHOx-2^f9i$IR_h|Wqc1#sMmrR^3RE_195XMH>lmHHAt zmr4QaV&U*;FcC8@hu(unv7J{+EJT4Em_q~5N4V>F+d{9;(;2oCwNjs51pPpN1PM>;uU^m58 zIPZS&0m|?GdcmyoX6~E}>8ygq84G7*f*i>o;ZQH#pxn?|1Nl=KmeYFpJl0$L^D-`c zG!TUsX_MFqfkYYjul{YKtzOM$SF7uXWOK*Ccn+4HbvoUuNm0aFEz4h96Z~iJ*<)iy zs?*>uHd6fv@DLz&%)~x;R<;aq2Kx`yA||@TBKrB6FAGu65evaj%sd;i)K+Tsk)iyW zTpuOwcN-;!dU3dB4!U6!bX8&qYjrGt<nL;~O9gF~RU=CV@mh zi;^3P(Y~mAsq|q~3lfNbvh?`Dr$&PQQwB7cT_s>tE5;lb_WR&Zc7R!7T(z522Id6) z5Eq_wYK$~#+-%@XNx;Mu*6zso;M0F35lrwtqUmZI$;k*QQs>pRum<)qx7tY|_5sMM zevj(zxRP>aDf18K@AXH5hY=1SI2y;#>bw!;e}S>-LNy$ST-NAs^-P+cw-3EJYF|Lu zgX(_z6<%*2)`;c;!oes^`10|xl`uVE5z!-1YRP~Kwl=a1Ku zV7KJZ9CsZER3llR^+t~2a*%AQ zmtHvna44RO2+n-b4Ue3MDv|e4D~C}(aNZBSBS%&II)x04>A{l9U= ziWCPTC*>e4NzU}*4(V?Y8mGr|FtBNbdCg4xFd1Q3h+hJcdOm#pM`|e?(jo9v+qL-; z!cmnHP?r;X@E~XjHj*$CtS|Xc4xo9;?Wv-GCHPp>7_`C<@4O^%SG9o^V6SO=2&E^$8mrS)pJ2kYq7pUxkB4v+L+0)TLKbz(;C+9*In{S+0Ok z8SZxh5%zQ=WPb6W{DQ8K98NM&_KpbtOhEDN!o3&QLn@g!62gIU$#hC)G0z>GSNqUx zQx$0Lr6|N=9W(+!UdFy_H}qx!;NaGdE&E~R+e*@eC@gWp=JV7b)oJI1?Uefapp{(5 zv?dsm(40Gck4vXK5b;1=#?oo3-R(L6hJBs{GIl%opTIwEg%T`a?Q4g7qZL0AD5vadvyXYG_3JOI4Y+2v;%isXSfx#2> ziYDV1DJa#73iYYp_ftvO%F1|WkjgJGB1g+o=J<4^7Oxi*cq>cOxRsNxva8e%`WPwa0CAPxo5x zA7eX66cVdM3=A?gj#@mwJkU$8*|_39EA)k!ZtD7G4JY-Aha?KDx77vp50Cnf_5gF<~1(YDso(huB8YPyPz}$Cy?eYJaF(Cxl^Qaf8 zJ$XOHKuOf0a^FQ@Fno{5k#NAdPL3nYIDV;c%C=RrlW^!b%Jc0R7!m=Bq_(ve+EEr# z{@}~Q(oo-7jn`b;UcvQ?VV;H5XDP$?RMVtTr zhkmM6JnDSP5WHv626z{Ea4*yaYBw`5^4+9>C7GRbVkV=cYILjDo=3b)2-P@oDa5zu zAcwt)<~($+R_@YS-O^O$1Pk*Pkl=}uxC?fznFxzLBO%2XWA_}3%GiKr*qAxZ6-BDG zW1Up^K0lJU>e;FV7pQF3rHwUcBVV~OG;C=RS;v7rcMO+HG5i`-4XvNtsAEc=moe2| zEET88<$=7$Wpx)kOCivOcNlvg9JJ4L8-Q`mB%Nt?ndLy8v$*C277Fgd)a*3G{nCAe zv=#_+8p9U2PiH-PozbD_P{-)K+ikr=OD^VPeRf=+zpIN#4_Q5iH3NU(5Jvk@d!p;p{^N)~P|z0-W6n0|2SSSSDs00(LSyLra? z%+Rt%jXig7-(%)=a>9qMPV>H)Nx}fY^ymPho5$d!!NPL-B~o$Nw9k^pWzogSJqL)_ z&fkw?Gxyp9dhWeJkh$Xz+83A0sMPY%mmLF4wi2Rl_Z1v3N`TTyE;f&jvQ!MGPR}Eq zRH<+)&da#~YOB*n%TkG{Rwx@qNTM8jReM_BWz73*B7F!$^Iffr4>X8|CXx>B-godY zvT_izfe5<`PoEvgd-XN$*K&>*bo0uQ^@%&*lMETBCbg~{sm>z*k2%wuiOUaHgYRMq zOF&^KMR#GsAqB<7%9@L8glh##qb$n(OCL}M8Val?XV+?$As>BjWa@)d*u#6CZ7bs< ze3Avfge`Fq*jU&x<9>#Mj_rw}7krlFICD1T0qcC_aiW3WL-?s&Man&be^%6Y$o8D{ zWnRgkHjSg)8OFP>5SHwq4C8#u-8zpZH%r(dq3ZX0fK-aEuaR?~cJ z%v^Hs-{fU&+~B+%gtt$ZB1DM|kgZ_s7Pm7+ooh(k5&K=aBKg?ul|0~*u>Bx>6w$v6 z?pugbOBlV&|CBtK|MD!BE|qG6tMEsDG?$0Q^yp+D@e1G&NP}|5VXbdxm)c*mR6f2+Uc|yV=N*{kL z6S4XF4UM!CfGQg2RnhcH8C&lM@L4CtD*^lo5*N)_8!bPvxy$$@jyZglwuBdh=7(kS zp-AJG{^7Vzi$?2Gsb8_?o{FW%Lxy?hG8fRMJ3w1hY)YaVr%uT!C{A%kr`zZo8y7lg ze3)76dc`rBUsAQ4BP)~@JqEx+)ZN>CY}77syT<)Z;ir6xzBx<1MBOU-!7xaHfZ~E5 zPLx#Sv|<@y7Th;3AbP{!J3{ij2Q_6bUEZeIHFNJuF5zLYc67@O7cUHkQ$Qf}S_dI9 z`V^$HC|kNImG$)OAS`E?>RPG(F@R@%6%jaV=jih5Z@Fu#6)wyzLq!NKYFdpX91uf7 z!PDl!J5w^-Y=oSvKSd(C%#&vBs%hpK%yzR0(>8W}8;3K%IJgmdVjj+p4*&jqy_j4n z-J=DR8Efr}^J9P}RI-TPNH3f6t_0qeR*o0cB@>Q-M{z$029j!6)n9!N+OzQb#B)(4 zX);Ia{N)LdQsTE$)AISPdWczqSaU}4`S_q2mb)!+k`t9z*$Zdmj!49s72XW{mC5lVpu6zAJyP# zezP*a1>Ut5Zy+S{Ch`4A74$0OMdXh?UAuz{=9d@1O~?m@d~3_=d1T ze%W(KCmfdhoag&&6K2%EYnmGJF9wp|Oo&&}-MgtCpV>IL%eR{pb5%32}$XB4UAaZD9WzhAHtOK!* z)tW9OGUiC2C*It?E{|N-FkANOrT7g z$lTIAZQGB!^zqQl(fc6?LA1w1sfjbQbJfcY2(`06KX4Gpv|Jx4aicxDahj*`xMGYN zhFb91DHj+S1Bb@L^AaSKB*zO?6)2$7T4f=y>vs=MB7Gb}>>HVi1mtQs8d?lom z-3^t1QmAmV?|-SLe+YtQV;^!&v}hVZP-nRixe3$iHRFiu9xbpzTMbEu&LBkc#H;Z^ zizw(@2UrnEcu@rC|F}sL02LzFyTlKC0E1u%PIw+4g#gtk{sHScMjtq4Sc60}^E|#c zcJUu}iVVNf^FKp01nYy;%+0+sC{&T9ZKG)423W#%6Enxb4U1-Ehu<0eGr+G(`_9{G54*iq1XJd_7;I z7D!5w^Wvnw1Z8G&{=wK>e+UGy%jtXYB^zpsISNl&ynv8O30-7G3D{~Ie2j%w%&7H4;rVAG8GzId6_X-StYc6=~ag0-k;Rzn2i{m{4g*<;TZc`onq;&$L;aLs&nu3zWA3*euSS+E2D?MkM9+#=>~hscfjI=}m=qfY^D~}j3)(Yid6^u3 z4eHTN5@G8!bB`PsMj0As^G!l_OqhANcsQrE*GyTG0LcVSuOZF8utbEu|b?b6{> z76NMeNz=V-27JVzO@>e+9mo`+Yt;SVDPEbHC5{zjNm!X^-1OL-a&VPDx<1`gXNV5a z%uSBoSaPn>v=ILB=qIc=BC3$RwYN(333Xvm%ZTmvEBTJ3qYEF9E zi6tEfCw6wOuTP78z6pxl7jfe!?&W8Zl#-J2#Bg02JTdr?>$7vE zx5%9*iF(mH)So9wz{YO`$Wtas5D>jEuH3yXtw#>TiS zZcRT_XD8cP{uZBF95pWu6sI#z$M zrv*+spT9RtOfSfE@2(}{{faSWY0IE0XkMTeWjeW=KKpr6ibO;_2gPvcp7lO{^{|@#BO;x|uFh!PuYBy9xwYmA*XdDv z%5(zmxP$5L45^PtfrZbod9&9=9Ys)F{`^8+2+`i{c!JT^h}c*@94~%JK)oy+8gXJH z;@^enKB-kQ-pT*TTz5HiB1lwc<;S5zd!3%5^uFHLy9k0`?9*e(u9`0f=WF0E_CR%Z z+0Sa;aX-tnuw=+iu4T2MtrTK!aI1I0no+Atb{KnddBA^oWuzpBxm$8f1dcM}m3r}1 zD~SjBhKC3Hym9^l^050mi^EkGp5Vij+2GAO+q9jS*%huE>=VC7>eY6QCRmNG{KqWB z3puemE~q=@FL=Ekes$Y-ZwkB5&sgqJt;g#wfuIR(G;l58DNA1b8Jq3U0y%_^B<+omyu;GgHh0`R z_T?jrCzb6IO4rkNw!qH_TrF7$+c_=lq*0H8P#5EJNQZup1GP^JXc5@F=;yzNBg@#& zLSJ-I1zR+@nBMwc=G~%a&hKX1A9W;N>Sl8|AyOdc?Dw362rt0c)W$|fuxBb|l>XFS zE?4*&4i*s(R?sob)Xc0Wk9N{|{}ET)ca-$3vlFkKl(7UhmZb$K)Oa+BNu*k1MT&mr zY|Ar9%hkqI>uF8(Qp1E{VXX92?fF`dWRi&4wDo$vGL>Xoh07bZ2O({l-kepvNnJUw z*RENbsK-B##hh;19xe&E32hZ@ME6j(jJuU0hCWt;v8a=_Ubr*PW?5-UiX%MMP{o@L zcz+1OxtzC>XV^(Nmzqs5wpA-!Iy2Rj)LDC6rg5WU>JCf~lj%0_%v3y1*PVi7qrchU z)os3~@+#dr>|f%pn{t^eZa2=g$fydlrlh8raG-2I|2na;)~>ZV!+8_Wnj~t*=fph1 zkdovZ!21->WZ$TeBK}NReY4_AeC-U$X~l}!Q@F0de4bn3(FO*)TghCTCUVK6X508d z`@@OmtLPqrt_QX&r7k(@ejjdN%mzD%w=?+1F|0P>Hy#|y3)wt7t+G2{bFBr@gCYm>+0lFVPwMY8 zXJls`__6n&?QpmxwCJ6i(Wt7eRDAzl?YvX!9Y0Dxxwi$f=dM1mA4&px{bk>IF8h~D zZdZI2g8Htj6=OcjN~BphNjk7GFGiSr63nZ!^oa(~E7^8y8VGtz%k0Lunra-T4RbAL zsm0aLDGWCw){^Z;rQX|HXvct3gCWx+s_o?u1)_X?LRuR%Bq~K-JdHNJXpvVMyz)Wl zGHX%Hr~qB@iLX6pJAZq>s#3Ln+G9<^>gZ~Q*2pv~Bt6x`>BGwHW$l|_wOA_Z#B*Ww z?3vbDPx+dyLs?tx3x>p}RC+*GfDo^as;H{Py&g&iQ-fUc?8biOgDL8DPtfsg(R2b3vc>CEaDe1a)TB&S$h_j)kK_pou z-nZtZJ>&^9oUN$f>rWlpg@Q4=ed(5K=1To?ecPEQURAJ;h5CO`KNMqgbKCOg<{=k; z&zm;P+!HPWA_iXCq+`Ap_8JFG<|=vV;f-H+2-aIS%&dkvOpK?xyU}_b@l2{lRcB;Y zGU0nQ9IO7E2=twlx`elQcSu&Ix*KxPP0SKoE$$8{^~~9iC6sPU&&sY78iQ+l&T8tc z^za2AUU7MOuPMEEBp5SFK@S~D1STgY0()*`liGn`e&-75HiBo`@vqY)x1>484<5&m znC6wi4tU)bnc3Lc`PN@;l|_*dt;^!=7G-qT2qNXeDEXIhY$_Ak(sSZ-0)gn391+J4 zE}sxmYVe2m5Ez^!O_J#LN9Flc^G7BmU7smBHXDa>h(|j$Q2pEMc?w?3S5dPCelKeO5O3};BP+RxD|j}8c4>KYllvoo+{QoDS(Vv2(Fe(^AGTrht<^nwBOwK2Jc&WrtuJL zvHTNMR72lpwcm_I*|yinp&BeRkB{6_7u`>JkgXQ6x8$vR_v$(##@|yHDn@G0-!QWn zMcx+>Rt|f-8P>FqWbJe(RyIMno6A$PI@^et8gsq8ry!ly?`~u5Zbxh1S+9bn zg-q#I?6lP#7%_wdvDO@^_)<%W*OJgbp3WHS0DBc)Oj@{awS9vCNOz?b53u zszs>)^!pAzYhqh3{GGa%Fihd>IhkC6P)Hz$JqQz*g6|Z_U z8BI#47RhcEy5FStn6*CFPrPV#f4Nvl@W!jdc;NcEg%43tyqy$$F5ScJcLTE|J&Jfv z)BcORKy+t2)3&H^pDPOIySrG5d&&YR`oXF^(gADk;S83Ip*4BIC{B#7&j31fd0tIu zNln&_EF!u-7g5ykaIKOo2wg}%x?1@Xdh?9r{CrUs3ref~h;uje>+RlpFoCCTV8+A- z3)-eKTocaEGO{)b*JZ29R+sqCIWXd>U%^@Vo|H!>-{YgnY_YtU>z=ag%nFX)!xG<@ zKRk?&%TgO|_KV93&SYv?=YWc7%bFusk$skrtEZLH#ieBO$2@qQnTbDxh0v&+++5GS zYc|iz)-LVznI7KovHvE5j|Q{ATd=e-+eHD(ppcqeJ69{eG~NzUA@f?dUC*^dE?ZVi z0XbB;2{(Y#IcHP$Y&t|X{X-!&n(A2yhgoby?}B1{(E3hIdixLU0we0Bkc3IEwaDl6 z8WeN9pZRHVYlfvQpHU`Ss&^thwWI zxFhY?PlH!4_O*_XPvAy=VimEKGkxsHxdfC!oz=0i&a8BM=TnPAzn=dTJYTR!|5tZ{ z-3|0@^Y{j18GH07*@-v9As-dyN`P4M^^-TMhHzeduArZo9A+uhJZ=-)X8o#$WRF?% zT1=fd@8^^@E~PPiJH%>q&|<%H8+$Qr06F|j&%sgeakCRuaq{APb;Pz;6(r()p2Qx{ zvvc0G=OI^=FvW@p2FyZt1nC|L5yDJAQMfA<;;5fOU~$E2-}SMd&<>e6gh&0bY+>lNC(r(6l=O7SDDe@fATW)}b6AVS6)h{GkZS5@mrYtU0!>c-Dh zG;-r{-c~aY)SNErbe8OdySM{8eS0ndF`WG6@>g+n_2IxJ_ET1%O4%o|>*m@`_-j^N z=aOPhJaDql8eu;&s&im7*{@%6mz0qxPSRza8msz?pUiG4C%1N-`5owf5ybToy5aPy z>dwaU8#9i4Ci1b2$cC2#sX0U5(rGxjl>?SUS$-odO{G^y|ESTv|^Z6m?R~5a1EPy4apH-tjpHX7!;mk5|R!g+!`sm zk2YCj&*LCe14g>JJ#Yi237_bRrd!oBD5EHeoi%65h(P`c#=v`; zwS}7~O4ne)xQ^|dgD@Y-1YZ=G_YI{>G;#;w6y2TiPU&sOs8Q;JL?jG={9U>-My{H1 zlffUIy=BwiGGw&`t4I>S1j(ZJm*i>%Xx`J2g?Nxh)kr8@RSQYld! zw9erIFsMHfE-&a3m}h%&IsK{jVC$`e`-kdUsn0#~RCqB#>pnf1c?CK^Bx@F^VQv0K z#Eu0}FR52T25?1jSN;c3i4=KpGm0FkSMqJA$SSS!99>+Ia%9na!^oj%gKydI{bxUo zBumS88atHxJUNU6F|8E2&0&|zExR%8+EN2TG!^nL@gma8P)ZZB$BGJtp7xXMTS?>7@o6m3~x^!Mh4dr)Om-n)v+Y*#~Fxc%eZPU1Fbh zQ-y;w)WhU*gfU-I!@|Jctfo$@EdhQ~>#X$}7(=x9iuD>-2{uuOsY1~hi{wfKp=^! z2*Z>7R7~Q^2`RV$#Zm#M;;NlhxgrnW-77YsAfiDdy;b`|_2*KNs^r^T^I9pG4w~V{ zw>K*i78Bu(e;g5OO6Vy|i|fwBL{>Rv$5IUnY=oiQLp?k$;AEi>$yF2+{&f)@+-h(s zG1-pvr$Y=t^WWRT|Ehz}UI)TiqfcR$K5Vs>{@IumJjQy?IeSrR9s#Y8G~6)nA@0JC z$*e53xGZ3{;@7j(2K*hJtuTw?OqKYpZL8EA#JeOHnZl+j>0eH(?_+6&b{gl$6(ijV z=>GYU%Nu79C}4nW_uPQDU{rI4y(*f13WQ7>yd{Mfa*oRKUedz%QmzS26AoQa5Yf%)&z~M6qSqP0URZxqlBStvgku zw|NN)9+WO(!M+h;eJ4P&(W~md{DC8CsIOTw3($0J1r%>u^yuyURT)cQV}~JDE02iK z!xgD83v)zE8k0w}$Y|LlsppcD)`#S911Q3GH}w+-lUr?(u{-u=>7(~!vmrBJtDe;t zq^L=K+sQyV#^~l`l{b<>L^hLw)>KK&X(~a+hZEpqKfmcQWo+te1Q7`_BsId|V3UP_ z_i-K0qZqlzcvs1vpyVH|3?UVNP0jp>wBbY$QU;<|A}+LG(0S zvwgXbOgk8Dkb};-NT7Lzc`Sk2_HArLD>#D-QqY)fqk2dX`31nb&mj`3vHg zw+E)!+IDvF+ij_1RTDfTqQ9*v6n;w_>P8$BfDSmXVl^bUoh?JCI(0mlTpG{2Eq7j5 z^Lg)VE!mS8b*9t!w?L++zArTK;_J!VLg zdJS~jDuz~+H9&IEXq&{p5k`YUT5PM46V|4O6w;VF+IE>%3>ae&WPtV722=$0t}x38 zmBrh+@(I1f8v<5ApjmrLD>>Mm8n-~!5b1BF3_Iyl!hx6n*^0^hZ0d@n zR#G(pc4lC8MTh<>w)1@{@Gsi8`F&eIrPZfD8WUqZr{`}T;9*+}cb0VrhRqY5$zvF2ui&gqz3AyMWQ^RW)e*Bw&m!9Cuh5 zJvul<#z7U0maRKO{s%SPQ=9(R&nhJ9=LXC|Vz}nZjHsy>R3n?rT5XLV2M7tF91KGk z10;)hIOx^sv2Gm>d~$92aK(1KH}?|(-~&Smd-C(~vODMj09$CB@0WN+oJWwz8KOiN zzVFKLLSM#;+o0Tm1krzjg~S)$os0P>2DzeMSLRF#=3!`ga>e$Gy?j!FfIg&0d+;7# zUO*$Ph?7MkFS|g8t0bZ^N82V#n6y-sPM~gZ*1`KeQq=nT$Dq~2Y^?vRHL zRVqHcrz2S~^`uz<(~i}~C~2aN9|1m1Wp6y%PN3dcxPL;x-Lk?gOv)Cg(K9!|J<>_j z?B03IiymGm4!F@hNJU??Sl%HIOZh<-2>~JzETgT*1`D^!q{0{^ zN00q@T%A6#IjxA-QAt7Hh{9OquKQI>iKVExafaN_03LoKhM z!C*S|>Gd_{CG3zAT$tl^(>l{yde< zY`By$6we5-Iog+#+WS$Em;ly*WTMdfKD@v5y^zUIduH7|=z~_T2TSz3uO54$eVVCe9k#2usgG|&L}IeS66Yq zAE7_;lYz63PAXtpk2(3yHn83=vGO?peUQKTF&oS#vt+qiONhcv=bSz~yM4J5jAz0; zA*uS9fFz_AX$|2CIyvs1p;q;-G?TRnV;C2mz z;H`yJfO?6+q%=>@_5tO?p19(RUsUC(w=@5@CBOBmYG_hgJDd$|@>r+k{4iq`bwLQ_ zRpmk-pSgWm);y3;(A`vw(xf>=nc@c9m^+TMXSr`vp9neoHzmo8)W(hg1{U&i-ZHE2 z6CN-p+JjB=!T7J};Q}d`fYF?yIz$S7Ar6)UX8Bv^spBnvB3Ha6$8+9{nG9~%yQMU9 z15U1ARjHN_@JU~)kc?kqF+V zVoIP|7gDD(bq{D(n%pCmY)FdK+%^yXZ|?$FaGb$iN1~Loem|ojOkjR8EUBylqU_AaLW;fa@olaTC zJdUUEgCKQi90U$pC}(CW7*hvGK_6jm#hvbq3k^ps6+n2)a3Fp+))z>%XV z!;%tJs{O=`tx_GXAk-@b(&ZR5YM9^;g-3gTZ50wISpR%mFW6cfUrhRR^5g{*l@^(H z${C$IgB*1-T@`MFs+8u@2RYAqQ{L9gQ461lS9WK}`Syv;pNwWS(XydQ?`mL> zViuyQRzS%^Ax^cE1?#L#fPZL~h>}G+|Cs9|(P|Q_uOHZ3IXGM}$MC`bT zMOwc!9zn(@8Ki+>603%V^fZk*QD{GXI7k(N{8^B~(jk{+)I^t5wlyHqzXEsR%8Cm& zMU_+=<(>o((BHAX_f5w{mOI4+i%fSW*l<0#0dULI1Dj6zR4qO9d|Cyz>X;7vE`lAe z8&xk=s$-3vknOMZiIXcqMcM?JUwkyP6@DGKsReO)D|hV?CFaTbrY36D*k+eU?I;3J%R($HJ{HW~t#3Y+twYeZ=lt9(e|B}at^#JxyhX>DSj#Es8zk?XqG8b7HqbAOWbs6dL)12=x} zr@^%s2krSgjn6y0ScmfI!+l3{r<+G4hu4+aU*GW(oy(4{>|ZFYq=f9&FyMk%tw=*n zzQ6MV{kV3SoQfjlytYFkw-xp!ujEa7LBaG+fpyNh_CO9V zp43)_B{e4lytHTGV(|Q{s!f4I2d*N$t;VE6=LNrS~13f&PBeE_;XFT?!yg;Lr}=T-jN+HpK)S636TT#7I03{&p_gaDIK ziF6s#^xW?YTvlw?XrKSG6C)cCqc^M}txx>Mp4?U(cwU6$e^`iS2thx$T}d0I2m<+Y znVtNXy*}vM{5GysDc0w4dLT3HMCCem@YBo1`(E~R6`J&VPEL0}J3WS@#V?T1J|V)o z>{y+1BSo5t<(3>BZ!$yQC?uLW27lgP{o#%!coF>A9elwBA>Zh;;w`i3sHikThxVI9 zzEWx7+id-{+omty)6d`!$LCYJ)ukkXL2KM>r?B0RAkSV0Qu)0NUJrU>C4S=08Az=Z zkVbWRSYc;^yfpak8!lr*FyK6Cm-;_5cw@M5l3I>=;u|dFrQ|WPC2SJ)kutl|=-k#LyEHO=2Ag`xWY_GE4W6vR)#8445*a(a#u5vmK)z1wBH%2BO? zCu2u-XB!~S2h8$Rwhf;))fI-aEQrx5Vt)SAtlclcr_&7<4W#Q_i$-%uzxjF~6Q3@9 zPAn^u>!oawR6TqAS$LD3?@%jT)XibvQqFw&dqDa%Bi|tm{O%<7Zgbg26Pfae2&?*F zb5Gk@MBiv`V2kjEN4u}uVuV9I7-YxxA`YiN3Xw+jNYkZSl6xZj!!qH~$HHQ#c5>Q4~r0zA53s2 z@dKsJ^We9n!5X!F+r=q1G3RG;AUU}c&nj|g{ZrkVlH08>+s_04tfx73(y+QK=x`BK z9$>_=uI)x1DCjF1ztjT-4ZNPy(~hPjngxLJC!uUgC-AYYtJ@miSz_Yk({6V~@_Sb6 zsA(b&f_tNL_FbA~VQ)#Lu3U|@%_$;P?B1~H-#!A3FirzHWS>`JV(C!+T!5r{lG$-~ zs5iRBAf0kq-`!z<7pS+(0}KhOA3vUlXa>Mr{D=#6Cqzkf<8{=l09@nOSHDg zuyfSCP7EyKpFL)OS{1Y3Js4vprs>q_xd|O7s#;)Na?X|j*cw4mdh=B!(D?JG_60@- zWLb709dIWoQJ9`3F3`ObS7O~eiJ6o*O-Z^7vmBTXNbi^18yQ)~sJ-%kOS)a-NWg2n zb{upMlaZRD5(d+G?cZ!p#N@CJUl1G!u&J4j!m=v3hiNtSbBa&Ax)aa*eEqFyAiPDT zA(MD_`iuL5(C`Dg^UThLOY55+@STw4u#z$-c@(O~<=#uz8GBo#Ei=tb)ji1KF5lc| z=c0m|?#Z#CK5o-CLV40u>ie~?-FKP?K~9hlaj0lxlhTrrczhNHBqSF`UR=tSa`8r_ zT8Y#LD?P+%NC6ic;o^hlCn;IKQj<^a394ldA34YO7y!_w85^z>n=S1S{WS8%!*VL*9YI= zrf}R%Xb0K{z+2ZPzO15xaozL~tjKLKM;pjW{F`%d9Z#~Edos32Of#rMfA|5Pn0DBU z+$I0s4Dt?Ri%UK?F>SvW%sC%5q@qnn&&4#Ko)E0c>5|vQS!(<#-7r$mw+eaScKAMA zI%eCMMoE7}HoxLh3g%9OwFkiDI=lO#p0z7u4HEl8r}Sg8`Lh0p)zi4v0>^M2p>xSc zpw7Y;KRm53OPy89RnuP(9#?H_)jRw7fGxW{4HtQlv}hPHF|p`iZg!$-vH`+Az|{Fi z6oO>j)Azz4yEMIA!j)}!9MEjuu#@!7<|HrWtCU*N(3Ta*>*WbQsNtj=I6-Yc8~=flgkH;m43KS91YkpwKX#;{|0Tj^Ps9H+$EbQByz2wk2lI+%J%lReIB;6 zosYJtV5)a%khd#v$WQ5>7kn7IjQxzFKik>6H(P6a!44$ycVhbWXJOZjBOm*+QZ^N$ zk*O8wV{}5n7f)~a*f_M?J$sYcM@Bx_zs+qEq1684t<7-gF+eXG%; z&Y8+pS`sUf`@j9;>C>cl+aXUG7!Ahk*1EoT>tU3w8 z;tK1_5I@u8G2Rv9aG&md|ZB&wsGFSqB_M0G!6% z(9%N((o|rAx1*bWG3R@>`Vtfv{P3?_*xbvPp5DR1eEZ_*!)orimML8e6K3OW^~~AL z#0^kNbDifm2j&Tw-G}kDgwmjKkB7!A*iK$~RtoP+AC=`S9EC_k<6YkjO; z5ESv_TUKSoENk7O6;SVyq7=pHcX?WlU?o>uZLqmY;4S2%S%J9OI{M<`@_-5LBB+2J zlIrO-HqDx`0(GnJP|sSD4mwA8m0&x z+oLA)9Hk6#Hd*Gld}P>D1#i(SjE#>YsC>Nb9&-DI?&m<>5dbz^;!gwz=z!H}A3^)x zbG8qbs5oQBxXihR&b^_g1h!Tc?&A{lh{JLXl}{nPrn@s7*~epddzMqaT<#@-=gqbf z4WK^dpc<-H$CDx40-!G=d@YFT>5j#z>wJd@z)$8lM#I11GAU$DVWS^6r7d}91Oy5? z7agU|y8Sg~ZfiYPu*}c940=~tN&mvw#*EAch!nz>N0Y2XwxT!P0TE~DU{sZG>@OXo z+i^P@2mE6N%VK_T&MwBh-$6@SqedZD(GCltg-n7QZ@qHe

BK%0%yBhSJTaBq{-; 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 Y%fEhL^A@Y^NWTv5JF++77bB1V0z#(tiU0rr literal 0 HcmV?d00001 diff --git a/docs/assets/images/ExpensifyHelp_R2_Profile_1.png b/docs/assets/images/ExpensifyHelp_R2_Profile_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7e3e6ac181be1e00d835f19871d3851a60ff3c3d GIT binary patch literal 170078 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

Zp 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 z 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 P&(u3=cqHqPeaQa-`4cFV literal 0 HcmV?d00001 diff --git a/docs/assets/images/ExpensifyHelp_R4_Tags_1.png b/docs/assets/images/ExpensifyHelp_R4_Tags_1.png new file mode 100644 index 0000000000000000000000000000000000000000..c8540d93423f876614a6e341c3d2ce4444a69e32 GIT binary patch literal 162915 zcmeFZcT`i`+CGX~5fudy0qH6NN|ho=-->`p6Oi7NDm~N?S`&t&K%`4=ff$h9 zq(}?BMOx?t0!e<8?LO!1^Bd#4w4bL2*I# z;R78C3aTFz6qL8m`~lvHe`yo~{+zPAr*V&hq9mI7=ouw=ebwrrjs^vVFAoL9i&qpB z1n}02UlbHxw<#!=pHfgrzo(#Jf~3`I%YqM1TdJu%pdcSVKGf&Lfp^YA9vXR2P%v^I z|2v_ob7KR1okI1&y(d0ns}nY+so2I=Hy*njOl`VqRSqUuCvWAZ*G(@d6lzwVZRiI6 zLcwn`G|hj``(M8Jf4JQL%Ln>j3h2L1`~R-A{!1DDOD6yGi~nC* zf0^U|ETI4ElPJ3r|FK^RH2Xha5bsFrjz{T!&a?fPagF)x!5tef=Xmr9c?t?-#eP7& zbG(DOFss(zP6O$^Ja!YD0#0-=udJ(Z)sm|^NqGfLv@y)|K?@Ah!@#vKj{hEQx?6Lj zX!E1vW#JEJxvCZ5^w9;{+m+d6%sx5bgdmyUvq0)C5X*Dp$i~k#X{LxZ42wA~!RdxCt)1`5MgO-(M-og<(GNa#cq+bIV^|r~k)5K9__xKYr;r zgX8KfzSSgi>OZ$fkzpFB!8|4!B-2v)k9kwH)PS3Hb(pO5F#r?#*KK|q5V^4Xz)l&G z#8RcZ{5kmABrWjy|MIIF0xr^5K1ra~&;iRe?4A-QT~GgW4vgm+t-$+daIU*^#g3WN z>EOcuwwqp|+?%Xu;#$B)j)vYQ2l(jUw}o90L>Ma1J7=h$Zo+{3{nyG*OId!sLWWvj z2s$)r6(6KmQ2-IG8r;P3A!`Aa77R79;eC4O5m@+tU5?_sy9%Urb?qPXesK?X21l0d zngsFT-xCsciIE99#8^hoQnGFSZ0zE}1ZUn#%Z)>Tt9DkN?cmH8&UQ4Zb(y?Kl-E<|q^1 z8_hbMOeWFhcwdt}oI2z`{R3$7zh$=OIrfABO}vn^Xme;gwAXf`sGV${K1PaJTPNxf zgZ=%h|FPO8Si!UwVj(r|TJl*}W9RibywZ91NQ?S0mwknzKC({_3U6SUCi5SuBfaj6 zUb;9w1p(IOI;f55T^A1EZmp#56`VUb{L?@|-r^t2R~T!d`+A!6I^Qu9sojJbJ!+Un z8`M* zjoQBzEeL2yYA}{`=twtSvxwRb7s)>l1cKs7^KT-%;-o_`pE7L8Nvk9y`(Lekbewuh z{??y2)2~*OYe^5xtmw`EHuygwDiF8_q??5IJq4X3Z;H_!FB@@pnw>>5;2@=OTFZEr zEGW>iNqrAOhP9JsxA@R{4lFF4c@E&Y!je)wZq5d*@%VT#9W_m2ISp+h*9-021C<8) z>ib5kI~nPz7_@>_4DthW37VECC0(GId?p}~AKki36P_>z)3%(u^)@mmaSb&~#}+yF z+XDg-)BW{0K{2^EJ=r>Ei%se=tP%XNoPQ0Seo02tasgRvry8AFx;mlCkBS?spPjA% zYhYW9X@FJj4`1rfYSuCi{LwCqtjl3l`P&I!1&eU}I7xvNM5j+Se-OJ81b4qH_flJR zC2E3TGy3Uv-Px?NVWj}WD?6%z)4U9HoZ6Nx+|_|XP_-xS6XSRuLHYyO0UY~iiI4c0 zY4>A82cF(m&Iw1)wEESZdKTgfdHR<$z-s&+>aW2L(DijWCikXrBN~NmuRPt~hQsFv z8T^LVFVdEi@(7cmA1mpLEa)(>r;8nhmpZE+7GR`S8bfYHot_$03V4s(M#SZO7BrL@ zzPFy5*B1RS3FU3HY7v+8Zjm%FON1#g+y&Y5@$p+~7I!&{tLjqQZN>cj{7xSS6`-)S z@*KkoqR)C>%Y{q!FeR8n_06Zg_d#cdnudkK7bpYWduKWY{Q}dk*H0&9Q+uc`{Ds|y`23#2?*%}8xZb4Et-ia1_uTe^f+v2v8j(0SupR$$@jzme zgZNUJ!C^V!=#|>2l%(1%z9(RQFC_0&%Me~`nbeAREU8`U=xkC5^Eg1>ou8`{Re*2i z@1(PS%KpeH*&4~(KS0S^$E=lBX^ozl8weH0w~V;)YH4wyiR^t0n4UJts){*Kp&TE7 zi-hDeo-tVPBzBB4h${$#F(IR;dxqwc#&g9+7d;J+wodmcHby-%-MxE7hiCXt?T>nG zy3%+2j@NMV#jza-jlpmo3+;-hznZN0%iOy^W{k)5>C}CtI)PAsXAYU)-|7FcNvr5T z()v1Yiu`qY<_ta>ZUmoA^mg>4qWRlaPeH*0kBt~;((HZ&WW#c4oXhh1uZSKvU-dwR z)FQ@=hUg2M%W7hMK+FCfrX3hkwB?W~qgJukb+_)`&W{$=P}&}(k9S7bJ0pX%y@Rsd zeXgIvLxlPA32rar zi<^fVPsm~Ly1Ba^LKZ2e9_zvk4c7=wcd^2s*ibjAIi+7l6ymBB)EN-fi`P2=1j(#PIf{p}Ue?BGGHiFU?X&)c4{jiuW-wOB(nvnoHEn9+CA5;{)<6*Os3`Xu5#{#JKjGQB)va4&f!iZ^Rv zZ?pQpT?OKB#9QCnd@p7Yx4431p5DExfH%^Q^Gh6?{M<7*WnHGa+GbmlIn0}6WAAHCj)mZnN{}CWHYp-(9JQ#BG?R)m+YuM64sZTaP@G#( zZ13R67y*^#n6Th5ZR(9KUXdyhJ?Wg0S5Qgn>&0ypw=147jw!b-VN`JBAky6)}y9g z#r3(s=v|pEm-}XeP3YAc5<+O|x*IX<{ngLFqkqZXZ$j}XIQ;_gl*uFzf?JF;**h}6 za%AU0TYBKImj|2iwqVJJ<2QG>t<~DunL6{AAy0nWF33fL4n4GP!;QH0sw=VcHVSIa z@Rn(u?^Q_INZ*A|p*`Iw-P|AIW486LQIa>ci-mM}&=Ye{+d64+UhxE=8By=wQ{LEf zdeqx{Q0J%Frk-BwwL4gtkDo+-$JsUz&}Qw8zr^g{ie!ZLW^tFV2_oiBj4L}^crC`f zss06Le2XFYH4r#w?eyl`937VCUUS;Nn3n(4AYb${9bZK)Ni2Wt-X!EE7P-#Xs1W5% zn9T`^m0yHwiq5$nBz%d_`cN5-s6q4J;E~{V9P2ola!%o_ME-g5^HJNgW(%B+t32xO zE8aT^)Oy128w*7p<2m5?D?7+gHswwj-1`(8WLL1(duebB5+KRS{F1VsQWy8Ka356_kc+uA8F-H0a37=$?;)qGF< z_T>f}!*3bv_twd(EX3j7Ihh#Ab-E7HhT^Xz-c zwXQ8SKqFT1`^fp}jI`8)z98nHTq_3_htTsxi(HG_5RwxJVG zuqrlEoS{zf#cgZgVN?cjAjJtpBhe{Mz?fr?a5Yy&XF$Ev>*yrID@7!|$T=p{=_h7#SPt?aw2)nOy!|`+zm5 zQ!SrAUhsU5v&lA*Wodorp~gh119@#q^ql)c`)+>zap+3bTYjdP^ys7`uTIyTy$OQg zQD7PbGUdDAX=vG%HxSyU$;dG_!%U~%f;?0Xi3`!w;_nnSG7G{uJAGWOBVsD~?X<=d zRC~IwaEycamP=c@H%ZWN8rTA(1)%hOXFjqId;QE?c5LzCYmBu-nMx;hWxLEQh#tW} zQW7t4zJ2?)S7%<()-3u&ppx@XFl`VXh#I=NUp_r)?}rTGG_Zr0ITp7jGfKxgSbZJD zybFkdkvn+D?4?r`7}a=fKAS{vph=7m|N538CJjXfmzhG;QZGssteaf2>K zc?EU%&*+Dkn?1uMl;tF>U)D?PxZ=<~Qlh_+G9*5@w+$ouoBQab&3{Y} za+U2GFL43q@m_YV(#B9x?XRV;d6UdLHCK6s7kXEcgybrtWk;~?d(_i+F5m>$*k@Ow z-#e0qhi4r{azozY5OJ?3FH7RKvfG2Eg|@c0SeF-%MU2SLl24j8zosQ6y~1}E zS6Nq|G0z9wGE@7Y568JB-=LX|UXf}rQFZ)p8>dQfj|(YHVZ)9ubpghOI=ux?T)ZXgqYF; z(;fPDi}maqXK>Mu&nZTo_9naUM0zO($>daFIxx=r8sTrkH8GXae0SX9@6Fba(db*3 zaSjXi+~Rg zNL$0Y{^-pbGO%Gwo9Mdq97K}}5GSe+1|m(@z)}PtC#PTia@)?Kg`YtPUD9fM#4Y^D z(tE5xF7>tRHgHH14LI7VTlEvTXD`7R=ck-nDl3eXXxnUU?l8;;2G%`tZ!eKktW2wd zJKlr2S#TQkw)^e}@)Q|9R?A(-Ju@5D^@H!l&(L}gWXE~M`yOosS4mXs+LzlL7T=sY zxYbDNT*sDj;eMFOI{F{8sO2!!+bG zjqKmrFK>1zRBcw_+~Ia?bQ>nchI?GRP_HhO$6}7O$$3eFlLW++Q_2TjFY<8d#>Ib6b(HDwpcOvO*wKqj2L_ zuL}`KtL-V?i$Mn7!;#e1WgZS&{_<4`W0f5RhJ=V2BT6;gbW!@Gp%VJMZ2g;d{(&Q({9mjyWX2o;9%3Ww8qR;orA^3ynRcOa~;F6GP$xk;E;hC zrlKyBO|6sw=YlF53{OryiONXJSlmSzbz)ib19)#Paew4=9TOBfgIj-FIPSB$r^>u$ zk*KC3LzMdImxqUE4fVR+Nf`kt{pV_U4vg6P=dK?p0w$SEc-nAg>Wc#ta*U~?eWU27 z{fMI+I}6UFNu^8?X_YjuWj)=Wk29aFd_*Ti>Y4fl3pI$wS>kgDdj{(SD!Mx5{|mN;(<&$&_%9Dvft zw*0zrvS_0550s&-35d~+{WZyyHP&isoWmtp2>B`QNt4Q*A^9IG^`mi0-<442^1YIL zPLLPHE>_BXdmxfJ-tq#1e!cjbY_fS9VlZSti*lu8;HJ&oCSek^=WAv~LQ=IF_Vcb*0|!Bx+M*=%R4yGzg)nfN3fZ+*Y|n4i99GUJ zFuc2#=o>XepV-ZvR2NDab!9xxL+l}mLlW+5y4X~FIZL)Jr6gcYYb8lQrbeOeW^r7f z6#1KXKaM@vzwO=BKvPDA-yHb#sMIRm;K7e+iYck@uCpB>zz$5IB*UMXIs8{8wq~B} z<}BLKI2U5Ky5jvi*Ime+AAZp^jTv$Uo#*)#x0Dr~|+hD)oiGLcF>*pqeN^kSLo zWWrob_rQIr%oojtaw133>3z)w&L1wv>)S3eni`5F7!mg)O=Z~VBMxo;EO zqt$AYVII{&gf7FuJCLX=2Y4>74g&8H380;T5*v#*!sazf*Sl8~?l)l+06yR}6n4Ns z2RF~>CQV5{QaBTIxS!0LF)P0!WdyH%XbRa{MdfGXu+|YotN3Qyj^tk?zsYhH&glV= zeisDjp&IY=G!h&}kx=gMwm8G8`H@NBCqbH7Nop+l)S-j?_&f3YT}*yl9?Sc-@nHrn zCn^!EoI``OL{B^qZ^~yomiz-r0j{O*3OuuCi+_&XKdbtNCZdih@iKq)?Yg^&^MY{r zp7p(@Kqm+S4q?qsxGz+YJ*Z_U9ew^))s`D8+q6m!HxXKK`R#stO>*!_|D2~&T3Lah z#z`0{bNha%uVc1ZET!A72@0q48WHx{l_ExFAnUj!s!K1btHOq9d)g0GV7aUHIz~YW zGW_)py{Wmru82pgw0q5N=2`QH9u`p2OqbXVMOs>%)cxLhx|$V{CA=fc$`y5A-$2d# zwhj*F`n;KOEgw`lCp7lT7FX$}zHF3^JrYWaGmB4(NluARH=i26d-q%Mm;7_!&aOa( z*raMjGd%J$%lXQVlcTQu(px>pc%ZSC0CbiGipgj8*M!K-_1JStWN`nNr# zm(n8z#Ky1(6g5~+$#?_ASp?-{OiSMXJ|YM<=1?4;FvU$!=2AsI_U!euec z*}3fdP9`d?*!iW9EYyxrL_t(aiRa76o~p(r}?`DY9Mjw1o6+Tf!@)WOTS5VB;? zLbyd@Pg0G%>V9L#o9I2ZBc zIh5AMTS*tv4k$&~V(TBtJDcBI8{E^&p#|=`KTD&tEPRV^Ij>E!b~5gwm}f;3>+cZs z8)u{J4lx;iOz$r2`49qtr8lZ??AMwsu`Y-BYtRgN9L)M*@dudPF8AT z@SR6{GeOKZ4B;S@lU_PwiZkwbK@02)*sVquxiz@mlNi}Y%@lK4-O3so%(rBJTq&QN zY2_#>wM*I*XskPwfIz|qR%M_#OA?gz0}ezkrhO~EpS;oeFn$>-OAI~)W> z`MZ%i`>D05F1hsZypFbgT}{`j+Q`uy9a@!~z$)eCVKY|!bg8Uoj*0IO{K)5gp#x?* zdbV@eYmNne_snK$i&BDeNzc(l3y++0=5^>34OTI|na|c)J0191&ftLJfFZ8oVW3)4 zO-&S*E?r4W@qaunCy;W^6#@|!DrTI5Y~?FaXZ)D;6)fUx+lZ9)ZN_#{%N~&qS zIYJ%{STG{)-Vq!o)0h6?08&YJ$p=hDsq{|71jwJ98sH5X+N09v#I#exy&=NATg08z zn(&9taQGIV%=!!5H4pZGM!uX`eq7ipP9lXT$Dq_Kv3CM?yUb-UE> zyZR4JXVizH>iv<7=GMJ&k$w)gX^$EKnmu^S_zH?9#<6KD~LYih4ke5KDS@N&sJFs8!v z^<2B6=(F1MHp{qYb)i&3^0kL$&6k2s(drc>D6|vZuL-_3 zf}g*}`hX5#@w1U-ocr+W;~n8at;M4vjvzd|9J0{1Y>iADOPvGM*GBt-TAW?sdrnK4 zXKm!=aiaEZWWe6y05`)=E#k#Lthf~75-%d{@Dn8Ga;b_~4>7nQzu<^F`sEs^Xo|N^ z#AP59hdzyXF5QqSOEu8<)LE)T=1x)@wV0t``x>Tf18a)~q_O!0QGxZdD?Z(4>%Mqokx)Bh#6QtOsfUAyMEhj2f z(hOuP1I=+(T4g;;Yq#x;yDS&=Pu{N>T)b?kTZ>EMME1va%<4JNKg*FK(n!SB!@EGf>;t2OAWl( z3dGmCdh_{_Z>BW~f$lD^lXC{NLsH`;gqXzff=OD(*#a7Ewq%Y4jv#YM&3Tt3`chqY z95rXAU{Pi@B&>#A;UnIZMbzDf=NC)hE-{&u|Cq4048z(b32APMkZXmOn-cfoc87s{ z6)sUvhgg`M9T`)1BhUdLgPR}NEmOMGUc=1g0@E`AHJWE*DJ)29m)8O}i@1OT^(vG4 z<(4@&f=|8hFGgpgoSl=!VNLlf-5A=*uYaxTUl@MRPg#6Rq9x7Dtu#y4*JaVrA)uZ_13c;K2Tbj zva8U&3=QjF_+HkegeM8xKJ`J$!U0Z__2EOq!pp48rGmU3 z-aYQI9sA)yYPFR9&*7LFqy2z!!s2V)N1{R5f825EZezb9Sgkvja_Sk-sYe?>Pw*8g zTK4j|A26^dyd*VTi>^iV`aRZp$Pol8*|?uSCz?KsNKf1+qD=TTB(~q2amlQVbMC4) zO~Itpn9@Y{8R_V0^1zwsnB;PAh~52W0V78p6@6G9DQP~LMv3%svK0vT*2ul*q8VsCVy@Z?qBeDIFJM z&4{H=FW(ZN07%#$o)7KJ)-(yo%IH55pnZ7?e}O5gSPJ?ISz(YaC3}R?1i)B0cNsAL z05dJ;)oF9JT(!1G6+7O#WfDI<%J;%)dinWT8f>7n`JX=ul}+Dsci}PePn}c>?|fK^ z$A@)3WNbKjB<}*#(0gtf@i9C-BQ8?K=jk)0_BZ)%XQIVjGb@`v^TrK)0eMoFFu#kv zE4yeDLwL79o`4rE^yKmVf+&0c{vh6XYK_&|Zd{gWXVW^^_= zcUR*=<5Yvgic_cHt%n_&yi+T)c(-uAPT8hlpinC}cY{L3eoPIw|5ESl^gg%MS1txU zv(tcx6GHN%Z9(-tNHq$e2mQ$+O?1O8TG9MvM}VzSuH^o9d&lrNhIRbyB4fvM$1n1S z{x~i6aT)QEByI*($kg4XjdUC1?!0o5%JsqJcP2$;pbjHQmnE@{14N@EQ8{STphc|* z`NhqkweQi?=;EgqGqiEa+@gj-iRkjmoO?|gD}lE4xv*??J+d;a+4eIQ>xA@ikGN$6 zT%$d1iS06{-ec{ps-VMZ3Niq14$H`C+1ATLKdl5DmaqKMkN}xq?2qqPgp!)DAZukH zO@)PKt_RO$D%ZJ~+rN7nvrpxbQ*_ts&-TV2Z9mQXOySMBCpo(U?zZ?3Wkd$)iyA{X z*`_W0;-->g&DDuhBEEvddJ%Z^M?_ z2L{4|IE6x3p6>qK61*fjthD`y!do}eY*AP53bgBz$&Fil+y_MeTiU9sOBXzP5UI0v z2YN=oT6_qysgenIe0*EqbF0(CX07L|v zc`VIn*R2r)0FTA2>RCyK_65m=cki5`HFfu2$A;UHLBUI|@+Z|@vRv;?zFuix6I*jn zuL)6BkhNfg&`wN{MQ#Ib1Vl1`%rfaEa_Cko4P^sK4oEJ~JlRU$(bT2Q8TG4*NL4Tc z$Oiz_NFX=8Wunh#bVZ`7Dq{c5X~Lm@W}~;60%~^f-d5%su=C+`h1#`_dg>Q*%p zq3G57UoAE)m5V{$*W>0Wr#5{7d{lQQ9F&^Z7dc0Y)}8X#p4RM*_klSD!uRGuGD~MJ z*rdQ?iAfMcts3G16xX=oTIE@u;&a!f8ZryM3m}|>tl0B)sW!8?{mwnF`L}X~{wiP3 zJW?McTAh;wpaUF4wSmeaQtv0Dd7Ey&uDR_RVB2Fb;t_D4fw!T{P)Ejq5}!R#qG35l z_7-BLwm$pr$NUA5{LMn&#TC?6b_fr`_wVA{MjrBPCod+#67|&Sg>0SE{nNzp-Igj9 zLqc=;tXYNUcks!6H8C*+ zG+?u#MM=`gm7EJ|l>AF)sqpX14}&N~o-K_7NmSDA5bDtB{bNU+0D4a6jIEb$vC7RW z=JBXO@?YC)GF}2{t&miMfz#YM_X**|F53v$L&Jk=c!^Kc#^w3BMJ=Yl=Vg0Nmua}I zPT^yh-O&Z2bKG_$WZ)98y;F8HQGDZ9HSG2?h4OPRifm1RIOE!D%&jO(MF55yqaPHV#Z za9~tsios-ew5u80t99!FapWgtwzzW{z_d;mASl_Tk{|IjXwc$N*C-0rCs^7I3b+Wm0amuk&d#{ zp9$`2q+&D|vX)vPKkOZY%=ma~bBr2JK3VU~_Bb`g++ThNAX{Cn)OP3eUtHbx1?(=< z9bDjbZlM6rXannq+BWtepg9_T11LK1{jxXwyuSDSBKl{fqml;SnOUZC2;JIzJ6L?l zPoj4M<<)dx`oJkpt`nwOunOkFag7xH&8ib3gFIna@+Iu$Y>amXP%!flI&PUwh0@febWa z#AEwYLNtcKIpJ2SLF}#sz`HMA!DFF?X~6-_P}j>xUG-l+J`~alh>-(03wn0MBv57z z#23x;XL=STDkV03>icq46^bm5llQ9g;s87d<5SDjp~p`UoR1olV?&`WAO&Dg9M*g5 zVz}2+psE(Ve&J1hl8H{t)>XC1C$1fd3F}=cJ56KFjnpo`+Zz5ATeXKDN1j{zAWzJ5 z0qkSl?qNM`D0RxAa$ggcsqKJ0GEdhb$I-+0Lg0EI=X3o`Ub7B;(_EBu$6G)~(sUsW zvqz4$fe}nTE z?f}o;nCZ!hCiz?9^qoHK$=;+4xMVec*R6Od@7*#H5O6WK`a*LO0b&5a>@(LXH#ZxT z^EEl6R8i!SoKIgr&Ci=9133L0bPphI4PB6<6Qv=OJaQp@Yv;r`OI+kN9)XVvOu~y zI-`wbcCbr?(^=4l`1jrVwHaZ;p2LKX$^9lPkW}86!iR-+xaaz znu7RB9{k2P$65#MPlkvIwnvV9r>XXrU{cndBjtwy(Jk7bvEf^_AGl!8wLoq?n?|Vm z4_h7{Mue@ZawnUdPRV$8?M~!wzFZSsazjOz0f_1#W1we0lmR!krhX(gCiN6n^uX*Gd*kzZGCmIL#hqRa5 zJ1?_wDg}r~YAGO+4D_?G)*ebK2YFFppqnQ@RqF0H>^3Ypgth=V(dL}4_fEG&H0qHC zixr9Ug@J4}*q&qY`1X<8Zq3T19(L8;4yS#U@`#+sCi8)*kfl?+ZJ$_curRxAt6Moi z@E*-Qs}suekUgb(9%v!IPR<2QBfICk+vV#X(N}o=tF|J5Eh?m!Io7$qFlJMe3_+19 z`A0F|NBd{I>0h71v!S#|+ntuBXg^DSMJrwN`w&-qS8lo^v$G;6?O4%vgV#nKfu7B) zPrgCdmo~h9vYWZ3XppwJ4U?wP&zg%)mDGTA#0+4{@O!R7#nazyZh%-{IH(_B$EvH9 zv$)5ImJjJg$rDJAM}avWCw8A&CPYr#L|+*{Jdg#E6(pN*#m z;VM*Txvl7cs`Btb$T?TW^uz}eCIO2Zaa4FILyo+l86+Wvjw0n*iY4`L4D!O&WrX*QFqO2}d?#GnmtZk69avcJcU-K^^cPBE} z=9e2t2*(jV4C4=ahl(JdrE~^}sZkMh3 zkr=}3DJ;d{FoBJgvWw4ru24+Y0JsIB+jP~Lv>P*Renpl9dTCFcTwbeh0@}qpnpAL2 z#Ojcx)KJOYrG-h&HXJx_l9VNc>4sP6p9ngICdzQ7DT%>L{zB{t@an63iJdv85I1Da zg%8qh93Gh(H%js$qjZG3hI;2f4Ffnx{8WR0KWR(#xT2DU87PAqD{0LUFf(V?D?e2( zzn*Mjc;v|@(7q?GY-eJJiJ`46KXNJ^1<5c1SlbV2Mox@I;+40Z4>`6_r-i(&5sHgC z#UK?=(wZz4m6FumP*s!fO*KxwHCn0>8R$3+$WIh?m`DK0HGNQlR(eKWwi zB~{OkMu~^F+`C-VC<1T^?o+Era$oK{rv5vN0otV4H2nBNG)+!l#+GZF9W5^CBhHOU zw7XKOv-n5-*FQ;(e;nk8$Lr~{V%9g?>y29a=c;m{Ue8Mr3p^QC5V+TqK|O;(J+#@7%3ej=t(u z<4*|ryZ$uLrUC^aX$Ap#S5dd6w-r_CPd+g#l7_Et!+8aCfU`IZZtpCpAoH7ISS?$c zYyCG@whn@(1BZXiES$pkr-U8zA|b;fZFZ0sa7{f;An=~dXTyLPN$Qlk>S5F7Z>iYE zvJ!JaKTY}@Y$v_U>KtwG;fBa6U~<Tj`HP>Mgjxpd_vNOGwD}Mr_ zF8L3&X;8%LZkL8A9@NL5vVy8G@LS38vSKePIC56moyVO`Rz%$7GB^Y&xnOpNX~X91 z+r6HTy7Sxs!d;|i-JC)4iollM20UT$g1m5DTM;_40HNB@+mdX=AmwO*CoC%aH~wYb zzuTju^{q*zuk-2=IC_CeUy3ARGnwFMqW8f^ALFYW=DBnU{rx`z}Co- z=W&ib?8!AAL^z{dT4X?Px0+%91+ZygVLUC)bsx^e8BcA`Y~Bxbd=(%MpGq;&bSUYf z)2(}9tF!JlFfYuAv+(V++$THmZZEPA_^NmwkeX0ez681!?A7m0aJrh(nbe!zS9h2} zg6;YeGQOIL;yNNZsOH!|26=y8@vXfY(5WCCu+?3Y~xR_R6OI{YzG_ zqr;g_LGfQ-T*HXH-`Qn~ic_80O?N_G4+;&})L6C@A-O=9)U)KFQ;BrY6$ZMrt>;${ z08|5D*@+q}aNR4QzLzQE3Aha%0~V@fS~9&rg=Zh`5e?OFWCVoa*RIt!(aj1xpMZVM z{35w5!tNYIGj?6Mv;dmER0zK~@L&J*Z~Lc^!_Xh(ZnkOkYPxroZqV=H=Pw;~yP>E~y_6F95N<4z(#OP&WaZ`j52A-o&jcxk`*kP5g@+rxRJ5{QYywM;8lpcbex;2?&euUVh4f6*{>74--SUf ztSoF(@;`+G0Apj|H?DY$yn|gOY1gXBW!|PTRjc1g71$`i>Dw|b%$&S@taYdGZLi8* zvuVxUZ?W{Zx*iUP7om{*Y3=kw-uFDFayhmZ8c(7wU_J&Cria6$&r#t`j2SB;H44|* zCnhF(t9`$NlAeRcq_6AGAJ2FJJ#w@uBYRx3GYvAd?SWRSXdnJ1N~w9{RtB=Eo>#=>Gn;&>%vTO4Zs6F4ocRc(6<|HjG)3$XDKodN` zJY6>;JgPz4_p^uhcVftL0?@TvL4KfUKCozSl2MU?f3p;8UuN;u90H^#`UL4uI48h{ z3v=H*(irqEC%8mj9&Ja<7;H-YBLtQ_C8vLTeXVIS;d<_&=XED+`NobZq&2uK=QTCVYzl81aiarP76yWD$ld+cE8z3z zqS-Z%gfmch>s7=|T+^u*r9d9RdyMlDnrbX0H|Ldg)nypu{@}(mj!wSOn#XuA(c1F> zAXGoa2hUA~2FgdbTehYAV$-dbYAFx}Jttn)Nz;8^C09aiivMnznlwqeS*W2{lwhJ$ zy*I9Hrm`|W4(MS0n6fjCS^#C85)*wtz71f3b5kPsAXR&A^rj=j!~BNtJ(o5EK>o(r zg8+?~*O5)H7nOmm+vST_a;eD%UW#j1(Dk{6u(8TJ$7gk=es*zGc6qq}*{VMd%Q+5u zci)-l+_q{ROC_*0Rh`v{xQ12BipDV?vVkpz;P~xAk2m;$jaAOwh0e+}^8B>sWY})< z0?NpI^CoY?5ymD*qTP>%d9p$A&W2ihaAW3RYwuXYd{7O}LQ>}0JHpgLPBBdXSM~){ zNEZTbdf1el+P+6lDfK;gnIF|a=gdBsbW|Wsc^G(ocLhXkfYjetL`vo8S+~#gN^w&* zVpi@N$C2s)c8rc$#&HbQg0AR=?LAkJ=P@=sQd3#!(4_*J$xXX{F={b%p(rl@eRbs5 z8%{O>kpQ~1KKXVcwegY_tI5p*7h5$y$0rW6&qf_B1d=`URFrNHcSDjxYAggY1VJZI zgQKFe6?+Zj1F9DQn2n`1KxpI?F&lg&HDG9+2fa_nX=4o6={Up#Fk=8b^_!w@zuA^v zZqI!77igmjngGQCCGB1k`-%gLBPH2OQ7f`Q*LS%{oheS_$CQe_v-|lSeX#FsZnw0~ z$S&Tdoq@K^lrd{f!U4l>l@6%wSh6%9bWS+u!lUrE1<*XpkT!F1ddGW8^oKvZ=Q8Mk zAPZbdlI#Qhz5pYaSsIMZ6V-*bf-h>CmVC&{LssYc6ZYxTE4 zVeh4hB!P*bzzGQ9!@Y=&#I28l3Was$7WfR1VIEnHH5!cisn%4!?C*u=PR%V@ir%NU zq8YE*BCXy6pp{;UXveLNbsTJeM`tX>W!ce3=@hjx1aJeOoB$nHu{%@1YrCD>$qk5K z5@*Z;SAce<{eH*?e8} z))~95db$SmI7t8icGOQ&ShifzAFnLBy+7a0&th^bQ?B;&kgXW4ooFl(q?LdWq6{9D zdCqR9w?Ijs6z*au0f=PKeXTXs@Y)kQ7gl9Bq3+A%e2{z6x(pO5p*$@T6%tB3tpF}B zoBrYL-rCZg8mK;FYox(FTJ|xVeUud5Tn4(BQQL$A(1N({gBF(D`FVJN1p6249&CV) zL!hAw#<%CD)AL`t;Z5%!F>zw*Hhx4!GHJ=0HhQ+Ff$&S&tnzO7;ncy5Jizf-VlQe~ z9c9_jUfy{AlMY((A zRz62Bqqt}HgPuX>s#gOCT55ZD#47;DA~+GmBP1onC4La0uTwl|AAHbSaiNT4=-any zR-zZ=$c`%Pwys~zmF@Y`27r3LTZP|4scqlG?ry3i-wj;s@v^>A@eM2{;vvx(@Tn}m zrpjBu=-cI6yHgvMcRm7g=&iH4>gNL3V*>Ue>?Bj&HA!N|s}W`!BX7wSVTGU?HUJR; z=Hr~}t?NS4=3B#nbtPoJk0A9Yom2gr`3PT+=4s_G}{H@4B;FD zu(;`f-U`f~H;q_k6@RHX)L>xj78a?f&UszbBK28MpPFFPf2buOllE02K>>r&FzFNa&ZfLsNb zLaDMeXxcU2V+7a=_s@kOae*Vb;7?&XdX90Rks^t0st$Kl5}pDjT3sKL!L<53kFWeZ z{pzN(pBhY84h#wtlVhjiFK&yGepLVTn|w}{j1ZSndm{v(hyAU`d5h{qi@2ad-ForK zwN3~A-83g}a|P7Q(Iz04fYk$&2W516gl5u31u1$nM++$0Nfx{VP$J}3i&MGK?mPP3}(8=ZYgw)bce^_ZDm*e874_XlKeiJU@t1HMZaB*b3NUv>f(!R82 zTaqkdj~7ImF?8+NM3jp=bw^IH14v#a&9**xXoi{D-&`ZGxjmR)lS8)1XW;up$p@rQ zTb%ve3XYYX@rvJi)VsZ?e5`(kH01GK-pev)-@u-j!?S-`?eWGE0N|eLg>O`x!O3E# z4)Y0{2gkeBdnZavj6n{=VoNO9iKS#l2tj_$ZG@{M=zL`UmN)lA6_z$UFQ5x-9 zP6Ky#w?%N2?6o|+&Y`4WavQmf;&Nl znR@E4-iX|C8kS&*vDjfn?>l>?Bj6l$Z>G_i80`%!i~J;v*k0z!$_h6$VN!{8&1GkI z7f`(7rwaiQT4P*U z{gSyn&dHblC|fsKpkkAg(q9t!dl#^JMB5UUrJe>oLByXp z{ns{l;(-i*4(eC=$7e&F`9&C7=9$2Os>L}Y46p|q8~T24sk974BKu?}GY{LiB)?DZ zxS)b;^*T`_x!rn}`?tM;Uo|*|mz1rh_1u676$9=qpd>h$xbJ_wl^v_4IqZ$Q#{eW* z$xn4uyI!PxKle5p+$C16igGCMlmKqydB}0u{Fxqawre|O*+HwFVAlp7XIt^caFDpMqa=L`^zf?yl~udpn`5s9p=8*I^KwnD690&OD-cv zRJ1nZCx15d)-UO9PchgP`RSdbHJ-|65D6UGL#fXR6?0w=fD=-z99{07afM07N_$}n z*E&ePODFrW8YH;@VvOU@LEV-NG4Mkbe;vo8?sCpgwqr+8jltuQ z5^Vpswj}g;gjuL^82V4{B*N2yOnvQ7S_q7wv}AM?=6a26%5{B!l;OA6dVNX7?fIy< zNlB}uw4s0^2n03#UIDNSpnwCivJSqX$QZysl|{t^QEb4{@6@HDs9O_gs!w zbZTT;exw(hM7!YxhcobcNFLM+`$JxY%&Z-6wU?DTP|-AYd$L?ky3>1Z%{t?1ig5jN zdC&(r(WW^QTg2EZZJ#XEptS^?pF9HP+A+kMI$s};>w8rt(smSpqw8j_vtC!$Y3F8n zE7#hsW4js~VBnN+wGJ-g7oP2R(cJO(O#TAfJ%SG@;9n6_7C*@y8jCJR3V}P*Pif`# z!4EAErM534w1Msc_0)@{~ z8rvWfjR{{i#zi$7=zI!)H}ZpDj{u8KgFAV2PagiE0fCj+4;%E(__==c9esl3_;*7< zhGw8`rrvVa-$E(@KF+INF8aeyoq>wCo zw_TZpm#6n^#Xogfu3Di3N31xBoSuS3p|%C!SQgaxHkTcRqNR1&{3)0V3eQbT^YrO) zR6$i^X1B$=%yL|6iW0imIetiX_#RDx-v5g0J33S?nrnay!m@Mtm#q#8*Da_VSuAby z1dWkM^Ln)s89pEXadU-d!Oek6k0NPGYiV7WW7>{pW57Id=R_dxPq-eLB3PlVRpspQ zkcP14g>7$B=`Wm_3Ql`h*5>~YZ|@xy)zZ8RACDqRGyx(>MY4e83?c%OB}*2`Ip?Gx zAUT6%1<6UtFa!a~Npj8^WXL&qYxJD=J?FdMTKBHsA9tKJYu32w-MhQGy6SnVs%xT@ z%>?2R1`Q+}N1v6vI;KQ(*Rz>AU>v3jxH&e;2NS#O`1Sf_GC+-+$*3^ur-w)67i>fM%nZvt7S327g zV^a#j?|W*k8n5VZjNT(&AkaG@QlP%xZB0+zF5HRy;k!5{YJjHOz0m~{DqL<$Np>rSqoni; zVgzuPHV!2I3x@BQ|VKQ@&v9rS!!!aqx%Kc~V%I->o51{bBX{?9*6E8-w4y!EEU*C7bP ztz9E|PQO)oqCLMdCb6h}B8TM5a^UrqAD|Q=>wizHYs6pq+V5`s-sIp0b#A)0mm9wI z984>gM4{(*PTD$;W|Koofs~4q<6x6~I1fWEm#fW^Hv+PMu}!PDC1{Tw)vMn9ZstD& zbp@Hay1r0s_k4{;DvAwTPq74VV9zc{3ZSAyTW;Sz2#@m}f&oRn{(El_qF=ASCF<`A zPXE2+U%yyI0(|p#VIx#lIsE%a0ioZB!vEhT|D!+pPhq0}wEMsR^8dawzaAR~?SFD- z)Pwvc6hJTj`ue{;(N`j}@e|I6zh=eJ>ez|+RQBROCi&OzP(A7&KUqAtT-tlop1m5x zt5eoCOkZtiFEYl$ofq2pfp6cxdZI&`wj{kKD?8tc6+3c~YUFonICTHN^H;lH$48T4 z+h~D*KfnUx)Wth6SMQmcOY^YuL+XMFkD-MCZ2$Tpl2`TmX?<}?>+9=>^1s9wgyX-m zbS8y^RJ4o4<}jO7b9Q+~{nIk)2Ojy)F9jyEBnNfYu}sE@yHh#CzD2RNr)*bH4+2$o z{$7n>0_b0Mz(GiiFeK=1$#77w5Bl4>eZMKU=WBjTuZL~OBQKO~+kbBVktpK$x}tJe zBgd4A^;)eci97E)e_R3Xi$E=h19$Tkfpf#Em$M^uq4V3F`pv;x@vNP0H#Iw_88&x((gr8Hav5lUiwS)G zXTpE-k&uwAS-c2%Si^Pn&QG3Q?fKZ%z0kN2rPfJiOj{fYlAc0LeV7RMDlwhFQTIpl zA)V6wGNpzj@(yG*=pmVbr-gC*`@s-@DiC#ShpeH;#4*>hv^+_0i?7vWw-`TN0ccC> zVRU)SEw5j7#!%J9Py_vI$UShqqtPK>`f^6_d7osF6Ide<+y2|7=l0=&HnnL5 z`|6%NzMUT&N`sj0;pXH-2%0Q?COjl3gqxn9;&}=i*p`;C4h#$^DJe!NDMeQqDk@U! z*(pi|mDn1aY^)u{U;Vd8(%O`dp;LL3N^1{tjlC|cyH_{CkhnFI%|p9CLNr94LU!;G!PxlscRdU0ZXucoaH8B_Vq=%nBWAMWT75JE0$!pE#8tRn{6J-AVcD zYR*5NhkdzDV*Wx<#d$rtAt3OEH^qHkV z-ow6T?TK#5BlD7eNT%k{;=XtLi@T7h9*9J;Sod}i7AbxC*m1f4hU(9($U|U>!bsd{ z_tubWOYO80EtlO7JUvFf=)=_;V(-o%@9@At=6ooD2BI}FfF zlex40OSm50F`+|bH>ceAs{X9{v*FL15pzUDCc_$uRXw%&zW>luQ18Pt#edW(Bk&sz z(bPWmF8z$J!r9FJ>mn^i{nJVW!EO~IHr2hTydrJyb$GkzTI3RK+B2j1K>fw_OpiRd z&5(A|Iev%>&Z{xzIw^ObST-rH`7k{xY!MqIn z^7&kzZZ>b~VG9GkiUM`L(IM^BWR>=JitMgHfPUihavFo&>h1nFsHX+kCP!7=R+T8P z$ZXDA2NqJYxL>k-b?VwnD_M>6BH<#)kBT9g8X6TBw1vTN%(3kmwXtTo_~hdGRzH7& zL#T}S@mcAh2-u0g$`qkWm0dchrQ$Dg9KdV;iR@3XYjQrf2$si*KmDw>^Vy#+twJx* zWXt)zFkXoZUSiEy-rgDMde3Qwz zt0~K`!I%I&IlbP~t3VKcdwol8G016kMF0M)`n9zj%`GdGdijSkZ~G{hl|N(D+&^yL z#--lBBi2brq+^QsJZY{kEF~l>yl!}hy0d}Gz<`DD3!yOW{`InsKmAx#lLXe~POM_? z94)cUy*6pOaBjsVdHJjY{op!G)5x|V){y)q2ktz#rGX+{IE*biUTWXDDVxBXw$UK5zfT%Xx+5?FT^(joC}AYI-dT6bs%T1sRs zGnWQ8_=T~uq-y=g@Arwxk(H^Q&y`^4T${*=Re8SU>V=BY324Jm zQ@aCi7E;~NKhKlizAw#NF|4bO7vo8N$Rc8CVVO#Q454!7?!@%c6A z!?2c=ahQz0XW%Z}L9oe@F&=tk? zYR6Jt8e4uIU3Qoemgh3{sqmeHI8Ru(uox)FJJIUg2J^9Xi=>U$MvHu*R?LLt=vD9d zPf0{vV;J^HTX!3Jrurtkt3MZiC@Be(WV;z{SrF1-Y?_Phj}u?(L06&Vs(K#>Vv1gK zxKG*_{J}UAniv;bug{V^d(d%yULztd^wRNryD2g)&HEoq0MzH zcx*;)aAsvqITS(DP7`Q>P{GvS8f$~1ao6gFBHIE4bPD_Apf|o98dN0YRtwVNl;3P?b?xS* z1D~ci;8MbVo>{LXd<*VP!mF&fwuiN=7H%3yHw?Ic6OY9`l63HrPQG{PQ0d~yrAWCM{AX%uICeQ-$LMkP?s!MwxMUp;;x@^E9p2>38!$Hc!vygL^b-4{ zYjG@7qm?2Zz0p;jxw+7t^%nJHsqHeMeCr<;rMn%sX1wLrh}M!U{raiu=B#JKUulir zJ$O4`ey>*i-oJFj&xlo`_@!j#TPm)7ocWy@nHH=#u^lv`QZmMl(}W;QuZNTg^7x(^ z+V$=Juq7=xI65C4=^tMv`f*|%hk*G~Ga>(nQ3sG$j%NcB1Ch+J_j>Ta#WsVKji|F5 z9jkWylP-ZRS@&(|VO0$+tpxAIDpKjz8?&ND=8ni(dmzBRh%qsm?e(KOsr-A9bra?U zOpf=88<`VINl2J*L@=#>S{063vaLFx=Dc1@Jb2{lHG8}^=qZ6igK!qrE48)cR(T)JcEKK_CR=Ds?v1`GxI26b}j;=Ag$)JBl`%?hVin z=!y^2UlC@Zk1^!V+u5S?V=FTa`=aJCaV*A;!ipR<9&wL>Rd`j-PS9!+^SC6s5s7gH z)0L|Z7TEjI$-sXZM(5-29h=Ww8cD$0Xx{IkRl%%%fOEnW;OQ))Cpqjm)GKh^BO0al z<3IVy5m5Kn#jDXUE)S`ahD1DMjXd|>22sn&dHQcrGw(8V@_SfwG+D@#yuo^EoP1=+ zKaqaY$vyzy1CxD}ygJv~`^gj=N|ZNOgdz|pGa1nam9H`ywCOTy_7{}6YHH4S!C>%R ztZHlX|K|b&*gBp(J0DzzV6~jWo_xC;7Bkj%EOCL+5Bg*Yyrb@ICaYzWrLd95d8qH} zpw~m^|ESW;rj_u{P}*2ucM_}}gmm&K#i;6pX(VzfOe-|t-y`yEC#aVvfOb`Gr!Cw@ zv~Mo0GNioSm|GtYOILF_9gtzbT^&gHBo-P8(2ea-)dAV7zy#Hh6p_cdOSljs5pN!Cp zGf2MI=;6;3N3W73a-}TP#tJxD3S=*`yW)n?pdIP4DHx*{`1;j0p-ieE1vPmj-t^v$ z^vIQ^9SjK!O=+_Oj7$3Q2fuUk zfE_i=-gk(y&z_uK%BrkR-9tN59cy0e?C1p1o1khbD=fV9FWv6;&~JnyV&B+2>`N+Z z8LvCq=gKAu0!ab&jLN}6?ErE+)&M(+4PN02tJr+2JC27Kka=2dJ}h zJ+>d$&U>zuA#5pwk-pWHz+(`_$8G)f6yQQ!J(#@z1FFhFtOfdsOtH3 zrWr|R^uP7WiB0}`XI^CHAvK4V1C(j~QS~E%|>pO)rvzv3GYZBcc#+mEwbO8u2@Gp=qJT$y^GJ9-&I-v}i?Wj70aV-w?NkQ-uh zc8<23K_aLg;NM!REyk0N=!?)yG`RhHAkVO`B1`NB&OcrNr*Gaj$RV`*toTF&>&~SA zuP(S-Zs;@RUPQ`FX6%hPqrH(CY(qKz?m-FD;RPIY6YRJtvRQ}nC^vbUFx{$P3)`JD z2$4~%EUY;4NAiKI$NKyh=f@{EhpG(I^!{sMbYpu7wzo(VBqW}%J=A}*hh1{keS%Jf z0^UzW3oQc?eh-im^u_TqE;4T#d4f~_}oQIl*l5&zNDm^(niOWM4 znxp&a9SOT}asHa@a|5+h8pWkQ&|^Q!Y72(lBQcYbbZ+)KO-KnpHK)X8T#)}Dt7fxP zNGGDj8q)Y-5pO;^63_aDt@Tx}L8TXwqHCsZ(PQg+EUT+IZEXSN69o&RHv z#ikm5hT0IdiRWr6%0VHdsLhwe%SBOR4zxE4>fkfBuVbI{m+yMVFsjE;^@G)^R!Kvr zFMeyuTu3O$E2Aj9COy#ShLxzi%EZ&|hN*x7?>DD1sh@HmiwLz+ecK?j7!0YV0z?VY z5AlS|wtHhD@mN_E)>PtNaE=t0vQDSDRxYV`zG!Z1bT7t^i(l&xw98fhF*-)-?(^V5 zGaZqkaMOefj8saQ8uwT>;R-uze^qow)@YnAYh<8lXYxtXT=*<}ukv(tCQY1iWb+pB zhEgt6X_T{4mn@?Ew_nZNO^Sx3#<3Cb%rm;Vw?J8UGB_sY$F z$jRLAwmW*hiTUb+rdZZhTal%&0c5MdO|zS=t)j9z_uISdcnXpoFtH6YAiwc|?<9}4 zguOt(;|D5O6>`%m?d)XrvK(|h&n}_9VEzztgm$fozK*a(1LPZLVKLoYN zK?`iqBdUej9+Yo;+*9-jT=X<+a^M+=uojZ`4Lc2|*mdjs5yKH|r5OnyC1Xj~we zK${DcQ)Nskv-SE(zjKZrOOsd2OE4Pct*}vpquWYbf{rz6@ z6HrkF%#?Y2-2CF-v0Xh~iQ-q2+ZhuQNbR2(*Xu|$?%W_H+0Q;Z2j~n1vYxA6KA4d-ZfgyR8V{+Sro;4R$e+-U)9#>-w(|eVBpeqE0gDALL6cr z3YC54l#!NbZ0SnLE0J|1De`ZVbEA`I)0yy0L6_kte;ZL2ALt_|B*YfJwsvFO#F#d6 zm(81w%JT$jwpLGQ(05`JLs6uc_+GT9B3*PXiv5aYb4gWBbx@|kT-StuUj9lQ$+TkA zn)cv;(y{OHPp&VLj?eAP23XEZTlF2%^wVmJzpTR}gVGsKV))w>IxyhVNC=NTb&w%I zoH$()zND-WQ=2e-4#j$)3fKE`>$;zL?-`$MLh^eI$AHV=%(_{p&A!<^o=CRAtt+^u zX{CDL&}>W|Lh9^DqZ7=!i&(YiES77L-&-E^$F&B#?ckHmW9Cg&eL+{6S~}XA5|q&=tSb zxTv?F7f?oDPJp*G(W5ZPI$&X#xyWZOTnDp<>%qvTqd|yGA*^9%LU7Vs_@wZOj;g+Y zX~n%*boKU*$K7oYm>I0UC0Y)nTzd`y8MqKGSCP`gq>BGGf2mG9BnX=gzpFH#ABnqN zgq7h4 z-Y0x?5#KYvgLYS9u&3OQE-8u9y=!T#?;q>MHd2wECHT_uxtkkah0G))$H9|Nmrp$!eU~%q78$DH!%vkxFukja9TrF_P*ow9Sm#e z#;cn;U^B2v?dh>8-m)8@PcZY%^-)z;URm6r8TRvd@mN*AZ3-J{q(UQ7x~NhSJD(ic zq{>HkGx^$2n0NSM-Di)K#@Ny0h|D)b}d>vJNwMOP@4pdPxqSQvl6s zHql5NY$st}wJC-DjYArHJ-KJcN|f~*xm53qyyIdc%-4+zKBS7+L#b>HWo3%tyS1Bd z{1Sy9zj*n?x+*&Mf>TI5&nT9YkX_HHo6u>?>;+J_I7tj3Ze&E`To0Y)j8n3_@G9&; z4}INyS!ba9#M(1Di{DAzIl2j^q;=&0t!|=qjGmWUvf-(Wl7z6dTH|PAP2nnIpQr2{ zlZjJ4#UNXxAuZi*nusQEznL>jUc89V}NY|Ky;Y& z^N(-9mzR7J2x2%*L1}|Ld3&hFIT9U>7laQQpmg}t3wcqK?GMGB*r_*D&=~Q{d{wlx z7KmnLl%_)m6xfTIFavN1&R;+pm6A+QEg2neQa8_csshe}6AO`x{K;eE;(oPc2fcC# zL~?WWaLc|@8{J{<{ok%|Eqk5YhuVVl{8bfWo|%~?!uVV5Gq$zGs5$}}EJgwr>LNaA zL$a&o>cM`92uMzq{~#kFnv);VDQwpmo(+XMc({3X6HKMYtE<(_aW`KSUqf&V*|4YI%?J9(EuRaLVT+R0B<)E7hoHIbIu$keg~HK-xa0E)b=-kxVs zEks9IG+9OOn3n-KZO)6F$i2a9Zz*69aXulv*I%{GF)cGb7=2koLWheUk6djBPA@pF zq!p|sswvHmO)W`?_V-Q=vUr#5l@U-?nq3ohHA~tkmd1x&|G{S1H2-KvkK%wHEKloE zT2K@<_uLuykr>>@ux6ta^>n>fSDD##NYF^wq~zWBBy`Ym4b(W$L06%XlzeEpR)`%m zx;np}{UKHVrCB^_7IgH=^cp{F}ohPNwFdY5+bWS(KeD_S((s~F4`yx z`UFfIm|9LJgi+jTyCHQfk7`*7>%P^CtXP`DI9lmR^LmG|#%2voH8vWyFJPRQuOpc zn0`nz{*zk4+5Z5n>-Y;hlcXJisK7~Pk)oBrBL|nod7J9Uf+kjeYxK1n-D}ceh&X?G_ zCAoTfyDqUIJ;NZ4b~!Ul<{l3&6$vJ}3O$~U=-T4qF+UC+JB<(Vq^Hcind$sjnR%Hx z=8G@a=hsD~dt!M;t{~-Xfd0t{$W1T&7*yf#xd3{S0wViGQ+w;8+|EkBQg~HKCwA)v zEm@{*F6C|7P=}OCKh2jA@;~+X?gz!N>_`3NRRt_6EN%v!m z?#EJx=F#Bw#%w8V+VbYL`XFy`u7*hKi!^LM6PT^ zg@%9cJ^p0VYhA%tfyVV_<_)9Sq&#^p7XFANyju~T+mhr# zw(k~UtDLBP*qi-tkfjf0EOW98>d^7QPyIQ!O4CV{uO>78v1B{Ao4fIK&uQ`0bc_%; zeV#=Nbv^pg$fvkgbu6^G8ci=WC$*fGvu>pIvuAG(0H5cwuzU(DgaV)XDb z8w-_&l0@Thm*-H!5AB}#_%)b)SiNm@{zm;u_CqZ*{Jh-if}-@hn$!`KJ)NJJR@Uzw zJb@i~{FJw)Gi;gx6vxuy@VI*StLL%1!5s;-alH}+^{RAk99`0USo#)px!akqWKcq}Frj~hU^=YH% z-ehs;{{3M?*iD*Hi;!oD0cE;Gm0^u}$M%paF>eOg&%d6*zWfH=Xm298U z%IKy}DZ47t^e}oZk4;NQcd%w*W#p#&BWjg#BSiMW95go68650=oLXuaO9;BXFEfu% zQWZBsNkan`nb}J{RW-G(OBwI(VCPDK+m>U}2E-#yfb_@yRkhevwRk1Pn5&*ABvN`r z$|pX@wAQEd1dFRLZfD&#j@S_*S(j4Ew})W`vyIglu-~Rn4sV5h!DK5xEXPDYfTd(5 z_619oC_peT_aWP7c5s3iA9j&mxC57nQFXF+>%_3S`Bv=ebkBW?Q1kL_D)Ay3Yof4G52`YECH6~S+k0<5(_!uja zlh7IP0ATMcyrJDoOY09$RMLUvoHT8Uo?6t|+b9j+Z@q;~!QK!^isd@1BsPRZh zlX(PcYHpC;1cblvc7J6ht(!?7^j??(O_$i@m3S5CyrK{n2^%4TYA@n$)%1|7$bo?c z=V(gM>0G$Xpo1u@Q&Xc}%`M)|$(luONKLZc5>I?n5<4ybuId8FZ=al)xYPrSqr&Z1 zBsM~N7wN6ty&FIHjAMok$?ja;H?c6epKO69>;!x4AjAHA-cwH=t~B5r#Dgc9JQ3Mp z(p_F1!TY`&-=NARY$e$~+^}~jDyIElpp73Hd9I~rY(bHe^@Oq`E0?x9HOth{Y*5&O z$|4O6cj%&0{(e8zdCirtbZoIaUW522LyO>(A&F*VLWyOJ%$JecTaF3t{1zW-LF))S zf&jiHs6|s<&6ijl>^Xb-J@ffN3};Xvr1`#dd@1VEm!mTFmnWx{G2Nx_z}HMBYjrTE zscH$dt=vvwjXJX^kik%t6-sv4f9I}IBd4fJ${tQ%fco@%Qb7>UfGQsV1+lj#hz1k* zn5`BdTBrxOCpcLl4+8p02)Chz4Uot8Aq@qT86X@Z)(_9Ady4Gc2als zLf%2l#QDN!h9jykicMXN>}yiTbTNZH;PkG|ufwXzH~nA-!Uonu^EfpRM}(x-cd#vV zb-;O_q%D4+LvS{8{Pxpzfti#nu+HbgUwN0&P&+XWz3LLKw!}PmCkl`HMNgmF6fv)qg1?Gr_ra7jHN*ZjtW3dr%x_=yQsKn zM8$;#`&H|yNs#+?TJG5qkn$uX#%F!VK`w5zf{w&8c2-(FD}Fljp43A?8kUddDIZS! z)`Pn0>}&-Ut-k)cxIlvt1X;$b%ylw+I7~Y?>da^(v`bo?x5_Zp=f1vLBp^url+_}4)7@OndcYvtjO4c+uC|l!d;nZ0Nw>v zN0EkBAA$Gu+f%ULM4Cjlo!`&Pg70^w_HiD45Ny+6(aZ~9546m1D8;a!C7NZ-$a@k_ zT~a;LUnk!9Si-VvZYK9is}*SPWWI6$x|qq_Cf+vaL%a~^7c?LAt4JFI(H#vwY?!F) zUMKGY(gz0=!OOcnqI%`>_5lPdC`aGA#W&4cce*$ssrpLX^~tIh&N-moPG$q(|G=mj z>QKI@iE7Y?PJ(G0hIX%I>tRlsoVwiIDx2^|*odo5MNH*#Q5LY{v{w3`ISk4yy&R7NmmUQ=0-pWUrJ{H-z*C_}flTMKmATJAZh~V6PB*>Oo=|T^LaDKtl=t28cB8B- z`mYJGo$$s_`MeoV5p~ruotxNuF?~uwVu34eyLklWxI6Buy`Z?0uL*3M-2-dOPGJW5_n%d8 z#(=K&rH`GE+Y>+B4@J;8Sv+Vzu;7CzB?^}tXfq9`g<&j$IIrhmVx(m zev59;%&pUllo_j3h2sdI!2a9Zer|ETn06;q%d(w=2RdUzTAYKulgtn(^2q^8FQQ^k zAW0B1Z#QGnfO+_N`Y?sBqf6RY-Ui}(ynDxQL}+rFFOcw+z4uAix4sI$wSEZVpF*2p z<6RH+Un51!=pk0L!IkJDGQ&+wRM0qBjyv{v$^6}1-$0ZoEkB=@oUU_nLRL^&N>+xP z>x{p^SFA~JYM}44Wnqc+7pe~8yw?5!-Nh}4WcIwbgBL|Xq2~>XTFgj{)`z>P6#tWH z__VpHLC?q}uPz!2u|D{tz??GZk^_ZXCm{Q^ye=g4`oV+QBHV0jcu?ne2}xZQ6j7Fw zn{KTyeH=QX6SV$N5v!z?cgRR3tL-?hi{Bh9clIKdyS&e2mBGe1=zil!tYjc6p(1Q0 zrlPHAr=n~6354y1BqvP^*e>gNw~u7kt*WYhi}DaU8X8fa!Ky9Q-_0rM*;s_Z z733KX8EW`c%F%9=1JDb0qDSomEr8qWN0d0rn<<*Hagj<4`>^X3#q0*Y0uibOk4ZRdUyKg82R%GD`Ut zCgtVpmmI)pVE-5)1b~E~RZ?M1bWSq5*I@L{-GD%R0^$znUlU}Ao7)j;o!ym( z{tpZ#CZOMVAj@2IEp}UN;;9TcjE92|0C1Y34#N+HMAC7T>W8**wxeL5eir<5hnKJ< zN|J479zt$LR;E{6VIzPOl}5(s*_qNy^S6!gIn68>3aA-q=yJ1YaQ!f%hGYZ$LvG+8 zOU-dSi_m~bc{_he(2}aTC_U>ubcaqVa+JxF2a(e^&@BWz${{a?it)hcfToC$A8#mZ z@CF~sUiK*9#9t>SO!<(CpG-W}tgWaR6&5quJ0g7;dRM-~KsN(ZhNi)B9BXA>(eZic z*+V#hazuY)=0QeU3OHV_F}4pOUn@bA-Amf6VYN&REM$R%#jL%Qw;DP`ciYqFT&97|<*84st z_FWre(C@S>CgB(M0L^=F3)bDDVdv?Z>9+3Os(=EX6In}TrhdwzcUSVh4eKu$XM8FU zqddD?H*r)@^kuA^8!Kz+ZLHTGco%JLH*S2}dni>bi4B}CO(Zv;#7%hL&~)OH6xRt# zM1TvTho->>GK6rx1E!k?UAYYck#aL7YM1S%+>Olj&ebMoU3MZs$8>lwja`a73||AO zMJO>guE3c3QTL?|yD9eA4e-p1L{*|ML0#4#Gj$puAWHJWO7e}pBf+i9hiVWS&Sv$E zu$9H8cfqb--Hp%rJ*%@pd_V{y?u)sZl(1mWMGee3z-n;<@-uTtZ(o0EX2EV#tn^)W z&AE732R9(;ecVe^i;vnVuwPTcZFP0{KgEae1-VGR3IylfCyO-pv)WKECpk}0$E&BF zh&%-OUICRUZBCm4R&j#c_;UYXWZ;SJm7{mfEQE`ao+qIMvYh1{to@mUYv5L3Rk%>- zp?Ns;^h0qu?+EZ&7|K_C8>2_X7x_HkD6o7yLL#HZmudRB=g)W^lp_u+4|tu~d@mgYmr}yG@JU3#d9CXFs+I(J3PU ztJT4+Y!R)yT{l73V(<)QQ;|FPRYlDgD~KGqwnOz6ay6T#RKn9{93-1ZBH0Smvj-@y zkj%{_V#Wc;!(`&<{{3|D9WR;yp+mAwqld!%e-e8$0j0bX_Na*asx}Z7utMLTk@U(GNU2V=K3M{h&xGFrd)i_61(mp5mxT zl-+t=vz?WhE6KF#qzUbE#QCkd>Y&jY03xr;T)YNZ>}U=Un^AW*piN}^bB(@jH8@PB za7&TgBfNh~gL0>iwy~$GOj3W}>a4OUy~h&)Q5X;{P%iQ*gemU4V)N>Lne`W<-p`~- zriQMZ)5U2OHJQ{hVEeU=1PhuNFlP#dN*{xge#os3zIoFCKMflb3l$$9PbUk+Fe}WsRtD=E{@qjoC~l$DO-s?3YgKExaZQs*b&w9ywJ+d(G=x8 zZDDLvoG~yXlQ!q?!CtnalI5_+`tWUZ%!Ba04cM)YFP(r%h~lpgGZB@mR$@$o*Xw{@ zc|f6t7+zDkqdXJ|N?{bigPqv&Zd6rH_5J(s>G^fQ2(k=}nCEv}hvm=gOF4i;rc8fO zeq0IkigDa(Of(*bCj>=HN!T=mQmMl>NB%WlY=fE_)i>*HYeM%&n88cUmk%h#^U||w zP^w-zcKkaX(Kwn=KQIp|v#G?qi2zQ3YBrR4lq^F~Ju%v-39KSdOAPU87GW#sF;E*a zq~onyx#qbNYlcVdH}32W=!C#|AP3<+&+jkwzO8)-cq(1$$EP(9w{20jy`-j^;>hEG z$r1Kb$GbaE`E)FC{jZST80XoLUJXoC-kLzzOWx>e1COp(8-R zvYJm>Wp~6V+bf$BnWvg&$rK zguBi28^1%G+=~UxQr*_<9Tp9viK5)frAL?^0Mg3<`4bsyw{U0?gYt1&}_ZFf>PA z_u?_~fLnSRHm+$aDMV)8HjW=w!&ubGE69=SSL7&VbJ(?&?N_wOEVvO!7c-#1NSKF-X06K`;k|!?S|YGehSkvh2czJ#66;b# zYL>c|7Cq+;2p#{N`3QV97b{s<3SIn2EL9gNDQ};wnyOOc(=*OGcT%G9HDfx!Lf@cmna|60VRazV0JH&Xjgh7_@j`iQJe0QI)#XKTc&}%D3h(xPe)e(}?y(M%JlH08 zFl@X-HbY%L$}syP(u&q4FpypLo=e$aanrM;rKg{E@8FZr15^#Wz8+qq8!>(cBB1d@ zuzhzstv?W1@mw$L_*Ek!8dA{TqMzkWcP+y?g`X>7w7~Il<)uo05O{sOwHMVVz;uNs zw{;iYwwd`fEH?}-D77q&3=enco7Pvdvl(u>*1%EbZnXby`4T!G!V5B78Wx;K70S|{q(!(ub;mX&{OkL(;_vkRpr1+H<7p)(Nnj+;#^(B|KBBd zP(FVMArIQEK4bmkoT@e+J#`w6J^eExSV&^&1Jq%Y-x#5YK3VBK&4M=p^s#axT~Eu( z%9dz6p@>|?$Aa_Uf%m5K#*Bt*c9E4W^M~->9u=3QxrmC&qJ)^qz|tjyHN5=^yWnT7 zjMN1*Ir(Hg(kkeve5=V%R*>?os;NfLN?V+gU7VIxQ`$WtGn~$E(4=Y0w9H7Dy5<7sTL@G83VK zs)32Vbfsr-Trkk?CxC%f9##U+M3F&NQp);WG;XClUaXIuL!o!5qqTkZ^D;4hb$a^v z_a@WBNM_w1_Iipmc||4Fc{KDa!kxcF%QYnak^@)@^ekQ=o5A~wUBS_#qZlRxJToKo zFk;wy0{}VzK0r8PM6%vl+%*WX06Y#<;J0&rr0G(@%1-pX89OpEIw1Hc%mEe>AgICK zvM@7c2+*<7@iA#8Mh}R`LEOOXfCZ`+x7Pe3pqFY`8R%6d2?}c7Wo<^2Yz~{xlsdgT zWP0j=YseYj&pO4!YfL1eUpJEidfRl~`7&NKAr!t#~KCr8Q3{r6t zz8WvKrpE$Y0Z6qA+7T;j|95V+_;{jMH*{{<_5(J8rj@giQUU@Wwqim$FHnWsNP!0a zA}|!H`j)909=K~xq`o?oA8SX@Lvj8 zC7>SK+b~>S*g}s*U5ZKqs&k{otyRPCmPe3h7Zyeij*Rw9CPc<%0<)$6Nus9id*`Px zt1Z$ClK`ljQsxz1uOnfh5*JvS*niMh(kwtaSS2W10u&1hi%N^;z!%+O%;$0i0w z$6vlO5X4|BL(p-Z)ud)f7&-M&2b@KREkx1;u>oT4HJFqXC5~)}KzFd_g>5^I`^8nV z?zj-mlAfe82p4cOkq7hq@Wcw{9zwI@;;cnwVql-B3%eK6)nWIZM-`LbyTvKD8Im94 ztr(F>z|1BhGx--OpocYId0C4#ap8RzfA)F<;ax?-k zj0k~QbBPTUDm>KAD~1zB1d@G2=uvDo8yj2MBs=c0Rm|v6eAHqhvpN8!Pj8mdLhS5M zr?RF^z7Eb@u+eJ~^MjRZgOJNgu)ImB=!5X3*{xM+0kM{z%(q7dgU~`)1JK=`U#e%AWQ+c#0?-#yarrier|!@`YVeiP@?3CekC})Fd@3Fy4=O{CMhgc zpk`qfp|c?2(5hYcFn(RPuyVJso)r?55Hq(jzFb>MMMJwF|oov(0C7i?qPo z<12}IV3z*A@USGsf^(T^s36xctr+wJUZV(l`4E*hx>nyGd9vyH=jo4yEPTVHoE zPcfT=gZlyLaXhLJq@sctZeK%1fkbH6J}9SK&5qc)4^b}c<~Z|?IKfzWl7aHFD%ocG z)Znq{njmM_%-0qjm1Tt5JMJFzjCjI=*-n2{$QA?Zp@`YZ@xvWMqxZ`}d})#n${8Pn zMqo^Yh>EH_69@>#AtMpsEAY=Cu#$u~f#^;)sNJXl5+?$e%Z~6?LyQ8X`2sQQP_%5T z8XsH{26T98Mmsg;qvB{shIlKAs2`8bDD%X+xo#v*HI} zn1MKMhc&Jv#lFT3a^E83u1HMSFUzwm4l6-09;k4UiLBuxVqE;8O?1Z%1RO=II;-C0hj!$RJZv9U3&aW7*t^DDtu z*d2-?YNxM^ovF0Qa^JqaLyWADFrw#r%q^1@U6Ws|;^N}kJz{S$bleI8V^a(5R~9ty zO?3kkZ;z>r2OyLc6&I09D>r9FN58!6>4zN`h5+;eINUC{8C9O@b(=PIDOnIj8fFy+ zuqUVn@YaArdQ0^U%=0hSaO_hcp*sgHorJn8A4m<*lk^Fuuoe2?3R@WEgS%q8x0iXc zMtlJ3<-*JxSVqvsU_K6)lZq2s1;oriV4EjHa(uGc-0I7v8F1+U}B)LKeT1_qqz!;f4;TMzN8@cAsq0NSxybk(zbv2JulBZ^&jDKH_<-E z3YtJ1Q<;_BGwIrHV7RI6aFV(NuL}yLZ#Zn)UVlg+rda}@0*j~#JSpHk-FK5KN89d^ ze{XLOfHvw=8(iKdwU&Q+p~m5R55fsPFGC-7Eui0E-rfuQsQbtoHy}EcxWL576zDv| zU7_w9UzWwP{MhsN;Ub75OW#+5gl10)IWfyJ%feQ=7Fh0gIcAm@|`hv>F|ln9z=&Re6$oH9IyB^ec^4 z@WgVdLS!K-(1(x)M(;rl1WjPuDZVpfcBWkDN5;CnmXF8Yqu|%IrNyu_&|G{*!N zz1fE#>Id7;KLS?=(iYI`=TbYnE1WhZo~gf8&a8EK@pw3xx?PKDee)&U%-FtC@Z_Rb z<6C9z#|(TsSpgD32RN9US8)R+qzo-Ay68Fr#QZEQOqhSZ++Y|bxrTQq?3#}I>Yeyt zVXEd>t=z&kx%TE9grs@u8YeF zhlghMH{w|fP40t63w|!wA6G11fYTswQO(l^PS8UCgrDr;gBb8H`00?C>aoh7sPA|O zN0Wt@dSfF@oJUdoD3VTBdL&n7G%Zx3o2}LM*@yrytK~UYhH=!B!J$04w(ju`;_(vW zh2eMlk0^)MhMa9C4k0Y|!idc+P|M(2 zGQ(DlLhj;mG7==JjxeqfhDu;p(w&eqWh=)s5*U3sbo-z+$dVbV5sjWUgw=ZDa-zo< zH&eHv@l~lndMY+7GRpZJvoFZd_gIfl&L~49?Q>NHS9$x1OQ3T}Rju;ikXw@Waf5gT z+>FanOj-PzJ+o_R@{-ND736@rRCw@q?eWrG{uGU;c}S0p+1qV*E}r^1Ly-UNGs5uT z=)h^!_h;{-S3H(#kodhQd+DPK<)Ino&+n~8*c)}bHDEdsaGw;s*U!`%OufB~xWU+& zshM{>lonlYDUMZ-*-*4Nn})G1Q7Vh+FXOS?uynAXGWdz zmmw+X3i6VJ=g9!k_zC(#qi?%EZcNF6eUd@Z7pBzDDqAy!G*jG6+TpluaPIP1#H$4I zKj(IsaTSy^*|Il8szZVmNDAor)s+-~PNX8&W8i!-y1c9(WRdY3v(sS>T#YVr2S0A% zf5vnHG}*7^nY|y@c2LN;mSVab?v^m4S8MH#($nQVU6}zNBu17+DdOG@i+(^t2kY>@*UH% z=bs$4%b#}NA&;NJZs znl8X6=iW;aYOdMp=Eapg>~f20-Wx5F#LLXLIGc+YEAyGRx7AAZa=3~t2PXelrIi14 z%fozkbY_QV=#E^fX5ZjIj(kr3$c|9j6D9Y<=L2DFJGoZu%RV6_1$+ulmX6Q52-#{l zs?_e~{CfB8Um?pe>9 zl*8R`61Ye|Lb3Hkv(xB5Q4a#II+DBPH^&Pap|%L>3#y2UC(mO`s$buKm$mtoH2|uB z1Z)7vszQDK5*;2OV^Bl<_pN>p_tjrF|J^L=J7gUGYV)@;LEQzFMhKrEe81bI`t=J$ z|3ho2@2JM%l3&4Zs5Vii&0nQmuKxP3fA$=8i(l>hvrYH~{^D2O9jd|K-M)fM7=kpv z|H}vY*G>O^3V0Uy^Tc0c^?!Pbzi;~MaiBlH8-&kmX3t!o;jW>&OWnK7d-lpTOAaABROTR%4Go7A-%s*xnHP+K|Qh}>fR85@! z{fp5nNJ?@8LHN(FQCLVyY2&}=vz*fN#BWQs%kzIR_tsHSu2K8&@ffIxSb&JYL8MEi zB}PT%2nY&Dhlogb=ctH?2&i-`h;-Kw0}|39UBl1~GxSgczdd+7@xH(HeQSMxeJ+*@ zoq3+;e(rnkYhU}?ckJJb8Y9iB@Xl88;9t-GCU_dd#wI7Xzvo$ovXwBcNc=yofZ$QX zc2`>DH0eCzj6)e=$N#?U9ENs`)D*3X1GuKZe=a$W3q1SP`fCGx^jj!0=G})5+F#v~ zkv{BUWAmi)>98GXUm{df;{cmnRLie1w`x92s6WffT0|PT(6-Bs1HT3nCFHqXU+;5v zEI#TSsXs$aowx6OE&OGnR?SD?!m+dZCqhV{@=BQ_u1YreocQG>Jr<<6XZ1iYw|gz`;G+ONtB>L)^>6|tgCCYoH)o{N zGymKD4iS>)FyTC;_QIMo2a|t&VA~u*JCa7)dUWIF+4!xqtYh`}{{8vNyU?q&w0xvX zqY4Y?SZixV%zt&_^I;Dr*}?m4az|R?;q&LYJZ6jr@BV(BLj+&zCp*=zW?t1_xtd~F zKysz&`Lp`3&wg#IKl?SX)8U_{BW&_v@S)?N0q|DG@bF#K>vyxYUM-T6*F|p{{(}@A zqJ9c7SMJNhH-77ReU|lZ?XQ9P=_&hQ@{hOf|MQpc15EuwbJ7UxBh^pGC;jW^eTZ)_ zoDZU5bcCeR+|MwdTg3gss z1*X?r7V6$O$jHH63ey(E6vy}-p4ClU^WZ=5(~JLVPpsn88kenN!Z{k&XO|P6CDLak zcg_h;;&D72QD-m!$=6E;GFKnw+dEcIJiBd>Fkjbv9#Q+!W%HA`v8sczij131h)QBv zTrI!F1s-v`$1XVXzpxun^B4|MKaB0+Yi?>3Agsb(3@QC75SbSTa~g6uDkMa?5~Tax z69PCnxh879+oqYN8FHi0i$7lET8y2absUo*{gWciNK8kGb?v`)!xW5Cy`vcGU> z{|$BnPvBe$_~?(FO1Vm|3T$f!yu^8g2bW988f7U|cZ-uJhb;{BCFYXJxB|N5V$K(0 zJ{4r|7B-r_q5xR=*Rbso$O!X0^Zed5c6RyEI6?hp^ZO;oVG=9b*Jp_fd;^(nNnb~j zxIMSudF5iM`c5W$Hw`T?29>WaBvwLj{P(TOIbXUOJI{1B#!Wt}8+V_ike3U)D^1~o zepda7Kbk?1-@JlIvtp5(lU-)L6qU7l$aXvA6&Z<=7QNiw*qDB9^C>?SJ!)jH=~!Z; zCi={}m-z_sxy=np_MW+Xjp*W{+DUgE=W%{rz8E5=<7s=$l|Z zwX2$>h*e(l?w?gx!{d-{ZnJNkJs%=Oz9d;1r=?^r%rCUh(3=1t0kAj{U#5z6OiRdyhXtgmO0pwtr~dPrGM?L?Z2sWqYqWXoYGCi> zZ1k?;6WxQl5|`@(CH>b+#I~NcGj$D5PuB$<;8W#AwYtpS{G7t)v{aAvn1M$u_spc z)tXo%Yf}~1ry|r{t}TRDs$XBnwwNDaKsp;GKiI^(t+zFyH*clE4RukXn3d%Ye(I)T zi`}My7`6QR+5}xDVa6hj)OCMfwZ&1Tp4M1n1AStuD^6{@UX0djbMoNgTVK>zxHsN; z(-@C>v!?5@8tFP!W?1+zwMW1{&u#Jva?Vq>X>Myuvaklh)Nk|OUUBir30YG?UPoO%C0TBa#se7aHUn{=|N`5c@tPEFwBWGb2zj{F$d%ExVy{&`Z&9b_h!YnAZaf7|qs>UYYp~J#h zTklr?KLhKXY-}!>x3)xvV$I=|5`zgl>ymUULghL(Q|_6WdlN7>NqA=)Sa7HC7~>^O#8KuP3RIY=Dalr>h%>w0C!~eumcy} zoN%FsMA}1i(Hh;z9yV{h1(Bh38MElvXr{&N$xTzYPcBJ-1|);XNr9V+>qsVlOQ=p{ zk)svS56R~$Nr$Zs@*mq;4NWg7K2+tmUEqYfA|ycrXq7xwRyN*cs97QwQodAbU}ZUn z+Za3O3n;K>wfC~~WwgHj>$k-bUVM_IAseE^MxrynT|*6(+TpkgVkgewH!GVfE~3&I zb!mfxKWb#HECmcvcNZZ?CXKH7MZkG~ervit+yO1}>DP7UPK~bgNUI(t3wek#U9NVr zQ<-H{;f6PlDZypKSzdwlsN63PP$lXLh|3G1KQHE^X^GjZ>=!O{Kl|}QW``-#zLow~ z1fK4FbW{|3GH2}CxTi30Os-kg7K1varPsfKP}SawQP}S!Ct1IkW`J;44?RM|amPqj zGdC|&Igmk za4n}_RHjRQFcVw*t+v)}EZ#y*V7qve-yE%7Q}b?ec=yM4<}s#$rx&!B`>*S@u2)F1 zv9ST8NyPWDn60-L#`>RM4XGI9s8;PQvbMW@Zrc7Q(iU#HCgoRIS`anDL>MCjpY5{W zLXBABbA4JH^G@Job&(lm`E5J%$9(6Id9_M*w^leZ!iJO6^*@0NN8k9wN-9k;TFkxThF zm{ZoKY_J9kW-u_ej0>~)z&v;{_+!d4B2(uH*h-Tjer{F6)@rZn?P0P2<%j@&SKSIE z!YMOr#X=n~g-5fV2v=Wi@0dKeF$6|Yg%RE?jsUDbTxhvuTe!3RycXfn*if?t-E66i ze%dChP;Ody)qv1)`e4F|ztWI>lQ*Hj1+vwU1uw@PyfbAo{ft(OpDrRGAo6aB>-7$s z_SXEq&s7Fr8zoxZW%e0YQi05Qnw2^-x?%$~y!zKegzT$h8l_}SFU&U8s%xpQ6KZiZ zLZ~6=@81I)XahITIVIMR!pf~hBMFJ zp7Tc8kIs#yrH9z#u))FKJSDSuIHSkZfo4In)yhHExNpXso`4}Hc22g(NNPaImWxXH_FHgM9zY_41i2zYL5%;+u1}&QAGdIF84Z#)zbGh> zC(JhA&`&)qy646A%J4C+xHfDAmdKO1_C6`_=pxbNuMNz>G-?CQQgE_x^4<7`fk4M@ ziqVcUt1b({CrNge=i=w~z(NP-KKW<(;=9{=&KsWiGLtK_YzpsU!>$A?tCkkbtk}mQ zr_s!}5_@!>SQSDuhdfr^+(eK>g>~e3o_)NuIx1gQjFII&eF7;H$iFmafztFt>q;AlC4^GvCDWLeIA z8K1bj7Negu6pHgNl*n!XTP;`Nk#B01ysB5cI_v>1-tE3L(i1b9xVKhj^}aA&`;mr{ zvyDw$-q&USM8*Pu{26Qswtvgd_V%!}yrx&{Zx)&*#mVRitqL^qfk($jv2?)Uyk!Q6 ziK~^`F<14F$oT_+-RcSwo$XyUnoK`a)_pF!-9?3&qw{C^!lq+p)!Ni}fwqmoG)Zi( zeM8E-k(IS3b5R#1ku;Ia1cU5 ztSaB>Ys9q`OJu9Z*qfWR|EqzN^t>g#{k%Ws@=fw*7e6#qj^2{3rJM8Wc5|KxrADk` zO}U0VL^;JKv-dI-&J=N~%q!)ynkY?=r2;|U& zR9+Nga;i`H1{Kb@XeQL%s3}+|Nzq}|fzXgJX)qu9!P@RiZe~e*VWX9Q>UaNufQDe3 z5t($>z@@l#Zu)6}myah`{Q?4(PVN_Oez{)o5yyNNBg2Xo@^T{+H;r31Dl+EUew&I3 zfA3SguU`4$M~_cY#je&TzpLVv5>dDyZ?^1#%CTbK-Kuo zvdO)!_sIsL8c4IN>smZ({eyx16dcj+{>1KM?!S_7=$*6rM_N9> zmCt1(c=)e2sQ;Z2_t=rp*yD*?(AmrI`EYyW_V_EGv;PPWgTwIQJ0)h)hdE*A>B7Y; z4lDnyF0guTk00x(W{=;0cB639VD;mFuB{(#xw5})&^10AMtZ%hf1avEda9&k&GLS4 z+6X&#OxNE#()g>tt?nNtEVWt3$8<1}o_me1i@*LK&4C@I5OY5Eu`?-qxAI~wQg~;5 z_is@q|19SISUfkJ^#`(x+jLo>;a12wE3(`J$(WFb9Wmu}6Zg&#&6%;E3BluS>VOPNYXY8lNz zChXi(EFHTuz7SfrxzPp(@NMf8bcK;$7t;k9%dBVSFoIQ{_I}bO#RD1D2bX*(a@F@X z+IzYe`pdolSHlzvY07s0{BxF+e3I+B=iz_szBn-RMujC*){&9jZN5tQ6`qto4p)a= z^<0-8dZ=Vtwe3*gtLxFve0@Vk{Qc?ll;VsnBdPRZI|Q?u$oG`N{>{#1_!>XaG1=(@vI>XypPz+9IZRY?yprcUqyzt{X(YvUa(+eW zgg#^0QlTJM8YA)>?>AdalBuz&%V@l?m#26~zXJBOMM4Mrm~97x3%(0d{0AcMBJt5B zlT{SfeHQU;Kj%5yhc01wGxBenRK1f=u;!*3W_?DsE37MbYij2 z<7qv*?n`q4b`eZ^lnIXva${Yl(;_7{>%}JRK_cpHRkI>V1Bh-6-wtIiExE;B;@IR( zFS%YD>`DN+?oQ=*4@^?3WeR`mS4780)mSPEs@TBwZ7TAwZUjgO_m(z@pX;-u(qJqB zLP%q&`o3PkC2RDtn?|L7=SHqfy-adia@2Xou^virJymBb{IrStG+NcGdZ#FNS}PI? zw6Po0JbJl_@_Z+R$sC#T`J5;E@?%TUiFrx!srJp@bo=UP*xK8LL~j$$*~r<;dLI1L zEjd7jtBB+&0gu4s-X56I-`CFeB3q}#SJ#iKUsxGgaL%KHo+d-)l-0_%8-z{1?c;64S3rwj^+D}O|< zG*wmhuzdE2%KX>hztzbUMVixq=0zP!%@usm1wEN|_pV(aTZY-T(D^lQlT@AEb=_`L zRig9SN6^n!!6Q}5R&1-fGsMH4oWNpcq|q_ z2pPhzuN4Ue%9J!kO6*NYL&q#r%t3vB($93xl;nsFH7=l!e4j{smQQD2WgDxh4`UAb zTcATs#P5it_h4;eAkY?TB;@cW=cUG{u00w+9xEZrU1~Rd4GQ;QtHiUiPo}n-V;FnW zS3FW5^;<4rn&pm|yBaoDk)#r2IU(5aWLFT_oW|Ox&6U^C!HEkkS2YXt(2Hwb_|i1} zk0h!D`~`T&E}jC1U>6iiFP;5?GG0ASKlSD&{?w?c4pI1f=~NG_t<|9IX@e~@LMifho8Y9 z@`j!kSu0r9o@GRXJm^l`37?ZhB3KZnj`u!`R7>}6C~)DEEw8hhCDW=@KV?N{Z#Dv& zxNirh?iD=y{*tB#>$3HG%HA2v9(M#P(`B2bF@JMX>iC-gaikRjt5v=g9qM&j0FvvR zvSeISbW~#;O{{=IAc+k9d{K|!BLw>7r6uEIe$BO+KdkRQy9`j2af;jmB%`WHK(1`i z5_&AP#HBYzw=yM7=4ML2q4OOIB^JAV3%O&mK2QLFJ!z(3g&dNd3;#TEF7c=?y&B9)$IJs2Cn`ToH)$J&x1JU-oN` zC1?Dx>+${fm8~u7_>7W5{SjYNuV_p@u8ks66461e8@juzBd`89jUc2-pzweC!N!-x zXUO`x2ba95$oH`-YArqSc4ALN`J)E~NU%qeTCXM2D8c%)!Dh{8>FU^Yoe%$HDWj!% z@k*aGT+*|%(wwWZY~7J$y-N11n@(E#6%}zof}YQPd*s7N7%4%Q4_H=VRk{OwU;)_Mw=S=e* zH)1Fwx?sk(d?U$1J=2+KQ*)qfb8TOMvD7Rv@r`wLa``C7bhd0D^L>f5cUksCDyd50 z^VAhoS^c5C%>IoHHIJDxO9_^_@||g_0VJF=y|WX_*sNx?jSp#Fc}Ib;Wn;Wttng#aMOS)q$=Dx!GnK zS$0(JE$w+lHHHBB%r%8K9xz#o&yBbQldDYT#%#VUoyQ0NmeDsXc|FeAbWZh_UD;BM z7zkeyD;FHre%$ECU0hjRr^6R9b4uJ)i}i>Zj!`Y$4&b68u9ua>x1U|7?~l!96Bgy; zx758Ut(t03#LGFr*W?sV?DVAIS*xU(i}Y`HdonR`9Cv-~lPRiv@mOB4U%rA_n1MM> znBm~g#ODO>ltwSU3wBkEV&>}WTegilNQ>0if$2A|l~n%W92Y2X%QrWDhulCSb{`uR z&F)J!?7JcQJ}8zx=ps!>$fpid1-UTJS(9f7;`;|9UOU!Mb#hGCRO)!(Xk$~^Jz!8% zseUT}<+0nO%Tuh6C0FPa>WYnus^jdJz;EV5Er40;bqly*A)&8yajmwY!*9Uo;wGkR z7lJaf$Z8!53T1Hd+*E5+_Tz5MRQE-3#pEtinD;jxJdd85NaS%`W+V)v*8?4kw_RRE zS5JN!gfgL@@02*J2DD`D0twblq16w#_mk5w`FGK>I}XE7Hov^E$6~TE5#me-Op$S@OP! zrgX7-ZN>2T9@R#3dl8T(qx#fV>}C@)Koy(YOIH%WmhU9$tiXwOtyGvhy9^{3N8>HF zZzwc2zMov+N&>VEcA(8m0VK&wk=tM=2+QJj+Q07(kK{zf?SO9SMw}5|geg6w0KBq$ zc#>Ao5mERIo)baJX{_VrKTmI0z1>U{Qrio&)N)dj!O&@zl`h4IR_2}#3~$=x{0Dp& zju1jJ3S4!ZYoNn319pOrJaaT@&!}4;AAfcE(jp%v z587jQ0U9pMQ`ETS6HIc>rGiOZ8Ma)q7z20e@x{B%$6Atn><%A7LVqNUL=bP6f^a8( zRZpg=^|VXF4o%EPx6-mgZTeomNj6Z)^i;h0tdS_pBpmD!vt2M@THbD2u@i~gG+E#?Qi}hg?kSJtD6~5fT#%9!%l8x!0bM2j@*2ts8zy>LC*rLyFI zY`7n$x_GYNFqk>ZSnix*JzI`$eOC3A?`aN0qh>T0s`e@C@qzY>2`7 zvt&x@@46{l0cU6)Gv$>)x!xv=oia&6YUbWTJ-TtLQ(d}#D9dPFf6vYH-yA;TB7WkXH>Gvb)^1rHc92kQzDNYQH*Ecmx(g4gq}4Btr_-*cKjkbjqje!8(Yaxc_7 zghbm5^@uNK-}+O>pI+W3hSiFS!&;xK!sDS)A;SP11ZK`EU^ktG67dd7)YQ2)rB>vFLg#m>K5zrtL zPSUa@C#mU|3AOlgc%g^k^`-j1ljhzet1q}mGd!$V=|)(DH-dQW+BLwpz`@g=9IRA; zP_+sr5K7T&b1MP_&5&l_dbta9Z9&Q*q#<4D*(-JNu|<_<-SD^$MHK$LRHs({ShV5h zAOchVjpvfl;~Ne2|1$LZWQ56Jni??w|!T_Ykb<0Ez|dI@dwL3#-y8mVC) zaOFoqeBm5Sdo@=g4l$MtEypEaN3WMr%z1I14*#H~rLLl-UQk%7Y%~EcJmckjA$^Pf z1F7V^ppYSynIA9|&S7>c>|APFa%kCZ)G0fEA$noPchYjbmN+!27Dg^C-8k$q^m>Xr zz*)wsaLwWLk<+C-TPh+kqYXI=FLWxs$ufIAgap#gd6ONbFaiqT&*b4XK{l&-A^$oB zM2MrfXA99hUSxy?ZY;Wd^jnsUb+#~Hs$|~AL}F$nVr7$WkM_d_%YwmHBJh0jy<<+3 zy7=RCbZfI?&1;)1UU$6Lxpvd-UCnNH40dEE<{23-;Zlk@d4rDsOJ`vNFa>L1bioVi z+3Re@l=2IoSEis2T4?3&N9R7xtoTGj{T(Vf=9_e_Lu>Q#Bt2h(PlDL!mFpEeQ#l;U z@97$l<~ZW35Mwy;3Hf9dDmTyvKuDl$POMkJ)?*?WV`A8!Zb5?1gU}e{ScoC)Xz1N3 zm20z@*K?KohsjX;I!>N8|Wx{jC98CF9i$n zVi>ADIcpA3P9v2_u>HHu(Ao*d+M0JGwDvEut+MDaL2OC~Qye>}2L0K6(reDbV(>!g>sQmm#qf?(>DIN*OoQc*k#n$gh=A;$snn>26FsnmYLr6P_WrKGcNpqUP1(2@Wg_TQg!&#e6 zWA(gP=6At8vx28-@3ngDmaUC(K?$rZYnTWCR-U>12R;nUBNRu<1}BS4fn33mD;kF? z_jmOThJ;1#2GlZ=YW3MxA(xv%18+bt{1P>H&mJWe_m*V|(6q9w_u`Jok=|a%z3^ml z6=p3(d%)U(gXnkh%>JJ}Kn@`xdZt9wYrzzd&zX-5@^DSY3Zf9pBd^O2^wrlN3p8Hs zgB)0VNoo3;ypeJ|6qjnA(lgx& zlbE69!HntMenyXGKflZ&LJ_g-2L@qJ4PXw_-excg<#gnhc>Y)|LC6tzw<}z|GPMxM zNeCX@KNMT<{Q-UPOYq$@KIAy~#(}8Hc+7aLn=I6A1{b7MnuyBb=H^)%A?TL>jD5a3 z9>rz(dQh6>hfR(_FXWA&kBM;trhSd}VBiz^!S#2;7P-4il~OE<&O>i*G6n}EN@b={VM_Eb-NB~Uh)(#-`F3Ua(Y7veq3 zK>q|=pB-`}S|?IhLmYx5JP^!@OH#{Wqyn8+yo|u>8UY_`%-LjlG;w$AjZAv~{Mb4{ zkT6v2QeUWZCOmF$DF9mx6I5JvJSL&gpB0$3TK!WV+x?-(|I>8j1qFuBj}t+gYKg+F zfmow6u+jHni}@}(;=kt7v2QN@uGgWm*J2sk7u6>Q#ApSywV<9y!@V-YJYA(NrrTD3{+YKce1g08EGU-&z) z5e0d9ry4KvH4+N}zUWmU0ys@DSJNF(w%nf-BA7|k-D%(_pm(FPh)^+~qVH`KV}&gQ zCgM6yPz6&#Xuo%h7=6pl^GtkWfbz6}RMa-)ZNKzJLaYvH3IY@Tw5{*)@U>3QTfx*j z#uE}S1EhHI$AOh+Xqy=bvfN^8-X|lyN-a*}YT7o3Ch9b8@4?@siAseRx|0eviuPt>#9Caalp@yx$ZfG)vnDzlTY-Cd(`!h##~;!Q zWed|(MJmZDam+{1>^~aaqDYY!^x|1ZU5@nRQ$o{>L6*z*M3}P?B7JSDPkJz3>J`VY z36VclY{Cre>xqCpGqo^+M(W;sRAlLv zCnEmGHU8usqx=cX=I%{rcpkXM0y;Xxd+1LG>#+89M(yd{9NXKU49%P% zYs)ADW=26lNiS|A!phdna!u_b!>QO%=hFQ89V^o4{RBIb&e&0XB~G?prbw%T`0XxzgGeR9ds=ud|k7Gr3xS?kt!wdH`I8x^Uq`Mv+5gf zzJSSUvY89VW_*a$vbji)9ACnY&B#0m#~v_k;rL0MrHQ3zH|D(#YVHH2kd`oVk`bqS zDuf#Oq_TSZ+<&Siy1u04Hq~`+GRi(@WT6&o2Xxgm9&*lw%ExSoPEE#m%z*l_)r=+; z`L_vNlY1l`EK_GWmcU1n-@%oMb;fhUKmM>(BthBVfabAq#8C?+Z(Jz#1`o(u{3kF)Qy-zC+j)8A*|WKffX)>H(OpPEp=xbaFv*Sy_HIx==P=NukJu z>#w5Eui)|jZ3O{oM1FY{)cE#i*Z⁣M4uqK!5+LH2v?=(*8X5{}h|{zw=Msjie|1 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 UK~*CMbXW+3r>mdKI;Vst0C!|aO8@`> literal 0 HcmV?d00001 diff --git a/docs/assets/images/ExpensifyHelp_R4_Tags_2.png b/docs/assets/images/ExpensifyHelp_R4_Tags_2.png new file mode 100644 index 0000000000000000000000000000000000000000..a83d748ea12be70e553bd5e286a9dd4c6bdcc6bf GIT binary patch literal 112397 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/ExpensifyHelp_R5_Wallet_1.png b/docs/assets/images/ExpensifyHelp_R5_Wallet_1.png new file mode 100644 index 0000000000000000000000000000000000000000..695dceb52581a79ff18513160ca1299588aeaa80 GIT binary patch literal 160199 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%0A~ugk-!VPTyJjT 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 literal 0 HcmV?d00001 diff --git a/docs/assets/images/domains.svg b/docs/assets/images/domains.svg index 3a3c95604b79..12c0a0a0792b 100644 --- a/docs/assets/images/domains.svg +++ b/docs/assets/images/domains.svg @@ -1,44 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/docs/assets/images/plane.svg b/docs/assets/images/plane.svg index 0295aa3c66c0..bd7fceba3607 100644 --- a/docs/assets/images/plane.svg +++ b/docs/assets/images/plane.svg @@ -1,34 +1 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + \ No newline at end of file diff --git a/docs/assets/images/simple-illustration__monitor-remotesync.svg b/docs/assets/images/simple-illustration__monitor-remotesync.svg new file mode 100644 index 000000000000..f0f6f363036e --- /dev/null +++ b/docs/assets/images/simple-illustration__monitor-remotesync.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/assets/js/main.js b/docs/assets/js/main.js index 6b3390148ff0..9e4880780e91 100644 --- a/docs/assets/js/main.js +++ b/docs/assets/js/main.js @@ -196,6 +196,35 @@ const tocbotOptions = { scrollContainer: 'content-area', }; +function selectNewExpensify(newExpensifyTab, newExpensifyContent, expensifyClassicTab, expensifyClassicContent) { + newExpensifyTab.classList.add('active'); + newExpensifyContent.classList.remove('hidden'); + + if (expensifyClassicTab && expensifyClassicContent) { + expensifyClassicTab.classList.remove('active'); + expensifyClassicContent.classList.add('hidden'); + } + window.tocbot.refresh({ + ...tocbotOptions, + contentSelector: '#new-expensify', + }); +} + +function selectExpensifyClassic(newExpensifyTab, newExpensifyContent, expensifyClassicTab, expensifyClassicContent) { + expensifyClassicTab.classList.add('active'); + expensifyClassicContent.classList.remove('hidden'); + + if (newExpensifyTab && newExpensifyContent) { + newExpensifyTab.classList.remove('active'); + newExpensifyContent.classList.add('hidden'); + } + + window.tocbot.refresh({ + ...tocbotOptions, + contentSelector: '#expensify-classic', + }); +} + window.addEventListener('DOMContentLoaded', () => { injectFooterCopywrite(); @@ -219,8 +248,10 @@ window.addEventListener('DOMContentLoaded', () => { let contentSelector = '.article-toc-content'; if (expensifyClassicContent) { contentSelector = '#expensify-classic'; + selectExpensifyClassic(newExpensifyTab, newExpensifyContent, expensifyClassicTab, expensifyClassicContent); } else if (newExpensifyContent) { contentSelector = '#new-expensify'; + selectNewExpensify(newExpensifyTab, newExpensifyContent, expensifyClassicTab, expensifyClassicContent); } if (window.tocbot) { @@ -232,28 +263,12 @@ window.addEventListener('DOMContentLoaded', () => { // eslint-disable-next-line es/no-optional-chaining expensifyClassicTab?.addEventListener('click', () => { - expensifyClassicTab.classList.add('active'); - expensifyClassicContent.classList.remove('hidden'); - - newExpensifyTab.classList.remove('active'); - newExpensifyContent.classList.add('hidden'); - window.tocbot.refresh({ - ...tocbotOptions, - contentSelector: '#expensify-classic', - }); + selectExpensifyClassic(newExpensifyTab, newExpensifyContent, expensifyClassicTab, expensifyClassicContent); }); // eslint-disable-next-line es/no-optional-chaining newExpensifyTab?.addEventListener('click', () => { - newExpensifyTab.classList.add('active'); - newExpensifyContent.classList.remove('hidden'); - - expensifyClassicTab.classList.remove('active'); - expensifyClassicContent.classList.add('hidden'); - window.tocbot.refresh({ - ...tocbotOptions, - contentSelector: '#new-expensify', - }); + selectNewExpensify(newExpensifyTab, newExpensifyContent, expensifyClassicTab, expensifyClassicContent); }); document.getElementById('header-button').addEventListener('click', toggleHeaderMenu); diff --git a/docs/redirects.csv b/docs/redirects.csv index 5e4d06619653..b4912a629918 100644 --- a/docs/redirects.csv +++ b/docs/redirects.csv @@ -26,10 +26,31 @@ https://community.expensify.com/discussion/5190/how-to-individually-assign-a-vac https://community.expensify.com/discussion/5274/how-to-set-up-an-adp-indirect-integration-with-expensify,https://help.expensify.com/articles/expensify-classic/integrations/HR-integrations/ADP https://community.expensify.com/discussion/5776/how-to-create-mileage-expenses-in-expensify,https://help.expensify.com/articles/expensify-classic/expenses/Distance-Tracking https://community.expensify.com/discussion/7385/how-to-enable-two-factor-authentication-in-your-account,https://help.expensify.com/expensify-classic/hubs/settings/account-settings -https://community.expensify.com/discussion/5124/how-to-add-your-name-and-photo-to-your-account,https://help.expensify.com/expensify-classic/hubs/settings/account-settings https://community.expensify.com/discussion/5149/how-to-manage-your-devices-in-expensify,https://help.expensify.com/expensify-classic/hubs/settings/account-settings https://community.expensify.com/discussion/4432/how-to-add-a-secondary-login,https://help.expensify.com/expensify-classic/hubs/settings/account-settings https://community.expensify.com/discussion/6794/how-to-change-your-email-in-expensify,https://help.expensify.com/expensify-classic/hubs/settings/account-settings +https://community.expensify.com/discussion/3498/how-do-i-invite-users-in-my-company,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/6015/tutorial,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/2596/setting-up-accounts,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/7665/how-do-i-add-another-person-to-my-account-to-keep-track-of-there-expenses,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/7456/how-do-i-submit-an-expense-for-reimbursement,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/1460/schedule-a-demo,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/835/what-is-the-difference-between-a-category-and-a-tag,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/7703/getting-started-video,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/1845/how-to-set-up-account-and-add-users,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/8629/employee-training-e-learning-program,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/1607/on-demand-webinars,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/5444/admin-onboarding-webinar-faqs,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/5417/employee-training-webinar-faqs,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/5885/overview-the-employee-training-webinar,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/5854/overview-the-expensify-admin-onboarding-webinar,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/4699/how-to-download-the-mobile-app,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/4524/how-to-set-up-the-uber-integration,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/5212/how-to-connect-your-policy-to-netsuite-token-based-authentication,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/5124/how-to-add-your-name-and-photo-to-your-account,https://help.expensify.com/articles/expensify-classic/settings/account-settings/Add-profile-photo +https://community.expensify.com/discussion/5922/deep-dive-day-1-with-expensify-for-submitters,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/5934/day-1-with-expensify-admins-and-accountants,https://help.expensify.com/expensify-classic/hubs/getting-started +https://community.expensify.com/discussion/5694/deep-dive-admin-training-and-setup-resources,https://help.expensify.com/expensify-classic/hubs/getting-started https://help.expensify.com/articles/expensify-classic/expensify-card/Expensify-Card-Perks.html,https://use.expensify.com/company-credit-card https://help.expensify.com/articles/expensify-classic/expensify-partner-program/How-to-Join-the-ExpensifyApproved!-Partner-Program.html,https://use.expensify.com/accountants-program https://help.expensify.com/articles/expensify-classic/getting-started/approved-accountants/Card-Revenue-Share-For-Expensify-Approved-Partners, https://use.expensify.com/blog/maximizing-rewards-expensifyapproved-accounting-partners-now-earn-0-5-revenue-share @@ -176,4 +197,8 @@ https://help.expensify.com/articles/new-expensify/workspaces/The-Free-Plan,https https://help.expensify.com/new-expensify/hubs/expenses/Connect-a-Bank-Account,https://help.expensify.com/articles/new-expensify/expenses/Connect-a-Business-Bank-Account https://help.expensify.com/articles/new-expensify/settings/Security,https://help.expensify.com/articles/new-expensify/settings/Encryption-and-Data-Security https://help.expensify.com/articles/expensify-classic/workspaces/reports/Currency,https://help.expensify.com/articles/expensify-classic/workspaces/Currency +https://help.expensify.com/articles/expensify-classic/workspaces/reports/Report-Fields-And-Titles,https://help.expensify.com/expensify-classic/hubs/workspaces/ +https://help.expensify.com/articles/expensify-classic/workspaces/reports/Scheduled-Submit,https://help.expensify.com/articles/expensify-classic/reports/Automatically-submit-employee-reports +https://help.expensify.com/articles/new-expensify/chat/Expensify-Chat-For-Admins,https://help.expensify.com/new-expensify/hubs/chat/ https://help.expensify.com/articles/new-expensify/bank-accounts-and-payments/Connect-a-Bank-Account.html,https://help.expensify.com/articles/new-expensify/expenses/Connect-a-Business-Bank-Account +https://help.expensify.com/articles/new-expensify/expenses/Manually-submit-reports-for-approval,https://help.expensify.com/new-expensify/hubs/expenses/ diff --git a/ios/.xcode.env b/ios/.xcode.env index 3d5782c71568..0ef3f59d606a 100644 --- a/ios/.xcode.env +++ b/ios/.xcode.env @@ -9,3 +9,8 @@ # For example, to use nvm with brew, add the following line # . "$(brew --prefix nvm)/nvm.sh" --no-use export NODE_BINARY=$(command -v node) + +# Provide a sourcemap path so that in release builds a source map file will be +# created at the specified location. +# (RN's default behaviour on iOS is to skip creating a sourcemap file): +export SOURCEMAP_FILE="$(pwd)/../main.jsbundle.map"; diff --git a/ios/NewExpensify/Info.plist b/ios/NewExpensify/Info.plist index 2884e1b4318d..2f9a259edbd4 100644 --- a/ios/NewExpensify/Info.plist +++ b/ios/NewExpensify/Info.plist @@ -19,7 +19,7 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.4.76 + 9.0.1 CFBundleSignature ???? CFBundleURLTypes @@ -40,7 +40,7 @@ CFBundleVersion - 1.4.76.6 + 9.0.1.0 FullStory OrgId diff --git a/ios/NewExpensifyTests/Info.plist b/ios/NewExpensifyTests/Info.plist index 628d11fb7896..d406249b9a7f 100644 --- a/ios/NewExpensifyTests/Info.plist +++ b/ios/NewExpensifyTests/Info.plist @@ -15,10 +15,10 @@ CFBundlePackageType BNDL CFBundleShortVersionString - 1.4.76 + 9.0.1 CFBundleSignature ???? CFBundleVersion - 1.4.76.6 + 9.0.1.0 diff --git a/ios/NotificationServiceExtension/Info.plist b/ios/NotificationServiceExtension/Info.plist index 48f43e75badf..c3a760235416 100644 --- a/ios/NotificationServiceExtension/Info.plist +++ b/ios/NotificationServiceExtension/Info.plist @@ -11,9 +11,9 @@ CFBundleName $(PRODUCT_NAME) CFBundleShortVersionString - 1.4.76 + 9.0.1 CFBundleVersion - 1.4.76.6 + 9.0.1.0 NSExtension NSExtensionPointIdentifier diff --git a/ios/Podfile b/ios/Podfile index d72086d4c07b..6330bb3d8d52 100644 --- a/ios/Podfile +++ b/ios/Podfile @@ -118,4 +118,4 @@ target 'NotificationServiceExtension' do pod 'AirshipServiceExtension' end -pod 'FullStory', :http => 'https://ios-releases.fullstory.com/fullstory-1.48.0-xcframework.tar.gz' \ No newline at end of file +pod 'FullStory', :http => 'https://ios-releases.fullstory.com/fullstory-1.49.0-xcframework.tar.gz' \ No newline at end of file diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 1ea6b65a58b7..ddab159714fc 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -138,7 +138,7 @@ PODS: - GoogleUtilities/Environment (~> 7.7) - "GoogleUtilities/NSData+zlib (~> 7.7)" - fmt (6.2.1) - - FullStory (1.48.0) + - FullStory (1.49.0) - fullstory_react-native (1.4.2): - FullStory (~> 1.14) - glog @@ -1243,13 +1243,7 @@ PODS: - react-native-config (1.5.0): - react-native-config/App (= 1.5.0) - react-native-config/App (1.5.0): - - RCT-Folly - - RCTRequired - - RCTTypeSafety - - React - - React-Codegen - - React-RCTFabric - - ReactCommon/turbomodule/core + - React-Core - react-native-document-picker (9.1.1): - RCT-Folly - RCTRequired @@ -1303,6 +1297,25 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga + - react-native-keyboard-controller (1.12.2): + - glog + - hermes-engine + - RCT-Folly (= 2022.05.16.00) + - RCTRequired + - RCTTypeSafety + - React-Codegen + - React-Core + - React-debug + - React-Fabric + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga - react-native-launch-arguments (4.0.2): - React - react-native-netinfo (11.2.1): @@ -1852,7 +1865,7 @@ PODS: - RNGoogleSignin (10.0.1): - GoogleSignIn (~> 7.0) - React-Core - - RNLiveMarkdown (0.1.70): + - RNLiveMarkdown (0.1.85): - glog - hermes-engine - RCT-Folly (= 2022.05.16.00) @@ -1870,9 +1883,9 @@ PODS: - React-utils - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNLiveMarkdown/common (= 0.1.70) + - RNLiveMarkdown/common (= 0.1.85) - Yoga - - RNLiveMarkdown/common (0.1.70): + - RNLiveMarkdown/common (0.1.85): - glog - hermes-engine - RCT-Folly (= 2022.05.16.00) @@ -1942,7 +1955,7 @@ PODS: - React-Codegen - React-Core - ReactCommon/turbomodule/core - - RNReanimated (3.7.2): + - RNReanimated (3.8.1): - glog - hermes-engine - RCT-Folly (= 2022.05.16.00) @@ -2098,7 +2111,7 @@ DEPENDENCIES: - ExpoImageManipulator (from `../node_modules/expo-image-manipulator/ios`) - ExpoModulesCore (from `../node_modules/expo-modules-core`) - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - - "FullStory (from `{:http=>\"https://ios-releases.fullstory.com/fullstory-1.48.0-xcframework.tar.gz\"}`)" + - "FullStory (from `{:http=>\"https://ios-releases.fullstory.com/fullstory-1.49.0-xcframework.tar.gz\"}`)" - "fullstory_react-native (from `../node_modules/@fullstory/react-native`)" - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) @@ -2137,6 +2150,7 @@ DEPENDENCIES: - "react-native-geolocation (from `../node_modules/@react-native-community/geolocation`)" - react-native-image-picker (from `../node_modules/react-native-image-picker`) - react-native-key-command (from `../node_modules/react-native-key-command`) + - react-native-keyboard-controller (from `../node_modules/react-native-keyboard-controller`) - react-native-launch-arguments (from `../node_modules/react-native-launch-arguments`) - "react-native-netinfo (from `../node_modules/@react-native-community/netinfo`)" - react-native-pager-view (from `../node_modules/react-native-pager-view`) @@ -2263,7 +2277,7 @@ EXTERNAL SOURCES: FBLazyVector: :path: "../node_modules/react-native/Libraries/FBLazyVector" FullStory: - :http: https://ios-releases.fullstory.com/fullstory-1.48.0-xcframework.tar.gz + :http: https://ios-releases.fullstory.com/fullstory-1.49.0-xcframework.tar.gz fullstory_react-native: :path: "../node_modules/@fullstory/react-native" glog: @@ -2335,6 +2349,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-image-picker" react-native-key-command: :path: "../node_modules/react-native-key-command" + react-native-keyboard-controller: + :path: "../node_modules/react-native-keyboard-controller" react-native-launch-arguments: :path: "../node_modules/react-native-launch-arguments" react-native-netinfo: @@ -2458,7 +2474,7 @@ EXTERNAL SOURCES: CHECKOUT OPTIONS: FullStory: - :http: https://ios-releases.fullstory.com/fullstory-1.48.0-xcframework.tar.gz + :http: https://ios-releases.fullstory.com/fullstory-1.49.0-xcframework.tar.gz SPEC CHECKSUMS: Airship: 5a6d3f8a982398940b0d48423bb9b8736717c123 @@ -2485,7 +2501,7 @@ SPEC CHECKSUMS: FirebasePerformance: 0c01a7a496657d7cea86d40c0b1725259d164c6c FirebaseRemoteConfig: 2d6e2cfdb49af79535c8af8a80a4a5009038ec2b fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 - FullStory: 097347c823c21c655ca25fd8d5e6355a9326ec54 + FullStory: c95f74445f871bc344cdc4a4e4ece61b5554e55d fullstory_react-native: 6cba8a2c054374a24a44dc4310407d9435459cae glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 GoogleAppMeasurement: 5ba1164e3c844ba84272555e916d0a6d3d977e91 @@ -2536,11 +2552,12 @@ SPEC CHECKSUMS: react-native-airship: 38e2596999242b68c933959d6145512e77937ac0 react-native-blob-util: 1ddace5234c62e3e6e4e154d305ad07ef686599b react-native-cameraroll: f373bebbe9f6b7c3fd2a6f97c5171cda574cf957 - react-native-config: 5ce986133b07fc258828b20b9506de0e683efc1c + react-native-config: 5330c8258265c1e5fdb8c009d2cabd6badd96727 react-native-document-picker: 8532b8af7c2c930f9e202aac484ac785b0f4f809 react-native-geolocation: f9e92eb774cb30ac1e099f34b3a94f03b4db7eb3 react-native-image-picker: f8a13ff106bcc7eb00c71ce11fdc36aac2a44440 react-native-key-command: 28ccfa09520e7d7e30739480dea4df003493bfe8 + react-native-keyboard-controller: 47c01b0741ae5fc84e53cf282e61cfa5c2edb19b react-native-launch-arguments: 5f41e0abf88a15e3c5309b8875d6fd5ac43df49d react-native-netinfo: 02d31de0e08ab043d48f2a1a8baade109d7b6ca5 react-native-pager-view: ccd4bbf9fc7effaf8f91f8dae43389844d9ef9fa @@ -2589,12 +2606,12 @@ SPEC CHECKSUMS: RNFS: 4ac0f0ea233904cb798630b3c077808c06931688 RNGestureHandler: 74b7b3d06d667ba0bbf41da7718f2607ae0dfe8f RNGoogleSignin: ccaa4a81582cf713eea562c5dd9dc1961a715fd0 - RNLiveMarkdown: 23250f3d64c9d5f82ff36c4733c03544af0222d2 + RNLiveMarkdown: fff70dc755ed8199a449f61e76cbadec7cd20440 RNLocalize: d4b8af4e442d4bcca54e68fc687a2129b4d71a81 rnmapbox-maps: df8fe93dbd251f25022f4023d31bc04160d4d65c RNPermissions: 0b61d30d21acbeafe25baaa47d9bae40a0c65216 RNReactNativeHapticFeedback: 616c35bdec7d20d4c524a7949ca9829c09e35f37 - RNReanimated: 51db0fff543694d931bd3b7cab1a3b36bd86c738 + RNReanimated: 323436b1a5364dca3b5f8b1a13458455e0de9efe RNScreens: 9ec969a95987a6caae170ef09313138abf3331e1 RNShare: 2a4cdfc0626ad56b0ef583d424f2038f772afe58 RNSound: 6c156f925295bdc83e8e422e7d8b38d33bc71852 @@ -2608,6 +2625,6 @@ SPEC CHECKSUMS: VisionCamera: 1394a316c7add37e619c48d7aa40b38b954bf055 Yoga: 64cd2a583ead952b0315d5135bf39e053ae9be70 -PODFILE CHECKSUM: 66a5c97ae1059e4da1993a4ad95abe5d819f555b +PODFILE CHECKSUM: d5e281e5370cb0211a104efd90eb5fa7af936e14 -COCOAPODS: 1.13.0 +COCOAPODS: 1.15.2 diff --git a/jest/setup.ts b/jest/setup.ts index 174e59a7e493..f11a8a4ed631 100644 --- a/jest/setup.ts +++ b/jest/setup.ts @@ -21,8 +21,8 @@ jest.mock('react-native-onyx/dist/storage', () => mockStorage); jest.mock('react-native/Libraries/EventEmitter/NativeEventEmitter'); // Turn off the console logs for timing events. They are not relevant for unit tests and create a lot of noise -jest.spyOn(console, 'debug').mockImplementation((...params) => { - if (params[0].indexOf('Timing:') === 0) { +jest.spyOn(console, 'debug').mockImplementation((...params: string[]) => { + if (params[0].startsWith('Timing:')) { return; } @@ -53,3 +53,6 @@ jest.mock('react-native-sound', () => { jest.mock('react-native-share', () => ({ default: jest.fn(), })); + +// eslint-disable-next-line @typescript-eslint/no-unsafe-return +jest.mock('react-native-keyboard-controller', () => require('react-native-keyboard-controller/jest')); diff --git a/package-lock.json b/package-lock.json index 7a7e2b035c1b..80947c22f6ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,32 +1,33 @@ { "name": "new.expensify", - "version": "1.4.76-6", + "version": "9.0.1-0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "new.expensify", - "version": "1.4.76-6", + "version": "9.0.1-0", "hasInstallScript": true, "license": "MIT", "dependencies": { "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@dotlottie/react-player": "^1.6.3", - "@expensify/react-native-live-markdown": "0.1.76", + "@expensify/react-native-live-markdown": "0.1.85", "@expo/metro-runtime": "~3.1.1", "@formatjs/intl-datetimeformat": "^6.10.0", "@formatjs/intl-listformat": "^7.2.2", "@formatjs/intl-locale": "^3.3.0", "@formatjs/intl-numberformat": "^8.5.0", "@formatjs/intl-pluralrules": "^5.2.2", + "@fullstory/babel-plugin-annotate-react": "github:fullstorydev/fullstory-babel-plugin-annotate-react#ryanwang/react-native-web-demo", "@fullstory/babel-plugin-react-native": "^1.2.1", "@fullstory/browser": "^2.0.3", "@fullstory/react-native": "^1.4.2", "@gorhom/portal": "^1.0.14", "@invertase/react-native-apple-authentication": "^2.2.2", "@kie/act-js": "^2.6.0", - "@kie/mock-github": "^1.0.0", + "@kie/mock-github": "2.0.1", "@onfido/react-native-sdk": "10.6.0", "@react-native-camera-roll/camera-roll": "7.4.0", "@react-native-clipboard/clipboard": "^1.13.2", @@ -59,11 +60,13 @@ "date-fns-tz": "^2.0.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "git+ssh://git@github.com/Expensify/expensify-common.git#1713f28214f0e7176c4fd13433fb0ea15491ebf9", + "expensify-common": "2.0.17", "expo": "^50.0.3", "expo-av": "~13.10.4", "expo-image": "1.11.0", "expo-image-manipulator": "11.8.0", + "fast-equals": "^4.0.3", + "focus-trap-react": "^10.2.3", "htmlparser2": "^7.2.0", "idb-keyval": "^6.2.1", "jest-expo": "50.0.1", @@ -73,7 +76,6 @@ "mapbox-gl": "^2.15.0", "onfido-sdk-ui": "14.15.0", "process": "^0.11.10", - "prop-types": "^15.7.2", "pusher-js": "8.3.0", "react": "18.2.0", "react-beautiful-dnd": "^13.1.1", @@ -99,11 +101,12 @@ "react-native-image-picker": "^7.0.3", "react-native-image-size": "git+https://github.com/Expensify/react-native-image-size#bf3ad41a61c4f6f80ed4d497599ef5247a2dd002", "react-native-key-command": "^1.0.8", + "react-native-keyboard-controller": "^1.12.2", "react-native-launch-arguments": "^4.0.2", "react-native-linear-gradient": "^2.8.1", "react-native-localize": "^2.2.6", "react-native-modal": "^13.0.0", - "react-native-onyx": "2.0.41", + "react-native-onyx": "2.0.52", "react-native-pager-view": "6.2.3", "react-native-pdf": "6.7.3", "react-native-performance": "^5.1.0", @@ -124,7 +127,7 @@ "react-native-url-polyfill": "^2.0.0", "react-native-view-shot": "3.8.0", "react-native-vision-camera": "^4.0.0-beta.13", - "react-native-web": "^0.19.9", + "react-native-web": "^0.19.12", "react-native-web-linear-gradient": "^1.1.2", "react-native-web-sound": "^0.1.3", "react-native-webview": "13.6.4", @@ -150,7 +153,7 @@ "@babel/runtime": "^7.20.0", "@babel/traverse": "^7.22.20", "@babel/types": "^7.22.19", - "@dword-design/eslint-plugin-import-alias": "^4.0.8", + "@dword-design/eslint-plugin-import-alias": "^5.0.0", "@electron/notarize": "^2.1.0", "@jest/globals": "^29.5.0", "@ngneat/falso": "^7.1.1", @@ -158,7 +161,7 @@ "@octokit/plugin-paginate-rest": "3.1.0", "@octokit/plugin-throttling": "4.1.0", "@octokit/rest": "^20.1.1", - "@react-native-community/eslint-config": "3.0.0", + "@react-native-community/eslint-config": "3.2.0", "@react-native/babel-preset": "^0.73.21", "@react-native/metro-config": "^0.73.5", "@react-navigation/devtools": "^6.0.10", @@ -186,12 +189,11 @@ "@types/setimmediate": "^1.0.2", "@types/webpack": "^5.28.5", "@types/webpack-bundle-analyzer": "^4.7.0", - "@typescript-eslint/eslint-plugin": "^6.13.2", - "@typescript-eslint/parser": "^6.13.2", + "@typescript-eslint/eslint-plugin": "^7.13.1", + "@typescript-eslint/parser": "^7.13.1", "@vercel/ncc": "0.38.1", "@welldone-software/why-did-you-render": "7.0.1", "ajv-cli": "^5.0.0", - "babel-eslint": "^10.1.0", "babel-jest": "29.4.1", "babel-loader": "^9.1.3", "babel-plugin-module-resolver": "^5.0.0", @@ -207,18 +209,16 @@ "dotenv": "^16.0.3", "electron": "^29.4.1", "electron-builder": "24.13.2", - "eslint": "^7.6.0", - "eslint-config-airbnb-typescript": "^17.1.0", - "eslint-config-expensify": "^2.0.47", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^24.1.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-typescript": "^18.0.0", + "eslint-config-expensify": "^2.0.52", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-jest": "^28.6.0", "eslint-plugin-jsdoc": "^46.2.6", - "eslint-plugin-jsx-a11y": "^6.6.1", "eslint-plugin-react-native-a11y": "^3.3.0", "eslint-plugin-storybook": "^0.8.0", "eslint-plugin-testing-library": "^6.2.2", - "eslint-plugin-you-dont-need-lodash-underscore": "^6.12.0", + "eslint-plugin-you-dont-need-lodash-underscore": "^6.14.0", "html-webpack-plugin": "^5.5.0", "jest": "29.4.1", "jest-circus": "29.4.1", @@ -242,6 +242,7 @@ "time-analytics-webpack-plugin": "^0.1.17", "ts-jest": "^29.1.2", "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", "type-fest": "^4.10.2", "typescript": "^5.4.5", "wait-port": "^0.2.9", @@ -253,16 +254,8 @@ "yaml": "^2.2.1" }, "engines": { - "node": "20.13.0", - "npm": "10.5.2" - } - }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "node": "20.14.0", + "npm": "10.7.0" } }, "node_modules/@actions/core": { @@ -473,10 +466,10 @@ } }, "node_modules/@babel/eslint-parser": { - "version": "7.23.10", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz", + "integrity": "sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA==", "dev": true, - "license": "MIT", - "peer": true, "dependencies": { "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", "eslint-visitor-keys": "^2.1.0", @@ -487,14 +480,13 @@ }, "peerDependencies": { "@babel/core": "^7.11.0", - "eslint": "^7.5.0 || ^8.0.0" + "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0" } }, "node_modules/@babel/eslint-parser/node_modules/semver": { "version": "6.3.1", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" } @@ -2873,16 +2865,18 @@ }, "node_modules/@dword-design/dedent": { "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@dword-design/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-OFmAmzKiDUh9m7WRMYcoEOPI7b5tS5hdqQmtKDwF+ZssVJv8a+GHo9VOtFsmlw3h8Roh/9QzFWIsjSFZyQUMdg==", "dev": true, - "license": "MIT", "dependencies": { "babel-plugin-add-module-exports": "^1.0.2" } }, "node_modules/@dword-design/endent": { "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@dword-design/endent/-/endent-1.4.1.tgz", + "integrity": "sha512-e2sCTzth5kyRdM0o+yEb5wBVzUdJL8Y6HblRGRV0Bif0knf1ZjRLhUjdCrqM+Muirb68X/xJzgdRDJVmLqgXGA==", "dev": true, - "license": "MIT", "dependencies": { "@dword-design/dedent": "^0.7.0", "fast-json-parse": "^1.0.3", @@ -2890,35 +2884,37 @@ } }, "node_modules/@dword-design/eslint-plugin-import-alias": { - "version": "4.0.8", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@dword-design/eslint-plugin-import-alias/-/eslint-plugin-import-alias-5.0.0.tgz", + "integrity": "sha512-QbY2hA+YvhKiPJnAd9fOwT7gNV8OvaGLHdUsC6uVtyoUVjzx55WbUlzlEZzurlwDamXDlIB81IxbHgHT32Lx0w==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.10.2", - "@dword-design/functions": "^5.0.22", + "@dword-design/functions": "^6.0.0", "babel-plugin-module-resolver": "^5.0.0", "deepmerge": "^4.3.1", "jiti": "^1.18.2" }, "engines": { - "node": ">=16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/dword-design" } }, "node_modules/@dword-design/functions": { - "version": "5.0.26", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@dword-design/functions/-/functions-6.0.0.tgz", + "integrity": "sha512-22X9eviXAbaz8xdYrp5Tj6KjDPiT+m3fppAP+wEqA3gecAlCyExABesA1bEZ57aXrXrbhNk88M8PvdAO/PLg3A==", "dev": true, - "license": "MIT", "dependencies": { "@dword-design/endent": "^1.0.0", - "delay": "^5.0.0", + "delay": "^6.0.0", "lodash": "^4.17.15", "tinycolor2": "^1.4.1" }, "engines": { - "node": ">=14" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/dword-design" @@ -3481,36 +3477,42 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", "dev": true, - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "0.4.3", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -3522,10 +3524,17 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.21.0", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -3536,23 +3545,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/@eslint/eslintrc/node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -3560,10 +3575,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@expensify/react-native-live-markdown": { - "version": "0.1.76", - "resolved": "https://registry.npmjs.org/@expensify/react-native-live-markdown/-/react-native-live-markdown-0.1.76.tgz", - "integrity": "sha512-JUXiLg0Y2FJiVOfZKRgoOP1no8ThPaJ6MBc122UsW6SG53OvS12MTHfgfKHjXRH1nIGro/p9ekYb8GAzpp+kdw==", + "version": "0.1.85", + "resolved": "https://registry.npmjs.org/@expensify/react-native-live-markdown/-/react-native-live-markdown-0.1.85.tgz", + "integrity": "sha512-jeP4JBzN34pGSpjHKM7Zj3d0cqcKbID3//WrqC+SI7SK/1iJT4SdhZptVCxUg+Dcxq5XwzYIhdnhTNimeya0Fg==", "workspaces": [ "parser", "example", @@ -5588,8 +5612,7 @@ }, "node_modules/@fullstory/babel-plugin-annotate-react": { "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@fullstory/babel-plugin-annotate-react/-/babel-plugin-annotate-react-2.3.0.tgz", - "integrity": "sha512-gYLUL6Tu0exbvTIhK9nSCaztmqBlQAm07Fvtl/nKTc+lxwFkcX9vR8RrdTbyjJZKbPaA5EMlExQ6GeLCXkfm5g==" + "resolved": "git+ssh://git@github.com/fullstorydev/fullstory-babel-plugin-annotate-react.git#25c26dadb644d5355e381a4ea4ca1cd05af4a8f6" }, "node_modules/@fullstory/babel-plugin-react-native": { "version": "1.2.1", @@ -5672,22 +5695,39 @@ "license": "Apache-2.0" }, "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "deprecated": "Use @eslint/config-array instead", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" }, "engines": { "node": ">=10.10.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "BSD-3-Clause" + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true }, "node_modules/@invertase/react-native-apple-authentication": { "version": "2.2.2", @@ -7054,48 +7094,12 @@ "act-js": "bin/act" } }, - "node_modules/@kie/act-js/node_modules/@kie/mock-github": { - "version": "2.0.0", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@octokit/openapi-types-ghec": "^18.0.0", - "ajv": "^8.11.0", - "express": "^4.18.1", - "fast-glob": "^3.2.12", - "fs-extra": "^10.1.0", - "nock": "^13.2.7", - "simple-git": "^3.8.0", - "totalist": "^3.0.0" - } - }, - "node_modules/@kie/act-js/node_modules/@octokit/openapi-types-ghec": { - "version": "18.1.1", - "license": "MIT" - }, - "node_modules/@kie/act-js/node_modules/fs-extra": { - "version": "10.1.0", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@kie/act-js/node_modules/totalist": { - "version": "3.0.1", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/@kie/mock-github": { - "version": "1.1.0", - "license": "SEE LICENSE IN LICENSE", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@kie/mock-github/-/mock-github-2.0.1.tgz", + "integrity": "sha512-G1FD/jg1KyW7a6NvKI4uEVJCK3eJnzXkh4Ikxn2is5tiNC980lavi8ak6bn1QEFEgpYcfM4DpZM3yHDfOmyLuQ==", "dependencies": { - "@octokit/openapi-types-ghec": "^14.0.0", + "@octokit/openapi-types-ghec": "^18.0.0", "ajv": "^8.11.0", "express": "^4.18.1", "fast-glob": "^3.2.12", @@ -7409,7 +7413,6 @@ "version": "5.1.1-v1", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "eslint-scope": "5.1.1" } @@ -7545,8 +7548,9 @@ "license": "MIT" }, "node_modules/@octokit/openapi-types-ghec": { - "version": "14.0.0", - "license": "MIT" + "version": "18.1.1", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types-ghec/-/openapi-types-ghec-18.1.1.tgz", + "integrity": "sha512-5Ri7FLYX4gJSdG+G0Q8QDca/gOLfkPN4YR2hkbVg6hEL+0N62MIsJPTyNaT9pGEXCLd1KbYV6Lh3T2ggsmyBJw==" }, "node_modules/@octokit/plugin-paginate-rest": { "version": "3.1.0", @@ -8868,52 +8872,57 @@ } }, "node_modules/@react-native-community/eslint-config": { - "version": "3.0.0", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@react-native-community/eslint-config/-/eslint-config-3.2.0.tgz", + "integrity": "sha512-ZjGvoeiBtCbd506hQqwjKmkWPgynGUoJspG8/MuV/EfKnkjCtBmeJvq2n+sWbWEvL9LWXDp2GJmPzmvU5RSvKQ==", "dev": true, - "license": "MIT", "dependencies": { + "@babel/core": "^7.14.0", + "@babel/eslint-parser": "^7.18.2", "@react-native-community/eslint-plugin": "^1.1.0", - "@typescript-eslint/eslint-plugin": "^4.22.1", - "@typescript-eslint/parser": "^4.22.1", - "babel-eslint": "^10.1.0", - "eslint-config-prettier": "^6.10.1", - "eslint-plugin-eslint-comments": "^3.1.2", - "eslint-plugin-flowtype": "2.50.3", - "eslint-plugin-jest": "22.4.1", - "eslint-plugin-prettier": "3.1.2", - "eslint-plugin-react": "^7.20.0", - "eslint-plugin-react-hooks": "^4.0.7", - "eslint-plugin-react-native": "^3.10.0", - "prettier": "^2.0.2" + "@typescript-eslint/eslint-plugin": "^5.30.5", + "@typescript-eslint/parser": "^5.30.5", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-eslint-comments": "^3.2.0", + "eslint-plugin-ft-flow": "^2.0.1", + "eslint-plugin-jest": "^26.5.3", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.30.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-native": "^4.0.0" }, "peerDependencies": { - "eslint": ">=7" + "eslint": ">=8", + "prettier": ">=2" } }, "node_modules/@react-native-community/eslint-config/node_modules/@typescript-eslint/eslint-plugin": { - "version": "4.33.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/experimental-utils": "4.33.0", - "@typescript-eslint/scope-manager": "4.33.0", - "debug": "^4.3.1", - "functional-red-black-tree": "^1.0.1", - "ignore": "^5.1.8", - "regexpp": "^3.1.0", - "semver": "^7.3.5", + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", "tsutils": "^3.21.0" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^4.0.0", - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -8922,24 +8931,25 @@ } }, "node_modules/@react-native-community/eslint-config/node_modules/@typescript-eslint/parser": { - "version": "4.33.0", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "debug": "^4.3.1" + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0" + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -8947,29 +8957,153 @@ } } }, - "node_modules/@react-native-community/eslint-config/node_modules/eslint-config-prettier": { - "version": "6.15.0", + "node_modules/@react-native-community/eslint-config/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, - "license": "MIT", "dependencies": { - "get-stdin": "^6.0.0" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@react-native-community/eslint-config/node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@react-native-community/eslint-config/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@react-native-community/eslint-config/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@react-native-community/eslint-config/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@react-native-community/eslint-config/node_modules/eslint-config-prettier": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", + "dev": true, "bin": { - "eslint-config-prettier-check": "bin/cli.js" + "eslint-config-prettier": "bin/cli.js" }, "peerDependencies": { - "eslint": ">=3.14.1" + "eslint": ">=7.0.0" } }, "node_modules/@react-native-community/eslint-config/node_modules/eslint-plugin-jest": { - "version": "22.4.1", + "version": "26.9.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-26.9.0.tgz", + "integrity": "sha512-TWJxWGp1J628gxh2KhaH1H1paEdgE2J61BBF1I59c6xWeL5+D1BzMxGDN/nXAfX+aSkR5u80K+XhskK6Gwq9ng==", "dev": true, - "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^5.10.0" + }, "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "peerDependencies": { - "eslint": ">=5" + "@typescript-eslint/eslint-plugin": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/@react-native-community/eslint-config/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/@react-native-community/eslint-plugin": { @@ -11281,29 +11415,6 @@ "node": ">=14.14" } }, - "node_modules/@storybook/preset-react-webpack/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@storybook/preset-react-webpack/node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "dev": true, - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@storybook/preview": { "version": "8.0.6", "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-8.0.6.tgz", @@ -12652,8 +12763,9 @@ }, "node_modules/@types/json5": { "version": "0.0.29", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true }, "node_modules/@types/keyv": { "version": "3.1.4", @@ -13000,86 +13112,31 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.13.2", + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.1.tgz", + "integrity": "sha512-kZqi+WZQaZfPKnsflLJQCz6Ze9FFSMfXrrIOcyargekQxG37ES7DJNpJUE9Q/X5n3yTIP/WPutVNzgknQ7biLg==", "dev": true, - "license": "MIT", "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.13.2", - "@typescript-eslint/type-utils": "6.13.2", - "@typescript-eslint/utils": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", - "debug": "^4.3.4", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.13.1", + "@typescript-eslint/type-utils": "7.13.1", + "@typescript-eslint/utils": "7.13.1", + "@typescript-eslint/visitor-keys": "7.13.1", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", - "eslint": "^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "6.13.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.13.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.13.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -13088,99 +13145,48 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "6.13.2", + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.1.tgz", + "integrity": "sha512-h5MzFBD5a/Gh/fvNdp9pTfqJAbuQC4sCN2WzuXme71lqFJsZtLbjxfSk4r3p02WIArOF9N94pdsLiGutpDbrXQ==", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.13.2", - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/typescript-estree": "6.13.2", - "semver": "^7.5.4" + "@typescript-eslint/scope-manager": "7.13.1", + "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/typescript-estree": "7.13.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.13.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.13.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typescript-eslint/experimental-utils": { - "version": "4.33.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.7", - "@typescript-eslint/scope-manager": "4.33.0", - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/typescript-estree": "4.33.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" + "eslint": "^8.56.0" } }, "node_modules/@typescript-eslint/parser": { - "version": "6.13.2", + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.13.1.tgz", + "integrity": "sha512-1ELDPlnLvDQ5ybTSrMhRTFDfOQEOXNM+eP+3HT/Yq7ruWpciQw+Avi73pdEbA4SooCawEWo3dtYbF68gN7Ed1A==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "6.13.2", - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/typescript-estree": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", + "@typescript-eslint/scope-manager": "7.13.1", + "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/typescript-estree": "7.13.1", + "@typescript-eslint/visitor-keys": "7.13.1", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -13188,97 +13194,17 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "6.13.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "6.13.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.13.2", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.13.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "6.13.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/@typescript-eslint/scope-manager": { - "version": "4.33.0", + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.1.tgz", + "integrity": "sha512-adbXNVEs6GmbzaCpymHQ0MB6E4TqoiVbC0iqG3uijR8ZYfpAXMGttouQzF4Oat3P2GxDVIrg7bMI/P65LiQZdg==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0" + "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/visitor-keys": "7.13.1" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -13286,24 +13212,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.13.2", + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.13.1.tgz", + "integrity": "sha512-aWDbLu1s9bmgPGXSzNCxELu+0+HQOapV/y+60gPXafR8e2g1Bifxzevaa+4L2ytCWm+CHqpELq4CSoN9ELiwCg==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "6.13.2", - "@typescript-eslint/utils": "6.13.2", + "@typescript-eslint/typescript-estree": "7.13.1", + "@typescript-eslint/utils": "7.13.1", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" + "eslint": "^8.56.0" }, "peerDependenciesMeta": { "typescript": { @@ -13311,49 +13238,58 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.13.2", + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.1.tgz", + "integrity": "sha512-h5MzFBD5a/Gh/fvNdp9pTfqJAbuQC4sCN2WzuXme71lqFJsZtLbjxfSk4r3p02WIArOF9N94pdsLiGutpDbrXQ==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2" + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.13.1", + "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/typescript-estree": "7.13.1" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.13.2", + "node_modules/@typescript-eslint/types": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.1.tgz", + "integrity": "sha512-7K7HMcSQIAND6RBL4kDl24sG/xKM13cA85dc7JnmQXw2cBDngg7c19B++JzvJHRG3zG36n9j1i451GBzRuHchw==", "dev": true, - "license": "MIT", "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.13.2", + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.1.tgz", + "integrity": "sha512-uxNr51CMV7npU1BxZzYjoVz9iyjckBduFBP0S5sLlh1tXYzHzgZ3BR9SVsNed+LmwKrmnqN3Kdl5t7eZ5TS1Yw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/visitor-keys": "6.13.2", + "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/visitor-keys": "7.13.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -13365,93 +13301,28 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "6.13.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.13.2", - "@typescript-eslint/types": "6.13.2", - "@typescript-eslint/typescript-estree": "6.13.2", - "semver": "^7.5.4" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.13.2", + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "6.13.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "4.33.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" + "balanced-match": "^1.0.0" } }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "4.33.0", + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "4.33.0", - "@typescript-eslint/visitor-keys": "4.33.0", - "debug": "^4.3.1", - "globby": "^11.0.3", - "is-glob": "^4.0.1", - "semver": "^7.3.5", - "tsutils": "^3.21.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=16 || 14 >=14.17" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/utils": { @@ -13567,21 +13438,34 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "4.33.0", + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.1.tgz", + "integrity": "sha512-k/Bfne7lrP7hcb7m9zSsgcBmo+8eicqqfNAJ7uUY+jkTFpKeH2FSkWpFRtimBxgkyvqfu9jTPRbYOvud6isdXA==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/types": "4.33.0", - "eslint-visitor-keys": "^2.0.0" + "@typescript-eslint/types": "7.13.1", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^8.10.0 || ^10.13.0 || >=11.10.1" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@ua/react-native-airship": { "version": "17.2.1", "resolved": "https://registry.npmjs.org/@ua/react-native-airship/-/react-native-airship-17.2.1.tgz", @@ -14174,14 +14058,6 @@ "version": "1.4.10", "license": "MIT" }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-escapes": { "version": "4.3.2", "license": "MIT", @@ -14771,6 +14647,7 @@ "version": "2.0.0", "dev": true, "license": "MIT", + "optional": true, "engines": { "node": ">=8" } @@ -15223,8 +15100,9 @@ }, "node_modules/babel-plugin-add-module-exports": { "version": "1.0.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-1.0.4.tgz", + "integrity": "sha512-g+8yxHUZ60RcyaUpfNzy56OtWW+x9cyEe9j+CranqLiqbju2yf/Cy6ZtYK40EZxtrdHllzlVZgLmcOUCTlJ7Jg==", + "dev": true }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", @@ -18356,11 +18234,12 @@ } }, "node_modules/delay": { - "version": "5.0.0", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-6.0.0.tgz", + "integrity": "sha512-2NJozoOHQ4NuZuVIr5CWd0iiLVIRSDepakaovIN+9eIDHEhdCAEvSy2cuf1DCrPPQLvHmbqTHODlhHg8UCy4zw==", "dev": true, - "license": "MIT", "engines": { - "node": ">=10" + "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -19122,17 +19001,6 @@ "node": ">=10.13.0" } }, - "node_modules/enquirer": { - "version": "2.3.6", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/entities": { "version": "2.2.0", "license": "BSD-2-Clause", @@ -19448,56 +19316,55 @@ } }, "node_modules/eslint": { - "version": "7.32.0", + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.0.1", + "debug": "^4.3.2", "doctrine": "^3.0.0", - "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", + "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -19550,28 +19417,30 @@ } }, "node_modules/eslint-config-airbnb-typescript": { - "version": "17.1.0", + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-18.0.0.tgz", + "integrity": "sha512-oc+Lxzgzsu8FQyFVa4QFaVKiitTYiiW3frB9KYW5OWdPrqFc7FzxgB20hP4cHMlr+MBzGcLl3jnCOVOydL9mIg==", "dev": true, - "license": "MIT", "dependencies": { "eslint-config-airbnb-base": "^15.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", - "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", - "eslint": "^7.32.0 || ^8.2.0", - "eslint-plugin-import": "^2.25.3" + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" } }, "node_modules/eslint-config-expensify": { - "version": "2.0.48", - "resolved": "https://registry.npmjs.org/eslint-config-expensify/-/eslint-config-expensify-2.0.48.tgz", - "integrity": "sha512-PFegJ9Wfsiu5tgevhjA1toCxsZ8Etfk6pIjtXAnwpmVj7q4CtB3QDRusJoUDyJ3HrZr8AsFKViz7CU/CBTfwOw==", + "version": "2.0.52", + "resolved": "https://registry.npmjs.org/eslint-config-expensify/-/eslint-config-expensify-2.0.52.tgz", + "integrity": "sha512-TUhtgsb+EUsfqhEGhSbUVgIypEhZjloYC8PEPxKKniaaG14SW/z1G3C5E4NJQ05xVdRwJ4H+shF7ZzOYbVcraQ==", "dev": true, "dependencies": { "@lwc/eslint-plugin-lwc": "^1.7.2", + "@typescript-eslint/parser": "^7.12.0", + "@typescript-eslint/utils": "^7.12.0", "babel-eslint": "^10.1.0", - "eslint": "^7.32.0", + "eslint": "^8.56.0", "eslint-config-airbnb": "19.0.4", "eslint-config-airbnb-base": "15.0.0", "eslint-plugin-es": "^4.1.0", @@ -19584,10 +19453,144 @@ "underscore": "^1.13.6" } }, + "node_modules/eslint-config-expensify/node_modules/@typescript-eslint/scope-manager": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz", + "integrity": "sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.12.0", + "@typescript-eslint/visitor-keys": "7.12.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-expensify/node_modules/@typescript-eslint/types": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz", + "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-expensify/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz", + "integrity": "sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.12.0", + "@typescript-eslint/visitor-keys": "7.12.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-expensify/node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-config-expensify/node_modules/@typescript-eslint/utils": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.12.0.tgz", + "integrity": "sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.12.0", + "@typescript-eslint/types": "7.12.0", + "@typescript-eslint/typescript-estree": "7.12.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz", + "integrity": "sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.12.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-config-expensify/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-config-expensify/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/eslint-config-prettier": { - "version": "8.10.0", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", "dev": true, - "license": "MIT", "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -19703,18 +19706,21 @@ "node": ">=0.8.0" } }, - "node_modules/eslint-plugin-flowtype": { - "version": "2.50.3", + "node_modules/eslint-plugin-ft-flow": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-ft-flow/-/eslint-plugin-ft-flow-2.0.3.tgz", + "integrity": "sha512-Vbsd/b+LYA99jUbsL6viEUWShFaYQt2YQs3QN3f+aeszOhh2sgdcU0mjzDyD4yyBvMc8qy2uwvBBWfMzEX06tg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { - "lodash": "^4.17.10" + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" }, "engines": { - "node": ">=4" + "node": ">=12.22.0" }, "peerDependencies": { - "eslint": ">=2.0.0" + "@babel/eslint-parser": "^7.12.0", + "eslint": "^8.1.0" } }, "node_modules/eslint-plugin-import": { @@ -19766,6 +19772,18 @@ "node": ">=0.10.0" } }, + "node_modules/eslint-plugin-import/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "dev": true, @@ -19774,26 +19792,74 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-import/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import/node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, "node_modules/eslint-plugin-jest": { - "version": "24.7.0", + "version": "28.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.6.0.tgz", + "integrity": "sha512-YG28E1/MIKwnz+e2H7VwYPzHUYU4aMa19w0yGcwXnnmJH6EfgHahTJ2un3IyraUxNfnz/KUhJAFXNNwWPo12tg==", "dev": true, - "license": "MIT", "dependencies": { - "@typescript-eslint/experimental-utils": "^4.0.1" + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0" }, "engines": { - "node": ">=10" + "node": "^16.10.0 || ^18.12.0 || >=20.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": ">= 4", - "eslint": ">=5" + "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0", + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", + "jest": "*" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { "optional": true + }, + "jest": { + "optional": true } } }, + "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.1.tgz", + "integrity": "sha512-h5MzFBD5a/Gh/fvNdp9pTfqJAbuQC4sCN2WzuXme71lqFJsZtLbjxfSk4r3p02WIArOF9N94pdsLiGutpDbrXQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.13.1", + "@typescript-eslint/types": "7.13.1", + "@typescript-eslint/typescript-estree": "7.13.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, "node_modules/eslint-plugin-jsdoc": { "version": "46.2.6", "dev": true, @@ -19867,18 +19933,24 @@ } }, "node_modules/eslint-plugin-prettier": { - "version": "3.1.2", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", "dev": true, - "license": "MIT", "dependencies": { "prettier-linter-helpers": "^1.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=12.0.0" }, "peerDependencies": { - "eslint": ">= 5.0.0", - "prettier": ">= 1.13.0" + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } } }, "node_modules/eslint-plugin-react": { @@ -19922,15 +19994,15 @@ } }, "node_modules/eslint-plugin-react-native": { - "version": "3.11.0", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-4.1.0.tgz", + "integrity": "sha512-QLo7rzTBOl43FvVqDdq5Ql9IoElIuTdjrz9SKAXCvULvBoRZ44JGSkx9z4999ZusCsb4rK3gjS8gOGyeYqZv2Q==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/traverse": "^7.7.4", "eslint-plugin-react-native-globals": "^0.1.1" }, "peerDependencies": { - "eslint": "^3.17.0 || ^4 || ^5 || ^6 || ^7" + "eslint": "^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8" } }, "node_modules/eslint-plugin-react-native-a11y": { @@ -19951,8 +20023,9 @@ }, "node_modules/eslint-plugin-react-native-globals": { "version": "0.1.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz", + "integrity": "sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g==", + "dev": true }, "node_modules/eslint-plugin-react/node_modules/doctrine": { "version": "2.1.0", @@ -20040,9 +20113,10 @@ } }, "node_modules/eslint-plugin-you-dont-need-lodash-underscore": { - "version": "6.12.0", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-you-dont-need-lodash-underscore/-/eslint-plugin-you-dont-need-lodash-underscore-6.14.0.tgz", + "integrity": "sha512-3zkkU/O1agczP7szJGHmisZJS/AknfVl6mb0Zqoc95dvFsdmfK+cbhrn+Ffy0UWB1pgDJwQr7kIO3rPstWs3Dw==", "dev": true, - "license": "MIT", "dependencies": { "kebab-case": "^1.0.0" }, @@ -20068,23 +20142,6 @@ "node": ">=4.0" } }, - "node_modules/eslint-utils": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^2.0.0" - }, - "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" - } - }, "node_modules/eslint-visitor-keys": { "version": "2.1.0", "dev": true, @@ -20093,14 +20150,6 @@ "node": ">=10" } }, - "node_modules/eslint/node_modules/@babel/code-frame": { - "version": "7.12.11", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, "node_modules/eslint/node_modules/ajv": { "version": "6.12.6", "dev": true, @@ -20130,6 +20179,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/eslint/node_modules/chalk": { "version": "4.1.2", "dev": true, @@ -20161,26 +20216,44 @@ "dev": true, "license": "MIT" }, - "node_modules/eslint/node_modules/eslint-utils": { - "version": "2.1.0", + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^1.1.0" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" }, "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/mysticatea" + "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" } }, "node_modules/eslint/node_modules/globals": { @@ -20205,35 +20278,32 @@ "node": ">=8" } }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", + "node_modules/eslint/node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">= 4" + "node": ">=8" } }, - "node_modules/eslint/node_modules/json-schema-traverse": { - "version": "0.4.1", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/optionator": { - "version": "0.9.3", + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" + "argparse": "^2.0.1" }, - "engines": { - "node": ">= 0.8.0" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, + "node_modules/eslint/node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, "node_modules/eslint/node_modules/supports-color": { "version": "7.2.0", "dev": true, @@ -20257,24 +20327,44 @@ } }, "node_modules/espree": { - "version": "7.3.1", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree/node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" } }, "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { - "node": ">=4" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/esprima": { @@ -20534,11 +20624,11 @@ } }, "node_modules/expensify-common": { - "version": "1.0.0", - "resolved": "git+ssh://git@github.com/Expensify/expensify-common.git#1713f28214f0e7176c4fd13433fb0ea15491ebf9", - "integrity": "sha512-uy1+axUTTuPKwAR06xNG/tGIJ+uaavmSQgKiNU7pQVR94ibNzDD2WESn2E7OEP9/QrHa61lfFlluTjFvvz5I8Q==", - "license": "MIT", + "version": "2.0.17", + "resolved": "https://registry.npmjs.org/expensify-common/-/expensify-common-2.0.17.tgz", + "integrity": "sha512-W7xO10/bYF/p0/cUOtzejXJDiLCB/U6JTXVltzOE70xjGgzTSyRotPkEtEItHTvXOS2Wz8jJ262nrGfFMpfisA==", "dependencies": { + "awesome-phonenumber": "^5.4.0", "classnames": "2.5.0", "clipboard": "2.0.11", "html-entities": "^2.5.2", @@ -20550,8 +20640,7 @@ "react-dom": "16.12.0", "semver": "^7.6.0", "simply-deferred": "git+https://github.com/Expensify/simply-deferred.git#77a08a95754660c7bd6e0b6979fdf84e8e831bf5", - "ua-parser-js": "^1.0.37", - "underscore": "1.13.6" + "ua-parser-js": "^1.0.37" } }, "node_modules/expensify-common/node_modules/react": { @@ -21480,6 +21569,28 @@ "node": ">=0.4.0" } }, + "node_modules/focus-trap": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/focus-trap-react": { + "version": "10.2.3", + "resolved": "https://registry.npmjs.org/focus-trap-react/-/focus-trap-react-10.2.3.tgz", + "integrity": "sha512-YXBpFu/hIeSu6NnmV2xlXzOYxuWkoOtar9jzgp3lOmjWLWY59C/b8DtDHEAV4SPU07Nd/t+nS/SBNGkhUBFmEw==", + "dependencies": { + "focus-trap": "^7.5.4", + "tabbable": "^6.2.0" + }, + "peerDependencies": { + "prop-types": "^15.8.1", + "react": ">=16.3.0", + "react-dom": ">=16.3.0" + } + }, "node_modules/follow-redirects": { "version": "1.15.5", "funding": [ @@ -21821,11 +21932,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/functions-have-names": { "version": "1.2.3", "dev": true, @@ -23120,8 +23226,9 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.2.4", - "license": "MIT", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "engines": { "node": ">= 4" } @@ -27470,11 +27577,6 @@ "version": "4.1.1", "license": "MIT" }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "dev": true, - "license": "MIT" - }, "node_modules/lodash.union": { "version": "4.6.0", "dev": true, @@ -28947,6 +29049,12 @@ "version": "1.4.0", "license": "MIT" }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/ncp": { "version": "2.0.0", "license": "MIT", @@ -29774,6 +29882,23 @@ "opener": "bin/opener-bin.js" } }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/ora": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", @@ -30631,8 +30756,9 @@ }, "node_modules/prettier-linter-helpers": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", "dev": true, - "license": "MIT", "dependencies": { "fast-diff": "^1.1.2" }, @@ -31702,6 +31828,16 @@ "version": "5.0.1", "license": "MIT" }, + "node_modules/react-native-keyboard-controller": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/react-native-keyboard-controller/-/react-native-keyboard-controller-1.12.2.tgz", + "integrity": "sha512-10Sy0+neSHGJxOmOxrUJR8TQznnrQ+jTFQtM1PP6YnblNQeAw1eOa+lO6YLGenRr5WuNSMZbks/3Ay0e2yMKLw==", + "peerDependencies": { + "react": "*", + "react-native": "*", + "react-native-reanimated": ">=2.3.0" + } + }, "node_modules/react-native-launch-arguments": { "version": "4.0.2", "license": "MIT", @@ -31749,17 +31885,17 @@ } }, "node_modules/react-native-onyx": { - "version": "2.0.41", - "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-2.0.41.tgz", - "integrity": "sha512-33r0sVBq7MV/GZwRneRt81uxgW8x3YG75VNJvThycB/dkCnGCfbxoVkZADVH3ET3jzfFXy9wnS06sZnZp78zMQ==", + "version": "2.0.52", + "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-2.0.52.tgz", + "integrity": "sha512-uXlNhQg1UStx1W/U+9GYtIhLvx3vTIpN1WwE1gsiVxvimnUzKpQX/JBkgpR9b48ZoxsdiZXOT5kKLlqGCa6O1g==", "dependencies": { "ascii-table": "0.0.9", "fast-equals": "^4.0.3", "underscore": "^1.13.6" }, "engines": { - "node": ">=20.10.0", - "npm": ">=10.2.3" + "node": ">=20.14.0", + "npm": ">=10.7.0" }, "peerDependencies": { "idb-keyval": "^6.2.1", @@ -32065,11 +32201,12 @@ } }, "node_modules/react-native-web": { - "version": "0.19.9", - "license": "MIT", + "version": "0.19.12", + "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.19.12.tgz", + "integrity": "sha512-o2T0oztoVDQjztt4YksO9S1XRjoH/AqcSvifgWLrPJgGVbMWsfhILgl6lfUdEamVZzZSVV/2gqDVMAk/qq7mZw==", "dependencies": { "@babel/runtime": "^7.18.6", - "@react-native/normalize-color": "^2.1.0", + "@react-native/normalize-colors": "^0.74.1", "fbjs": "^3.0.4", "inline-style-prefixer": "^6.0.1", "memoize-one": "^6.0.0", @@ -32099,6 +32236,11 @@ "react-native-web": "*" } }, + "node_modules/react-native-web/node_modules/@react-native/normalize-colors": { + "version": "0.74.81", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.74.81.tgz", + "integrity": "sha512-g3YvkLO7UsSWiDfYAU+gLhRHtEpUyz732lZB+N8IlLXc5MnfXHC8GKneDGY3Mh52I3gBrs20o37D5viQX9E1CA==" + }, "node_modules/react-native-web/node_modules/memoize-one": { "version": "6.0.0", "license": "MIT" @@ -34935,6 +35077,12 @@ "node": ">=10" } }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", + "dev": true + }, "node_modules/string-width": { "version": "4.2.3", "license": "MIT", @@ -35371,66 +35519,10 @@ "version": "3.2.4", "license": "MIT" }, - "node_modules/table": { - "version": "6.8.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/table/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/table/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/table/node_modules/slice-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" }, "node_modules/tapable": { "version": "2.2.1", @@ -35875,8 +35967,9 @@ }, "node_modules/tinycolor2": { "version": "1.6.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.6.0.tgz", + "integrity": "sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==", + "dev": true }, "node_modules/tinyqueue": { "version": "2.0.3", @@ -36031,11 +36124,12 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.1", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, - "license": "MIT", "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" @@ -36174,25 +36268,17 @@ "license": "Apache-2.0" }, "node_modules/tsconfig-paths": { - "version": "3.15.0", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", "dev": true, - "license": "MIT", "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", + "json5": "^2.2.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.0" }, - "bin": { - "json5": "lib/cli.js" + "engines": { + "node": ">=6" } }, "node_modules/tsconfig-paths/node_modules/strip-bom": { @@ -36814,11 +36900,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "dev": true, - "license": "MIT" - }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "devOptional": true, @@ -38021,6 +38102,15 @@ "version": "4.0.15", "license": "MIT" }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", diff --git a/package.json b/package.json index 1493e9fb48dc..fce99497a539 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "new.expensify", - "version": "1.4.76-6", + "version": "9.0.1-0", "author": "Expensify, Inc.", "homepage": "https://new.expensify.com", "description": "New Expensify is the next generation of Expensify: a reimagination of payments based atop a foundation of chat.", @@ -53,6 +53,7 @@ "symbolicate:ios": "npx metro-symbolicate main.jsbundle.map", "symbolicate-release:ios": "scripts/release-profile.ts --platform=ios", "symbolicate-release:android": "scripts/release-profile.ts --platform=android", + "symbolicate-profile": "scripts/symbolicate-profile.ts", "test:e2e": "ts-node tests/e2e/testRunner.ts --config ./config.local.ts", "test:e2e:dev": "ts-node tests/e2e/testRunner.ts --config ./config.dev.ts", "gh-actions-unused-styles": "./.github/scripts/findUnusedKeys.sh", @@ -65,20 +66,21 @@ "@babel/plugin-proposal-private-methods": "^7.18.6", "@babel/plugin-proposal-private-property-in-object": "^7.21.11", "@dotlottie/react-player": "^1.6.3", - "@expensify/react-native-live-markdown": "0.1.76", + "@expensify/react-native-live-markdown": "0.1.85", "@expo/metro-runtime": "~3.1.1", "@formatjs/intl-datetimeformat": "^6.10.0", "@formatjs/intl-listformat": "^7.2.2", "@formatjs/intl-locale": "^3.3.0", "@formatjs/intl-numberformat": "^8.5.0", "@formatjs/intl-pluralrules": "^5.2.2", + "@fullstory/babel-plugin-annotate-react": "github:fullstorydev/fullstory-babel-plugin-annotate-react#ryanwang/react-native-web-demo", "@fullstory/babel-plugin-react-native": "^1.2.1", "@fullstory/browser": "^2.0.3", "@fullstory/react-native": "^1.4.2", "@gorhom/portal": "^1.0.14", "@invertase/react-native-apple-authentication": "^2.2.2", "@kie/act-js": "^2.6.0", - "@kie/mock-github": "^1.0.0", + "@kie/mock-github": "2.0.1", "@onfido/react-native-sdk": "10.6.0", "@react-native-camera-roll/camera-roll": "7.4.0", "@react-native-clipboard/clipboard": "^1.13.2", @@ -111,11 +113,13 @@ "date-fns-tz": "^2.0.0", "dom-serializer": "^0.2.2", "domhandler": "^4.3.0", - "expensify-common": "git+ssh://git@github.com/Expensify/expensify-common.git#1713f28214f0e7176c4fd13433fb0ea15491ebf9", + "expensify-common": "2.0.17", "expo": "^50.0.3", "expo-av": "~13.10.4", "expo-image": "1.11.0", "expo-image-manipulator": "11.8.0", + "fast-equals": "^4.0.3", + "focus-trap-react": "^10.2.3", "htmlparser2": "^7.2.0", "idb-keyval": "^6.2.1", "jest-expo": "50.0.1", @@ -125,7 +129,6 @@ "mapbox-gl": "^2.15.0", "onfido-sdk-ui": "14.15.0", "process": "^0.11.10", - "prop-types": "^15.7.2", "pusher-js": "8.3.0", "react": "18.2.0", "react-beautiful-dnd": "^13.1.1", @@ -151,11 +154,12 @@ "react-native-image-picker": "^7.0.3", "react-native-image-size": "git+https://github.com/Expensify/react-native-image-size#bf3ad41a61c4f6f80ed4d497599ef5247a2dd002", "react-native-key-command": "^1.0.8", + "react-native-keyboard-controller": "^1.12.2", "react-native-launch-arguments": "^4.0.2", "react-native-linear-gradient": "^2.8.1", "react-native-localize": "^2.2.6", "react-native-modal": "^13.0.0", - "react-native-onyx": "2.0.41", + "react-native-onyx": "2.0.52", "react-native-pager-view": "6.2.3", "react-native-pdf": "6.7.3", "react-native-performance": "^5.1.0", @@ -176,7 +180,7 @@ "react-native-url-polyfill": "^2.0.0", "react-native-view-shot": "3.8.0", "react-native-vision-camera": "^4.0.0-beta.13", - "react-native-web": "^0.19.9", + "react-native-web": "^0.19.12", "react-native-web-linear-gradient": "^1.1.2", "react-native-web-sound": "^0.1.3", "react-native-webview": "13.6.4", @@ -202,7 +206,7 @@ "@babel/runtime": "^7.20.0", "@babel/traverse": "^7.22.20", "@babel/types": "^7.22.19", - "@dword-design/eslint-plugin-import-alias": "^4.0.8", + "@dword-design/eslint-plugin-import-alias": "^5.0.0", "@electron/notarize": "^2.1.0", "@jest/globals": "^29.5.0", "@ngneat/falso": "^7.1.1", @@ -210,7 +214,7 @@ "@octokit/plugin-paginate-rest": "3.1.0", "@octokit/plugin-throttling": "4.1.0", "@octokit/rest": "^20.1.1", - "@react-native-community/eslint-config": "3.0.0", + "@react-native-community/eslint-config": "3.2.0", "@react-native/babel-preset": "^0.73.21", "@react-native/metro-config": "^0.73.5", "@react-navigation/devtools": "^6.0.10", @@ -238,12 +242,11 @@ "@types/setimmediate": "^1.0.2", "@types/webpack": "^5.28.5", "@types/webpack-bundle-analyzer": "^4.7.0", - "@typescript-eslint/eslint-plugin": "^6.13.2", - "@typescript-eslint/parser": "^6.13.2", + "@typescript-eslint/eslint-plugin": "^7.13.1", + "@typescript-eslint/parser": "^7.13.1", "@vercel/ncc": "0.38.1", "@welldone-software/why-did-you-render": "7.0.1", "ajv-cli": "^5.0.0", - "babel-eslint": "^10.1.0", "babel-jest": "29.4.1", "babel-loader": "^9.1.3", "babel-plugin-module-resolver": "^5.0.0", @@ -259,18 +262,16 @@ "dotenv": "^16.0.3", "electron": "^29.4.1", "electron-builder": "24.13.2", - "eslint": "^7.6.0", - "eslint-config-airbnb-typescript": "^17.1.0", - "eslint-config-expensify": "^2.0.47", - "eslint-config-prettier": "^8.8.0", - "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^24.1.0", + "eslint": "^8.57.0", + "eslint-config-airbnb-typescript": "^18.0.0", + "eslint-config-expensify": "^2.0.52", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-jest": "^28.6.0", "eslint-plugin-jsdoc": "^46.2.6", - "eslint-plugin-jsx-a11y": "^6.6.1", "eslint-plugin-react-native-a11y": "^3.3.0", "eslint-plugin-storybook": "^0.8.0", "eslint-plugin-testing-library": "^6.2.2", - "eslint-plugin-you-dont-need-lodash-underscore": "^6.12.0", + "eslint-plugin-you-dont-need-lodash-underscore": "^6.14.0", "html-webpack-plugin": "^5.5.0", "jest": "29.4.1", "jest-circus": "29.4.1", @@ -294,6 +295,7 @@ "time-analytics-webpack-plugin": "^0.1.17", "ts-jest": "^29.1.2", "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", "type-fest": "^4.10.2", "typescript": "^5.4.5", "wait-port": "^0.2.9", @@ -332,7 +334,7 @@ ] }, "engines": { - "node": "20.13.0", - "npm": "10.5.2" + "node": "20.14.0", + "npm": "10.7.0" } } diff --git a/patches/@expensify+react-native-live-markdown+0.1.85.patch b/patches/@expensify+react-native-live-markdown+0.1.85.patch new file mode 100644 index 000000000000..f745786a088e --- /dev/null +++ b/patches/@expensify+react-native-live-markdown+0.1.85.patch @@ -0,0 +1,13 @@ +diff --git a/node_modules/@expensify/react-native-live-markdown/lib/module/web/cursorUtils.js b/node_modules/@expensify/react-native-live-markdown/lib/module/web/cursorUtils.js +index e975fb2..6a4b510 100644 +--- a/node_modules/@expensify/react-native-live-markdown/lib/module/web/cursorUtils.js ++++ b/node_modules/@expensify/react-native-live-markdown/lib/module/web/cursorUtils.js +@@ -53,7 +53,7 @@ function setCursorPosition(target, start, end = null) { + // 3. Caret at the end of whole input, when pressing enter + // 4. All other placements + if (prevChar === '\n' && prevTextLength !== undefined && prevTextLength < textCharacters.length) { +- if (nextChar !== '\n') { ++ if (nextChar !== '\n' && i !== n - 1 && nextChar) { + range.setStart(textNodes[i + 1], 0); + } else if (i !== textNodes.length - 1) { + range.setStart(textNodes[i], 1); diff --git a/patches/@react-navigation+native+6.1.12.patch b/patches/@react-navigation+native+6.1.12.patch index d451d89d687c..0ac57a865dfd 100644 --- a/patches/@react-navigation+native+6.1.12.patch +++ b/patches/@react-navigation+native+6.1.12.patch @@ -1,5 +1,5 @@ diff --git a/node_modules/@react-navigation/native/lib/module/createMemoryHistory.js b/node_modules/@react-navigation/native/lib/module/createMemoryHistory.js -index 16fdbef..bc2c96a 100644 +index 16fdbef..231a520 100644 --- a/node_modules/@react-navigation/native/lib/module/createMemoryHistory.js +++ b/node_modules/@react-navigation/native/lib/module/createMemoryHistory.js @@ -1,8 +1,23 @@ @@ -63,6 +63,15 @@ index 16fdbef..bc2c96a 100644 replace(_ref3) { var _window$history$state2; let { +@@ -80,7 +101,7 @@ export default function createMemoryHistory() { + + // Need to keep the hash part of the path if there was no previous history entry + // or the previous history entry had the same path +- let pathWithHash = path; ++ let pathWithHash = path.replace(/(\/{2,})/g, '/'); + if (!items.length || items.findIndex(item => item.id === id) < 0) { + // There are two scenarios for creating an array with only one history record: + // - When loaded id not found in the items array, this function by default will replace @@ -108,7 +129,9 @@ export default function createMemoryHistory() { window.history.replaceState({ id diff --git a/patches/@shopify+flash-list+1.6.3.patch b/patches/@shopify+flash-list+1.6.3.patch index ab347fbb4e9c..e3d690055ff8 100644 --- a/patches/@shopify+flash-list+1.6.3.patch +++ b/patches/@shopify+flash-list+1.6.3.patch @@ -867,7 +867,7 @@ index 023b94a..0000000 -{"program":{"fileNames":["../node_modules/typescript/lib/lib.es5.d.ts","../node_modules/typescript/lib/lib.es2015.d.ts","../node_modules/typescript/lib/lib.es2016.d.ts","../node_modules/typescript/lib/lib.es2017.d.ts","../node_modules/typescript/lib/lib.es2018.d.ts","../node_modules/typescript/lib/lib.es2019.d.ts","../node_modules/typescript/lib/lib.es2020.d.ts","../node_modules/typescript/lib/lib.dom.d.ts","../node_modules/typescript/lib/lib.dom.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.core.d.ts","../node_modules/typescript/lib/lib.es2015.collection.d.ts","../node_modules/typescript/lib/lib.es2015.generator.d.ts","../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../node_modules/typescript/lib/lib.es2015.promise.d.ts","../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../node_modules/typescript/lib/lib.es2017.object.d.ts","../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2017.string.d.ts","../node_modules/typescript/lib/lib.es2017.intl.d.ts","../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../node_modules/typescript/lib/lib.es2018.intl.d.ts","../node_modules/typescript/lib/lib.es2018.promise.d.ts","../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../node_modules/typescript/lib/lib.es2019.array.d.ts","../node_modules/typescript/lib/lib.es2019.object.d.ts","../node_modules/typescript/lib/lib.es2019.string.d.ts","../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../node_modules/typescript/lib/lib.es2020.date.d.ts","../node_modules/typescript/lib/lib.es2020.promise.d.ts","../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../node_modules/typescript/lib/lib.es2020.string.d.ts","../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../node_modules/typescript/lib/lib.es2020.intl.d.ts","../node_modules/typescript/lib/lib.es2020.number.d.ts","../node_modules/typescript/lib/lib.esnext.intl.d.ts","../node_modules/tslib/tslib.d.ts","../node_modules/@types/react-native/modules/BatchedBridge.d.ts","../node_modules/@types/react-native/modules/Codegen.d.ts","../node_modules/@types/react-native/modules/Devtools.d.ts","../node_modules/@types/react-native/modules/globals.d.ts","../node_modules/@types/react-native/modules/LaunchScreen.d.ts","../node_modules/@types/react/global.d.ts","../node_modules/csstype/index.d.ts","../node_modules/@types/prop-types/index.d.ts","../node_modules/@types/scheduler/tracing.d.ts","../node_modules/@types/react/index.d.ts","../node_modules/@types/react-native/private/Utilities.d.ts","../node_modules/@types/react-native/public/Insets.d.ts","../node_modules/@types/react-native/Libraries/ReactNative/RendererProxy.d.ts","../node_modules/@types/react-native/public/ReactNativeTypes.d.ts","../node_modules/@types/react-native/Libraries/Types/CoreEventTypes.d.ts","../node_modules/@types/react-native/public/ReactNativeRenderer.d.ts","../node_modules/@types/react-native/Libraries/Components/Touchable/Touchable.d.ts","../node_modules/@types/react-native/Libraries/Components/View/ViewAccessibility.d.ts","../node_modules/@types/react-native/Libraries/Components/View/ViewPropTypes.d.ts","../node_modules/@types/react-native/Libraries/Components/RefreshControl/RefreshControl.d.ts","../node_modules/@types/react-native/Libraries/Components/ScrollView/ScrollView.d.ts","../node_modules/@types/react-native/Libraries/Components/View/View.d.ts","../node_modules/@types/react-native/Libraries/Image/ImageResizeMode.d.ts","../node_modules/@types/react-native/Libraries/Image/ImageSource.d.ts","../node_modules/@types/react-native/Libraries/Image/Image.d.ts","../node_modules/@react-native/virtualized-lists/Lists/VirtualizedList.d.ts","../node_modules/@react-native/virtualized-lists/index.d.ts","../node_modules/@types/react-native/Libraries/Lists/FlatList.d.ts","../node_modules/@types/react-native/Libraries/Lists/SectionList.d.ts","../node_modules/@types/react-native/Libraries/Text/Text.d.ts","../node_modules/@types/react-native/Libraries/Animated/Animated.d.ts","../node_modules/@types/react-native/Libraries/StyleSheet/StyleSheetTypes.d.ts","../node_modules/@types/react-native/Libraries/StyleSheet/StyleSheet.d.ts","../node_modules/@types/react-native/Libraries/StyleSheet/processColor.d.ts","../node_modules/@types/react-native/Libraries/ActionSheetIOS/ActionSheetIOS.d.ts","../node_modules/@types/react-native/Libraries/Alert/Alert.d.ts","../node_modules/@types/react-native/Libraries/Animated/Easing.d.ts","../node_modules/@types/react-native/Libraries/Animated/useAnimatedValue.d.ts","../node_modules/@types/react-native/Libraries/vendor/emitter/EventEmitter.d.ts","../node_modules/@types/react-native/Libraries/EventEmitter/RCTDeviceEventEmitter.d.ts","../node_modules/@types/react-native/Libraries/EventEmitter/RCTNativeAppEventEmitter.d.ts","../node_modules/@types/react-native/Libraries/AppState/AppState.d.ts","../node_modules/@types/react-native/Libraries/BatchedBridge/NativeModules.d.ts","../node_modules/@types/react-native/Libraries/Components/AccessibilityInfo/AccessibilityInfo.d.ts","../node_modules/@types/react-native/Libraries/Components/ActivityIndicator/ActivityIndicator.d.ts","../node_modules/@types/react-native/Libraries/Components/Clipboard/Clipboard.d.ts","../node_modules/@types/react-native/Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.d.ts","../node_modules/@types/react-native/Libraries/EventEmitter/NativeEventEmitter.d.ts","../node_modules/@types/react-native/Libraries/Components/Keyboard/Keyboard.d.ts","../node_modules/@types/react-native/private/TimerMixin.d.ts","../node_modules/@types/react-native/Libraries/Components/Keyboard/KeyboardAvoidingView.d.ts","../node_modules/@types/react-native/Libraries/Components/Pressable/Pressable.d.ts","../node_modules/@types/react-native/Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.d.ts","../node_modules/@types/react-native/Libraries/Components/SafeAreaView/SafeAreaView.d.ts","../node_modules/@types/react-native/Libraries/Components/StatusBar/StatusBar.d.ts","../node_modules/@types/react-native/Libraries/Components/Switch/Switch.d.ts","../node_modules/@types/react-native/Libraries/Components/TextInput/InputAccessoryView.d.ts","../node_modules/@types/react-native/Libraries/Components/TextInput/TextInput.d.ts","../node_modules/@types/react-native/Libraries/Components/ToastAndroid/ToastAndroid.d.ts","../node_modules/@types/react-native/Libraries/Components/Touchable/TouchableWithoutFeedback.d.ts","../node_modules/@types/react-native/Libraries/Components/Touchable/TouchableHighlight.d.ts","../node_modules/@types/react-native/Libraries/Components/Touchable/TouchableOpacity.d.ts","../node_modules/@types/react-native/Libraries/Components/Touchable/TouchableNativeFeedback.d.ts","../node_modules/@types/react-native/Libraries/Components/Button.d.ts","../node_modules/@types/react-native/Libraries/DevToolsSettings/DevToolsSettingsManager.d.ts","../node_modules/@types/react-native/Libraries/Interaction/InteractionManager.d.ts","../node_modules/@types/react-native/Libraries/Interaction/PanResponder.d.ts","../node_modules/@types/react-native/Libraries/LayoutAnimation/LayoutAnimation.d.ts","../node_modules/@types/react-native/Libraries/Linking/Linking.d.ts","../node_modules/@types/react-native/Libraries/LogBox/LogBox.d.ts","../node_modules/@types/react-native/Libraries/Modal/Modal.d.ts","../node_modules/@types/react-native/Libraries/Performance/Systrace.d.ts","../node_modules/@types/react-native/Libraries/PermissionsAndroid/PermissionsAndroid.d.ts","../node_modules/@types/react-native/Libraries/PushNotificationIOS/PushNotificationIOS.d.ts","../node_modules/@types/react-native/Libraries/Utilities/IPerformanceLogger.d.ts","../node_modules/@types/react-native/Libraries/ReactNative/AppRegistry.d.ts","../node_modules/@types/react-native/Libraries/ReactNative/I18nManager.d.ts","../node_modules/@types/react-native/Libraries/ReactNative/RootTag.d.ts","../node_modules/@types/react-native/Libraries/ReactNative/UIManager.d.ts","../node_modules/@types/react-native/Libraries/ReactNative/requireNativeComponent.d.ts","../node_modules/@types/react-native/Libraries/Settings/Settings.d.ts","../node_modules/@types/react-native/Libraries/Share/Share.d.ts","../node_modules/@types/react-native/Libraries/StyleSheet/PlatformColorValueTypesIOS.d.ts","../node_modules/@types/react-native/Libraries/StyleSheet/PlatformColorValueTypes.d.ts","../node_modules/@types/react-native/Libraries/TurboModule/RCTExport.d.ts","../node_modules/@types/react-native/Libraries/TurboModule/TurboModuleRegistry.d.ts","../node_modules/@types/react-native/Libraries/Utilities/Appearance.d.ts","../node_modules/@types/react-native/Libraries/Utilities/BackHandler.d.ts","../node_modules/@types/react-native/Libraries/Utilities/DevSettings.d.ts","../node_modules/@types/react-native/Libraries/Utilities/Dimensions.d.ts","../node_modules/@types/react-native/Libraries/Utilities/PixelRatio.d.ts","../node_modules/@types/react-native/Libraries/Utilities/Platform.d.ts","../node_modules/@types/react-native/Libraries/Vibration/Vibration.d.ts","../node_modules/@types/react-native/Libraries/YellowBox/YellowBoxDeprecated.d.ts","../node_modules/@types/react-native/Libraries/vendor/core/ErrorUtils.d.ts","../node_modules/@types/react-native/public/DeprecatedPropertiesAlias.d.ts","../node_modules/@types/react-native/index.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/dependencies/ContextProvider.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/dependencies/DataProvider.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/layoutmanager/LayoutManager.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/dependencies/LayoutProvider.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/dependencies/GridLayoutProvider.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/scrollcomponent/BaseScrollView.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/ViewabilityTracker.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/VirtualRenderer.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/ItemAnimator.d.ts","../node_modules/recyclerlistview/dist/reactnative/utils/ComponentCompat.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/RecyclerListView.d.ts","../node_modules/recyclerlistview/dist/reactnative/utils/AutoScroll.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/layoutmanager/GridLayoutManager.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/ProgressiveListView.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/devutils/debughandlers/resize/ResizeDebugHandler.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/devutils/debughandlers/DebugHandlers.d.ts","../node_modules/recyclerlistview/dist/reactnative/index.d.ts","../node_modules/recyclerlistview/dist/reactnative/core/StickyContainer.d.ts","../node_modules/recyclerlistview/sticky/index.d.ts","../src/native/auto-layout/AutoLayoutViewNativeComponentProps.ts","../src/native/auto-layout/AutoLayoutViewNativeComponent.ts","../src/native/auto-layout/AutoLayoutView.tsx","../src/native/cell-container/CellContainer.tsx","../src/PureComponentWrapper.tsx","../src/viewability/ViewToken.ts","../src/FlashListProps.ts","../src/utils/AverageWindow.ts","../src/utils/ContentContainerUtils.ts","../src/GridLayoutProviderWithProps.ts","../src/errors/CustomError.ts","../src/errors/ExceptionList.ts","../src/errors/Warnings.ts","../src/viewability/ViewabilityHelper.ts","../src/viewability/ViewabilityManager.ts","../node_modules/recyclerlistview/dist/reactnative/platform/reactnative/itemanimators/defaultjsanimator/DefaultJSItemAnimator.d.ts","../src/native/config/PlatformHelper.ts","../src/FlashList.tsx","../src/AnimatedFlashList.ts","../src/MasonryFlashList.tsx","../src/benchmark/AutoScrollHelper.ts","../src/benchmark/roundToDecimalPlaces.ts","../src/benchmark/JSFPSMonitor.ts","../src/benchmark/useBlankAreaTracker.ts","../src/benchmark/useBenchmark.ts","../src/benchmark/useDataMultiplier.ts","../src/benchmark/useFlatListBenchmark.ts","../src/index.ts","../src/__tests__/AverageWindow.test.ts","../src/__tests__/ContentContainerUtils.test.ts","../node_modules/@quilted/react-testing/build/typescript/types.d.ts","../node_modules/@quilted/react-testing/build/typescript/matchers/index.d.ts","../node_modules/@quilted/react-testing/build/typescript/environment.d.ts","../node_modules/@quilted/react-testing/build/typescript/implementations/test-renderer.d.ts","../node_modules/@quilted/react-testing/build/typescript/index.d.ts","../src/__tests__/helpers/mountFlashList.tsx","../src/__tests__/FlashList.test.tsx","../src/__tests__/GridLayoutProviderWithProps.test.ts","../src/__tests__/helpers/mountMasonryFlashList.tsx","../src/__tests__/MasonryFlashList.test.ts","../src/native/config/PlatformHelper.web.ts","../src/__tests__/PlatformHelper.web.test.ts","../src/__tests__/ViewabilityHelper.test.ts","../src/__tests__/useBlankAreaTracker.test.tsx","../src/native/auto-layout/AutoLayoutViewNativeComponent.android.ts","../src/native/auto-layout/AutoLayoutViewNativeComponent.ios.ts","../src/native/cell-container/CellContainer.android.ts","../src/native/cell-container/CellContainer.ios.ts","../src/native/cell-container/CellContainer.web.tsx","../src/native/config/PlatformHelper.android.ts","../src/native/config/PlatformHelper.ios.ts","../node_modules/@babel/types/lib/index.d.ts","../node_modules/@types/babel__generator/index.d.ts","../node_modules/@babel/parser/typings/babel-parser.d.ts","../node_modules/@types/babel__template/index.d.ts","../node_modules/@types/babel__traverse/index.d.ts","../node_modules/@types/babel__core/index.d.ts","../node_modules/@types/node/assert.d.ts","../node_modules/@types/node/assert/strict.d.ts","../node_modules/@types/node/globals.d.ts","../node_modules/@types/node/async_hooks.d.ts","../node_modules/@types/node/buffer.d.ts","../node_modules/@types/node/child_process.d.ts","../node_modules/@types/node/cluster.d.ts","../node_modules/@types/node/console.d.ts","../node_modules/@types/node/constants.d.ts","../node_modules/@types/node/crypto.d.ts","../node_modules/@types/node/dgram.d.ts","../node_modules/@types/node/diagnostics_channel.d.ts","../node_modules/@types/node/dns.d.ts","../node_modules/@types/node/dns/promises.d.ts","../node_modules/@types/node/domain.d.ts","../node_modules/@types/node/events.d.ts","../node_modules/@types/node/fs.d.ts","../node_modules/@types/node/fs/promises.d.ts","../node_modules/@types/node/http.d.ts","../node_modules/@types/node/http2.d.ts","../node_modules/@types/node/https.d.ts","../node_modules/@types/node/inspector.d.ts","../node_modules/@types/node/module.d.ts","../node_modules/@types/node/net.d.ts","../node_modules/@types/node/os.d.ts","../node_modules/@types/node/path.d.ts","../node_modules/@types/node/perf_hooks.d.ts","../node_modules/@types/node/process.d.ts","../node_modules/@types/node/punycode.d.ts","../node_modules/@types/node/querystring.d.ts","../node_modules/@types/node/readline.d.ts","../node_modules/@types/node/repl.d.ts","../node_modules/@types/node/stream.d.ts","../node_modules/@types/node/stream/promises.d.ts","../node_modules/@types/node/stream/consumers.d.ts","../node_modules/@types/node/stream/web.d.ts","../node_modules/@types/node/string_decoder.d.ts","../node_modules/@types/node/timers.d.ts","../node_modules/@types/node/timers/promises.d.ts","../node_modules/@types/node/tls.d.ts","../node_modules/@types/node/trace_events.d.ts","../node_modules/@types/node/tty.d.ts","../node_modules/@types/node/url.d.ts","../node_modules/@types/node/util.d.ts","../node_modules/@types/node/v8.d.ts","../node_modules/@types/node/vm.d.ts","../node_modules/@types/node/wasi.d.ts","../node_modules/@types/node/worker_threads.d.ts","../node_modules/@types/node/zlib.d.ts","../node_modules/@types/node/globals.global.d.ts","../node_modules/@types/node/index.d.ts","../node_modules/@types/graceful-fs/index.d.ts","../node_modules/@types/istanbul-lib-coverage/index.d.ts","../node_modules/@types/istanbul-lib-report/index.d.ts","../node_modules/@types/istanbul-reports/index.d.ts","../node_modules/chalk/index.d.ts","../node_modules/@sinclair/typebox/typebox.d.ts","../node_modules/@jest/schemas/build/index.d.ts","../node_modules/pretty-format/build/index.d.ts","../node_modules/jest-diff/build/index.d.ts","../node_modules/jest-matcher-utils/build/index.d.ts","../node_modules/@types/jest/index.d.ts","../node_modules/@types/json-schema/index.d.ts","../node_modules/@types/json5/index.d.ts","../node_modules/@types/parse-json/index.d.ts","../node_modules/@types/prettier/index.d.ts","../node_modules/@types/react-test-renderer/index.d.ts","../node_modules/@types/scheduler/index.d.ts","../node_modules/@types/stack-utils/index.d.ts","../node_modules/@types/websocket/index.d.ts","../node_modules/@types/yargs-parser/index.d.ts","../node_modules/@types/yargs/index.d.ts"],"fileInfos":[{"version":"f5c28122bee592cfaf5c72ed7bcc47f453b79778ffa6e301f45d21a0970719d4","affectsGlobalScope":true},"dc47c4fa66b9b9890cf076304de2a9c5201e94b740cffdf09f87296d877d71f6","7a387c58583dfca701b6c85e0adaf43fb17d590fb16d5b2dc0a2fbd89f35c467","8a12173c586e95f4433e0c6dc446bc88346be73ffe9ca6eec7aa63c8f3dca7f9","5f4e733ced4e129482ae2186aae29fde948ab7182844c3a5a51dd346182c7b06","e6b724280c694a9f588847f754198fb96c43d805f065c3a5b28bbc9594541c84","1fc5ab7a764205c68fa10d381b08417795fc73111d6dd16b5b1ed36badb743d9",{"version":"3f149f903dd20dfeb7c80e228b659f0e436532de772469980dbd00702cc05cc1","affectsGlobalScope":true},{"version":"1272277fe7daa738e555eb6cc45ded42cc2d0f76c07294142283145d49e96186","affectsGlobalScope":true},{"version":"adb996790133eb33b33aadb9c09f15c2c575e71fb57a62de8bf74dbf59ec7dfb","affectsGlobalScope":true},{"version":"43fb1d932e4966a39a41b464a12a81899d9ae5f2c829063f5571b6b87e6d2f9c","affectsGlobalScope":true},{"version":"cdccba9a388c2ee3fd6ad4018c640a471a6c060e96f1232062223063b0a5ac6a","affectsGlobalScope":true},{"version":"c5c05907c02476e4bde6b7e76a79ffcd948aedd14b6a8f56e4674221b0417398","affectsGlobalScope":true},{"version":"0d5f52b3174bee6edb81260ebcd792692c32c81fd55499d69531496f3f2b25e7","affectsGlobalScope":true},{"version":"810627a82ac06fb5166da5ada4159c4ec11978dfbb0805fe804c86406dab8357","affectsGlobalScope":true},{"version":"181f1784c6c10b751631b24ce60c7f78b20665db4550b335be179217bacc0d5f","affectsGlobalScope":true},{"version":"3013574108c36fd3aaca79764002b3717da09725a36a6fc02eac386593110f93","affectsGlobalScope":true},{"version":"75ec0bdd727d887f1b79ed6619412ea72ba3c81d92d0787ccb64bab18d261f14","affectsGlobalScope":true},{"version":"3be5a1453daa63e031d266bf342f3943603873d890ab8b9ada95e22389389006","affectsGlobalScope":true},{"version":"17bb1fc99591b00515502d264fa55dc8370c45c5298f4a5c2083557dccba5a2a","affectsGlobalScope":true},{"version":"7ce9f0bde3307ca1f944119f6365f2d776d281a393b576a18a2f2893a2d75c98","affectsGlobalScope":true},{"version":"6a6b173e739a6a99629a8594bfb294cc7329bfb7b227f12e1f7c11bc163b8577","affectsGlobalScope":true},{"version":"12a310447c5d23c7d0d5ca2af606e3bd08afda69100166730ab92c62999ebb9d","affectsGlobalScope":true},{"version":"b0124885ef82641903d232172577f2ceb5d3e60aed4da1153bab4221e1f6dd4e","affectsGlobalScope":true},{"version":"0eb85d6c590b0d577919a79e0084fa1744c1beba6fd0d4e951432fa1ede5510a","affectsGlobalScope":true},{"version":"da233fc1c8a377ba9e0bed690a73c290d843c2c3d23a7bd7ec5cd3d7d73ba1e0","affectsGlobalScope":true},{"version":"d154ea5bb7f7f9001ed9153e876b2d5b8f5c2bb9ec02b3ae0d239ec769f1f2ae","affectsGlobalScope":true},{"version":"bb2d3fb05a1d2ffbca947cc7cbc95d23e1d053d6595391bd325deb265a18d36c","affectsGlobalScope":true},{"version":"c80df75850fea5caa2afe43b9949338ce4e2de086f91713e9af1a06f973872b8","affectsGlobalScope":true},{"version":"9d57b2b5d15838ed094aa9ff1299eecef40b190722eb619bac4616657a05f951","affectsGlobalScope":true},{"version":"6c51b5dd26a2c31dbf37f00cfc32b2aa6a92e19c995aefb5b97a3a64f1ac99de","affectsGlobalScope":true},{"version":"6e7997ef61de3132e4d4b2250e75343f487903ddf5370e7ce33cf1b9db9a63ed","affectsGlobalScope":true},{"version":"2ad234885a4240522efccd77de6c7d99eecf9b4de0914adb9a35c0c22433f993","affectsGlobalScope":true},{"version":"09aa50414b80c023553090e2f53827f007a301bc34b0495bfb2c3c08ab9ad1eb","affectsGlobalScope":true},{"version":"d7f680a43f8cd12a6b6122c07c54ba40952b0c8aa140dcfcf32eb9e6cb028596","affectsGlobalScope":true},{"version":"3787b83e297de7c315d55d4a7c546ae28e5f6c0a361b7a1dcec1f1f50a54ef11","affectsGlobalScope":true},{"version":"e7e8e1d368290e9295ef18ca23f405cf40d5456fa9f20db6373a61ca45f75f40","affectsGlobalScope":true},{"version":"faf0221ae0465363c842ce6aa8a0cbda5d9296940a8e26c86e04cc4081eea21e","affectsGlobalScope":true},{"version":"06393d13ea207a1bfe08ec8d7be562549c5e2da8983f2ee074e00002629d1871","affectsGlobalScope":true},{"version":"cd483c056da900716879771893a3c9772b66c3c88f8943b4205aec738a94b1d0","affectsGlobalScope":true},{"version":"b248e32ca52e8f5571390a4142558ae4f203ae2f94d5bac38a3084d529ef4e58","affectsGlobalScope":true},{"version":"c37f8a49593a0030eecb51bbfa270e709bec9d79a6cc3bb851ef348d4e6b26f8","affectsGlobalScope":true},"14a84fbe4ec531dcbaf5d2594fd95df107258e60ae6c6a076404f13c3f66f28e",{"version":"1c0e04c54479b57b49fec4e93556974b3d071b65d0b750897e07b3b7d2145fc5","affectsGlobalScope":true},"bc1852215dc1488e6747ca43ae0605041de22ab9a6eeef39542d29837919c414","ae6da60c852e7bacc4a49ff14a42dc1a3fdbb44e11bd9b4acb1bf3d58866ee71",{"version":"0dab023e564abb43c817779fff766e125017e606db344f9633fdba330c970532","affectsGlobalScope":true},"4cbd76eafece5844dc0a32807e68047aecbdd8d863edba651f34c050624f18df",{"version":"ecf78e637f710f340ec08d5d92b3f31b134a46a4fcf2e758690d8c46ce62cba6","affectsGlobalScope":true},"ea0aa24a32c073b8639aa1f3130ba0add0f0f2f76b314d9ba988a5cb91d7e3c4","f7b46d22a307739c145e5fddf537818038fdfffd580d79ed717f4d4d37249380","f5a8b384f182b3851cec3596ccc96cb7464f8d3469f48c74bf2befb782a19de5",{"version":"29b8a3a533884705024eab54e56465614ad167f5dd87fdc2567d8e451f747224","affectsGlobalScope":true},"4f2490e3f420ea6345cade9aee5eada76888848e053726956aaf2af8705477ea","b3ac03d0c853c0ac076a10cfef4dc21d810f54dac5899ade2b1c628c35263533","d17a689ac1bd689f37d6f0d3d9a21afac349e60633844044f7a7b7b9d6f7fd83","019650941b03d4978f62d21ae874788a665c02b54e3268ef2029b02d3b4f7561","ae591c8a4d5c7f7fa44b6965016391457d9c1fd763475f68340599a2a2987a24","fbdef0c642b82cc1713b965f07b4da8005bbbb2c026039bfdc15ca2d20769e38","c2c004e7f1a150541d06bc4a408b96e45ac1f08e0b1b35dfd07fc0f678205f95","1f2081eb2cbeb0828f9baa1dd12cf6d207f8104ae0b085ab9975d11adc7f7e6f","cda9069fc4c312ff484c1373455e4297a02d38ae3bd7d0959aad772a2809623c","c028d20108bcaa3b1fdf3514956a8a90ccf680f18672fa3c92ce5acf81d7ab23","1054f6e8774a75aaf17e7cfea4899344f69590b2db1e06da21048ed1e063c693","9533301b8f75664e1b40a8484a4fd9c77efc04aef526409c2447aab7d12ddc63","b78b5b3fdb4e30976c4263c66c0ad38fb81edcc8075a4160a39d99c6dedd35be","032b51d656feaece529823992f5a39fe9e24d44dfa21b3a149982f7787fc7bdf","5bbfdfb694b019cb2a2022fba361a7a857efc1fc2b77a892c92ebc1349b7e984","46bc25e3501d321a70d0878e82a1d47b16ab77bdf017c8fecc76343f50806a0d","42bacb33cddecbcfe3e043ee1117ba848801749e44f947626765b3e0aec74b1c","49dba0d7a37268e6ae2026e84ad4362eac7e776d816756abf649be7fa177dcd5","5f2b5ab209daae571eb9acc1fd2067ccc94e2a13644579a245875bc4f02b562f","f072acf9547f89b814b9fdb3e72f4ebb1649191591cec99db43d35383906f87f","42450dba65ba1307f27c914a8e45e0b602c6f8f78773c052e42b0b87562f081e","f5870d0ca7b0dfb7e2b9ba9abad3a2e2bffe5c711b53dab2e6e76ca2df58302b","aeb20169389e9f508b1a4eb2a30371b64d64bb7c8543120bc39a3c6b78adfcc9","2a3d3acbab8567057a943f9f56113c0144f5fc561623749fbd6bb5c2b33bf738","9cf21fdcd1beb5142a514887133fa59057e06275bb3070713f3b6d51e830ffa0","0ad4f0b67db47064b404df89c50f99552ce12d6c4bb6154255be61eb6beed094","f8a464b9999126fe1095968c266c0d9c6174612cf256379a1ed1993a87bccdc6","49f981ca657ac160b5de5919ee5602d48bc8f8aac0805107c2ce4fd41dc9a2a1","56e4e08d95a3a7886266a2b4f66b67065c340480d9f1beb73ed7578aa83c639a","eb4360d3818dcd879ee965ae2f4b3fdfdc4149db921b6be338cb7dc7c2bd6710","1c1275f325f13af001aa5873418cb497a26b4b8271f9ad20a45e33f61ea3f9d9","b33e8426136c4f9b349b02c940d23310d350179f790899733aa097ed76457061","05aab001669a230a88820be09a54031c45d9af2488b27d53d4a9c8880ce73e8f","d93a066d4b8b33335dfff910fb25abb8979f8814f8ba45ea902a1360907da1f6","41e97e42d182b4d5f0733ebaad69294faaa507d95e595f317168b8f2325da9ca","debc734fc99b6e1684ed565946bad008913c769d4d2e400d8722c0c23d079c06","5a9f7e087aacb01fa0cdbc36b703a60367239f62beed2507a507199e4c417549","c7c23798fbf564983ed69c1ced3371970d986aaed4801a6e0fb41862550dc034","921f5bce372610ae8948ade7d82decbd2cf56d263de578976189585edd0abac0","ac11f8b13beef593e2f097450a7e214b23dca0d428babd570a2f39582f10e9ab","2499beb5d3e2b4c606977bcc2e08b6ef77b2ecda70e78e0622f5af3bed95c9ba","a11057410396907b84051cbdb8b0cd7f7049d72b58d2b6ac1c14ac2608191a52","bb630c26d487cc45ed107f4f2d3c2a95434716f6367f059de734c40d288c31eb","67cbce0ccdfa96b25de478a93cc493266c152e256c3c96b3d16d1f811e3d881f","19905c928bc4c016d05d915625bb08568447266c4661232faf89f7ddc4417ccc","26204eb4c326e8c975f1b789cbf345c6820205bded6d72e57246a83918d3bc84","618f25b2d41a99216e71817a3bc578991eee86c858c3f0f62a9e70707f4d279d","4cd2947878536ec078e4115b7d53cdcd4dcecd3a8288760caa79098db4f8f61f","2129e984399e94c82b77a32b975f3371ca5ee96341ab9f123474f1a5a1a9921f","798120aaa4952d68cd4b43d6625524c62a135c2f5a3eb705caee98de2355230d","6047365397173788c34bd71fea2bf07a9036d981212efd059b33e52d2c405e97","d7e25d7c03ccf8b10972c2a3a57e29a8d9024e6dbc4ac223baf633a6e8c7145c","6c2e2dead2d80007ee44c429b925d0a7b86f8f3d4c237b2197f7db9f39545dc6","38fbc8f9610fbf4bf619854b26e28c4fbbab16dc1944c4317a4af9bf1ac08d8e","1bd0470a72e6869c330e6e978f15ef32ba2c245249aca097b410448152e8a06b","dd05d7970a92b789f7df3b2252574b2e60f1b9a3758e2839e167b498b8f77159","7092be1889127b2f319efd5d9bdcc0b5cf6fe0740e47247ed039446045518898","0a3d5dbf7c2091017e697ebf9af0a727571f5d99cb4c19e6856212a745c6c355","d05f9c767924db6fb89f6075acb64c042cebdb12779bbd1aaca12c850b772d49","d032678e20ff0f4b8ef6f1e4823b6ae37931b776e8381676dc9141999909b3d7","3e4ab0e8e96e968ac84a2484104892c881ded1757acd81b5e969b6229851f54c","d43a36641f5812794a3b4a941e3dfb5fa070f9fff64cfd6daf5291cb962c8b05","32468df81188116040636844517fbe4f67fc37af4fe565c7592353df8e11d2f3","c12b5f9bf412c891cad443ef00a378ad2d3f1301f140943414308665a7d90af8","cf1b65c20036885ed99ce1c18aa0a0ed66f42acd6d415e99b48a8fa4105c23ed","173aec8be1be982c8244df6f94880d77a9b766c8c1ec3eb0af662c8dc6da7f2e","08188020373062e07955835a996fda1aff97a89e57d469edc6b9210bd9c8926f","cad5c2c0085a3e3b74f58aa199944b25ed8d24f93f51c99ebe2463e4f1694785","3e2d93a797c41ab081fbcd80e959b7c30d5d1c358f091c22a6ebe416ef7c5e19","c440df5735a3305e7db118bf821efb597c8318910861f735372846db9f7b506b","d6d8de719a75e5d2ed9dd9d6a99296d1337259e1c96166579db50797edd72ede","32b4c732e183bf5d123f88d526ac21b71a681089c18d2d761be342df31179d94","212d16020e7dce1b5509f3b9813de73612de57c6a3d74536714eb88787b96dc3","1a63d5212341783aa49cf78d667bf2a6cd03208ea09620b2fc3e647ae07f4e0d","84ea58841272970e6e3247cba4dbb326cf22764c2f4bbcb03f1c634315bbbcb5","86f9fbecdd848d02c90f861cc9839d8f3449c518a77e77ea65362f6a4126c63b","ecdaf317a4a1e7e3540e2f1b6aae38acd78dd99d564b52f98eea7358ac74416d","c30430960f1a0552b3cdaf1ef8164fdd4f289c782a8912df5180d57bc9ddfc03","a348081c01502c9f87d39d9e4b5dd58e1111b34c62686d6e569c595a0417bb35","eff69aee13c76502a16b756cde9c451fb4b5c4234052f3b3bee9dbfe92e1b1d5","9943f44400939f4ff008a882ff71162f70ba0c2f735c9743fd4645ef5c925fc4","b7836eba6c5173a1683aee8aa1771ff339e795cb9c21411590edb910274febe4","6fe447aa7e6fabc4f6c536f2997e3b1116b7f73dbe5bf3fc8d958bad434e4a84","15d3908d453d14be4dae760122ed5d74ad789a19f1fec2edd4034e57217436e9","ef00bc701f382da70870ab7721ed8f6552a38e332e60370b93cf340b6470845c","18891a02fa046e57b43a543dddc7212086fcb04ae6c8e8f28f8605dd3ccf57ed",{"version":"5980a888624dce1b0937a0d21c623f97056501bb61a8da29cbe07f1a0be2c9a8","affectsGlobalScope":true},"590a41ccab332c66a6aa62746612b03ceb2e92cc1da58c140e90fb7ff6e8c851","dc1d2996f23fe7f0da0b2c843e05c0ac170a36b51da11e58de089d344de93c3b","78ff01b50e7e9761f239527ec70b96171bccc28a08d909243e193db03b6f6983","ed18472ee2247563a26d754dd4c8bd66383013df13ce7c2927b03cab1a27b7e8","28ac9ac1fa163e5f2321fafa49b9931908c0076216ed3c82646d79abdf79775e","07dd4bed8ddab685f82a2125bf3aa41b42e36f28c16a5aec7357b727649076fb","fc15a2216f29b825747c0c3a54d6989518dd0f4aa0b580520e5526b4a47bec8f","c656d5baf3d4a8f358fc083db04b0fda8cb8503a613a9ba42327ecbd7909773c","397c2c81eaeae1388f7459699d7606feecfc304b212eb9113407c1315746a578","c2d923e9adc26a3efe5186f3a4a72413d24c80f03b306c68c30fa146690fb101","d34782833b7d5f72486a5fb926d3d96198706ed76aeaf1d435c748ebcf9169fc","b093e56054755189dd891ea832dec40d729d110a0a3f432fff5ea5ab1078cdde","98affe620e6230a3888b445c32376e4edbf6b1b376a71f2bf9c07bee11fcdd65","1e05491bef32ff48393d605d557152735899da3d9b111ba3588a1800f2927f4a","1ff7813974b1b9a0524c1e5a99aa52a05e79fc7df7749ada75ded8c53fe1b7e0","cd8c517f54d4ff3475755b290d741c8799df3265ce73d454d8fafe423f8ff749","bf431147b104ae92d61de6b43e9f25d27e8d3eaeaffd612e0c0d3bb8e2423926","f0f21604ae8f880c0ab529f00303806fdeadc943e32a25ca063fc8fea0fa063c","8dc4f45212fba9381e1674e8bd934a588730efbb8a6681b661cad8cd09b081c5",{"version":"52bf774bd30177ebb3e450c808d8d46f67896848a942e6203ae78b65b33d0106","signature":"688c437017a53e69ff66aac2036a0d7f6263082f676a408c9998cbd87ea2ec73"},{"version":"8b6ee36fd764378c62dca37041c5a12fd5a77b9e853c78908b7ed1c90dc149e4","signature":"03846acca031c757d910dbc017d846c87574faf90bde82316fb9b8537896d5ee"},{"version":"0d089d33f31b56697d142aa7395738c0323cf761b4c79fd6bf65a54ab1ddf02f","signature":"027c87e1cb049497d4f185bc9b922ce91cad59832da8faf3411e6b298b9deb78"},{"version":"ec0982b9e7d6c1b6c80e2829c5909eefb9ecee687e60621e0bb937e8ad5d1d43","signature":"8478b617a5be940f1b4b4d19d2fc6149c21ac69c4a7e00c8a7db2c2c21aa2274"},{"version":"84c5fc9d0d22f4566791b88d5fc2c24f56508b50c9ce894ac549ebaa158b1fca","signature":"677ea66c6fa02f1cebf82df19f416a8302c7a7d10e2de265b162760fcd865eef"},{"version":"8455135ea42310a73404fa2513e212d170af1191584061f583ec1e0f6b75dd91","signature":"83e4298f0b6834e955ee6a76569d3e5b3192065d47f1daf4535bb9edb16e88cb"},{"version":"73529962207605bdc5285d5e745919b8d57b776daa0f22a14b75cd8a92d63af9","signature":"422fcd2a7fd87f05efdfaa6eab382ca607d5d54e1f175ba2efccd4aacd5433ef"},{"version":"ebe927d8a9739c9d32ef4df28c1c36cf82daa9abba7cdf3f79e320c5e99e99d8","signature":"2421f9c6b1ecedd50818719090a77e9d2748c2339c33f3d4817beebf7a39d211"},{"version":"165c56632fea46c85e2a62f1b4eae600b846ea0deacd3c137fde9bacb845c30e","signature":"79bf9e3846b43e706d181c00f3c1c50ae8fc60e587c97a16e521adc150317624"},{"version":"866e1d2cf16a41851b056a2cc0cdc5f0f00df0435376cc2c723a8c609f61fbd0","signature":"5f5bbca60f0bfed6ff714163c4e962a5e260e59db754c89ee2063403accd03e3"},{"version":"ecfa1b63e3829b310ac968b2cc1cc7016ba76ffb8532439aebecbcbc57173b99","signature":"2f1dda63ade2bd085704674523b56ede942bc8c2c37fe8ed9b9b0fdfd69b1262"},{"version":"51d2f746d7e599a5549f5a946565934b4556bb9155be1eed2c474e25f1474872","signature":"c15585fe8935ed5cfedec39b7d41ec49990973f40faaba4b3e14278861643d79"},{"version":"b1d1378906c54a2f4d230ad69d212beedd2552afe3f7ad171b7eacb4cecc26d7","signature":"f9e60e8f79a7f606f19e02e2d39a24995719767dbe587f564f970bb24e3ca29d"},{"version":"f5a156e5b3783ea0399ac0326b7ab31a00e8874c5fa9b5e26fac217da8b5adfd","signature":"cfa7179e0306fc04d93f062c96e7ae8bad58d0cc4a7aa0dd4494ff9d262b101c"},{"version":"3c9fefca9303bcfd5712de11a3cbda20b3d6e85f29019bc75cab24690fb0f90d","signature":"306683152ff5a6038cf05b03ddff85a15b1bc8e18ef268aad26b02fd8e0e8b9d"},"a11c3e55d22d6379fe0949793e2638a6b43aa6e9def4f7452c3e352a296ef8da",{"version":"2770956c9437d7d66650084891c559ff6bb94200b7e2820940fd5d5dd0efa489","signature":"2faaf4f254008bf5be0e145be10dba35dccfac7116e9083f9d697a476a8e7076"},{"version":"ceee917fd557b841b93f7e13103dfdad79d38fe9962408f538f27db03dc9368d","signature":"15003ff6ed10d259dca775c7e5f7a64b272a9c370b6085db2d42a2d4a1d81579"},{"version":"a1691ae6d70af82f3e26d9e2e021dc5063021bd9c335bfdb40dc97d3574d1b3f","signature":"cd1c566b611a70ff987a79d0465da67649a8ed7e7668feddfcdf6dceb01c09a8"},{"version":"a105417dd540f1a400f0665c877e5d7e48e2efe08f01c2e5c7272256e644faa5","signature":"b3a6ee392811d6cddb38378ebaa373d4a39aa7dc4ecac73497c6b33627e6430b"},{"version":"581b44cf6122e3ad267d6bda2428c214fef3d38b6d7249df9fa6bc240a880a78","signature":"0ca09d92d6469d906a3d1c7192a6294c7f65b75f4f7eb8072bbd1b68c7f021e1"},{"version":"2e6426c1a1ff8561aa5f01d9398426bf06e55307f688464939de3196f0d4c143","signature":"5357bd09c9816a9765e617f86a9b49f85133d0bc0f9c5e29e834f2f8e6d52acb"},{"version":"508279c48de5627ae6c30a0aee01f4391bf32450335d7f09d5dd82acbc4d13c5","signature":"11d546a505f70f9c5f8092916027d8045c280a817b709fcaf2c4e63fa026c89c"},{"version":"557f2e0a4e5ac8a59b7c3068b2b30162fb963d72d50152482ab8c414e81caf37","signature":"008eaae28119118f1c589a1e29ea7fd17277f2280d2d3bfddeacd71fd1671bb5"},{"version":"f45c172ca54fb28d64b2dd04e495f17038034e20f37bd286a9f3eeb286cf1388","signature":"75a8761564c8fc5581b062dd339ea698921baf60e52eae055c8177dfa89eba90"},{"version":"ea696a0517ad69afea472e47eb1f904aba1667f54d4557eb98b8c766469d56a2","signature":"7e125d9abc19f62d1480f6c04a45d7bb2c89153316245ae8b8e5a0234b078c4e"},{"version":"902937c505f88d8b5b32829b4c14243eb740013fd0e2f58e6485324bbfe197a6","signature":"dc7de7650e5a64fc010387db18e84d48fe8f562dbd9caac01e54f83681ac976b"},{"version":"842accda78bb1b6f494f264aae307b84d933486d607e91f6e1d3a4d2e4851783","signature":"430d9683c8e5aaab71f0e3b271c4240cd5120a91191f953722985499af51d7e6"},{"version":"45b1a895868587c78a2ddff937967669b4e1968ea72c01e1c2b6dd5993f53b36","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"99cab9373415bac71e9d2c84279782c0a361b59551d0ca8dfaee8d4c08ed3247","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},"ba1fed463e8a21ffddb67a53df3f0d818b351991723736e167d065e2de1c7183",{"version":"22e311fec88bcc49b2b1fb3c9a7c082cd84b3388c9bcc7b9ef08253f6fa74e26","affectsGlobalScope":true},"c186097fd9b86681981cdeba08c0b6bbfcd8b562ab490c25656d85fef8f10c79","0b0c483e991e81c3f26e5f2da53ff26a15994c98c8b89cda1e4156dfc2428111","3340eb7b30bdee5f0349107d4068fd6f2f4712e11a2ba68e203b2f2489350317",{"version":"2000d60bd5195730ffff0d4ce9389003917928502c455ed2a9e296d3bf1a4b42","signature":"56335d3c9b867cc8654c05e633c508dd8de0038157f9958eb8794b7c123bb90e"},{"version":"dfceb5b9355a4a9002a7c291b1c3315511977c73cb23d9c123a72567783a18c0","signature":"b1802850887a3ea11a06df1fc1c65c6579332eefba1e63b3967a73dc937a2574"},{"version":"384fc0e3fa5966f524c96f1782b9d7a005346ba1621c43d0d1d819bf39077fbc","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"7fde517b3f03bb21ec3a46ba5f85c6797f8abf27deacb862183126e2f072788e","signature":"8b310edcfec83da25bc4f3adb20a7583bc5dae56d7d06c5b1431b76d390c1b72"},{"version":"894d93831d2afcd26f7362347e4960dd6d53f4153dad08813f3670e1327e387c","signature":"b1802850887a3ea11a06df1fc1c65c6579332eefba1e63b3967a73dc937a2574"},{"version":"8f9eac2c3ae305c25d4ffeff800b9811c8d3ec6a11b142fe96d08a2bc40f6440","signature":"08d6a2d1b004bbcac4249cd5baf6e9c662adc6139939c266b42e0422ef0c68b3"},{"version":"ac8980bdd810c30c444b59cca584c9b61d5ab274fa9474d778970537f3090240","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"1c024431c672cf9c6dcdb4d30c5b625435d81a5423b9d45e8de0082e969af8a8","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"eee1b57475023853cd09dd79b8d0d6639b6b82c3baee5863c2f2022b710f4102","signature":"8e609bb71c20b858c77f0e9f90bb1319db8477b13f9f965f1a1e18524bf50881"},{"version":"377ba49d29102653a4b0c72b3870f9c599575df7db3a3fae7a21be5327ff84e2","signature":"c47f5db4df0a5031ed84bc6ee192c412b9e2d4d5e94681af77ccdcc25c851839"},{"version":"377ba49d29102653a4b0c72b3870f9c599575df7db3a3fae7a21be5327ff84e2","signature":"c47f5db4df0a5031ed84bc6ee192c412b9e2d4d5e94681af77ccdcc25c851839"},{"version":"39833acf7547216b2f31b2279dcfec3ed1359dec8adc9d1cb87c695ebf9bff94","signature":"7292d4dc9dac6d815dc30245a4a4a4959845d3a2b84ba0166857e4b23f2d033f"},{"version":"39833acf7547216b2f31b2279dcfec3ed1359dec8adc9d1cb87c695ebf9bff94","signature":"7292d4dc9dac6d815dc30245a4a4a4959845d3a2b84ba0166857e4b23f2d033f"},{"version":"529dd364d169ab3dbbb177ccdc4987c4a6f69187f553f3d36460ab65879ad998","signature":"3919e9d5911da2254732c31942e2cdc0057056ebfc2a16d34041c76a9b58d447"},{"version":"ebea587ca6477b9db29baf75d359924c55ab490fecdc38d7c0f16e589f0d27f9","signature":"0688c25f38e78e052338305d23046c7841074b3da5709a8f9e598ed705b9932b"},{"version":"de411013305dbe5c7a1ac13d2ea16dc36e52e6efd255b4e912fe53862058c649","signature":"2faaf4f254008bf5be0e145be10dba35dccfac7116e9083f9d697a476a8e7076"},"e432b56911b58550616fc4d54c1606f65fe98c74875b81d74601f5f965767c60","cc957354aa3c94c9961ebf46282cfde1e81d107fc5785a61f62c67f1dd3ac2eb","a46a2e69d12afe63876ec1e58d70e5dbee6d3e74132f4468f570c3d69f809f1c","93de1c6dab503f053efe8d304cb522bb3a89feab8c98f307a674a4fae04773e9","3b043cf9a81854a72963fdb57d1884fc4da1cf5be69b5e0a4c5b751e58cb6d88","dd5647a9ccccb2b074dca8a02b00948ac293091ebe73fdf2e6e98f718819f669","0cba3a5d7b81356222594442753cf90dd2892e5ccfe1d262aaca6896ba6c1380","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"c2ab70bbc7a24c42a790890739dd8a0ba9d2e15038b40dff8163a97a5d148c00","affectsGlobalScope":true},"422dbb183fdced59425ca072c8bd09efaa77ce4e2ab928ec0d8a1ce062d2a45a",{"version":"712ba0d43b44d144dfd01593f61af6e2e21cfae83e834d297643e7973e55ed61","affectsGlobalScope":true},"1dab5ab6bcf11de47ab9db295df8c4f1d92ffa750e8f095e88c71ce4c3299628","f71f46ccd5a90566f0a37b25b23bc4684381ab2180bdf6733f4e6624474e1894",{"version":"54e65985a3ee3cec182e6a555e20974ea936fc8b8d1738c14e8ed8a42bd921d4","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","98a3ebfa494b46265634a73459050befba5da8fdc6ca0ef9b7269421780f4ff3","34e5de87d983bc6aefef8b17658556e3157003e8d9555d3cb098c6bef0b5fbc8","cc0b61316c4f37393f1f9595e93b673f4184e9d07f4c127165a490ec4a928668","f27371653aded82b2b160f7a7033fb4a5b1534b6f6081ef7be1468f0f15327d3","c762cd6754b13a461c54b59d0ae0ab7aeef3c292c6cf889873f786ee4d8e75c9","f4ea7d5df644785bd9fbf419930cbaec118f0d8b4160037d2339b8e23c059e79",{"version":"bfea28e6162ed21a0aeed181b623dcf250aa79abf49e24a6b7e012655af36d81","affectsGlobalScope":true},"7a5459efa09ea82088234e6533a203d528c594b01787fb90fba148885a36e8b6","ae97e20f2e10dbeec193d6a2f9cd9a367a1e293e7d6b33b68bacea166afd7792","10d4796a130577d57003a77b95d8723530bbec84718e364aa2129fa8ffba0378","ad41bb744149e92adb06eb953da195115620a3f2ad48e7d3ae04d10762dae197","bf73c576885408d4a176f44a9035d798827cc5020d58284cb18d7573430d9022","7ae078ca42a670445ae0c6a97c029cb83d143d62abd1730efb33f68f0b2c0e82",{"version":"e8b18c6385ff784228a6f369694fcf1a6b475355ba89090a88de13587a9391d5","affectsGlobalScope":true},"5d0a9ea09d990b5788f867f1c79d4878f86f7384cb7dab38eecbf22f9efd063d","12eea70b5e11e924bb0543aea5eadc16ced318aa26001b453b0d561c2fd0bd1e","08777cd9318d294646b121838574e1dd7acbb22c21a03df84e1f2c87b1ad47f2","08a90bcdc717df3d50a2ce178d966a8c353fd23e5c392fd3594a6e39d9bb6304",{"version":"4cd4cff679c9b3d9239fd7bf70293ca4594583767526916af8e5d5a47d0219c7","affectsGlobalScope":true},"2a12d2da5ac4c4979401a3f6eaafa874747a37c365e4bc18aa2b171ae134d21b","002b837927b53f3714308ecd96f72ee8a053b8aeb28213d8ec6de23ed1608b66","1dc9c847473bb47279e398b22c740c83ea37a5c88bf66629666e3cf4c5b9f99c","a9e4a5a24bf2c44de4c98274975a1a705a0abbaad04df3557c2d3cd8b1727949","00fa7ce8bc8acc560dc341bbfdf37840a8c59e6a67c9bfa3fa5f36254df35db2","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff",{"version":"806ef4cac3b3d9fa4a48d849c8e084d7c72fcd7b16d76e06049a9ed742ff79c0","affectsGlobalScope":true},"44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","5f0ed51db151c2cdc4fa3bb0f44ce6066912ad001b607a34e65a96c52eb76248",{"version":"3345c276cab0e76dda86c0fb79104ff915a4580ba0f3e440870e183b1baec476","affectsGlobalScope":true},"664d8f2d59164f2e08c543981453893bc7e003e4dfd29651ce09db13e9457980","e383ff72aabf294913f8c346f5da1445ae6ad525836d28efd52cbadc01a361a6","f52fbf64c7e480271a9096763c4882d356b05cab05bf56a64e68a95313cd2ce2","59bdb65f28d7ce52ccfc906e9aaf422f8b8534b2d21c32a27d7819be5ad81df7",{"version":"3a2da34079a2567161c1359316a32e712404b56566c45332ac9dcee015ecce9f","affectsGlobalScope":true},"28a2e7383fd898c386ffdcacedf0ec0845e5d1a86b5a43f25b86bc315f556b79","3aff9c8c36192e46a84afe7b926136d520487155154ab9ba982a8b544ea8fc95","a880cf8d85af2e4189c709b0fea613741649c0e40fffb4360ec70762563d5de0","85bbf436a15bbeda4db888be3062d47f99c66fd05d7c50f0f6473a9151b6a070","9f9c49c95ecd25e0cb2587751925976cf64fd184714cb11e213749c80cf0f927","f0c75c08a71f9212c93a719a25fb0320d53f2e50ca89a812640e08f8ad8c408c",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"9cafe917bf667f1027b2bb62e2de454ecd2119c80873ad76fc41d941089753b8","3ebae8c00411116a66fca65b08228ea0cf0b72724701f9b854442100aab55aba","8b06ac3faeacb8484d84ddb44571d8f410697f98d7bfa86c0fda60373a9f5215","7eb06594824ada538b1d8b48c3925a83e7db792f47a081a62cf3e5c4e23cf0ee","f5638f7c2f12a9a1a57b5c41b3c1ea7db3876c003bab68e6a57afd6bcc169af0","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","7980bf9d2972585cdf76b5a72105f7817be0723ccb2256090f6335f45b462abe","301d7466eb591139c7d456958f732153b3400f3243f68d3321956b43a64769e9","22f13de9e2fe5f0f4724797abd3d34a1cdd6e47ef81fc4933fea3b8bf4ad524b","e3ba509d3dce019b3190ceb2f3fc88e2610ab717122dabd91a9efaa37804040d","cda0cb09b995489b7f4c57f168cd31b83dcbaa7aad49612734fb3c9c73f6e4f2",{"version":"2abad7477cf6761b55c18bea4c21b5a5dcf319748c13696df3736b35f8ac149e","affectsGlobalScope":true},"d38e588a10943bbab1d4ce03d94759bf065ff802a9a72fc57aa75a72f1725b71","96d14f21b7652903852eef49379d04dbda28c16ed36468f8c9fa08f7c14c9538","2b8264b2fefd7367e0f20e2c04eed5d3038831fe00f5efbc110ff0131aab899b","6209c901f30cc321f4b86800d11fad3d67e73a3308f19946b1bc642af0280298","60aaac5fb1858fbd4c4eb40e01706eb227eed9eca5c665564bd146971280dbd3","74b0245c42990ed8a849df955db3f4362c81b13f799ebc981b7bec2d5b414a57","b0d10e46cfe3f6c476b69af02eaa38e4ccc7430221ce3109ae84bb9fb8282298","4266ccd2cf1d6a281efd9c7ddf9efd7daecf76575364148bd233e18919cac3ed","70e9a18da08294f75bf23e46c7d69e67634c0765d355887b9b41f0d959e1426e","105b9a2234dcb06ae922f2cd8297201136d416503ff7d16c72bfc8791e9895c1"],"options":{"composite":true,"declaration":true,"declarationMap":true,"downlevelIteration":true,"esModuleInterop":true,"experimentalDecorators":true,"importHelpers":true,"jsx":2,"noEmitOnError":false,"noImplicitAny":true,"noUnusedLocals":true,"outDir":"./","rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strictNullChecks":true,"target":1,"tsBuildInfoFile":"./tsconfig.tsbuildinfo"},"fileIdsList":[[211,260],[260],[260,273],[53,190,260],[192,194,260],[190,192,193,260],[53,260],[53,140,260],[69,260],[211,212,213,214,215,260],[211,213,260],[233,260,267],[260,269],[260,270],[260,275,277],[217,260],[220,260],[221,226,260],[222,232,233,240,249,259,260],[222,223,232,240,260],[224,260],[225,226,233,241,260],[226,249,256,260],[227,229,232,240,260],[228,260],[229,230,260],[231,232,260],[232,260],[232,233,234,249,259,260],[232,233,234,249,260],[235,240,249,259,260],[232,233,235,236,240,249,256,259,260],[235,237,249,256,259,260],[217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266],[232,238,260],[239,259,260],[229,232,240,249,260],[241,260],[242,260],[220,243,260],[244,258,260,264],[245,260],[246,260],[232,247,260],[247,248,260,262],[232,249,250,251,260],[249,251,260],[249,250,260],[252,260],[253,260],[232,254,255,260],[254,255,260],[226,240,249,256,260],[257,260],[240,258,260],[221,235,246,259,260],[226,260],[249,260,261],[260,262],[260,263],[221,226,232,234,243,249,259,260,262,264],[249,260,265],[76,77,260],[53,58,64,65,68,71,72,73,76,260],[74,260],[84,260],[53,57,82,260],[53,54,57,58,62,75,76,260],[53,76,105,106,260],[53,54,57,58,62,76,260],[82,91,260],[53,54,62,75,76,93,260],[53,55,58,61,62,65,75,76,260],[53,54,57,62,76,260],[53,54,57,62,260],[53,54,55,58,60,62,63,75,76,260],[53,76,260],[53,75,76,260],[53,54,57,58,61,62,75,76,82,93,260],[53,55,58,260],[53,54,57,60,75,76,93,103,260],[53,54,60,76,103,105,260],[53,54,57,60,62,93,103,260],[53,54,55,58,60,61,75,76,93,260],[58,260],[53,55,58,59,60,61,75,76,260],[82,260],[83,260],[53,54,55,57,58,61,66,67,75,76,260],[58,59,260],[53,64,65,70,75,76,260],[53,56,64,70,75,76,260],[53,58,62,260],[53,118,260],[53,57,260],[57,260],[76,260],[75,260],[66,74,76,260],[53,54,57,58,61,75,76,260],[128,260],[53,56,57,260],[91,260],[44,45,46,47,48,55,56,57,58,59,60,61,62,63,64,65,66,67,68,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,260],[140,260],[46,260],[49,50,51,52,260],[232,235,237,240,259,260,267],[260,287],[260,275],[260,272,276],[260,274],[151,260],[53,141,142,143,144,146,147,148,149,150,157,260],[53,140,147,150,151,260],[143,144,260],[142,143,144,147,260],[143,260],[155,260],[157,260],[144,260],[53,144,260],[141,142,143,144,145,146,147,149,150,151,152,153,154,156,260],[149,260],[158,260],[43,140,166,177,260],[43,53,140,157,159,162,163,164,166,168,169,170,171,172,174,176,260],[43,53,140,162,165,260],[43,157,166,167,168,260],[43,53,140,165,166,168,170,171,177,260],[43,53,260],[43,167,260],[43,168,260],[43,53,140,157,162,163,166,172,191,195,260],[43,140,157,177,195,260],[43,53,140,157,177,179,191,198,260],[43,200,260],[43,157,170,171,173,260],[43,53,140,166,177,191,194,260],[43,53,140,166,179,191,194,260],[43,53,177,183,194,195,260],[43,260],[43,181,260],[43,53,177,180,181,182,183,260],[43,53,157,162,177,260],[43,53,140,180,182,184,260],[43,162,163,165,166,177,178,179,180,182,183,184,185,186,260],[43,53,140,160,161,260],[43,140,160,260],[43,140,260],[43,53,140,260],[43,157,260],[43,157,175,260],[43,53,140,157,175,260],[43,140,157,166,260],[43,140,157,170,171,260],[43,140,165,173,177,260],[53,140,166],[53,157,166,169],[53,140,162,165],[157,166],[53,140,166,177],[53],[191],[53,166,177,191,194],[53,166,179,191,194],[53,177,182,183,187],[53,162,177],[140,184],[162,163,165,166,177,178,179,180,182,183,184,185,186],[53,140],[140,160],[140],[157],[53,157],[140,157,166],[140,157],[177]],"referencedMap":[[213,1],[211,2],[274,3],[192,4],[193,5],[194,6],[191,4],[190,7],[69,8],[70,9],[273,2],[216,10],[212,1],[214,11],[215,1],[268,12],[269,2],[270,13],[271,14],[278,15],[279,2],[280,2],[217,16],[218,16],[220,17],[221,18],[222,19],[223,20],[224,21],[225,22],[226,23],[227,24],[228,25],[229,26],[230,26],[231,27],[232,28],[233,29],[234,30],[219,2],[266,2],[235,31],[236,32],[237,33],[267,34],[238,35],[239,36],[240,37],[241,38],[242,39],[243,40],[244,41],[245,42],[246,43],[247,44],[248,45],[249,46],[251,47],[250,48],[252,49],[253,50],[254,51],[255,52],[256,53],[257,54],[258,55],[259,56],[260,57],[261,58],[262,59],[263,60],[264,61],[265,62],[281,2],[282,2],[51,2],[78,63],[79,2],[74,64],[80,2],[81,65],[85,66],[86,2],[87,67],[88,68],[107,69],[89,2],[90,70],[92,71],[94,72],[95,73],[96,74],[63,74],[97,75],[64,76],[98,77],[99,68],[100,78],[101,79],[102,2],[60,80],[104,81],[106,82],[105,83],[103,84],[65,75],[61,85],[62,86],[108,2],[91,87],[83,87],[84,88],[68,89],[66,2],[67,2],[109,87],[110,90],[111,2],[112,71],[71,91],[72,92],[113,2],[114,93],[115,2],[116,2],[117,2],[119,94],[120,2],[56,7],[121,7],[122,95],[123,96],[124,2],[125,97],[127,97],[126,97],[76,98],[75,99],[77,97],[73,100],[128,2],[129,101],[58,102],[130,66],[131,66],[132,103],[133,87],[118,2],[134,2],[135,2],[136,2],[137,7],[138,2],[82,2],[140,104],[44,2],[45,105],[46,106],[48,2],[47,2],[93,2],[54,2],[139,105],[55,2],[59,85],[57,7],[283,7],[49,2],[53,107],[284,2],[52,2],[285,2],[286,108],[287,2],[288,109],[272,2],[50,2],[276,110],[277,111],[275,112],[149,2],[154,113],[151,114],[158,115],[147,116],[148,117],[141,2],[142,2],[145,116],[144,118],[156,119],[155,120],[153,116],[143,121],[146,122],[157,123],[175,124],[152,2],[150,7],[159,125],[43,2],[8,2],[9,2],[11,2],[10,2],[2,2],[12,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[3,2],[4,2],[23,2],[20,2],[21,2],[22,2],[24,2],[25,2],[26,2],[5,2],[27,2],[28,2],[29,2],[30,2],[6,2],[31,2],[32,2],[33,2],[34,2],[7,2],[35,2],[40,2],[41,2],[36,2],[37,2],[38,2],[39,2],[1,2],[42,2],[178,126],[177,127],[166,128],[169,129],[179,130],[164,131],[188,132],[189,133],[196,134],[197,135],[199,136],[201,137],[202,138],[195,139],[198,140],[203,141],[180,142],[182,143],[181,142],[184,144],[183,145],[185,142],[186,146],[170,142],[171,142],[172,142],[187,147],[162,148],[204,149],[205,149],[161,149],[160,131],[206,150],[207,150],[163,151],[208,131],[209,152],[210,152],[176,153],[200,154],[167,142],[168,155],[165,142],[173,156],[174,157]],"exportedModulesMap":[[213,1],[211,2],[274,3],[192,4],[193,5],[194,6],[191,4],[190,7],[69,8],[70,9],[273,2],[216,10],[212,1],[214,11],[215,1],[268,12],[269,2],[270,13],[271,14],[278,15],[279,2],[280,2],[217,16],[218,16],[220,17],[221,18],[222,19],[223,20],[224,21],[225,22],[226,23],[227,24],[228,25],[229,26],[230,26],[231,27],[232,28],[233,29],[234,30],[219,2],[266,2],[235,31],[236,32],[237,33],[267,34],[238,35],[239,36],[240,37],[241,38],[242,39],[243,40],[244,41],[245,42],[246,43],[247,44],[248,45],[249,46],[251,47],[250,48],[252,49],[253,50],[254,51],[255,52],[256,53],[257,54],[258,55],[259,56],[260,57],[261,58],[262,59],[263,60],[264,61],[265,62],[281,2],[282,2],[51,2],[78,63],[79,2],[74,64],[80,2],[81,65],[85,66],[86,2],[87,67],[88,68],[107,69],[89,2],[90,70],[92,71],[94,72],[95,73],[96,74],[63,74],[97,75],[64,76],[98,77],[99,68],[100,78],[101,79],[102,2],[60,80],[104,81],[106,82],[105,83],[103,84],[65,75],[61,85],[62,86],[108,2],[91,87],[83,87],[84,88],[68,89],[66,2],[67,2],[109,87],[110,90],[111,2],[112,71],[71,91],[72,92],[113,2],[114,93],[115,2],[116,2],[117,2],[119,94],[120,2],[56,7],[121,7],[122,95],[123,96],[124,2],[125,97],[127,97],[126,97],[76,98],[75,99],[77,97],[73,100],[128,2],[129,101],[58,102],[130,66],[131,66],[132,103],[133,87],[118,2],[134,2],[135,2],[136,2],[137,7],[138,2],[82,2],[140,104],[44,2],[45,105],[46,106],[48,2],[47,2],[93,2],[54,2],[139,105],[55,2],[59,85],[57,7],[283,7],[49,2],[53,107],[284,2],[52,2],[285,2],[286,108],[287,2],[288,109],[272,2],[50,2],[276,110],[277,111],[275,112],[149,2],[154,113],[151,114],[158,115],[147,116],[148,117],[141,2],[142,2],[145,116],[144,118],[156,119],[155,120],[153,116],[143,121],[146,122],[157,123],[175,124],[152,2],[150,7],[159,125],[43,2],[8,2],[9,2],[11,2],[10,2],[2,2],[12,2],[13,2],[14,2],[15,2],[16,2],[17,2],[18,2],[19,2],[3,2],[4,2],[23,2],[20,2],[21,2],[22,2],[24,2],[25,2],[26,2],[5,2],[27,2],[28,2],[29,2],[30,2],[6,2],[31,2],[32,2],[33,2],[34,2],[7,2],[35,2],[40,2],[41,2],[36,2],[37,2],[38,2],[39,2],[1,2],[42,2],[178,158],[177,159],[166,160],[169,161],[179,162],[164,163],[196,164],[199,164],[195,165],[198,166],[184,167],[183,168],[186,169],[187,170],[162,171],[204,172],[205,172],[161,172],[160,163],[206,173],[207,173],[163,171],[208,163],[209,174],[210,174],[176,174],[200,175],[168,176],[173,177],[174,178]],"semanticDiagnosticsPerFile":[213,211,274,192,193,194,191,190,69,70,273,216,212,214,215,268,269,270,271,278,279,280,217,218,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,219,266,235,236,237,267,238,239,240,241,242,243,244,245,246,247,248,249,251,250,252,253,254,255,256,257,258,259,260,261,262,263,264,265,281,282,51,78,79,74,80,81,85,86,87,88,107,89,90,92,94,95,96,63,97,64,98,99,100,101,102,60,104,106,105,103,65,61,62,108,91,83,84,68,66,67,109,110,111,112,71,72,113,114,115,116,117,119,120,56,121,122,123,124,125,127,126,76,75,77,73,128,129,58,130,131,132,133,118,134,135,136,137,138,82,140,44,45,46,48,47,93,54,139,55,59,57,283,49,53,284,52,285,286,287,288,272,50,276,277,275,149,154,151,158,147,148,141,142,145,144,156,155,153,143,146,157,175,152,150,159,43,8,9,11,10,2,12,13,14,15,16,17,18,19,3,4,23,20,21,22,24,25,26,5,27,28,29,30,6,31,32,33,34,7,35,40,41,36,37,38,39,1,42,178,177,166,169,179,164,188,189,196,197,199,201,202,195,198,203,180,182,181,184,183,185,186,170,171,172,187,162,204,205,161,160,206,207,163,208,209,210,176,200,167,168,165,173,174]},"version":"4.7.4"} \ No newline at end of file diff --git a/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutView.swift b/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutView.swift -index f18e92c..71b63dc 100644 +index f18e92c..f166553 100644 --- a/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutView.swift +++ b/node_modules/@shopify/flash-list/ios/Sources/AutoLayoutView.swift @@ -4,31 +4,35 @@ import UIKit @@ -973,7 +973,7 @@ index f18e92c..71b63dc 100644 } else { assertionFailure("CellRendererComponent outer view should always be CellContainer. Learn more here: https://shopify.github.io/flash-list/docs/usage#cellrenderercomponent.") return nil -@@ -106,7 +128,7 @@ import UIKit +@@ -106,12 +128,16 @@ import UIKit /// Checks for overlaps or gaps between adjacent items and then applies a correction. /// Performance: RecyclerListView renders very small number of views and this is not going to trigger multiple layouts on the iOS side. @@ -982,7 +982,16 @@ index f18e92c..71b63dc 100644 var maxBound: CGFloat = 0 var minBound: CGFloat = CGFloat(Int.max) var maxBoundNextCell: CGFloat = 0 -@@ -192,7 +214,7 @@ import UIKit + let correctedScrollOffset = scrollOffset - (horizontal ? frame.minX : frame.minY) + lastMaxBoundOverall = 0 ++ if cellContainers.count == 1 { ++ let firstCellContainer = cellContainers[0] ++ lastMaxBoundOverall = horizontal ? firstCellContainer.frame.maxX : firstCellContainer.frame.maxY ++ } + cellContainers.indices.dropLast().forEach { index in + let cellContainer = cellContainers[index] + let cellTop = cellContainer.frame.minY +@@ -192,7 +218,7 @@ import UIKit lastMinBound = minBound } @@ -991,7 +1000,7 @@ index f18e92c..71b63dc 100644 lastMaxBoundOverall = max(lastMaxBoundOverall, horizontal ? currentCell.frame.maxX : currentCell.frame.maxY, horizontal ? nextCell.frame.maxX : nextCell.frame.maxY) } -@@ -217,7 +239,7 @@ import UIKit +@@ -217,7 +243,7 @@ import UIKit /// It's important to avoid correcting views outside the render window. An item that isn't being recycled might still remain in the view tree. If views outside get considered then gaps between unused items will cause algorithm to fail. func isWithinBounds( @@ -1000,21 +1009,18 @@ index f18e92c..71b63dc 100644 scrollOffset: CGFloat, renderAheadOffset: CGFloat, windowSize: CGFloat, -@@ -260,10 +282,10 @@ import UIKit +@@ -260,17 +286,18 @@ import UIKit } private func footerDiff() -> CGFloat { - if subviews.count == 0 { -+ if viewsToLayout.count == 0 { - lastMaxBoundOverall = 0 +- lastMaxBoundOverall = 0 - } else if subviews.count == 1 { - let firstChild = subviews[0] -+ } else if viewsToLayout.count == 1 { -+ let firstChild = viewsToLayout[0] - lastMaxBoundOverall = horizontal ? firstChild.frame.maxX : firstChild.frame.maxY - } +- lastMaxBoundOverall = horizontal ? firstChild.frame.maxX : firstChild.frame.maxY +- } let autoLayoutEnd = horizontal ? frame.width : frame.height -@@ -271,6 +293,13 @@ import UIKit + return lastMaxBoundOverall - autoLayoutEnd } private func footer() -> UIView? { diff --git a/patches/react-native+0.73.4+016+fixClippedEmojis.patch b/patches/react-native+0.73.4+016+fixClippedEmojis.patch new file mode 100644 index 000000000000..4a14a11c96c0 --- /dev/null +++ b/patches/react-native+0.73.4+016+fixClippedEmojis.patch @@ -0,0 +1,47 @@ +diff --git a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.h b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.h +index 49a4353..c0158f3 100644 +--- a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.h ++++ b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.h +@@ -39,6 +39,8 @@ facebook::react::AttributedStringBox RCTAttributedStringBoxFromNSAttributedStrin + + NSString *RCTNSStringFromStringApplyingTextTransform(NSString *string, facebook::react::TextTransform textTransform); + ++void RCTApplyBaselineOffset(NSMutableAttributedString *attributedText); ++ + @interface RCTWeakEventEmitterWrapper : NSObject + @property (nonatomic, assign) facebook::react::SharedEventEmitter eventEmitter; + @end +diff --git a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm +index b3b53c8..b2d43c6 100644 +--- a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm ++++ b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTAttributedTextUtils.mm +@@ -300,7 +300,7 @@ inline static CGFloat RCTEffectiveFontSizeMultiplierFromTextAttributes(const Tex + return [attributes copy]; + } + +-static void RCTApplyBaselineOffset(NSMutableAttributedString *attributedText) ++void RCTApplyBaselineOffset(NSMutableAttributedString *attributedText) + { + __block CGFloat maximumLineHeight = 0; + +@@ -396,7 +396,6 @@ static void RCTApplyBaselineOffset(NSMutableAttributedString *attributedText) + + [nsAttributedString appendAttributedString:nsAttributedStringFragment]; + } +- RCTApplyBaselineOffset(nsAttributedString); + [nsAttributedString endEditing]; + + return nsAttributedString; +diff --git a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm +index 368c334..1f06f92 100644 +--- a/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm ++++ b/node_modules/react-native/ReactCommon/react/renderer/textlayoutmanager/platform/ios/react/renderer/textlayoutmanager/RCTTextLayoutManager.mm +@@ -261,7 +261,7 @@ - (NSTextStorage *)_textStorageForNSAttributesString:(NSAttributedString *)attri + [layoutManager addTextContainer:textContainer]; + + NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:attributedString]; +- ++ RCTApplyBaselineOffset(textStorage); + [textStorage addLayoutManager:layoutManager]; + + if (paragraphAttributes.adjustsFontSizeToFit) { diff --git a/patches/react-native+0.73.4+016+iOS-textinput-onscroll-event.patch b/patches/react-native+0.73.4+016+iOS-textinput-onscroll-event.patch new file mode 100644 index 000000000000..1a5b4c40477b --- /dev/null +++ b/patches/react-native+0.73.4+016+iOS-textinput-onscroll-event.patch @@ -0,0 +1,70 @@ +diff --git a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/iostextinput/react/renderer/components/iostextinput/TextInputEventEmitter.cpp b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/iostextinput/react/renderer/components/iostextinput/TextInputEventEmitter.cpp +index 88ae3f3..497569a 100644 +--- a/node_modules/react-native/ReactCommon/react/renderer/components/textinput/iostextinput/react/renderer/components/iostextinput/TextInputEventEmitter.cpp ++++ b/node_modules/react-native/ReactCommon/react/renderer/components/textinput/iostextinput/react/renderer/components/iostextinput/TextInputEventEmitter.cpp +@@ -36,6 +36,54 @@ static jsi::Value textInputMetricsPayload( + return payload; + }; + ++static jsi::Value textInputMetricsScrollPayload( ++ jsi::Runtime& runtime, ++ const TextInputMetrics& textInputMetrics) { ++ auto payload = jsi::Object(runtime); ++ ++ { ++ auto contentOffset = jsi::Object(runtime); ++ contentOffset.setProperty(runtime, "x", textInputMetrics.contentOffset.x); ++ contentOffset.setProperty(runtime, "y", textInputMetrics.contentOffset.y); ++ payload.setProperty(runtime, "contentOffset", contentOffset); ++ } ++ ++ { ++ auto contentInset = jsi::Object(runtime); ++ contentInset.setProperty(runtime, "top", textInputMetrics.contentInset.top); ++ contentInset.setProperty( ++ runtime, "left", textInputMetrics.contentInset.left); ++ contentInset.setProperty( ++ runtime, "bottom", textInputMetrics.contentInset.bottom); ++ contentInset.setProperty( ++ runtime, "right", textInputMetrics.contentInset.right); ++ payload.setProperty(runtime, "contentInset", contentInset); ++ } ++ ++ { ++ auto contentSize = jsi::Object(runtime); ++ contentSize.setProperty( ++ runtime, "width", textInputMetrics.contentSize.width); ++ contentSize.setProperty( ++ runtime, "height", textInputMetrics.contentSize.height); ++ payload.setProperty(runtime, "contentSize", contentSize); ++ } ++ ++ { ++ auto layoutMeasurement = jsi::Object(runtime); ++ layoutMeasurement.setProperty( ++ runtime, "width", textInputMetrics.layoutMeasurement.width); ++ layoutMeasurement.setProperty( ++ runtime, "height", textInputMetrics.layoutMeasurement.height); ++ payload.setProperty(runtime, "layoutMeasurement", layoutMeasurement); ++ } ++ ++ payload.setProperty(runtime, "zoomScale", textInputMetrics.zoomScale ?: 1); ++ ++ ++ return payload; ++ }; ++ + static jsi::Value textInputMetricsContentSizePayload( + jsi::Runtime& runtime, + const TextInputMetrics& textInputMetrics) { +@@ -140,7 +188,9 @@ void TextInputEventEmitter::onKeyPressSync( + + void TextInputEventEmitter::onScroll( + const TextInputMetrics& textInputMetrics) const { +- dispatchTextInputEvent("scroll", textInputMetrics); ++ dispatchEvent("scroll", [textInputMetrics](jsi::Runtime& runtime) { ++ return textInputMetricsScrollPayload(runtime, textInputMetrics); ++ }); + } + + void TextInputEventEmitter::dispatchTextInputEvent( diff --git a/patches/react-native+0.73.4+017+iOS-fix-whitespace-support-sourcemap.patch b/patches/react-native+0.73.4+017+iOS-fix-whitespace-support-sourcemap.patch new file mode 100644 index 000000000000..e8ca87026282 --- /dev/null +++ b/patches/react-native+0.73.4+017+iOS-fix-whitespace-support-sourcemap.patch @@ -0,0 +1,37 @@ +diff --git a/node_modules/react-native/scripts/react-native-xcode.sh b/node_modules/react-native/scripts/react-native-xcode.sh +index d6c382b..3e1742c 100755 +--- a/node_modules/react-native/scripts/react-native-xcode.sh ++++ b/node_modules/react-native/scripts/react-native-xcode.sh +@@ -104,7 +104,7 @@ fi + + BUNDLE_FILE="$CONFIGURATION_BUILD_DIR/main.jsbundle" + +-EXTRA_ARGS= ++EXTRA_ARGS=() + + case "$PLATFORM_NAME" in + "macosx") +@@ -131,12 +131,12 @@ if [[ $EMIT_SOURCEMAP == true ]]; then + else + PACKAGER_SOURCEMAP_FILE="$SOURCEMAP_FILE" + fi +- EXTRA_ARGS="$EXTRA_ARGS --sourcemap-output $PACKAGER_SOURCEMAP_FILE" ++ EXTRA_ARGS+=("--sourcemap-output" "$PACKAGER_SOURCEMAP_FILE") + fi + + # Hermes doesn't require JS minification. + if [[ $USE_HERMES != false && $DEV == false ]]; then +- EXTRA_ARGS="$EXTRA_ARGS --minify false" ++ EXTRA_ARGS+=("--minify" "false") + fi + + "$NODE_BINARY" $NODE_ARGS "$CLI_PATH" $BUNDLE_COMMAND \ +@@ -147,7 +147,7 @@ fi + --reset-cache \ + --bundle-output "$BUNDLE_FILE" \ + --assets-dest "$DEST" \ +- $EXTRA_ARGS \ ++ "${EXTRA_ARGS[@]}" \ + $EXTRA_PACKAGER_ARGS + + if [[ $USE_HERMES == false ]]; then diff --git a/patches/react-native-keyboard-controller+1.12.2.patch.patch b/patches/react-native-keyboard-controller+1.12.2.patch.patch new file mode 100644 index 000000000000..3c8034354481 --- /dev/null +++ b/patches/react-native-keyboard-controller+1.12.2.patch.patch @@ -0,0 +1,39 @@ +diff --git a/node_modules/react-native-keyboard-controller/android/src/main/java/com/reactnativekeyboardcontroller/views/EdgeToEdgeReactViewGroup.kt b/node_modules/react-native-keyboard-controller/android/src/main/java/com/reactnativekeyboardcontroller/views/EdgeToEdgeReactViewGroup.kt +index 83884d8..5d9e989 100644 +--- a/node_modules/react-native-keyboard-controller/android/src/main/java/com/reactnativekeyboardcontroller/views/EdgeToEdgeReactViewGroup.kt ++++ b/node_modules/react-native-keyboard-controller/android/src/main/java/com/reactnativekeyboardcontroller/views/EdgeToEdgeReactViewGroup.kt +@@ -99,12 +99,12 @@ class EdgeToEdgeReactViewGroup(private val reactContext: ThemedReactContext) : R + } + + private fun goToEdgeToEdge(edgeToEdge: Boolean) { +- reactContext.currentActivity?.let { +- WindowCompat.setDecorFitsSystemWindows( +- it.window, +- !edgeToEdge, +- ) +- } ++ // reactContext.currentActivity?.let { ++ // WindowCompat.setDecorFitsSystemWindows( ++ // it.window, ++ // !edgeToEdge, ++ // ) ++ // } + } + + private fun setupKeyboardCallbacks() { +@@ -158,13 +158,13 @@ class EdgeToEdgeReactViewGroup(private val reactContext: ThemedReactContext) : R + // region State managers + private fun enable() { + this.goToEdgeToEdge(true) +- this.setupWindowInsets() ++ // this.setupWindowInsets() + this.setupKeyboardCallbacks() + } + + private fun disable() { + this.goToEdgeToEdge(false) +- this.setupWindowInsets() ++ // this.setupWindowInsets() + this.removeKeyboardCallbacks() + } + // endregion \ No newline at end of file diff --git a/patches/react-native-modal+13.0.1.patch b/patches/react-native-modal+13.0.1.patch index 5bfb2cc5f0b0..cc9c8531e3a3 100644 --- a/patches/react-native-modal+13.0.1.patch +++ b/patches/react-native-modal+13.0.1.patch @@ -11,7 +11,7 @@ index b63bcfc..bd6419e 100644 buildPanResponder: () => void; getAccDistancePerDirection: (gestureState: PanResponderGestureState) => number; diff --git a/node_modules/react-native-modal/dist/modal.js b/node_modules/react-native-modal/dist/modal.js -index 80f4e75..3ba8b8c 100644 +index 80f4e75..5a58eae 100644 --- a/node_modules/react-native-modal/dist/modal.js +++ b/node_modules/react-native-modal/dist/modal.js @@ -75,6 +75,13 @@ export class ReactNativeModal extends React.Component { @@ -48,7 +48,17 @@ index 80f4e75..3ba8b8c 100644 if (this.didUpdateDimensionsEmitter) { this.didUpdateDimensionsEmitter.remove(); } -@@ -525,7 +540,7 @@ export class ReactNativeModal extends React.Component { +@@ -464,6 +479,9 @@ export class ReactNativeModal extends React.Component { + InteractionManager.clearInteractionHandle(this.interactionHandle); + this.interactionHandle = null; + } ++ if (this.state.isVisible) { ++ this.props.onModalHide(); ++ } + } + componentDidUpdate(prevProps) { + // If the animations have been changed then rebuild them to make sure we're +@@ -525,7 +543,7 @@ export class ReactNativeModal extends React.Component { } return (React.createElement(Modal, Object.assign({ transparent: true, animationType: 'none', visible: this.state.isVisible, onRequestClose: onBackButtonPress }, otherProps), this.makeBackdrop(), diff --git a/patches/react-native-web+0.19.9+001+initial.patch b/patches/react-native-web+0.19.12+001+initial.patch similarity index 98% rename from patches/react-native-web+0.19.9+001+initial.patch rename to patches/react-native-web+0.19.12+001+initial.patch index 91ba6bfd59c0..c77cfc7829ed 100644 --- a/patches/react-native-web+0.19.9+001+initial.patch +++ b/patches/react-native-web+0.19.12+001+initial.patch @@ -1,9 +1,9 @@ diff --git a/node_modules/react-native-web/dist/vendor/react-native/VirtualizedList/index.js b/node_modules/react-native-web/dist/vendor/react-native/VirtualizedList/index.js -index c879838..0c9dfcb 100644 +index e137def..c3e5054 100644 --- a/node_modules/react-native-web/dist/vendor/react-native/VirtualizedList/index.js +++ b/node_modules/react-native-web/dist/vendor/react-native/VirtualizedList/index.js @@ -285,7 +285,7 @@ class VirtualizedList extends StateSafePureComponent { - // $FlowFixMe[missing-local-annot] + // REACT-NATIVE-WEB patch to preserve during future RN merges: Support inverted wheel scroller. constructor(_props) { - var _this$props$updateCel; @@ -243,7 +243,7 @@ index c879838..0c9dfcb 100644 }); this._hasMore = this.state.cellsAroundViewport.last < itemCount - 1; var innerRet = /*#__PURE__*/React.createElement(VirtualizedListContextProvider, { -@@ -1307,8 +1360,12 @@ class VirtualizedList extends StateSafePureComponent { +@@ -1317,8 +1370,12 @@ class VirtualizedList extends StateSafePureComponent { onStartReached = _this$props8.onStartReached, onStartReachedThreshold = _this$props8.onStartReachedThreshold, onEndReached = _this$props8.onEndReached, @@ -258,7 +258,7 @@ index c879838..0c9dfcb 100644 var _this$_scrollMetrics2 = this._scrollMetrics, contentLength = _this$_scrollMetrics2.contentLength, visibleLength = _this$_scrollMetrics2.visibleLength, -@@ -1348,16 +1405,10 @@ class VirtualizedList extends StateSafePureComponent { +@@ -1358,16 +1415,10 @@ class VirtualizedList extends StateSafePureComponent { // and call onStartReached only once for a given content length, // and only if onEndReached is not being executed else if (onStartReached != null && this.state.cellsAroundViewport.first === 0 && isWithinStartThreshold && this._scrollMetrics.contentLength !== this._sentStartForContentLength) { @@ -279,9 +279,9 @@ index c879838..0c9dfcb 100644 } // If the user scrolls away from the start or end and back again, -@@ -1412,6 +1463,11 @@ class VirtualizedList extends StateSafePureComponent { - } - } +@@ -1433,6 +1484,11 @@ class VirtualizedList extends StateSafePureComponent { + */ + _updateViewableItems(props, cellsAroundViewport) { + // If we have any pending scroll updates it means that the scroll metrics + // are out of date and we should not call any of the visibility callbacks. @@ -292,7 +292,7 @@ index c879838..0c9dfcb 100644 tuple.viewabilityHelper.onUpdate(props, this._scrollMetrics.offset, this._scrollMetrics.visibleLength, this._getFrameMetrics, this._createViewToken, tuple.onViewableItemsChanged, cellsAroundViewport); }); diff --git a/node_modules/react-native-web/src/vendor/react-native/VirtualizedList/index.js b/node_modules/react-native-web/src/vendor/react-native/VirtualizedList/index.js -index c7d68bb..43f9653 100644 +index c7d68bb..459f017 100644 --- a/node_modules/react-native-web/src/vendor/react-native/VirtualizedList/index.js +++ b/node_modules/react-native-web/src/vendor/react-native/VirtualizedList/index.js @@ -75,6 +75,10 @@ type ViewabilityHelperCallbackTuple = { diff --git a/patches/react-native-web+0.19.9+004+fixLastSpacer.patch b/patches/react-native-web+0.19.12+002+fixLastSpacer.patch similarity index 100% rename from patches/react-native-web+0.19.9+004+fixLastSpacer.patch rename to patches/react-native-web+0.19.12+002+fixLastSpacer.patch diff --git a/patches/react-native-web+0.19.9+005+image-header-support.patch b/patches/react-native-web+0.19.12+003+image-header-support.patch similarity index 95% rename from patches/react-native-web+0.19.9+005+image-header-support.patch rename to patches/react-native-web+0.19.12+003+image-header-support.patch index 4652e22662f0..6652f0345cc4 100644 --- a/patches/react-native-web+0.19.9+005+image-header-support.patch +++ b/patches/react-native-web+0.19.12+003+image-header-support.patch @@ -1,5 +1,5 @@ diff --git a/node_modules/react-native-web/dist/exports/Image/index.js b/node_modules/react-native-web/dist/exports/Image/index.js -index 95355d5..19109fc 100644 +index 9649d27..3281cc8 100644 --- a/node_modules/react-native-web/dist/exports/Image/index.js +++ b/node_modules/react-native-web/dist/exports/Image/index.js @@ -135,7 +135,22 @@ function resolveAssetUri(source) { @@ -23,10 +23,10 @@ index 95355d5..19109fc 100644 + return a.uri !== b.uri || JSON.stringify(a.headers) !== JSON.stringify(b.headers); +} +var BaseImage = /*#__PURE__*/React.forwardRef((props, ref) => { - var ariaLabel = props['aria-label'], + var _ariaLabel = props['aria-label'], + accessibilityLabel = props.accessibilityLabel, blurRadius = props.blurRadius, - defaultSource = props.defaultSource, -@@ -236,16 +251,10 @@ var Image = /*#__PURE__*/React.forwardRef((props, ref) => { +@@ -238,16 +253,10 @@ var Image = /*#__PURE__*/React.forwardRef((props, ref) => { } }, function error() { updateState(ERRORED); @@ -47,7 +47,7 @@ index 95355d5..19109fc 100644 }); } function abortPendingRequest() { -@@ -277,10 +286,78 @@ var Image = /*#__PURE__*/React.forwardRef((props, ref) => { +@@ -279,10 +288,78 @@ var Image = /*#__PURE__*/React.forwardRef((props, ref) => { suppressHydrationWarning: true }), hiddenImage, createTintColorSVG(tintColor, filterRef.current)); }); @@ -129,7 +129,7 @@ index 95355d5..19109fc 100644 ImageLoader.getSize(uri, success, failure); }; diff --git a/node_modules/react-native-web/dist/modules/ImageLoader/index.js b/node_modules/react-native-web/dist/modules/ImageLoader/index.js -index bc06a87..e309394 100644 +index bc06a87..5a22819 100644 --- a/node_modules/react-native-web/dist/modules/ImageLoader/index.js +++ b/node_modules/react-native-web/dist/modules/ImageLoader/index.js @@ -76,7 +76,7 @@ var ImageLoader = { diff --git a/patches/react-native-web+0.19.9+006+fixPointerEventDown.patch b/patches/react-native-web+0.19.12+004+fixPointerEventDown.patch similarity index 100% rename from patches/react-native-web+0.19.9+006+fixPointerEventDown.patch rename to patches/react-native-web+0.19.12+004+fixPointerEventDown.patch diff --git a/patches/react-native-web+0.19.9+007+osr-improvement.patch b/patches/react-native-web+0.19.12+005+osr-improvement.patch similarity index 100% rename from patches/react-native-web+0.19.9+007+osr-improvement.patch rename to patches/react-native-web+0.19.12+005+osr-improvement.patch diff --git a/patches/react-native-web+0.19.12+006+remove focus trap from modal.patch b/patches/react-native-web+0.19.12+006+remove focus trap from modal.patch new file mode 100644 index 000000000000..14dbc88b0b1c --- /dev/null +++ b/patches/react-native-web+0.19.12+006+remove focus trap from modal.patch @@ -0,0 +1,20 @@ +diff --git a/node_modules/react-native-web/dist/exports/Modal/index.js b/node_modules/react-native-web/dist/exports/Modal/index.js +index d5df021..e2c46cf 100644 +--- a/node_modules/react-native-web/dist/exports/Modal/index.js ++++ b/node_modules/react-native-web/dist/exports/Modal/index.js +@@ -86,13 +86,11 @@ var Modal = /*#__PURE__*/React.forwardRef((props, forwardedRef) => { + onDismiss: onDismissCallback, + onShow: onShowCallback, + visible: visible +- }, /*#__PURE__*/React.createElement(ModalFocusTrap, { +- active: isActive + }, /*#__PURE__*/React.createElement(ModalContent, _extends({}, rest, { + active: isActive, + onRequestClose: onRequestClose, + ref: forwardedRef, + transparent: transparent +- }), children)))); ++ }), children))); + }); + export default Modal; +\ No newline at end of file diff --git a/patches/react-native-web+0.19.9+002+measureInWindow.patch b/patches/react-native-web+0.19.9+002+measureInWindow.patch deleted file mode 100644 index f41b4b3b48cb..000000000000 --- a/patches/react-native-web+0.19.9+002+measureInWindow.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/node_modules/react-native-web/dist/exports/UIManager/index.js b/node_modules/react-native-web/dist/exports/UIManager/index.js -index 15b71d5..46b9e01 100644 ---- a/node_modules/react-native-web/dist/exports/UIManager/index.js -+++ b/node_modules/react-native-web/dist/exports/UIManager/index.js -@@ -77,7 +77,7 @@ var UIManager = { - measureInWindow(node, callback) { - if (node) { - setTimeout(() => { -- var _getRect2 = getRect(node), -+ var _getRect2 = node.getBoundingClientRect(), - height = _getRect2.height, - left = _getRect2.left, - top = _getRect2.top, diff --git a/patches/react-pdf+7.7.1.patch b/patches/react-pdf+7.7.3.patch similarity index 93% rename from patches/react-pdf+7.7.1.patch rename to patches/react-pdf+7.7.3.patch index f6ec8d8c1685..5b1b3ebb6f6e 100644 --- a/patches/react-pdf+7.7.1.patch +++ b/patches/react-pdf+7.7.3.patch @@ -1,5 +1,5 @@ diff --git a/node_modules/react-pdf/dist/esm/Document.js b/node_modules/react-pdf/dist/esm/Document.js -index 493ff15..8d5e734 100644 +index b1c5a81..569769e 100644 --- a/node_modules/react-pdf/dist/esm/Document.js +++ b/node_modules/react-pdf/dist/esm/Document.js @@ -261,6 +261,7 @@ const Document = forwardRef(function Document(_a, ref) { diff --git a/police.diff b/police.diff new file mode 100644 index 000000000000..bea7a333d094 --- /dev/null +++ b/police.diff @@ -0,0 +1,889 @@ +diff --git a/.github/.eslintrc.js b/.github/.eslintrc.js +index d6d39822b7..d1f75405f7 100644 +--- a/.github/.eslintrc.js ++++ b/.github/.eslintrc.js +@@ -6,5 +6,6 @@ module.exports = { + '@lwc/lwc/no-async-await': 'off', + 'no-await-in-loop': 'off', + 'no-restricted-syntax': ['error', 'ForInStatement', 'LabeledStatement', 'WithStatement'], ++ 'no-continue': 'off', + }, + }; +diff --git a/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts b/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts +index 76523d0b4d..c88327c97f 100644 +--- a/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts ++++ b/.github/actions/javascript/proposalPoliceComment/proposalPoliceComment.ts +@@ -1,65 +1,105 @@ +-import {context, getOctokit} from '@actions/github'; +-import InitOpenAI from 'openai'; ++import {getInput, setFailed} from '@actions/core'; ++import {context} from '@actions/github'; ++import type {IssueCommentCreatedEvent, IssueCommentEditedEvent, IssueCommentEvent} from '@octokit/webhooks-types'; + import CONST from '@github/libs/CONST'; +-import type {GitHubType} from '@github/libs/GithubUtils'; +-import * as OpenAIUtils from '@github/libs/OpenAIUtils'; ++import GithubUtils from '@github/libs/GithubUtils'; ++import OpenAIUtils from '@github/libs/OpenAIUtils'; + +-const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); ++function isCommentCreatedOrEditedEvent(payload: IssueCommentEvent): payload is IssueCommentCreatedEvent | IssueCommentEditedEvent { ++ return payload.action === CONST.ACTIONS.CREATED || payload.action === CONST.ACTIONS.EDIT; ++} ++ ++function isCommentCreatedEvent(payload: IssueCommentEvent): payload is IssueCommentCreatedEvent { ++ return payload.action === CONST.ACTIONS.CREATED; ++} + +-async function processIssueComment(octokit: InstanceType) { +- const payload = context.payload; +- const OPENAI_ASSISTANT_ID = process.env.OPENAI_ASSISTANT_ID; ++// Main function to process the workflow event ++async function run() { ++ // Verify this is running for an expected webhook event ++ if (context.eventName !== 'issue_comment') { ++ throw new Error('ProposalPolice™ only supports the issue_comment webhook event'); ++ } ++ ++ const payload = context.payload as IssueCommentEvent; + + // check if the issue is open and the has labels + if (payload.issue?.state !== 'open' && !payload.issue?.labels.some((issueLabel: {name: string}) => issueLabel.name === CONST.LABELS.HELP_WANTED)) { + return; + } + +- if (!OPENAI_ASSISTANT_ID) { +- console.error('OPENAI_ASSISTANT_ID missing from the environment variables'); ++ // Verify that the comment is not empty ++ if (!payload.comment?.body.trim()) { + return; + } + +- if (!payload.comment?.body.trim()) { ++ console.log('ProposalPolice™ Action triggered for comment:', payload.comment?.body); ++ console.log('-> GitHub Action Type: ', payload.action?.toUpperCase()); ++ ++ if (!isCommentCreatedOrEditedEvent(payload)) { ++ console.error('Unsupported action type:', payload?.action); ++ setFailed(new Error(`Unsupported action type ${payload?.action}`)); + return; + } +- console.log('Action triggered for comment:', payload.comment?.body); + +- let content = ''; ++ const prompt = isCommentCreatedEvent(payload) ++ ? `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "${CONST.NO_ACTION}" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment?.body}` ++ : `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "${CONST.NO_ACTION}" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body?.from}.\n\nEdited comment content: ${payload.comment?.body}`; + +- console.log('-> GitHub Action Type: ', payload.action?.toUpperCase()); ++ const assistantResponse = await OpenAIUtils.prompt(prompt); + +- if (payload.action === CONST.ACTIONS.CREATED) { +- content = `I NEED HELP WITH CASE (1.), CHECK IF COMMENT IS PROPOSAL AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "${CONST.NO_ACTION}" IN CASE THE COMMENT IS NOT A PROPOSAL. Comment content: ${payload.comment?.body}`; +- } else if (payload.action === CONST.ACTIONS.EDIT) { +- content = `I NEED HELP WITH CASE (2.) WHEN A USER THAT POSTED AN INITIAL PROPOSAL OR COMMENT (UNEDITED) THEN EDITS THE COMMENT - WE NEED TO CLASSIFY THE COMMENT BASED IN THE GIVEN INSTRUCTIONS AND IF TEMPLATE IS FOLLOWED AS PER INSTRUCTIONS. IT IS MANDATORY THAT YOU RESPOND ONLY WITH "${CONST.NO_ACTION}" IN CASE THE COMMENT IS NOT A PROPOSAL. \n\nPrevious comment content: ${payload.changes.body?.from}.\n\nEdited comment content: ${payload.comment?.body}`; +- } ++ // check if assistant response is either NO_ACTION or "NO_ACTION" strings ++ // as sometimes the assistant response varies ++ const isNoAction = assistantResponse.trim().replaceAll(' ', '_').replaceAll('"', '').toUpperCase() === CONST.NO_ACTION; + +- if (content === '') { +- console.log('Early return - Comment body content is empty.'); ++ // If assistant response is NO_ACTION, do nothing ++ if (isNoAction) { ++ console.log('Detected NO_ACTION for comment, returning early'); + return; + } +- console.log('Comment body content for assistant:', content); +- +- // create thread with first user message and run it +- const createAndRunResponse = await OpenAI.beta.threads.createAndRun({ +- /* eslint-disable @typescript-eslint/naming-convention */ +- assistant_id: OPENAI_ASSISTANT_ID ?? '', +- thread: {messages: [{role: 'user', content}]}, +- }); +- +- if (payload.action === CONST.ACTIONS.CREATED) { +- await OpenAIUtils.prompt({createAndRunResponse, payload, octokit}); +- } else if (payload.action === CONST.ACTIONS.EDIT) { +- await OpenAIUtils.promptEdit({createAndRunResponse, payload, octokit}); ++ ++ // if the assistant responded with no action but there's some context in the response ++ if (assistantResponse.includes(`[${CONST.NO_ACTION}]`)) { ++ // extract the text after [NO_ACTION] from assistantResponse since this is a ++ // bot related action keyword ++ const noActionContext = assistantResponse.split(`[${CONST.NO_ACTION}] `)?.[1]?.replace('"', ''); ++ console.log('[NO_ACTION] w/ context: ', noActionContext); ++ return; + } +-} + +-// Main function to process the workflow event +-async function run() { +- // @ts-expect-error - process is not imported +- const octokit: InstanceType = getOctokit(process.env.GITHUB_TOKEN); +- await processIssueComment(octokit); ++ if (isCommentCreatedEvent(payload)) { ++ const formattedResponse = assistantResponse ++ // replace {user} from response template with @username ++ .replaceAll('{user}', `@${payload.comment?.user.login}`) ++ ++ // replace {proposalLink} from response template with the link to the comment ++ .replaceAll('{proposalLink}', payload.comment?.html_url) ++ ++ // remove any double quotes from the final comment because sometimes the assistant's ++ // response contains double quotes / sometimes it doesn't ++ .replaceAll('"', ''); ++ ++ // Create a comment with the assistant's response ++ console.log('ProposalPolice™ commenting on issue...'); ++ await GithubUtils.createComment(CONST.APP_REPO, context.issue.number, formattedResponse); ++ } else { ++ // edit comment if assistant detected substantial changes and if the comment was not edited already by the bot ++ if (assistantResponse.includes('[EDIT_COMMENT]') && !payload.comment?.body.includes('Edited by **proposal-police**')) { ++ // extract the text after [EDIT_COMMENT] from assistantResponse since this is a ++ // bot related action keyword ++ let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); ++ // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC ++ const date = new Date(payload.comment?.updated_at ?? ''); ++ const formattedDate = `${date.toISOString()?.split('.')?.[0]?.replace('T', ' ')} UTC`; ++ extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); ++ console.log('ProposalPolice™ editing issue comment...', payload.comment.id); ++ await GithubUtils.octokit.issues.updateComment({ ++ ...context.repo, ++ /* eslint-disable @typescript-eslint/naming-convention */ ++ comment_id: payload.comment.id, ++ body: `${extractedNotice}\n\n${payload.comment?.body}`, ++ }); ++ } ++ } + } + + run().catch((error) => { +diff --git a/.github/libs/CONST.ts b/.github/libs/CONST.ts +index f2d704a41a..3be40ff564 100644 +--- a/.github/libs/CONST.ts ++++ b/.github/libs/CONST.ts +@@ -28,6 +28,7 @@ const CONST = { + APP_REPO_GIT_URL: `git@github.com:${GIT_CONST.GITHUB_OWNER}/${GIT_CONST.APP_REPO}.git`, + NO_ACTION: 'NO_ACTION', + OPENAI_POLL_RATE: 1500, ++ OPENAI_POLL_TIMEOUT: 90000, + } as const; + + export default CONST; +diff --git a/.github/libs/GithubUtils.ts b/.github/libs/GithubUtils.ts +index 258048a259..26ff70ec9c 100644 +--- a/.github/libs/GithubUtils.ts ++++ b/.github/libs/GithubUtils.ts +@@ -1,8 +1,7 @@ + /* eslint-disable @typescript-eslint/naming-convention, import/no-import-module-exports */ + import * as core from '@actions/core'; + import {getOctokitOptions, GitHub} from '@actions/github/lib/utils'; +-import type {Octokit, Octokit as OctokitCore} from '@octokit/core'; +-import type {Constructor} from '@octokit/core/dist-types/types'; ++import type {Octokit as OctokitCore} from '@octokit/core'; + import type {graphql} from '@octokit/graphql/dist-types/types'; + import type {components as OctokitComponents} from '@octokit/openapi-types/types'; + import type {PaginateInterface} from '@octokit/plugin-paginate-rest'; +@@ -560,18 +559,4 @@ class GithubUtils { + } + + export default GithubUtils; +-// This is a temporary solution to allow the use of the GithubUtils class in both TypeScript and JavaScript. +-// Once all the files that import GithubUtils are migrated to TypeScript, this can be removed. +- +-declare const GitHubType: (new (...args: unknown[]) => Record) & { +- new (...args: unknown[]): Record; +- plugins: unknown[]; +-} & typeof Octokit & +- Constructor< +- RestEndpointMethods & { +- paginate: PaginateInterface; +- } +- >; +- +-export {GitHubType}; + export type {ListForRepoMethod, InternalOctokit, CreateCommentResponse, StagingDeployCashData}; +diff --git a/.github/libs/OpenAIUtils.ts b/.github/libs/OpenAIUtils.ts +index dca95dbc74..df4a14e2d2 100644 +--- a/.github/libs/OpenAIUtils.ts ++++ b/.github/libs/OpenAIUtils.ts +@@ -1,198 +1,74 @@ +-import {context} from '@actions/github'; +-import InitOpenAI from 'openai'; ++import {getInput} from '@actions/core'; ++import OpenAI from 'openai'; ++import type {MessageContent, TextContentBlock} from 'openai/resources/beta/threads'; + import CONST from './CONST'; +-import type {GitHubType} from './GithubUtils'; + +-const OpenAI = new InitOpenAI({apiKey: process.env.OPENAI_API_KEY}); ++const MAX_POLL_COUNT = Math.floor(CONST.OPENAI_POLL_TIMEOUT / CONST.OPENAI_POLL_RATE); ++ ++class OpenAIUtils { ++ private static ai: OpenAI; ++ ++ private static assistantID: string; ++ ++ static init(apiKey?: string, assistantID?: string) { ++ const key = apiKey ?? getInput('OPENAI_API_KEY', {required: true}); ++ if (!key) { ++ throw new Error('Could not initialize OpenAI: no key provided'); ++ } ++ this.ai = new OpenAI({apiKey: key}); ++ this.assistantID = assistantID ?? getInput('OPENAI_ASSISTANT_ID', {required: true}); ++ } ++ ++ static get openAI() { ++ if (!this.ai) { ++ this.init(); ++ } ++ return this.ai; ++ } ++ ++ static async prompt(userMessage: string) { ++ // start a thread run ++ let threadRun = await this.openAI.beta.threads.createAndRun({ ++ /* eslint-disable @typescript-eslint/naming-convention */ ++ assistant_id: this.assistantID, ++ thread: {messages: [{role: 'user', content: userMessage}]}, ++ }); + +-type OpenAIUtilsPrompt = { +- createAndRunResponse: InitOpenAI.Beta.Threads.Runs.Run; +- payload: typeof context.payload; +- octokit: InstanceType; +-}; +- +-async function prompt({createAndRunResponse, payload, octokit}: OpenAIUtilsPrompt) { +- return new Promise((resolve, reject) => { +- // count calls for debug purposes +- let count = 0; + // poll for run completion +- const intervalID = setInterval(() => { +- OpenAI.beta.threads.runs +- .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) +- .then((threadRun) => { +- // return if run is not completed +- if (threadRun.status !== 'completed') { +- return; +- } +- +- // get assistant response +- OpenAI.beta.threads.messages +- .list(createAndRunResponse.thread_id) +- .then((threadMessages) => { +- // list thread messages content +- threadMessages.data.forEach((message, index) => { +- // @ts-expect-error - we do have `text` in content[0] but typescript doesn't know that this is an 'openai' package type issue +- let assistantResponse = message.content?.[index]?.text?.value as string; +- console.log('issue_comment.created - assistantResponse', assistantResponse); +- +- if (!assistantResponse) { +- return console.log('issue_comment.created - assistantResponse is empty'); +- } +- +- // check if assistant response is either NO_ACTION or "NO_ACTION" strings +- // as sometimes the assistant response varies +- const isNoAction = assistantResponse.replaceAll('"', '').toUpperCase() === CONST.NO_ACTION; +- // If assistant response is NO_ACTION, do nothing +- if (isNoAction) { +- console.log('Detected NO_ACTION for comment, returning early'); +- return; +- } +- // If thread message role is 'user', do nothing +- if (threadMessages.data?.[index]?.role === 'user') { +- console.log('Detected message role "user", returning early...'); +- return; +- } +- +- // if the assistant responded with no action but there's some context in the response +- if (assistantResponse.includes(`[${CONST.NO_ACTION}]`)) { +- // extract the text after [NO_ACTION] from assistantResponse since this is a +- // bot related action keyword +- const noActionContext = assistantResponse.split(`[${CONST.NO_ACTION}] `)?.[1]?.replace('"', ''); +- console.log('issue_comment.created - [NO_ACTION] w/ context: ', noActionContext); +- return; +- } +- // replace {user} from response template with @username +- assistantResponse = assistantResponse.replace('{user}', `@${payload.comment?.user.login as string}`); +- // replace {proposalLink} from response template with the link to the comment +- assistantResponse = assistantResponse.replace('{proposalLink}', payload.comment?.html_url as string); +- +- // remove any double quotes from the final comment because sometimes the assistant's +- // response contains double quotes / sometimes it doesn't +- assistantResponse = assistantResponse.replace('"', '').replace(/^"|"$/g, ''); +- // create a comment with the assistant's response +- console.log('issue_comment.created - proposal-police posts comment'); +- octokit.issues.createComment({ +- ...context.repo, +- /* eslint-disable @typescript-eslint/naming-convention */ +- issue_number: payload.issue?.number ?? -1, +- body: assistantResponse, +- }); +- +- // resolve the Promise with the response +- resolve({response: assistantResponse}); +- // stop polling +- clearInterval(intervalID); +- }); +- }) +- .catch((error) => { +- console.error('threads.messages.list - error', error); +- reject(error); +- clearInterval(intervalID); +- }); +- +- // stop polling +- clearInterval(intervalID); +- }) +- .catch((error) => { +- console.error('threads.runs.retrieve - error', error); +- reject(error); +- clearInterval(intervalID); +- }); +- +- // increment count for every threads.runs.retrieve call +- count++; +- console.log('threads.runs.retrieve - called:', count); +- }, CONST.OPENAI_POLL_RATE); +- }); +-} +- +-async function promptEdit({createAndRunResponse, payload, octokit}: OpenAIUtilsPrompt) { +- return new Promise((resolve, reject) => { +- // count calls for debug purposes ++ let response = ''; + let count = 0; +- +- // poll for run completion +- const intervalID = setInterval(() => { +- OpenAI.beta.threads.runs +- .retrieve(createAndRunResponse.thread_id, createAndRunResponse.id) +- .then((threadRun) => { +- // return if run is not completed yet +- if (threadRun.status !== 'completed') { +- console.log('issue_comment.edited - run pending completion'); +- return; +- } +- +- // get assistant response +- OpenAI.beta.threads.messages +- .list(createAndRunResponse.thread_id) +- .then((threadMessages) => { +- // list thread messages content +- threadMessages.data.forEach((message, index) => { +- // @ts-expect-error - we do have `text` in content[0] but typescript doesn't know that this is a 'openai' package type issue +- const assistantResponse = message.content?.[index]?.text?.value as string; +- console.log('issue_comment.edited - assistantResponse', assistantResponse); +- +- if (!assistantResponse) { +- return console.log('issue_comment.edited - assistantResponse is empty'); +- } +- +- // check if assistant response is either NO_ACTION or "NO_ACTION" strings +- // as sometimes the assistant response varies +- const isNoAction = assistantResponse.replaceAll('"', '').toUpperCase() === CONST.NO_ACTION; +- // If assistant response is NO_ACTION, do nothing +- if (isNoAction) { +- console.log('Detected NO_ACTION for comment, returning early'); +- return; +- } +- // If thread message role is 'user', do nothing +- if (threadMessages.data?.[index]?.role === 'user') { +- console.log('Detected message role "user", returning early...'); +- return; +- } +- +- // edit comment if assistant detected substantial changes and if the comment was not edited already by the bot +- if (assistantResponse.includes('[EDIT_COMMENT]') && !payload.comment?.body.includes('Edited by **proposal-police**')) { +- // extract the text after [EDIT_COMMENT] from assistantResponse since this is a +- // bot related action keyword +- let extractedNotice = assistantResponse.split('[EDIT_COMMENT] ')?.[1]?.replace('"', ''); +- // format the github's updated_at like: 2024-01-24 13:15:24 UTC not 2024-01-28 18:18:28.000 UTC +- const date = new Date((payload.comment?.updated_at as string) ?? ''); +- const formattedDate = `${date.toISOString()?.split('.')?.[0]?.replace('T', ' ')} UTC`; +- extractedNotice = extractedNotice.replace('{updated_timestamp}', formattedDate); +- +- console.log(`issue_comment.edited - proposal-police edits comment: ${payload.comment?.id}`); +- octokit.issues.updateComment({ +- ...context.repo, +- /* eslint-disable @typescript-eslint/naming-convention */ +- comment_id: payload.comment?.id ?? -1, +- body: `${extractedNotice}\n\n${payload.comment?.body}`, +- }); +- } +- +- // resolve the Promise with the response +- resolve({response: assistantResponse}); +- clearInterval(intervalID); +- }); +- }) +- .catch((error) => { +- console.error('threads.messages.list - error', error); +- reject(error); +- clearInterval(intervalID); +- }); +- +- clearInterval(intervalID); +- }) +- .catch((error) => { +- console.error('threads.runs.retrieve - error', error); +- reject(error); +- clearInterval(intervalID); ++ while (!response && count < MAX_POLL_COUNT) { ++ // await thread run completion ++ threadRun = await this.openAI.beta.threads.runs.retrieve(threadRun.thread_id, threadRun.id); ++ if (threadRun.status !== 'completed') { ++ count++; ++ await new Promise((resolve) => { ++ setTimeout(resolve, CONST.OPENAI_POLL_RATE); + }); +- +- // increment count for every threads.runs.retrieve call +- count++; +- console.log('threads.runs.retrieve - called:', count); +- }, CONST.OPENAI_POLL_RATE); +- }); ++ continue; ++ } ++ ++ for await (const message of this.openAI.beta.threads.messages.list(threadRun.thread_id)) { ++ if (message.role !== 'assistant') { ++ continue; ++ } ++ response += message.content ++ .map((contentBlock) => this.isTextContentBlock(contentBlock)) ++ .join('\n') ++ .trim(); ++ console.log('Parsed assistant response:', response); ++ } ++ ++ if (!response) { ++ throw new Error('Assistant response is empty or had no text content. This is unexpected'); ++ } ++ } ++ return response; ++ } ++ ++ static isTextContentBlock(contentBlock: MessageContent): contentBlock is TextContentBlock { ++ return contentBlock?.type === 'text'; ++ } + } + +-export {prompt, promptEdit}; ++export default OpenAIUtils; +diff --git a/.github/workflows/proposalPolice.yml b/.github/workflows/proposalPolice.yml +index 37d40db372..d381a438f9 100644 +--- a/.github/workflows/proposalPolice.yml ++++ b/.github/workflows/proposalPolice.yml +@@ -6,22 +6,16 @@ on: + jobs: + proposal-police-workflow: + runs-on: ubuntu-latest ++ if: !contains(fromJSON('["OSBotify", "imgbot[bot]", "melvin-bot[bot]"]'), github.actor) + steps: + - uses: actions/checkout@v4 + +- - name: Setup node version +- uses: actions/setup-node@v4 +- with: +- node-version: "20" +- + # Checks if the comment is created and follows the template OR + # if the comment is edited and if proposal template is followed. + # Action type logic can be found in the script files. + - name: Run ProposalPolice™ Comment Check Script +- env: ++ uses: ./.github/actions/javascript/proposalPoliceComment ++ with: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }} + OPENAI_ASSISTANT_ID: ${{ secrets.OPENAI_ASSISTANT_ID }} +- ISSUE: ${{ toJson(github.event.issue) }} +- COMMENT: ${{ toJson(github.event.comment) }} +- run: node .github/actions/javascript/proposalPoliceComment/index.js +diff --git a/package-lock.json b/package-lock.json +index 1b2f992189..59e5d2a843 100644 +--- a/package-lock.json ++++ b/package-lock.json +@@ -160,6 +160,7 @@ + "@octokit/core": "4.0.4", + "@octokit/plugin-paginate-rest": "3.1.0", + "@octokit/plugin-throttling": "4.1.0", ++ "@octokit/webhooks-types": "^7.5.1", + "@react-native-community/eslint-config": "3.2.0", + "@react-native/babel-preset": "^0.73.21", + "@react-native/metro-config": "^0.73.5", +@@ -226,6 +227,7 @@ + "jest-transformer-svg": "^2.0.1", + "memfs": "^4.6.0", + "onchange": "^7.1.0", ++ "openai": "^4.47.2", + "patch-package": "^8.0.0", + "portfinder": "^1.0.28", + "prettier": "^2.8.8", +@@ -258,8 +260,9 @@ + }, + "node_modules/@actions/core": { + "version": "1.10.0", ++ "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.10.0.tgz", ++ "integrity": "sha512-2aZDDa3zrrZbP5ZYg159sNoLRb61nQ7awl5pSvIq5Qpj81vwDzdMRKzkWJGJuwVvWpvZKx7vspJALyvaaIQyug==", + "dev": true, +- "license": "MIT", + "dependencies": { + "@actions/http-client": "^2.0.1", + "uuid": "^8.3.2" +@@ -267,8 +270,9 @@ + }, + "node_modules/@actions/github": { + "version": "5.1.1", ++ "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.1.1.tgz", ++ "integrity": "sha512-Nk59rMDoJaV+mHCOJPXuvB1zIbomlKS0dmSIqPGxd0enAXBnOfn4VWF+CGtRCwXZG9Epa54tZA7VIRlJDS8A6g==", + "dev": true, +- "license": "MIT", + "dependencies": { + "@actions/http-client": "^2.0.1", + "@octokit/core": "^3.6.0", +@@ -278,16 +282,18 @@ + }, + "node_modules/@actions/github/node_modules/@octokit/auth-token": { + "version": "2.5.0", ++ "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz", ++ "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==", + "dev": true, +- "license": "MIT", + "dependencies": { + "@octokit/types": "^6.0.3" + } + }, + "node_modules/@actions/github/node_modules/@octokit/core": { + "version": "3.6.0", ++ "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.6.0.tgz", ++ "integrity": "sha512-7RKRKuA4xTjMhY+eG3jthb3hlZCsOwg3rztWh75Xc+ShDWOfDDATWbeZpAHBNRpm4Tv9WgBMOy1zEJYXG6NJ7Q==", + "dev": true, +- "license": "MIT", + "dependencies": { + "@octokit/auth-token": "^2.4.4", + "@octokit/graphql": "^4.5.8", +@@ -300,8 +306,9 @@ + }, + "node_modules/@actions/github/node_modules/@octokit/endpoint": { + "version": "6.0.12", ++ "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz", ++ "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==", + "dev": true, +- "license": "MIT", + "dependencies": { + "@octokit/types": "^6.0.3", + "is-plain-object": "^5.0.0", +@@ -310,8 +317,9 @@ + }, + "node_modules/@actions/github/node_modules/@octokit/graphql": { + "version": "4.8.0", ++ "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz", ++ "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==", + "dev": true, +- "license": "MIT", + "dependencies": { + "@octokit/request": "^5.6.0", + "@octokit/types": "^6.0.3", +@@ -320,8 +328,9 @@ + }, + "node_modules/@actions/github/node_modules/@octokit/plugin-paginate-rest": { + "version": "2.21.3", ++ "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.21.3.tgz", ++ "integrity": "sha512-aCZTEf0y2h3OLbrgKkrfFdjRL6eSOo8komneVQJnYecAxIej7Bafor2xhuDJOIFau4pk0i/P28/XgtbyPF0ZHw==", + "dev": true, +- "license": "MIT", + "dependencies": { + "@octokit/types": "^6.40.0" + }, +@@ -331,8 +340,9 @@ + }, + "node_modules/@actions/github/node_modules/@octokit/request": { + "version": "5.6.3", ++ "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.3.tgz", ++ "integrity": "sha512-bFJl0I1KVc9jYTe9tdGGpAMPy32dLBXXo1dS/YwSCTL/2nd9XeHsY616RE3HPXDVk+a+dBuzyz5YdlXwcDTr2A==", + "dev": true, +- "license": "MIT", + "dependencies": { + "@octokit/endpoint": "^6.0.1", + "@octokit/request-error": "^2.1.0", +@@ -344,8 +354,9 @@ + }, + "node_modules/@actions/github/node_modules/@octokit/request-error": { + "version": "2.1.0", ++ "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz", ++ "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==", + "dev": true, +- "license": "MIT", + "dependencies": { + "@octokit/types": "^6.0.3", + "deprecation": "^2.0.0", +@@ -353,11 +364,13 @@ + } + }, + "node_modules/@actions/http-client": { +- "version": "2.0.1", ++ "version": "2.2.1", ++ "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-2.2.1.tgz", ++ "integrity": "sha512-KhC/cZsq7f8I4LfZSJKgCvEwfkE8o1538VoBeoGzokVLLnbFDEAdFD3UhoMklxo2un9NJVBdANOresx7vTHlHw==", + "dev": true, +- "license": "MIT", + "dependencies": { +- "tunnel": "^0.0.6" ++ "tunnel": "^0.0.6", ++ "undici": "^5.25.4" + } + }, + "node_modules/@ampproject/remapping": { +@@ -5518,6 +5531,15 @@ + "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", + "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==" + }, ++ "node_modules/@fastify/busboy": { ++ "version": "2.1.1", ++ "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", ++ "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", ++ "dev": true, ++ "engines": { ++ "node": ">=14" ++ } ++ }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "1.15.0", + "license": "MIT", +@@ -7566,8 +7588,9 @@ + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "5.16.2", ++ "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.16.2.tgz", ++ "integrity": "sha512-8QFz29Fg5jDuTPXVtey05BLm7OB+M8fnvE64RNegzX7U+5NUXcOcnpTIK0YfSHBg8gYd0oxIq3IZTe9SfPZiRw==", + "dev": true, +- "license": "MIT", + "dependencies": { + "@octokit/types": "^6.39.0", + "deprecation": "^2.3.1" +@@ -7654,6 +7677,12 @@ + "@octokit/openapi-types": "^12.11.0" + } + }, ++ "node_modules/@octokit/webhooks-types": { ++ "version": "7.5.1", ++ "resolved": "https://registry.npmjs.org/@octokit/webhooks-types/-/webhooks-types-7.5.1.tgz", ++ "integrity": "sha512-1dozxWEP8lKGbtEu7HkRbK1F/nIPuJXNfT0gd96y6d3LcHZTtRtlf8xz3nicSJfesADxJyDh+mWBOsdLkqgzYw==", ++ "dev": true ++ }, + "node_modules/@onfido/react-native-sdk": { + "version": "10.6.0", + "license": "MIT", +@@ -12656,6 +12685,30 @@ + "undici-types": "~5.26.4" + } + }, ++ "node_modules/@types/node-fetch": { ++ "version": "2.6.11", ++ "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz", ++ "integrity": "sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g==", ++ "dev": true, ++ "dependencies": { ++ "@types/node": "*", ++ "form-data": "^4.0.0" ++ } ++ }, ++ "node_modules/@types/node-fetch/node_modules/form-data": { ++ "version": "4.0.0", ++ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", ++ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", ++ "dev": true, ++ "dependencies": { ++ "asynckit": "^0.4.0", ++ "combined-stream": "^1.0.8", ++ "mime-types": "^2.1.12" ++ }, ++ "engines": { ++ "node": ">= 6" ++ } ++ }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz", +@@ -13762,6 +13815,18 @@ + "node": ">= 6.0.0" + } + }, ++ "node_modules/agentkeepalive": { ++ "version": "4.5.0", ++ "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", ++ "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", ++ "dev": true, ++ "dependencies": { ++ "humanize-ms": "^1.2.1" ++ }, ++ "engines": { ++ "node": ">= 8.0.0" ++ } ++ }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "license": "MIT", +@@ -21596,6 +21661,34 @@ + "node": ">= 6" + } + }, ++ "node_modules/form-data-encoder": { ++ "version": "1.7.2", ++ "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz", ++ "integrity": "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==", ++ "dev": true ++ }, ++ "node_modules/formdata-node": { ++ "version": "4.4.1", ++ "resolved": "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz", ++ "integrity": "sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==", ++ "dev": true, ++ "dependencies": { ++ "node-domexception": "1.0.0", ++ "web-streams-polyfill": "4.0.0-beta.3" ++ }, ++ "engines": { ++ "node": ">= 12.20" ++ } ++ }, ++ "node_modules/formdata-node/node_modules/web-streams-polyfill": { ++ "version": "4.0.0-beta.3", ++ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz", ++ "integrity": "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==", ++ "dev": true, ++ "engines": { ++ "node": ">= 14" ++ } ++ }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", +@@ -22674,6 +22767,15 @@ + "node": ">=10.17.0" + } + }, ++ "node_modules/humanize-ms": { ++ "version": "1.2.1", ++ "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", ++ "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", ++ "dev": true, ++ "dependencies": { ++ "ms": "^2.0.0" ++ } ++ }, + "node_modules/husky": { + "version": "1.3.1", + "dev": true, +@@ -28897,6 +28999,25 @@ + "node": ">= 0.10.5" + } + }, ++ "node_modules/node-domexception": { ++ "version": "1.0.0", ++ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", ++ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", ++ "dev": true, ++ "funding": [ ++ { ++ "type": "github", ++ "url": "https://github.com/sponsors/jimmywarting" ++ }, ++ { ++ "type": "github", ++ "url": "https://paypal.me/jimmywarting" ++ } ++ ], ++ "engines": { ++ "node": ">=10.5.0" ++ } ++ }, + "node_modules/node-fetch": { + "version": "2.6.7", + "license": "MIT", +@@ -29590,6 +29711,34 @@ + "url": "https://github.com/sponsors/sindresorhus" + } + }, ++ "node_modules/openai": { ++ "version": "4.52.0", ++ "resolved": "https://registry.npmjs.org/openai/-/openai-4.52.0.tgz", ++ "integrity": "sha512-xmiNcdA9QJ5wffHpZDpIsge6AsPTETJ6h5iqDNuFQ7qGSNtonHn8Qe0VHy4UwLE8rBWiSqh4j+iSvuYZSeKkPg==", ++ "dev": true, ++ "dependencies": { ++ "@types/node": "^18.11.18", ++ "@types/node-fetch": "^2.6.4", ++ "abort-controller": "^3.0.0", ++ "agentkeepalive": "^4.2.1", ++ "form-data-encoder": "1.7.2", ++ "formdata-node": "^4.3.2", ++ "node-fetch": "^2.6.7", ++ "web-streams-polyfill": "^3.2.1" ++ }, ++ "bin": { ++ "openai": "bin/cli" ++ } ++ }, ++ "node_modules/openai/node_modules/@types/node": { ++ "version": "18.19.38", ++ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.38.tgz", ++ "integrity": "sha512-SApYXUF7si4JJ+lO2o6X60OPOnA6wPpbiB09GMCkQ+JAwpa9hxUVG8p7GzA08TKQn5OhzK57rj1wFj+185YsGg==", ++ "dev": true, ++ "dependencies": { ++ "undici-types": "~5.26.4" ++ } ++ }, + "node_modules/opencollective-postinstall": { + "version": "2.0.3", + "license": "MIT", +@@ -36241,6 +36390,18 @@ + "version": "1.13.6", + "license": "MIT" + }, ++ "node_modules/undici": { ++ "version": "5.28.4", ++ "resolved": "https://registry.npmjs.org/undici/-/undici-5.28.4.tgz", ++ "integrity": "sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==", ++ "dev": true, ++ "dependencies": { ++ "@fastify/busboy": "^2.0.0" ++ }, ++ "engines": { ++ "node": ">=14.0" ++ } ++ }, + "node_modules/undici-types": { + "version": "5.26.5", + "license": "MIT" +@@ -37005,6 +37166,15 @@ + "defaults": "^1.0.3" + } + }, ++ "node_modules/web-streams-polyfill": { ++ "version": "3.3.3", ++ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", ++ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", ++ "dev": true, ++ "engines": { ++ "node": ">= 8" ++ } ++ }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "license": "BSD-2-Clause", +diff --git a/package.json b/package.json +index 54e331f078..cecd689867 100644 +--- a/package.json ++++ b/package.json +@@ -213,6 +213,7 @@ + "@octokit/core": "4.0.4", + "@octokit/plugin-paginate-rest": "3.1.0", + "@octokit/plugin-throttling": "4.1.0", ++ "@octokit/webhooks-types": "^7.5.1", + "@react-native-community/eslint-config": "3.2.0", + "@react-native/babel-preset": "^0.73.21", + "@react-native/metro-config": "^0.73.5", diff --git a/scripts/.eslintrc.js b/scripts/.eslintrc.js new file mode 100644 index 000000000000..d6d39822b737 --- /dev/null +++ b/scripts/.eslintrc.js @@ -0,0 +1,10 @@ +module.exports = { + rules: { + // For all these Node.js scripts, we do not want to disable `console` statements + 'no-console': 'off', + + '@lwc/lwc/no-async-await': 'off', + 'no-await-in-loop': 'off', + 'no-restricted-syntax': ['error', 'ForInStatement', 'LabeledStatement', 'WithStatement'], + }, +}; diff --git a/scripts/release-profile.ts b/scripts/release-profile.ts index 8ec0979f9f9e..cfc7e2cb8838 100755 --- a/scripts/release-profile.ts +++ b/scripts/release-profile.ts @@ -3,21 +3,7 @@ /* eslint-disable no-console */ import {execSync} from 'child_process'; import fs from 'fs'; - -type ArgsMap = Record; - -// Function to parse command-line arguments into a key-value object -function parseCommandLineArguments(): ArgsMap { - const args = process.argv.slice(2); // Skip node and script paths - const argsMap: ArgsMap = {}; - args.forEach((arg) => { - const [key, value] = arg.split('='); - if (key.startsWith('--')) { - argsMap[key.substring(2)] = value; - } - }); - return argsMap; -} +import parseCommandLineArguments from './utils/parseCommandLineArguments'; // Function to find .cpuprofile files in the current directory function findCpuProfileFiles() { diff --git a/scripts/shellUtils.sh b/scripts/shellUtils.sh index 848e6d238254..fa44f2ee7d3a 100644 --- a/scripts/shellUtils.sh +++ b/scripts/shellUtils.sh @@ -102,4 +102,18 @@ get_abs_path() { abs_path=${abs_path/#\/\//\/} echo "$abs_path" -} \ No newline at end of file +} + +# Function to read lines from standard input into an array using a temporary file. +# This is a bash 3 polyfill for readarray. +# Arguments: +# $1: Name of the array variable to store the lines +# Usage: +# read_lines_into_array array_name +read_lines_into_array() { + local array_name="$1" + local line + while IFS= read -r line || [ -n "$line" ]; do + eval "$array_name+=(\"$line\")" + done +} diff --git a/scripts/symbolicate-profile.ts b/scripts/symbolicate-profile.ts new file mode 100755 index 000000000000..a100c05029dd --- /dev/null +++ b/scripts/symbolicate-profile.ts @@ -0,0 +1,174 @@ +#!/usr/bin/env ts-node + +/* eslint-disable @typescript-eslint/naming-convention */ + +/** + * This script helps to symbolicate a .cpuprofile file that was obtained from a specific (staging) app version (usually provided by a user using the app). + * + * @abstract + * + * 1. When creating a new deployment in our github actions, we upload the source map for android and iOS as artifacts. + * 2. The profiles created by the app on the user's device have the app version encoded in the filename. + * 3. This script takes in a .cpuprofile file, reads the app version from the filename, and downloads the corresponding source map from the artifacts using github's API. + * 4. It then uses the source map to symbolicate the .cpuprofile file using the `react-native-release-profiler` cli. + * + * @note For downloading an artifact a github token is required. + */ +import {execSync} from 'child_process'; +import fs from 'fs'; +import https from 'https'; +import path from 'path'; +import GithubUtils from '@github/libs/GithubUtils'; +import * as Logger from './utils/Logger'; +import parseCommandLineArguments from './utils/parseCommandLineArguments'; + +const argsMap = parseCommandLineArguments(); + +/* ============== INPUT VALIDATION ============== */ + +if (Object.keys(argsMap).length === 0 || argsMap.help !== undefined) { + Logger.log('Symbolicates a .cpuprofile file obtained from a specific app version by downloading the source map from the github action runs.'); + Logger.log('Usage: npm run symbolicate-profile -- --profile= --platform='); + Logger.log('Options:'); + Logger.log(' --profile= The .cpuprofile file to symbolicate'); + Logger.log(' --platform= The platform for which the source map was uploaded'); + Logger.log(' --gh-token Token to use for requests send to the GitHub API. By default tries to pick up from the environment variable GITHUB_TOKEN'); + Logger.log(' --help Display this help message'); + process.exit(0); +} + +if (argsMap.profile === undefined) { + Logger.error('Please specify the .cpuprofile file to symbolicate using --profile='); + process.exit(1); +} +if (!fs.existsSync(argsMap.profile)) { + Logger.error(`File ${argsMap.profile} does not exist.`); + process.exit(1); +} + +if (argsMap.platform === undefined) { + Logger.error('Please specify the platform using --platform=ios or --platform=android'); + process.exit(1); +} + +const githubToken = argsMap.ghToken ?? process.env.GITHUB_TOKEN; +if (githubToken === undefined) { + Logger.error('No GitHub token provided. Either set a GITHUB_TOKEN environment variable or pass it using --gh-token'); + process.exit(1); +} + +GithubUtils.initOctokitWithToken(githubToken); + +/* ============= EXTRACT APP VERSION ============= */ + +// Formatted as "Profile_trace_for_1.4.81-9.cpuprofile" +const appVersionRegex = /\d+\.\d+\.\d+(-\d+)?/; +const appVersion = argsMap.profile.match(appVersionRegex)?.[0]; +if (appVersion === undefined) { + Logger.error('Could not extract the app version from the profile filename.'); + process.exit(1); +} +Logger.info(`Found app version ${appVersion} in the profile filename`); + +/* ============== UTILITY FUNCTIONS ============== */ + +async function getWorkflowRunArtifact() { + const artifactName = `${argsMap.platform}-sourcemap-${appVersion}`; + Logger.info(`Fetching sourcemap artifact with name "${artifactName}"`); + const artifact = await GithubUtils.getArtifactByName(artifactName); + if (artifact === undefined) { + throw new Error(`Could not find the artifact ${artifactName}! Are you sure the deploy step succeeded?`); + } + return artifact.id; +} + +const sourcemapDir = path.resolve(__dirname, '../.sourcemaps'); + +function downloadFile(url: string) { + Logger.log(`Downloading file from URL: ${url}`); + if (!fs.existsSync(sourcemapDir)) { + Logger.info(`Creating download directory ${sourcemapDir}`); + fs.mkdirSync(sourcemapDir); + } + + const destination = path.join(sourcemapDir, `${argsMap.platform}-sourcemap-${appVersion}.zip`); + const file = fs.createWriteStream(destination); + return new Promise((resolve, reject) => { + https + .get(url, (response) => { + response.pipe(file); + file.on('finish', () => { + file.close(); + Logger.success(`Downloaded file to ${destination}`); + resolve(destination); + }); + }) + .on('error', (error) => { + fs.unlink(destination, () => { + reject(error); + }); + }); + }); +} + +function unpackZipFile(zipPath: string) { + Logger.info(`Unpacking file ${zipPath}`); + const command = `unzip -o ${zipPath} -d ${sourcemapDir}`; + execSync(command, {stdio: 'inherit'}); + Logger.info(`Deleting zip file ${zipPath}`); + return new Promise((resolve, reject) => { + fs.unlink(zipPath, (error) => (error ? reject(error) : resolve())); + }); +} + +const localSourceMapPath = path.join(sourcemapDir, `${appVersion}-${argsMap.platform}.map`); +function renameDownloadedSourcemapFile() { + const androidName = 'index.android.bundle.map'; + const iosName = 'main.jsbundle.map'; + const downloadSourcemapPath = path.join(sourcemapDir, argsMap.platform === 'ios' ? iosName : androidName); + + if (!fs.existsSync(downloadSourcemapPath)) { + Logger.error(`Could not find the sourcemap file ${downloadSourcemapPath}`); + process.exit(1); + } + + Logger.info(`Renaming sourcemap file to ${localSourceMapPath}`); + fs.renameSync(downloadSourcemapPath, localSourceMapPath); +} + +// Symbolicate using the downloaded source map +function symbolicateProfile() { + const command = `npx react-native-release-profiler --local ${argsMap.profile} --sourcemap-path ${localSourceMapPath}`; + execSync(command, {stdio: 'inherit'}); +} + +async function fetchAndProcessArtifact() { + const artifactId = await getWorkflowRunArtifact(); + const downloadUrl = await GithubUtils.getArtifactDownloadURL(artifactId); + const zipPath = await downloadFile(downloadUrl); + await unpackZipFile(zipPath); + renameDownloadedSourcemapFile(); +} + +/* ============== MAIN SCRIPT ============== */ + +async function runAsyncScript() { + // Step: check if source map locally already exists (if so we can skip the download) + if (fs.existsSync(localSourceMapPath)) { + Logger.success(`Found local source map at ${localSourceMapPath}`); + Logger.info('Skipping download step'); + } else { + // Step: Download the source map for the app version and then symbolicate the profile: + try { + await fetchAndProcessArtifact(); + } catch (error) { + Logger.error(error); + process.exit(1); + } + } + + // Finally, symbolicate the profile + symbolicateProfile(); +} + +runAsyncScript(); diff --git a/scripts/tsconfig.json b/scripts/tsconfig.json new file mode 100644 index 000000000000..2d548a3aa2ce --- /dev/null +++ b/scripts/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../tsconfig.json", + "ts-node": { + "require": ["tsconfig-paths/register"] + } +} diff --git a/scripts/utils/Logger.ts b/scripts/utils/Logger.ts new file mode 100644 index 000000000000..a851f11ff74f --- /dev/null +++ b/scripts/utils/Logger.ts @@ -0,0 +1,37 @@ +const COLOR_DIM = '\x1b[2m'; +const COLOR_RESET = '\x1b[0m'; +const COLOR_YELLOW = '\x1b[33m'; +const COLOR_RED = '\x1b[31m'; +const COLOR_GREEN = '\x1b[32m'; + +const log = (...args: unknown[]) => { + console.debug(...args); +}; + +const info = (...args: unknown[]) => { + log('▶️', ...args); +}; + +const success = (...args: unknown[]) => { + const lines = ['✅', COLOR_GREEN, ...args, COLOR_RESET]; + log(...lines); +}; + +const warn = (...args: unknown[]) => { + const lines = ['⚠️', COLOR_YELLOW, ...args, COLOR_RESET]; + log(...lines); +}; + +const note = (...args: unknown[]) => { + const lines = [COLOR_DIM, ...args, COLOR_RESET]; + log(...lines); +}; + +const error = (...args: unknown[]) => { + const lines = ['🔴', COLOR_RED, ...args, COLOR_RESET]; + log(...lines); +}; + +const formatLink = (name: string | number, url: string) => `\x1b]8;;${url}\x1b\\${name}\x1b]8;;\x1b\\`; + +export {log, info, warn, note, error, success, formatLink}; diff --git a/scripts/utils/parseCommandLineArguments.ts b/scripts/utils/parseCommandLineArguments.ts new file mode 100644 index 000000000000..9bb1d340335e --- /dev/null +++ b/scripts/utils/parseCommandLineArguments.ts @@ -0,0 +1,19 @@ +type ArgsMap = Record; + +// Function to parse command-line arguments into a key-value object +export default function parseCommandLineArguments(): ArgsMap { + const args = process.argv.slice(2); // Skip node and script paths + const argsMap: ArgsMap = {}; + args.forEach((arg) => { + const [key, value] = arg.split('='); + if (key.startsWith('--')) { + const name = key.substring(2); + argsMap[name] = value; + // User may provide a help arg without any value + if (name.toLowerCase() === 'help' && !value) { + argsMap[name] = 'true'; + } + } + }); + return argsMap; +} diff --git a/src/App.tsx b/src/App.tsx index 6316fa80fba1..1ce17ea095bd 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,11 +2,12 @@ import {PortalProvider} from '@gorhom/portal'; import React from 'react'; import {LogBox} from 'react-native'; import {GestureHandlerRootView} from 'react-native-gesture-handler'; +import {KeyboardProvider} from 'react-native-keyboard-controller'; import {PickerStateProvider} from 'react-native-picker-select'; import {SafeAreaProvider} from 'react-native-safe-area-context'; import '../wdyr'; import ActiveElementRoleProvider from './components/ActiveElementRoleProvider'; -import ActiveWorkspaceContextProvider from './components/ActiveWorkspace/ActiveWorkspaceProvider'; +import ActiveWorkspaceContextProvider from './components/ActiveWorkspaceProvider'; import ColorSchemeWrapper from './components/ColorSchemeWrapper'; import ComposeProviders from './components/ComposeProviders'; import CustomStatusBarAndBackground from './components/CustomStatusBarAndBackground'; @@ -84,6 +85,7 @@ function App({url}: AppProps) { FullScreenContextProvider, VolumeContextProvider, VideoPopoverMenuContextProvider, + KeyboardProvider, ]} > diff --git a/src/CONST.ts b/src/CONST.ts index b06e6e5b761e..c485268b55e2 100755 --- a/src/CONST.ts +++ b/src/CONST.ts @@ -50,6 +50,7 @@ const KEYBOARD_SHORTCUT_NAVIGATION_TYPE = 'NAVIGATION_SHORTCUT'; const chatTypes = { POLICY_ANNOUNCE: 'policyAnnounce', POLICY_ADMINS: 'policyAdmins', + TRIP_ROOM: 'tripRoom', GROUP: 'group', DOMAIN_ALL: 'domainAll', POLICY_ROOM: 'policyRoom', @@ -151,6 +152,7 @@ const CONST = { DISPLAY_NAME: { MAX_LENGTH: 50, RESERVED_NAMES: ['Expensify', 'Concierge'], + EXPENSIFY_CONCIERGE: 'Expensify Concierge', }, GPS: { @@ -354,12 +356,15 @@ const CONST = { CHRONOS_IN_CASH: 'chronosInCash', DEFAULT_ROOMS: 'defaultRooms', VIOLATIONS: 'violations', + DUPE_DETECTION: 'dupeDetection', REPORT_FIELDS: 'reportFields', P2P_DISTANCE_REQUESTS: 'p2pDistanceRequests', WORKFLOWS_DELAYED_SUBMISSION: 'workflowsDelayedSubmission', SPOTNANA_TRAVEL: 'spotnanaTravel', ACCOUNTING_ON_NEW_EXPENSIFY: 'accountingOnNewExpensify', XERO_ON_NEW_EXPENSIFY: 'xeroOnNewExpensify', + NETSUITE_ON_NEW_EXPENSIFY: 'netsuiteOnNewExpensify', + REPORT_FIELDS_FEATURE: 'reportFieldsFeature', }, BUTTON_STATES: { DEFAULT: 'default', @@ -521,6 +526,16 @@ const CONST = { shortcutKey: 'Tab', modifiers: [], }, + DEBUG: { + descriptionKey: 'openDebug', + shortcutKey: 'D', + modifiers: ['CTRL'], + trigger: { + DEFAULT: {input: 'd', modifierFlags: keyModifierControl}, + [PLATFORM_OS_MACOS]: {input: 'd', modifierFlags: keyModifierCommand}, + [PLATFORM_IOS]: {input: 'd', modifierFlags: keyModifierCommand}, + }, + }, }, KEYBOARD_SHORTCUTS_TYPES: { NAVIGATION_SHORTCUT: KEYBOARD_SHORTCUT_NAVIGATION_TYPE, @@ -548,10 +563,8 @@ const CONST = { EMPTY_ARRAY, EMPTY_OBJECT, USE_EXPENSIFY_URL, - STATUS_EXPENSIFY_URL: 'https://status.expensify.com', GOOGLE_MEET_URL_ANDROID: 'https://meet.google.com', GOOGLE_DOC_IMAGE_LINK_MATCH: 'googleusercontent.com', - GOOGLE_CLOUD_URL: 'https://clients3.google.com/generate_204', IMAGE_BASE64_MATCH: 'base64', DEEPLINK_BASE_URL: 'new-expensify://', PDF_VIEWER_URL: '/pdf/web/viewer.html', @@ -567,12 +580,14 @@ const CONST = { LICENSES_URL: `${USE_EXPENSIFY_URL}/licenses`, ACH_TERMS_URL: `${USE_EXPENSIFY_URL}/achterms`, WALLET_AGREEMENT_URL: `${USE_EXPENSIFY_URL}/walletagreement`, + BANCORP_WALLET_AGREEMENT_URL: `${USE_EXPENSIFY_URL}/bancorp-bank-wallet-terms-of-service`, HELP_LINK_URL: `${USE_EXPENSIFY_URL}/usa-patriot-act`, ELECTRONIC_DISCLOSURES_URL: `${USE_EXPENSIFY_URL}/esignagreement`, GITHUB_RELEASE_URL: 'https://api.github.com/repos/expensify/app/releases/latest', ADD_SECONDARY_LOGIN_URL: encodeURI('settings?param={"section":"account","openModal":"secondaryLogin"}'), MANAGE_CARDS_URL: 'domain_companycards', FEES_URL: `${USE_EXPENSIFY_URL}/fees`, + SAVE_WITH_EXPENSIFY_URL: `${USE_EXPENSIFY_URL}/savings-calculator`, CFPB_PREPAID_URL: 'https://cfpb.gov/prepaid', STAGING_NEW_EXPENSIFY_URL: 'https://staging.new.expensify.com', NEWHELP_URL: 'https://help.expensify.com', @@ -594,7 +609,6 @@ const CONST = { ADMIN_POLICIES_URL: 'admin_policies', ADMIN_DOMAINS_URL: 'admin_domains', INBOX: 'inbox', - DISMMISSED_REASON: '?dismissedReason=missingFeatures', }, SIGN_IN_FORM_WIDTH: 300, @@ -660,9 +674,9 @@ const CONST = { DELETED_ACCOUNT: 'DELETEDACCOUNT', // OldDot Action DISMISSED_VIOLATION: 'DISMISSEDVIOLATION', DONATION: 'DONATION', // OldDot Action - EXPORTED_TO_CSV: 'EXPORTEDTOCSV', // OldDot Action - EXPORTED_TO_INTEGRATION: 'EXPORTEDTOINTEGRATION', // OldDot Action - EXPORTED_TO_QUICK_BOOKS: 'EXPORTEDTOQUICKBOOKS', // OldDot Action + EXPORTED_TO_CSV: 'EXPORTCSV', // OldDot Action + EXPORTED_TO_INTEGRATION: 'EXPORTINTEGRATION', // OldDot Action + EXPORTED_TO_QUICK_BOOKS: 'EXPORTED', // OldDot Action FORWARDED: 'FORWARDED', // OldDot Action HOLD: 'HOLD', HOLD_COMMENT: 'HOLDCOMMENT', @@ -684,6 +698,7 @@ const CONST = { REIMBURSEMENT_DEQUEUED: 'REIMBURSEMENTDEQUEUED', REIMBURSEMENT_REQUESTED: 'REIMBURSEMENTREQUESTED', // OldDot Action REIMBURSEMENT_SETUP: 'REIMBURSEMENTSETUP', // OldDot Action + REIMBURSEMENT_SETUP_REQUESTED: 'REIMBURSEMENTSETUPREQUESTED', // OldDot Action RENAMED: 'RENAMED', REPORT_PREVIEW: 'REPORTPREVIEW', SELECTED_FOR_RANDOM_AUDIT: 'SELECTEDFORRANDOMAUDIT', // OldDot Action @@ -695,6 +710,7 @@ const CONST = { TASK_COMPLETED: 'TASKCOMPLETED', TASK_EDITED: 'TASKEDITED', TASK_REOPENED: 'TASKREOPENED', + TRIPPREVIEW: 'TRIPPREVIEW', UNAPPROVED: 'UNAPPROVED', // OldDot Action UNHOLD: 'UNHOLD', UNSHARE: 'UNSHARE', // OldDot Action @@ -925,16 +941,18 @@ const CONST = { COMMENT_LENGTH_DEBOUNCE_TIME: 500, SEARCH_OPTION_LIST_DEBOUNCE_TIME: 300, RESIZE_DEBOUNCE_TIME: 100, + UNREAD_UPDATE_DEBOUNCE_TIME: 300, }, SEARCH_TABLE_COLUMNS: { RECEIPT: 'receipt', DATE: 'date', MERCHANT: 'merchant', + DESCRIPTION: 'description', FROM: 'from', TO: 'to', CATEGORY: 'category', TAG: 'tag', - TOTAL: 'total', + TOTAL_AMOUNT: 'amount', TYPE: 'type', ACTION: 'action', TAX_AMOUNT: 'taxAmount', @@ -1043,7 +1061,7 @@ const CONST = { MAX_RETRY_WAIT_TIME_MS: 10 * 1000, PROCESS_REQUEST_DELAY_MS: 1000, MAX_PENDING_TIME_MS: 10 * 1000, - BACKEND_CHECK_INTERVAL_MS: 60 * 1000, + RECHECK_INTERVAL_MS: 60 * 1000, MAX_REQUEST_RETRIES: 10, NETWORK_STATUS: { ONLINE: 'online', @@ -1055,7 +1073,7 @@ const CONST = { DEFAULT_TIME_ZONE: {automatic: true, selected: 'America/Los_Angeles'}, DEFAULT_ACCOUNT_DATA: {errors: null, success: '', isLoading: false}, DEFAULT_CLOSE_ACCOUNT_DATA: {errors: null, success: '', isLoading: false}, - DEFAULT_NETWORK_DATA: {isOffline: false, isBackendReachable: true}, + DEFAULT_NETWORK_DATA: {isOffline: false}, FORMS: { LOGIN_FORM: 'LoginForm', VALIDATE_CODE_FORM: 'ValidateCodeForm', @@ -1183,6 +1201,10 @@ const CONST = { WEBP: 'image/webp', JPEG: 'image/jpeg', }, + ATTACHMENT_TYPE: { + REPORT: 'r', + NOTE: 'n', + }, IMAGE_OBJECT_POSITION: { TOP: 'top', @@ -1226,6 +1248,8 @@ const CONST = { MAX_AMOUNT_OF_SUGGESTIONS: 20, MAX_AMOUNT_OF_VISIBLE_SUGGESTIONS_IN_CONTAINER: 5, HERE_TEXT: '@here', + SUGGESTION_BOX_MAX_SAFE_DISTANCE: 38, + BIG_SCREEN_SUGGESTION_WIDTH: 300, }, COMPOSER_MAX_HEIGHT: 125, CHAT_FOOTER_SECONDARY_ROW_HEIGHT: 15, @@ -1302,12 +1326,13 @@ const CONST = { SYNC: 'sync', ENABLE_NEW_CATEGORIES: 'enableNewCategories', EXPORT: 'export', + TENANT_ID: 'tenantID', IMPORT_CUSTOMERS: 'importCustomers', IMPORT_TAX_RATES: 'importTaxRates', INVOICE_STATUS: { - AWAITING_PAYMENT: 'AWT_PAYMENT', DRAFT: 'DRAFT', AWAITING_APPROVAL: 'AWT_APPROVAL', + AWAITING_PAYMENT: 'AWT_PAYMENT', }, IMPORT_TRACKING_CATEGORIES: 'importTrackingCategories', MAPPINGS: 'mappings', @@ -1418,6 +1443,7 @@ const CONST = { }, STEP: { // In the order they appear in the Wallet flow + ADD_BANK_ACCOUNT: 'AddBankAccountStep', ADDITIONAL_DETAILS: 'AdditionalDetailsStep', ADDITIONAL_DETAILS_KBA: 'AdditionalDetailsKBAStep', ONFIDO: 'OnfidoStep', @@ -1454,6 +1480,7 @@ const CONST = { CONCIERGE: 'CONCIERGE_NAVIGATE', }, MTL_WALLET_PROGRAM_ID: '760', + BANCORP_WALLET_PROGRAM_ID: '660', PROGRAM_ISSUERS: { EXPENSIFY_PAYMENTS: 'Expensify Payments LLC', BANCORP_BANK: 'The Bancorp Bank', @@ -1528,6 +1555,7 @@ const CONST = { }, IOU: { + MAX_RECENT_REPORTS_TO_SHOW: 5, // This is the transactionID used when going through the create expense flow so that it mimics a real transaction (like the edit flow) OPTIMISTIC_TRANSACTION_ID: '1', // Note: These payment types are used when building IOU reportAction message values in the server and should @@ -1569,7 +1597,7 @@ const CONST = { APPROVE: 'approve', TRACK: 'track', }, - AMOUNT_MAX_LENGTH: 10, + AMOUNT_MAX_LENGTH: 8, RECEIPT_STATE: { SCANREADY: 'SCANREADY', OPEN: 'OPEN', @@ -1592,6 +1620,9 @@ const CONST = { ACCOUNTANT: 'accountant', }, }, + ACCESS_VARIANTS: { + CREATE: 'create', + }, }, GROWL: { @@ -1770,9 +1801,11 @@ const CONST = { // Here we will add other connections names when we add support for them QBO: 'quickbooksOnline', XERO: 'xero', + NETSUITE: 'netsuite', }, SYNC_STAGE_NAME: { - STARTING_IMPORT: 'startingImport', + STARTING_IMPORT_QBO: 'startingImportQBO', + STARTING_IMPORT_XERO: 'startingImportXero', QBO_IMPORT_MAIN: 'quickbooksOnlineImportMain', QBO_IMPORT_CUSTOMERS: 'quickbooksOnlineImportCustomers', QBO_IMPORT_EMPLOYEES: 'quickbooksOnlineImportEmployees', @@ -1801,7 +1834,23 @@ const CONST = { XERO_SYNC_IMPORT_TAX_RATES: 'xeroSyncImportTaxRates', XERO_CHECK_CONNECTION: 'xeroCheckConnection', XERO_SYNC_TITLE: 'xeroSyncTitle', + NETSUITE_SYNC_CONNECTION: 'netSuiteSyncConnection', + NETSUITE_SYNC_CUSTOMERS: 'netSuiteSyncCustomers', + NETSUITE_SYNC_INIT_DATA: 'netSuiteSyncInitData', + NETSUITE_SYNC_IMPORT_TAXES: 'netSuiteSyncImportTaxes', + NETSUITE_SYNC_IMPORT_ITEMS: 'netSuiteSyncImportItems', + NETSUITE_SYNC_DATA: 'netSuiteSyncData', + NETSUITE_SYNC_ACCOUNTS: 'netSuiteSyncAccounts', + NETSUITE_SYNC_CURRENCIES: 'netSuiteSyncCurrencies', + NETSUITE_SYNC_CATEGORIES: 'netSuiteSyncCategories', + NETSUITE_SYNC_IMPORT_EMPLOYEES: 'netSuiteSyncImportEmployees', + NETSUITE_SYNC_REPORT_FIELDS: 'netSuiteSyncReportFields', + NETSUITE_SYNC_TAGS: 'netSuiteSyncTags', + NETSUITE_SYNC_UPDATE_DATA: 'netSuiteSyncUpdateConnectionData', + NETSUITE_SYNC_NETSUITE_REIMBURSED_REPORTS: 'netSuiteSyncNetSuiteReimbursedReports', + NETSUITE_SYNC_EXPENSIFY_REIMBURSED_REPORTS: 'netSuiteSyncExpensifyReimbursedReports', }, + SYNC_STAGE_TIMEOUT_MINUTES: 20, }, ACCESS_VARIANTS: { PAID: 'paid', @@ -1813,7 +1862,7 @@ const CONST = { NAME_DISTANCE: 'Distance', DISTANCE_UNIT_MILES: 'mi', DISTANCE_UNIT_KILOMETERS: 'km', - MILEAGE_IRS_RATE: 0.655, + MILEAGE_IRS_RATE: 0.67, DEFAULT_RATE: 'Default Rate', RATE_DECIMALS: 3, FAKE_P2P_ID: '_FAKE_P2P_ID_', @@ -1885,6 +1934,12 @@ const CONST = { COMPACT: 'compact', DEFAULT: 'default', }, + SUBSCRIPTION: { + TYPE: { + ANNUAL: 'yearly2018', + PAYPERUSE: 'monthly2018', + }, + }, REGEX: { SPECIAL_CHARS_WITHOUT_NEWLINE: /((?!\n)[()-\s\t])/g, DIGITS_AND_PLUS: /^\+?[0-9]*$/, @@ -1918,8 +1973,8 @@ const CONST = { // Extract attachment's source from the data's html string ATTACHMENT_DATA: /(data-expensify-source|data-name)="([^"]+)"/g, - EMOJI_NAME: /:[\w+-]+:/g, - EMOJI_SUGGESTIONS: /:[a-zA-Z0-9_+-]{1,40}$/, + EMOJI_NAME: /:[\p{L}0-9_+-]+:/gu, + EMOJI_SUGGESTIONS: /:[\p{L}0-9_+-]{1,40}$/u, AFTER_FIRST_LINE_BREAK: /\n.*/g, LINE_BREAK: /\r\n|\r|\n/g, CODE_2FA: /^\d{6}$/, @@ -2082,12 +2137,13 @@ const CONST = { INFO: 'info', }, REPORT_DETAILS_MENU_ITEM: { - SHARE_CODE: 'shareCode', MEMBERS: 'member', INVITE: 'invite', SETTINGS: 'settings', LEAVE_ROOM: 'leaveRoom', PRIVATE_NOTES: 'privateNotes', + DELETE: 'delete', + MARK_AS_INCOMPLETE: 'markAsIncomplete', }, EDIT_REQUEST_FIELD: { AMOUNT: 'amount', @@ -3285,6 +3341,12 @@ const CONST = { }, CONCIERGE_TRAVEL_URL: 'https://community.expensify.com/discussion/7066/introducing-concierge-travel', + BOOK_TRAVEL_DEMO_URL: 'https://calendly.com/d/ck2z-xsh-q97/expensify-travel-demo-travel-page', + TRAVEL_DOT_URL: 'https://travel.expensify.com', + STAGING_TRAVEL_DOT_URL: 'https://staging.travel.expensify.com', + TRIP_ID_PATH: (tripID: string) => `trips/${tripID}`, + SPOTNANA_TMC_ID: '8e8e7258-1cf3-48c0-9cd1-fe78a6e31eed', + STAGING_SPOTNANA_TMC_ID: '7a290c6e-5328-4107-aff6-e48765845b81', SCREEN_READER_STATES: { ALL: 'all', ACTIVE: 'active', @@ -3372,6 +3434,11 @@ const CONST = { * @deprecated Please stop using the accessibilityRole prop and use the role prop instead. */ IMAGE: 'image', + + /** + * @deprecated Please stop using the accessibilityRole prop and use the role prop instead. + */ + TEXTBOX: 'textbox', }, /** * Acceptable values for the `role` attribute on react native components. @@ -3434,6 +3501,8 @@ const CONST = { TIMER: 'timer', /** Use for toolbars containing action buttons or components. */ TOOLBAR: 'toolbar', + /** Use for navigation elements */ + NAVIGATION: 'navigation', }, TRANSLATION_KEYS: { ATTACHMENT: 'common.attachment', @@ -3475,6 +3544,9 @@ const CONST = { }, TAB_SEARCH: { ALL: 'all', + SHARED: 'shared', + DRAFTS: 'drafts', + FINISHED: 'finished', }, STATUS_TEXT_MAX_LENGTH: 100, @@ -3507,10 +3579,12 @@ const CONST = { COLON: ':', MAPBOX: { PADDING: 50, - DEFAULT_ZOOM: 10, + DEFAULT_ZOOM: 15, SINGLE_MARKER_ZOOM: 15, DEFAULT_COORDINATE: [-122.4021, 37.7911], STYLE_URL: 'mapbox://styles/expensify/cllcoiqds00cs01r80kp34tmq', + ANIMATION_DURATION_ON_CENTER_ME: 1000, + CENTER_BUTTON_FADE_DURATION: 300, }, ONYX_UPDATE_TYPES: { HTTPS: 'https', @@ -3679,6 +3753,14 @@ const CONST = { REPORT: 'REPORT', }, + PROMOTED_ACTIONS: { + PIN: 'pin', + SHARE: 'share', + JOIN: 'join', + MESSAGE: 'message', + HOLD: 'hold', + }, + THUMBNAIL_IMAGE: { SMALL_SCREEN: { SIZE: 250, @@ -3733,7 +3815,7 @@ const CONST = { ONBOARDING_INTRODUCTION: 'Let’s get you set up 🔧', ONBOARDING_CHOICES: {...onboardingChoices}, - + ACTIONABLE_TRACK_EXPENSE_WHISPER_MESSAGE: 'What would you like to do with this expense?', ONBOARDING_CONCIERGE: { [onboardingChoices.EMPLOYER]: '# Expensify is the fastest way to get paid back!\n' + @@ -3846,10 +3928,10 @@ const CONST = { type: 'meetGuide', autoCompleted: false, title: 'Meet your setup specialist', - description: ({adminsRoomLink, guideCalendarLink}: {adminsRoomLink: string; guideCalendarLink: string}) => + description: ({adminsRoomLink}: {adminsRoomLink: string}) => `Meet your setup specialist, who can answer any questions as you get started with Expensify. Yes, a real human!\n` + '\n' + - `Chat with the specialist in your [#admins room](${adminsRoomLink}) or [schedule a call](${guideCalendarLink}) today.`, + `Chat with the specialist in your [#admins room](${adminsRoomLink}).`, }, { type: 'setupCategories', @@ -4726,6 +4808,13 @@ const CONST = { SESSION_STORAGE_KEYS: { INITIAL_URL: 'INITIAL_URL', + ACTIVE_WORKSPACE_ID: 'ACTIVE_WORKSPACE_ID', + }, + + RESERVATION_TYPE: { + CAR: 'car', + HOTEL: 'hotel', + FLIGHT: 'flight', }, DOT_SEPARATOR: '•', @@ -4775,6 +4864,46 @@ const CONST = { REFERRER: { NOTIFICATION: 'notification', }, + + SORT_ORDER: { + ASC: 'asc', + DESC: 'desc', + }, + + SUBSCRIPTION_SIZE_LIMIT: 20000, + + PAYMENT_CARD_CURRENCY: { + USD: 'USD', + AUD: 'AUD', + GBP: 'GBP', + NZD: 'NZD', + }, + + SUBSCRIPTION_PRICE_FACTOR: 2, + SUBSCRIPTION_POSSIBLE_COST_SAVINGS: { + COLLECT_PLAN: 10, + CONTROL_PLAN: 18, + }, + FEEDBACK_SURVEY_OPTIONS: { + TOO_LIMITED: { + ID: 'tooLimited', + TRANSLATION_KEY: 'feedbackSurvey.tooLimited', + }, + TOO_EXPENSIVE: { + ID: 'tooExpensive', + TRANSLATION_KEY: 'feedbackSurvey.tooExpensive', + }, + INADEQUATE_SUPPORT: { + ID: 'inadequateSupport', + TRANSLATION_KEY: 'feedbackSurvey.inadequateSupport', + }, + BUSINESS_CLOSING: { + ID: 'businessClosing', + TRANSLATION_KEY: 'feedbackSurvey.businessClosing', + }, + }, + + EXCLUDE_FROM_LAST_VISITED_PATH: [SCREENS.NOT_FOUND, SCREENS.SAML_SIGN_IN, SCREENS.VALIDATE_LOGIN] as string[], } as const; type Country = keyof typeof CONST.ALL_COUNTRIES; @@ -4782,7 +4911,10 @@ type Country = keyof typeof CONST.ALL_COUNTRIES; type IOUType = ValueOf; type IOUAction = ValueOf; type IOURequestType = ValueOf; +type FeedbackSurveyOptionID = ValueOf, 'ID'>>; + +type SubscriptionType = ValueOf; -export type {Country, IOUAction, IOUType, RateAndUnit, OnboardingPurposeType, IOURequestType}; +export type {Country, IOUAction, IOUType, RateAndUnit, OnboardingPurposeType, IOURequestType, SubscriptionType, FeedbackSurveyOptionID}; export default CONST; diff --git a/src/Expensify.tsx b/src/Expensify.tsx index 6205afb9c03c..458f1e3c5d24 100644 --- a/src/Expensify.tsx +++ b/src/Expensify.tsx @@ -1,3 +1,4 @@ +import {Audio} from 'expo-av'; import React, {useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState} from 'react'; import type {NativeEventSubscription} from 'react-native'; import {AppState, Linking} from 'react-native'; @@ -108,6 +109,9 @@ function Expensify({ const isAuthenticated = useMemo(() => !!(session?.authToken ?? null), [session]); const autoAuthState = useMemo(() => session?.autoAuthState ?? '', [session]); + const isAuthenticatedRef = useRef(false); + isAuthenticatedRef.current = isAuthenticated; + const contextValue = useMemo( () => ({ isSplashHidden, @@ -142,10 +146,10 @@ function Expensify({ // Initialize this client as being an active client ActiveClientManager.init(); - // Used for the offline indicator appearing when someone is offline or backend is unreachable - const unsubscribeNetworkStatus = NetworkConnection.subscribeToNetworkStatus(); + // Used for the offline indicator appearing when someone is offline + const unsubscribeNetInfo = NetworkConnection.subscribeToNetInfo(); - return () => unsubscribeNetworkStatus(); + return unsubscribeNetInfo; }, []); useEffect(() => { @@ -194,7 +198,8 @@ function Expensify({ // Open chat report from a deep link (only mobile native) Linking.addEventListener('url', (state) => { - Report.openReportFromDeepLink(state.url); + // We need to pass 'isAuthenticated' to avoid loading a non-existing profile page twice + Report.openReportFromDeepLink(state.url, !isAuthenticatedRef.current); }); return () => { @@ -206,6 +211,11 @@ function Expensify({ // eslint-disable-next-line react-hooks/exhaustive-deps -- we don't want this effect to run again }, []); + // This is being done since we want to play sound even when iOS device is on silent mode, to align with other platforms. + useEffect(() => { + Audio.setAudioModeAsync({playsInSilentModeIOS: true}); + }, []); + // Display a blank page until the onyx migration completes if (!isOnyxMigrated) { return null; @@ -259,6 +269,8 @@ function Expensify({ ); } +Expensify.displayName = 'Expensify'; + export default withOnyx({ isCheckingPublicRoom: { key: ONYXKEYS.IS_CHECKING_PUBLIC_ROOM, diff --git a/src/ONYXKEYS.ts b/src/ONYXKEYS.ts index a027a8493b41..b5eea4228042 100755 --- a/src/ONYXKEYS.ts +++ b/src/ONYXKEYS.ts @@ -133,9 +133,6 @@ const ONYXKEYS = { /** This NVP holds to most recent waypoints that a person has used when creating a distance expense */ NVP_RECENT_WAYPOINTS: 'expensify_recentWaypoints', - /** This NVP will be `true` if the user has ever dismissed the engagement modal on either OldDot or NewDot. If it becomes true it should stay true forever. */ - NVP_HAS_DISMISSED_IDLE_PANEL: 'nvp_hasDismissedIdlePanel', - /** This NVP contains the choice that the user made on the engagement modal */ NVP_INTRO_SELECTED: 'nvp_introSelected', @@ -154,8 +151,11 @@ const ONYXKEYS = { /** Whether the user has tried focus mode yet */ NVP_TRY_FOCUS_MODE: 'nvp_tryFocusMode', - /** Whether the user has been shown the hold educational interstitial yet */ - NVP_HOLD_USE_EXPLAINED: 'holdUseExplained', + /** Whether the user has dismissed the hold educational interstitial */ + NVP_DISMISSED_HOLD_USE_EXPLANATION: 'nvp_dismissedHoldUseExplanation', + + /** Store the state of the subscription */ + NVP_PRIVATE_SUBSCRIPTION: 'nvp_private_subscription', /** Store preferred skintone for emoji */ PREFERRED_EMOJI_SKIN_TONE: 'nvp_expensify_preferredEmojiSkinTone', @@ -169,6 +169,21 @@ const ONYXKEYS = { /** The NVP with the last action taken (for the Quick Action Button) */ NVP_QUICK_ACTION_GLOBAL_CREATE: 'nvp_quickActionGlobalCreate', + /** The start date (yyyy-MM-dd HH:mm:ss) of the workspace owner’s free trial period. */ + NVP_FIRST_DAY_FREE_TRIAL: 'nvp_private_firstDayFreeTrial', + + /** The end date (yyyy-MM-dd HH:mm:ss) of the workspace owner’s free trial period. */ + NVP_LAST_DAY_FREE_TRIAL: 'nvp_private_lastDayFreeTrial', + + /** ID associated with the payment card added by the user. */ + NVP_BILLING_FUND_ID: 'nvp_expensify_billingFundID', + + /** The amount owed by the workspace’s owner. */ + NVP_PRIVATE_AMOUNT_OWNED: 'nvp_private_amountOwed', + + /** The end date (epoch timestamp) of the workspace owner’s grace period after the free trial ends. */ + NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END: 'nvp_private_billingGracePeriodEnd', + /** Does this user have push notifications enabled for this device? */ PUSH_NOTIFICATIONS_ENABLED: 'pushNotificationsEnabled', @@ -324,6 +339,9 @@ const ONYXKEYS = { /** Holds the checks used while transferring the ownership of the workspace */ POLICY_OWNERSHIP_CHANGE_CHECKS: 'policyOwnershipChangeChecks', + /** Stores info during review duplicates flow */ + REVIEW_DUPLICATES: 'reviewDuplicates', + /** Collection Keys */ COLLECTION: { DOWNLOAD: 'download_', @@ -376,6 +394,10 @@ const ONYXKEYS = { // Search Page related SNAPSHOT: 'snapshot_', + + // Shared NVPs + /** Collection of objects where each object represents the owner of the workspace that is past due billing AND the user is a member of. */ + SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END: 'sharedNVP_private_billingGracePeriodEnd_', }, /** List of Form ids */ @@ -397,6 +419,8 @@ const ONYXKEYS = { POLICY_CREATE_DISTANCE_RATE_FORM: 'policyCreateDistanceRateForm', POLICY_CREATE_DISTANCE_RATE_FORM_DRAFT: 'policyCreateDistanceRateFormDraft', POLICY_DISTANCE_RATE_EDIT_FORM: 'policyDistanceRateEditForm', + POLICY_DISTANCE_RATE_TAX_RECLAIMABLE_ON_EDIT_FORM: 'policyDistanceRateTaxReclaimableOnEditForm', + POLICY_DISTANCE_RATE_TAX_RECLAIMABLE_ON_EDIT_FORM_DRAFT: 'policyDistanceRateTaxReclaimableOnEditFormDraft', POLICY_DISTANCE_RATE_EDIT_FORM_DRAFT: 'policyDistanceRateEditFormDraft', CLOSE_ACCOUNT_FORM: 'closeAccount', CLOSE_ACCOUNT_FORM_DRAFT: 'closeAccountDraft', @@ -482,6 +506,8 @@ const ONYXKEYS = { WORKSPACE_TAX_VALUE_FORM_DRAFT: 'workspaceTaxValueFormDraft', NEW_CHAT_NAME_FORM: 'newChatNameForm', NEW_CHAT_NAME_FORM_DRAFT: 'newChatNameFormDraft', + SUBSCRIPTION_SIZE_FORM: 'subscriptionSizeForm', + SUBSCRIPTION_SIZE_FORM_DRAFT: 'subscriptionSizeFormDraft', }, } as const; @@ -536,9 +562,11 @@ type OnyxFormValuesMapping = { [ONYXKEYS.FORMS.WORKSPACE_NEW_TAX_FORM]: FormTypes.WorkspaceNewTaxForm; [ONYXKEYS.FORMS.POLICY_CREATE_DISTANCE_RATE_FORM]: FormTypes.PolicyCreateDistanceRateForm; [ONYXKEYS.FORMS.POLICY_DISTANCE_RATE_EDIT_FORM]: FormTypes.PolicyDistanceRateEditForm; + [ONYXKEYS.FORMS.POLICY_DISTANCE_RATE_TAX_RECLAIMABLE_ON_EDIT_FORM]: FormTypes.PolicyDistanceRateTaxReclaimableOnEditForm; [ONYXKEYS.FORMS.WORKSPACE_TAX_NAME_FORM]: FormTypes.WorkspaceTaxNameForm; [ONYXKEYS.FORMS.WORKSPACE_TAX_VALUE_FORM]: FormTypes.WorkspaceTaxValueForm; [ONYXKEYS.FORMS.NEW_CHAT_NAME_FORM]: FormTypes.NewChatNameForm; + [ONYXKEYS.FORMS.SUBSCRIPTION_SIZE_FORM]: FormTypes.SubscriptionSizeForm; }; type OnyxFormDraftValuesMapping = { @@ -583,13 +611,17 @@ type OnyxCollectionValuesMapping = { [ONYXKEYS.COLLECTION.POLICY_JOIN_MEMBER]: OnyxTypes.PolicyJoinMember; [ONYXKEYS.COLLECTION.POLICY_CONNECTION_SYNC_PROGRESS]: OnyxTypes.PolicyConnectionSyncProgress; [ONYXKEYS.COLLECTION.SNAPSHOT]: OnyxTypes.SearchResults; + [ONYXKEYS.COLLECTION.SHARED_NVP_PRIVATE_USER_BILLING_GRACE_PERIOD_END]: OnyxTypes.BillingGraceEndPeriod; }; type OnyxValuesMapping = { [ONYXKEYS.ACCOUNT]: OnyxTypes.Account; [ONYXKEYS.ACCOUNT_MANAGER_REPORT_ID]: string; [ONYXKEYS.NVP_IS_FIRST_TIME_NEW_EXPENSIFY_USER]: boolean; + + // NVP_ONBOARDING is an array for old users. [ONYXKEYS.NVP_ONBOARDING]: Onboarding | []; + [ONYXKEYS.ACTIVE_CLIENTS]: string[]; [ONYXKEYS.DEVICE_ID]: string; [ONYXKEYS.IS_SIDEBAR_LOADED]: boolean; @@ -621,14 +653,15 @@ type OnyxValuesMapping = { [ONYXKEYS.BETAS]: OnyxTypes.Beta[]; [ONYXKEYS.NVP_PRIORITY_MODE]: ValueOf; [ONYXKEYS.NVP_BLOCKED_FROM_CONCIERGE]: OnyxTypes.BlockedFromConcierge; + + // The value of this nvp is a string representation of the date when the block expires, or an empty string if the user is not blocked [ONYXKEYS.NVP_BLOCKED_FROM_CHAT]: string; [ONYXKEYS.NVP_PRIVATE_PUSH_NOTIFICATION_ID]: string; [ONYXKEYS.NVP_TRY_FOCUS_MODE]: boolean; - [ONYXKEYS.NVP_HOLD_USE_EXPLAINED]: boolean; + [ONYXKEYS.NVP_DISMISSED_HOLD_USE_EXPLANATION]: boolean; [ONYXKEYS.FOCUS_MODE_NOTIFICATION]: boolean; [ONYXKEYS.NVP_LAST_PAYMENT_METHOD]: OnyxTypes.LastPaymentMethod; [ONYXKEYS.NVP_RECENT_WAYPOINTS]: OnyxTypes.RecentWaypoint[]; - [ONYXKEYS.NVP_HAS_DISMISSED_IDLE_PANEL]: boolean; [ONYXKEYS.NVP_INTRO_SELECTED]: OnyxTypes.IntroSelected; [ONYXKEYS.NVP_LAST_SELECTED_DISTANCE_RATES]: OnyxTypes.LastSelectedDistanceRates; [ONYXKEYS.PUSH_NOTIFICATIONS_ENABLED]: boolean; @@ -641,6 +674,7 @@ type OnyxValuesMapping = { [ONYXKEYS.NVP_ACTIVE_POLICY_ID]: string; [ONYXKEYS.NVP_DISMISSED_REFERRAL_BANNERS]: OnyxTypes.DismissedReferralBanners; [ONYXKEYS.NVP_HAS_SEEN_TRACK_TRAINING]: boolean; + [ONYXKEYS.NVP_PRIVATE_SUBSCRIPTION]: OnyxTypes.PrivateSubscription; [ONYXKEYS.USER_WALLET]: OnyxTypes.UserWallet; [ONYXKEYS.WALLET_ONFIDO]: OnyxTypes.WalletOnfido; [ONYXKEYS.WALLET_ADDITIONAL_DETAILS]: OnyxTypes.WalletAdditionalDetails; @@ -688,6 +722,12 @@ type OnyxValuesMapping = { [ONYXKEYS.CACHED_PDF_PATHS]: Record; [ONYXKEYS.POLICY_OWNERSHIP_CHANGE_CHECKS]: Record; [ONYXKEYS.NVP_QUICK_ACTION_GLOBAL_CREATE]: OnyxTypes.QuickAction; + [ONYXKEYS.REVIEW_DUPLICATES]: OnyxTypes.ReviewDuplicates; + [ONYXKEYS.NVP_FIRST_DAY_FREE_TRIAL]: string; + [ONYXKEYS.NVP_LAST_DAY_FREE_TRIAL]: string; + [ONYXKEYS.NVP_BILLING_FUND_ID]: number; + [ONYXKEYS.NVP_PRIVATE_AMOUNT_OWNED]: number; + [ONYXKEYS.NVP_PRIVATE_OWNER_BILLING_GRACE_PERIOD_END]: number; }; type OnyxValues = OnyxValuesMapping & OnyxCollectionValuesMapping & OnyxFormValuesMapping & OnyxFormDraftValuesMapping; diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 2bc04c4a99ea..f39e4b5aa431 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -2,6 +2,8 @@ import type {ValueOf} from 'type-fest'; import type CONST from './CONST'; import type {IOUAction, IOUType} from './CONST'; import type {IOURequestType} from './libs/actions/IOU'; +import type {CentralPaneNavigatorParamList} from './libs/Navigation/types'; +import type {SearchQuery} from './types/onyx/SearchResults'; import type AssertTypesNotEqual from './types/utils/AssertTypesNotEqual'; // This is a file containing constants for all the routes we want to be able to go to @@ -14,10 +16,20 @@ function getUrlWithBackToParam(url: TUrl, backTo?: string): return `${url}${backToParam}` as const; } -const ROUTES = { +const PUBLIC_SCREENS_ROUTES = { // If the user opens this route, we'll redirect them to the path saved in the last visited path or to the home page if the last visited path is empty. ROOT: '', + TRANSITION_BETWEEN_APPS: 'transition', + CONNECTION_COMPLETE: 'connection-complete', + VALIDATE_LOGIN: 'v/:accountID/:validateCode', + UNLINK_LOGIN: 'u/:accountID/:validateCode', + APPLE_SIGN_IN: 'sign-in-with-apple', + GOOGLE_SIGN_IN: 'sign-in-with-google', + SAML_SIGN_IN: 'sign-in-with-saml', +} as const; +const ROUTES = { + ...PUBLIC_SCREENS_ROUTES, // This route renders the list of reports. HOME: 'home', @@ -25,7 +37,15 @@ const ROUTES = { SEARCH: { route: '/search/:query', - getRoute: (query: string) => `search/${query}` as const, + getRoute: (searchQuery: SearchQuery, queryParams?: CentralPaneNavigatorParamList['Search_Central_Pane']) => { + const {sortBy, sortOrder} = queryParams ?? {}; + + if (!sortBy && !sortOrder) { + return `search/${searchQuery}` as const; + } + + return `search/${searchQuery}?sortBy=${sortBy}&sortOrder=${sortOrder}` as const; + }, }, SEARCH_REPORT: { @@ -40,31 +60,24 @@ const ROUTES = { getRoute: (reportID: string, reportActionID: string) => `flag/${reportID}/${reportActionID}` as const, }, CHAT_FINDER: 'chat-finder', - DETAILS: { - route: 'details', - getRoute: (login: string) => `details?login=${encodeURIComponent(login)}` as const, - }, PROFILE: { route: 'a/:accountID', - getRoute: (accountID: string | number, backTo?: string) => getUrlWithBackToParam(`a/${accountID}`, backTo), + getRoute: (accountID?: string | number, backTo?: string, login?: string) => { + const baseRoute = getUrlWithBackToParam(`a/${accountID}`, backTo); + const loginParam = login ? `?login=${encodeURIComponent(login)}` : ''; + return `${baseRoute}${loginParam}` as const; + }, }, PROFILE_AVATAR: { route: 'a/:accountID/avatar', getRoute: (accountID: string | number) => `a/${accountID}/avatar` as const, }, - TRANSITION_BETWEEN_APPS: 'transition', - VALIDATE_LOGIN: 'v/:accountID/:validateCode', - CONNECTION_COMPLETE: 'connection-complete', GET_ASSISTANCE: { route: 'get-assistance/:taskID', getRoute: (taskID: string, backTo: string) => getUrlWithBackToParam(`get-assistance/${taskID}`, backTo), }, - UNLINK_LOGIN: 'u/:accountID/:validateCode', - APPLE_SIGN_IN: 'sign-in-with-apple', - GOOGLE_SIGN_IN: 'sign-in-with-google', DESKTOP_SIGN_IN_REDIRECT: 'desktop-signin-redirect', - SAML_SIGN_IN: 'sign-in-with-saml', // This is a special validation URL that will take the user to /workspace/new after validation. This is used // when linking users from e.com in order to share a session in this app. @@ -88,6 +101,13 @@ const ROUTES = { SETTINGS_TIMEZONE_SELECT: 'settings/profile/timezone/select', SETTINGS_PRONOUNS: 'settings/profile/pronouns', SETTINGS_PREFERENCES: 'settings/preferences', + SETTINGS_SUBSCRIPTION: 'settings/subscription', + SETTINGS_SUBSCRIPTION_SIZE: { + route: 'settings/subscription/subscription-size', + getRoute: (canChangeSize: 0 | 1) => `settings/subscription/subscription-size?canChangeSize=${canChangeSize}` as const, + }, + SETTINGS_SUBSCRIPTION_ADD_PAYMENT_CARD: 'settings/subscription/add-payment-card', + SETTINGS_SUBSCRIPTION_DISABLE_AUTO_RENEW_SURVEY: 'settings/subscription/disable-auto-renew-survey', SETTINGS_PRIORITY_MODE: 'settings/preferences/priority-mode', SETTINGS_LANGUAGE: 'settings/preferences/language', SETTINGS_THEME: 'settings/preferences/theme', @@ -123,12 +143,7 @@ const ROUTES = { }, SETTINGS_ADD_DEBIT_CARD: 'settings/wallet/add-debit-card', SETTINGS_ADD_BANK_ACCOUNT: 'settings/wallet/add-bank-account', - SETTINGS_ADD_BANK_ACCOUNT_REFACTOR: 'settings/wallet/add-bank-account-refactor', SETTINGS_ENABLE_PAYMENTS: 'settings/wallet/enable-payments', - // TODO: Added temporarily for testing purposes, remove after refactor - https://github.com/Expensify/App/issues/36648 - SETTINGS_ENABLE_PAYMENTS_REFACTOR: 'settings/wallet/enable-payments-refactor', - // TODO: Added temporarily for testing purposes, remove after refactor - https://github.com/Expensify/App/issues/36648 - SETTINGS_ENABLE_PAYMENTS_TEMPORARY_TERMS: 'settings/wallet/enable-payments-temporary-terms', SETTINGS_WALLET_CARD_DIGITAL_DETAILS_UPDATE_ADDRESS: { route: 'settings/wallet/card/:domain/digital-details/update-address', getRoute: (domain: string) => `settings/wallet/card/${domain}/digital-details/update-address` as const, @@ -182,7 +197,10 @@ const ROUTES = { SETTINGS_STATUS_CLEAR_AFTER_DATE: 'settings/profile/status/clear-after/date', SETTINGS_STATUS_CLEAR_AFTER_TIME: 'settings/profile/status/clear-after/time', SETTINGS_TROUBLESHOOT: 'settings/troubleshoot', - SETTINGS_CONSOLE: 'settings/troubleshoot/console', + SETTINGS_CONSOLE: { + route: 'settings/troubleshoot/console', + getRoute: (backTo?: string) => getUrlWithBackToParam(`settings/troubleshoot/console`, backTo), + }, SETTINGS_SHARE_LOG: { route: 'settings/troubleshoot/console/share-log', getRoute: (source: string) => `settings/troubleshoot/console/share-log?source=${encodeURI(source)}` as const, @@ -234,9 +252,10 @@ const ROUTES = { route: 'r/:reportID/details/shareCode', getRoute: (reportID: string) => `r/${reportID}/details/shareCode` as const, }, - REPORT_ATTACHMENTS: { - route: 'r/:reportID/attachment', - getRoute: (reportID: string, source: string) => `r/${reportID}/attachment?source=${encodeURIComponent(source)}` as const, + ATTACHMENTS: { + route: 'attachment', + getRoute: (reportID: string, type: ValueOf, url: string, accountID?: number) => + `attachment?source=${encodeURIComponent(url)}&type=${type}${reportID ? `&reportID=${reportID}` : ''}${accountID ? `&accountID=${accountID}` : ''}` as const, }, REPORT_PARTICIPANTS: { route: 'r/:reportID/participants', @@ -262,13 +281,9 @@ const ROUTES = { route: 'r/:reportID/settings', getRoute: (reportID: string) => `r/${reportID}/settings` as const, }, - REPORT_SETTINGS_ROOM_NAME: { - route: 'r/:reportID/settings/room-name', - getRoute: (reportID: string) => `r/${reportID}/settings/room-name` as const, - }, - REPORT_SETTINGS_GROUP_NAME: { - route: 'r/:reportID/settings/group-name', - getRoute: (reportID: string) => `r/${reportID}/settings/group-name` as const, + REPORT_SETTINGS_NAME: { + route: 'r/:reportID/settings/name', + getRoute: (reportID: string) => `r/${reportID}/settings/name` as const, }, REPORT_SETTINGS_NOTIFICATION_PREFERENCES: { route: 'r/:reportID/settings/notification-preferences', @@ -353,6 +368,27 @@ const ROUTES = { getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, backTo = '', reportActionID?: string) => getUrlWithBackToParam(`${action as string}/${iouType as string}/category/${transactionID}/${reportID}${reportActionID ? `/${reportActionID}` : ''}`, backTo), }, + SETTINGS_CATEGORIES_ROOT: { + route: 'settings/:policyID/categories', + getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/categories`, backTo), + }, + SETTINGS_CATEGORY_SETTINGS: { + route: 'settings/:policyID/categories/:categoryName', + getRoute: (policyID: string, categoryName: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/categories/${encodeURIComponent(categoryName)}`, backTo), + }, + SETTINGS_CATEGORIES_SETTINGS: { + route: 'settings/:policyID/categories/settings', + getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/categories/settings`, backTo), + }, + SETTINGS_CATEGORY_CREATE: { + route: 'settings/:policyID/categories/new', + getRoute: (policyID: string, backTo = '') => getUrlWithBackToParam(`settings/${policyID}/categories/new`, backTo), + }, + SETTINGS_CATEGORY_EDIT: { + route: 'settings/:policyID/categories/:categoryName/edit', + getRoute: (policyID: string, categoryName: string, backTo = '') => + getUrlWithBackToParam(`settings/workspaces/${policyID}/categories/${encodeURIComponent(categoryName)}/edit`, backTo), + }, MONEY_REQUEST_STEP_CURRENCY: { route: ':action/:iouType/currency/:transactionID/:reportID/:pageIndex?', getRoute: (action: IOUAction, iouType: IOUType, transactionID: string, reportID: string, pageIndex = '', currency = '', backTo = '') => @@ -643,10 +679,6 @@ const ROUTES = { route: 'settings/workspaces/:policyID/categories/settings', getRoute: (policyID: string) => `settings/workspaces/${policyID}/categories/settings` as const, }, - WORKSPACE_MORE_FEATURES: { - route: 'settings/workspaces/:policyID/more-features', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/more-features` as const, - }, WORKSPACE_CATEGORY_CREATE: { route: 'settings/workspaces/:policyID/categories/new', getRoute: (policyID: string) => `settings/workspaces/${policyID}/categories/new` as const, @@ -655,6 +687,10 @@ const ROUTES = { route: 'settings/workspaces/:policyID/categories/:categoryName/edit', getRoute: (policyID: string, categoryName: string) => `settings/workspaces/${policyID}/categories/${encodeURIComponent(categoryName)}/edit` as const, }, + WORKSPACE_MORE_FEATURES: { + route: 'settings/workspaces/:policyID/more-features', + getRoute: (policyID: string) => `settings/workspaces/${policyID}/more-features` as const, + }, WORKSPACE_TAGS: { route: 'settings/workspaces/:policyID/tags', getRoute: (policyID: string) => `settings/workspaces/${policyID}/tags` as const, @@ -672,12 +708,12 @@ const ROUTES = { getRoute: (policyID: string, orderWeight: number) => `settings/workspaces/${policyID}/tags/${orderWeight}/edit` as const, }, WORKSPACE_TAG_EDIT: { - route: 'settings/workspace/:policyID/tag/:tagName/edit', - getRoute: (policyID: string, tagName: string) => `settings/workspace/${policyID}/tag/${encodeURIComponent(tagName)}/edit` as const, + route: 'settings/workspaces/:policyID/tag/:orderWeight/:tagName/edit', + getRoute: (policyID: string, orderWeight: number, tagName: string) => `settings/workspaces/${policyID}/tag/${orderWeight}/${encodeURIComponent(tagName)}/edit` as const, }, WORKSPACE_TAG_SETTINGS: { - route: 'settings/workspaces/:policyID/tag/:tagName', - getRoute: (policyID: string, tagName: string) => `settings/workspaces/${policyID}/tag/${encodeURIComponent(tagName)}` as const, + route: 'settings/workspaces/:policyID/tag/:orderWeight/:tagName', + getRoute: (policyID: string, orderWeight: number, tagName: string) => `settings/workspaces/${policyID}/tag/${orderWeight}/${encodeURIComponent(tagName)}` as const, }, WORKSPACE_TAG_LIST_VIEW: { route: 'settings/workspaces/:policyID/tag-list/:orderWeight', @@ -760,6 +796,14 @@ const ROUTES = { route: 'settings/workspaces/:policyID/distance-rates/:rateID/edit', getRoute: (policyID: string, rateID: string) => `settings/workspaces/${policyID}/distance-rates/${rateID}/edit` as const, }, + WORKSPACE_DISTANCE_RATE_TAX_RECLAIMABLE_ON_EDIT: { + route: 'settings/workspaces/:policyID/distance-rates/:rateID/tax-reclaimable/edit', + getRoute: (policyID: string, rateID: string) => `settings/workspaces/${policyID}/distance-rates/${rateID}/tax-reclaimable/edit` as const, + }, + WORKSPACE_DISTANCE_RATE_TAX_RATE_EDIT: { + route: 'settings/workspaces/:policyID/distance-rates/:rateID/tax-rate/edit', + getRoute: (policyID: string, rateID: string) => `settings/workspaces/${policyID}/distance-rates/${rateID}/tax-rate/edit` as const, + }, // Referral program promotion REFERRAL_DETAILS_MODAL: { route: 'referral/:contentType', @@ -779,6 +823,11 @@ const ROUTES = { route: 'r/:reportID/transaction/:transactionID/receipt', getRoute: (reportID: string, transactionID: string) => `r/${reportID}/transaction/${transactionID}/receipt` as const, }, + TRANSACTION_DUPLICATE_REVIEW_PAGE: { + route: 'r/:threadReportID/duplicates/review', + getRoute: (threadReportID: string) => `r/${threadReportID}/duplicates/review` as const, + }, + POLICY_ACCOUNTING_XERO_IMPORT: { route: 'settings/workspaces/:policyID/accounting/xero/import', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/xero/import` as const, @@ -795,17 +844,14 @@ const ROUTES = { route: 'settings/workspaces/:policyID/accounting/xero/import/tracking-categories', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/xero/import/tracking-categories` as const, }, - POLICY_ACCOUNTING_XERO_TRACKING_CATEGORIES_MAP_COST_CENTERS: { - route: 'settings/workspaces/:policyID/accounting/xero/import/tracking-categories/cost-centers', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/xero/import/tracking-categories/cost-centers` as const, - }, - POLICY_ACCOUNTING_XERO_TRACKING_CATEGORIES_MAP_REGION: { - route: 'settings/workspaces/:policyID/accounting/xero/import/tracking-categories/region', - getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/xero/import/tracking-categories/region` as const, + POLICY_ACCOUNTING_XERO_TRACKING_CATEGORIES_MAP: { + route: 'settings/workspaces/:policyID/accounting/xero/import/tracking-categories/mapping/:categoryId/:categoryName', + getRoute: (policyID: string, categoryId: string, categoryName: string) => + `settings/workspaces/${policyID}/accounting/xero/import/tracking-categories/mapping/${categoryId}/${encodeURIComponent(categoryName)}` as const, }, POLICY_ACCOUNTING_XERO_CUSTOMER: { - route: '/settings/workspaces/:policyID/accounting/xero/import/customers', - getRoute: (policyID: string) => `/settings/workspaces/${policyID}/accounting/xero/import/customers` as const, + route: 'settings/workspaces/:policyID/accounting/xero/import/customers', + getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/xero/import/customers` as const, }, POLICY_ACCOUNTING_XERO_TAXES: { route: 'settings/workspaces/:policyID/accounting/xero/import/taxes', @@ -816,8 +862,8 @@ const ROUTES = { getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/xero/export` as const, }, POLICY_ACCOUNTING_XERO_PREFERRED_EXPORTER_SELECT: { - route: '/settings/workspaces/:policyID/connections/xero/export/preferred-exporter/select', - getRoute: (policyID: string) => `/settings/workspaces/${policyID}/connections/xero/export/preferred-exporter/select` as const, + route: 'settings/workspaces/:policyID/connections/xero/export/preferred-exporter/select', + getRoute: (policyID: string) => `settings/workspaces/${policyID}/connections/xero/export/preferred-exporter/select` as const, }, POLICY_ACCOUNTING_XERO_EXPORT_PURCHASE_BILL_DATE_SELECT: { route: 'settings/workspaces/:policyID/accounting/xero/export/purchase-bill-date-select', @@ -831,6 +877,10 @@ const ROUTES = { route: 'settings/workspaces/:policyID/accounting/xero/advanced', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/xero/advanced` as const, }, + POLICY_ACCOUNTING_XERO_BILL_STATUS_SELECTOR: { + route: 'settings/workspaces/:policyID/accounting/xero/export/purchase-bill-status-selector', + getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/xero/export/purchase-bill-status-selector` as const, + }, POLICY_ACCOUNTING_XERO_INVOICE_SELECTOR: { route: 'settings/workspaces/:policyID/accounting/xero/advanced/invoice-account-selector', getRoute: (policyID: string) => `settings/workspaces/${policyID}/accounting/xero/advanced/invoice-account-selector` as const, @@ -875,7 +925,7 @@ const HYBRID_APP_ROUTES = { MONEY_REQUEST_SUBMIT_CREATE: '/submit/new/scan', } as const; -export {HYBRID_APP_ROUTES, getUrlWithBackToParam}; +export {HYBRID_APP_ROUTES, getUrlWithBackToParam, PUBLIC_SCREENS_ROUTES}; export default ROUTES; // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/src/SCREENS.ts b/src/SCREENS.ts index f74002312623..f89469873ac7 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -7,7 +7,7 @@ import type DeepValueOf from './types/utils/DeepValueOf'; const PROTECTED_SCREENS = { HOME: 'Home', CONCIERGE: 'Concierge', - REPORT_ATTACHMENTS: 'ReportAttachments', + ATTACHMENTS: 'Attachments', } as const; const SCREENS = { @@ -42,7 +42,6 @@ const SCREENS = { APP_DOWNLOAD_LINKS: 'Settings_App_Download_Links', ADD_DEBIT_CARD: 'Settings_Add_Debit_Card', ADD_BANK_ACCOUNT: 'Settings_Add_Bank_Account', - ADD_BANK_ACCOUNT_REFACTOR: 'Settings_Add_Bank_Account_Refactor', CLOSE: 'Settings_Close', TWO_FACTOR_AUTH: 'Settings_TwoFactorAuth', REPORT_CARD_LOST_OR_DAMAGED: 'Settings_ReportCardLostOrDamaged', @@ -89,10 +88,6 @@ const SCREENS = { TRANSFER_BALANCE: 'Settings_Wallet_Transfer_Balance', CHOOSE_TRANSFER_ACCOUNT: 'Settings_Wallet_Choose_Transfer_Account', ENABLE_PAYMENTS: 'Settings_Wallet_EnablePayments', - // TODO: Added temporarily for testing purposes, remove after refactor - https://github.com/Expensify/App/issues/36648 - ENABLE_PAYMENTS_REFACTOR: 'Settings_Wallet_EnablePayments_Refactor', - // TODO: Added temporarily for testing purposes, remove after refactor - https://github.com/Expensify/App/issues/36648 - ENABLE_PAYMENTS_TEMPORARY_TERMS: 'Settings_Wallet_EnablePayments_Temporary_Terms', CARD_ACTIVATE: 'Settings_Wallet_Card_Activate', REPORT_VIRTUAL_CARD_FRAUD: 'Settings_Wallet_ReportVirtualCardFraud', CARDS_DIGITAL_DETAILS_UPDATE_ADDRESS: 'Settings_Wallet_Cards_Digital_Details_Update_Address', @@ -103,6 +98,13 @@ const SCREENS = { RESPONSE: 'Settings_ExitSurvey_Response', CONFIRM: 'Settings_ExitSurvey_Confirm', }, + + SUBSCRIPTION: { + ROOT: 'Settings_Subscription', + SIZE: 'Settings_Subscription_Size', + ADD_PAYMENT_CARD: 'Settings_Subscription_Add_Payment_Card', + DISABLE_AUTO_RENEW_SURVEY: 'Settings_Subscription_DisableAutoRenewSurvey', + }, }, SAVE_THE_WORLD: { ROOT: 'SaveTheWorld_Root', @@ -136,8 +138,10 @@ const SCREENS = { ROOM_INVITE: 'RoomInvite', REFERRAL: 'Referral', PROCESS_MONEY_REQUEST_HOLD: 'ProcessMoneyRequestHold', + TRANSACTION_DUPLICATE: 'TransactionDuplicate', TRAVEL: 'Travel', SEARCH_REPORT: 'SearchReport', + SETTINGS_CATEGORIES: 'SettingsCategories', }, ONBOARDING_MODAL: { ONBOARDING: 'Onboarding', @@ -176,16 +180,27 @@ const SCREENS = { STATE_SELECTOR: 'Money_Request_State_Selector', }, + TRANSACTION_DUPLICATE: { + REVIEW: 'Transaction_Duplicate_Review', + }, + IOU_SEND: { ADD_BANK_ACCOUNT: 'IOU_Send_Add_Bank_Account', ADD_DEBIT_CARD: 'IOU_Send_Add_Debit_Card', ENABLE_PAYMENTS: 'IOU_Send_Enable_Payments', }, + SETTINGS_CATEGORIES: { + SETTINGS_CATEGORY_SETTINGS: 'Settings_Category_Settings', + SETTINGS_CATEGORIES_SETTINGS: 'Settings_Categories_Settings', + SETTINGS_CATEGORY_CREATE: 'Settings_Category_Create', + SETTINGS_CATEGORY_EDIT: 'Settings_Category_Edit', + SETTINGS_CATEGORIES_ROOT: 'Settings_Categories', + }, + REPORT_SETTINGS: { ROOT: 'Report_Settings_Root', - ROOM_NAME: 'Report_Settings_Room_Name', - GROUP_NAME: 'Report_Settings_Group_Name', + NAME: 'Report_Settings_Name', NOTIFICATION_PREFERENCES: 'Report_Settings_Notification_Preferences', WRITE_CAPABILITY: 'Report_Settings_Write_Capability', VISIBILITY: 'Report_Settings_Visibility', @@ -244,11 +259,11 @@ const SCREENS = { XERO_CUSTOMER: 'Policy_Acounting_Xero_Import_Customer', XERO_TAXES: 'Policy_Accounting_Xero_Taxes', XERO_TRACKING_CATEGORIES: 'Policy_Accounting_Xero_Tracking_Categories', - XERO_MAP_COST_CENTERS: 'Policy_Accounting_Xero_Map_Cost_Centers', - XERO_MAP_REGION: 'Policy_Accounting_Xero_Map_Region', + XERO_MAP_TRACKING_CATEGORY: 'Policy_Accounting_Xero_Map_Tracking_Category', XERO_EXPORT: 'Policy_Accounting_Xero_Export', XERO_EXPORT_PURCHASE_BILL_DATE_SELECT: 'Policy_Accounting_Xero_Export_Purchase_Bill_Date_Select', XERO_ADVANCED: 'Policy_Accounting_Xero_Advanced', + XERO_BILL_STATUS_SELECTOR: 'Policy_Accounting_Xero_Export_Bill_Status_Selector', XERO_INVOICE_ACCOUNT_SELECTOR: 'Policy_Accounting_Xero_Invoice_Account_Selector', XERO_EXPORT_PREFERRED_EXPORTER_SELECT: 'Workspace_Accounting_Xero_Export_Preferred_Exporter_Select', XERO_BILL_PAYMENT_ACCOUNT_SELECTOR: 'Policy_Accounting_Xero_Bill_Payment_Account_Selector', @@ -308,6 +323,8 @@ const SCREENS = { DISTANCE_RATES_SETTINGS: 'Distance_Rates_Settings', DISTANCE_RATE_DETAILS: 'Distance_Rate_Details', DISTANCE_RATE_EDIT: 'Distance_Rate_Edit', + DISTANCE_RATE_TAX_RECLAIMABLE_ON_EDIT: 'Distance_Rate_Tax_Reclaimable_On_Edit', + DISTANCE_RATE_TAX_RATE_EDIT: 'Distance_Rate_Tax_Rate_Edit', }, EDIT_REQUEST: { diff --git a/src/TIMEZONES.ts b/src/TIMEZONES.ts index 238563134872..0fb340a2d88d 100644 --- a/src/TIMEZONES.ts +++ b/src/TIMEZONES.ts @@ -1,5 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ // All timezones were taken from: https://raw.githubusercontent.com/leon-do/Timezones/main/timezone.json +import type {TupleToUnion} from 'type-fest'; + const TIMEZONES = [ 'Africa/Abidjan', 'Africa/Accra', @@ -425,7 +427,7 @@ const TIMEZONES = [ * The timezones supported in browser and on native devices differ, so we must map each timezone to its supported equivalent. * Data sourced from https://en.wikipedia.org/wiki/List_of_tz_database_time_zones */ -const timezoneBackwardMap: Record = { +const timezoneBackwardMap: Record> = { 'Africa/Asmera': 'Africa/Nairobi', 'Africa/Timbuktu': 'Africa/Abidjan', 'America/Argentina/ComodRivadavia': 'America/Argentina/Catamarca', @@ -549,6 +551,17 @@ const timezoneBackwardMap: Record = { 'US/Pacific': 'America/Los_Angeles', 'US/Samoa': 'Pacific/Pago_Pago', 'W-SU': 'Europe/Moscow', + CET: 'Europe/Paris', + CST6CDT: 'America/Chicago', + EET: 'Europe/Sofia', + EST: 'America/Cancun', + EST5EDT: 'America/New_York', + HST: 'Pacific/Honolulu', + MET: 'Europe/Paris', + MST: 'America/Phoenix', + MST7MDT: 'America/Denver', + PST8PDT: 'America/Los_Angeles', + WET: 'Europe/Lisbon', }; export {timezoneBackwardMap}; diff --git a/src/components/ActiveWorkspace/ActiveWorkspaceProvider.tsx b/src/components/ActiveWorkspaceProvider/index.tsx similarity index 80% rename from src/components/ActiveWorkspace/ActiveWorkspaceProvider.tsx rename to src/components/ActiveWorkspaceProvider/index.tsx index 884b9a2a2d95..bc7260cdf10b 100644 --- a/src/components/ActiveWorkspace/ActiveWorkspaceProvider.tsx +++ b/src/components/ActiveWorkspaceProvider/index.tsx @@ -1,6 +1,6 @@ import React, {useMemo, useState} from 'react'; +import ActiveWorkspaceContext from '@components/ActiveWorkspace/ActiveWorkspaceContext'; import type ChildrenProps from '@src/types/utils/ChildrenProps'; -import ActiveWorkspaceContext from './ActiveWorkspaceContext'; function ActiveWorkspaceContextProvider({children}: ChildrenProps) { const [activeWorkspaceID, setActiveWorkspaceID] = useState(undefined); @@ -10,7 +10,7 @@ function ActiveWorkspaceContextProvider({children}: ChildrenProps) { activeWorkspaceID, setActiveWorkspaceID, }), - [activeWorkspaceID], + [activeWorkspaceID, setActiveWorkspaceID], ); return {children}; diff --git a/src/components/ActiveWorkspaceProvider/index.website.tsx b/src/components/ActiveWorkspaceProvider/index.website.tsx new file mode 100644 index 000000000000..82e46d70f896 --- /dev/null +++ b/src/components/ActiveWorkspaceProvider/index.website.tsx @@ -0,0 +1,29 @@ +import React, {useCallback, useMemo, useState} from 'react'; +import ActiveWorkspaceContext from '@components/ActiveWorkspace/ActiveWorkspaceContext'; +import CONST from '@src/CONST'; +import type ChildrenProps from '@src/types/utils/ChildrenProps'; + +function ActiveWorkspaceContextProvider({children}: ChildrenProps) { + const [activeWorkspaceID, updateActiveWorkspaceID] = useState(undefined); + + const setActiveWorkspaceID = useCallback((workspaceID: string | undefined) => { + updateActiveWorkspaceID(workspaceID); + if (workspaceID && sessionStorage) { + sessionStorage?.setItem(CONST.SESSION_STORAGE_KEYS.ACTIVE_WORKSPACE_ID, workspaceID); + } else { + sessionStorage?.removeItem(CONST.SESSION_STORAGE_KEYS.ACTIVE_WORKSPACE_ID); + } + }, []); + + const value = useMemo( + () => ({ + activeWorkspaceID, + setActiveWorkspaceID, + }), + [activeWorkspaceID, setActiveWorkspaceID], + ); + + return {children}; +} + +export default ActiveWorkspaceContextProvider; diff --git a/src/pages/workspace/members/WorkspaceOwnerPaymentCardCurrencyModal.tsx b/src/components/AddPaymentCard/PaymentCardCurrencyModal.tsx similarity index 82% rename from src/pages/workspace/members/WorkspaceOwnerPaymentCardCurrencyModal.tsx rename to src/components/AddPaymentCard/PaymentCardCurrencyModal.tsx index fcbbbbd4af3f..60fa838b0577 100644 --- a/src/pages/workspace/members/WorkspaceOwnerPaymentCardCurrencyModal.tsx +++ b/src/components/AddPaymentCard/PaymentCardCurrencyModal.tsx @@ -6,9 +6,10 @@ import SelectionList from '@components/SelectionList'; import RadioListItem from '@components/SelectionList/RadioListItem'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; +import useWindowDimensions from '@hooks/useWindowDimensions'; import CONST from '@src/CONST'; -type WorkspaceOwnerPaymentCardCurrencyModalProps = { +type PaymentCardCurrencyModalProps = { /** Whether the modal is visible */ isVisible: boolean; @@ -25,7 +26,8 @@ type WorkspaceOwnerPaymentCardCurrencyModalProps = { onClose?: () => void; }; -function WorkspaceOwnerPaymentCardCurrencyModal({isVisible, currencies, currentCurrency = CONST.CURRENCY.USD, onCurrencyChange, onClose}: WorkspaceOwnerPaymentCardCurrencyModalProps) { +function PaymentCardCurrencyModal({isVisible, currencies, currentCurrency = CONST.CURRENCY.USD, onCurrencyChange, onClose}: PaymentCardCurrencyModalProps) { + const {isSmallScreenWidth} = useWindowDimensions(); const styles = useThemeStyles(); const {translate} = useLocalize(); const {sections} = useMemo( @@ -51,13 +53,14 @@ function WorkspaceOwnerPaymentCardCurrencyModal({isVisible, currencies, currentC onClose={() => onClose?.()} onModalHide={onClose} hideModalContentWhileAnimating + innerContainerStyle={styles.RHPNavigatorContainer(isSmallScreenWidth)} useNativeDriver > , currency?: ValueOf) => void; + submitButtonText: string; + /** Custom content to display in the footer after card form */ + footerContent?: ReactNode; + /** Custom content to display in the header before card form */ + headerContent?: ReactNode; +}; + +function IAcceptTheLabel() { + const {translate} = useLocalize(); + + return ( + + {`${translate('common.iAcceptThe')}`} + {`${translate('common.addCardTermsOfService')}`} {`${translate('common.and')}`} + {` ${translate('common.privacyPolicy')} `} + + ); +} + +const REQUIRED_FIELDS = [ + INPUT_IDS.NAME_ON_CARD, + INPUT_IDS.CARD_NUMBER, + INPUT_IDS.EXPIRATION_DATE, + INPUT_IDS.ADDRESS_STREET, + INPUT_IDS.SECURITY_CODE, + INPUT_IDS.ADDRESS_ZIP_CODE, + INPUT_IDS.ADDRESS_STATE, +]; + +const CARD_TYPES = { + DEBIT_CARD: 'debit', + PAYMENT_CARD: 'payment', +}; + +const CARD_TYPE_SECTIONS = { + DEFAULTS: 'defaults', + ERROR: 'error', +}; +type CartTypesMap = (typeof CARD_TYPES)[keyof typeof CARD_TYPES]; +type CartTypeSectionsMap = (typeof CARD_TYPE_SECTIONS)[keyof typeof CARD_TYPE_SECTIONS]; + +type CardLabels = Record>>; + +const CARD_LABELS: CardLabels = { + [CARD_TYPES.DEBIT_CARD]: { + [CARD_TYPE_SECTIONS.DEFAULTS]: { + cardNumber: 'addDebitCardPage.debitCardNumber', + nameOnCard: 'addDebitCardPage.nameOnCard', + expirationDate: 'addDebitCardPage.expirationDate', + expiration: 'addDebitCardPage.expiration', + securityCode: 'addDebitCardPage.cvv', + billingAddress: 'addDebitCardPage.billingAddress', + }, + [CARD_TYPE_SECTIONS.ERROR]: { + nameOnCard: 'addDebitCardPage.error.invalidName', + cardNumber: 'addDebitCardPage.error.debitCardNumber', + expirationDate: 'addDebitCardPage.error.expirationDate', + securityCode: 'addDebitCardPage.error.securityCode', + addressStreet: 'addDebitCardPage.error.addressStreet', + addressZipCode: 'addDebitCardPage.error.addressZipCode', + }, + }, + [CARD_TYPES.PAYMENT_CARD]: { + defaults: { + cardNumber: 'addPaymentCardPage.paymentCardNumber', + nameOnCard: 'addPaymentCardPage.nameOnCard', + expirationDate: 'addPaymentCardPage.expirationDate', + expiration: 'addPaymentCardPage.expiration', + securityCode: 'addPaymentCardPage.cvv', + billingAddress: 'addPaymentCardPage.billingAddress', + }, + error: { + nameOnCard: 'addPaymentCardPage.error.invalidName', + cardNumber: 'addPaymentCardPage.error.paymentCardNumber', + expirationDate: 'addPaymentCardPage.error.expirationDate', + securityCode: 'addPaymentCardPage.error.securityCode', + addressStreet: 'addPaymentCardPage.error.addressStreet', + addressZipCode: 'addPaymentCardPage.error.addressZipCode', + }, + }, +}; + +function PaymentCardForm({ + shouldShowPaymentCardForm, + addPaymentCard, + showAcceptTerms, + showAddressField, + showCurrencyField, + isDebitCard, + submitButtonText, + showStateSelector, + footerContent, + headerContent, +}: PaymentCardFormProps) { + const styles = useThemeStyles(); + const {translate} = useLocalize(); + const route = useRoute(); + const label = CARD_LABELS[isDebitCard ? CARD_TYPES.DEBIT_CARD : CARD_TYPES.PAYMENT_CARD]; + + const cardNumberRef = useRef(null); + + const [isCurrencyModalVisible, setIsCurrencyModalVisible] = useState(false); + const [currency, setCurrency] = useState(CONST.CURRENCY.USD); + + const validate = (values: FormOnyxValues): FormInputErrors => { + const errors = ValidationUtils.getFieldRequiredErrors(values, REQUIRED_FIELDS); + + if (values.nameOnCard && !ValidationUtils.isValidLegalName(values.nameOnCard)) { + errors.nameOnCard = translate('addDebitCardPage.error.invalidName'); + } + + if (values.cardNumber && !ValidationUtils.isValidDebitCard(values.cardNumber.replace(/ /g, ''))) { + errors.cardNumber = translate('addDebitCardPage.error.debitCardNumber'); + } + + if (values.expirationDate && !ValidationUtils.isValidExpirationDate(values.expirationDate)) { + errors.expirationDate = translate('addDebitCardPage.error.expirationDate'); + } + + if (values.securityCode && !ValidationUtils.isValidSecurityCode(values.securityCode)) { + errors.securityCode = translate('addDebitCardPage.error.securityCode'); + } + + if (values.addressStreet && !ValidationUtils.isValidAddress(values.addressStreet)) { + errors.addressStreet = translate('addDebitCardPage.error.addressStreet'); + } + + if (values.addressZipCode && !ValidationUtils.isValidZipCode(values.addressZipCode)) { + errors.addressZipCode = translate('addDebitCardPage.error.addressZipCode'); + } + + if (!values.acceptTerms) { + errors.acceptTerms = translate('common.error.acceptTerms'); + } + + return errors; + }; + + const showCurrenciesModal = useCallback(() => { + setIsCurrencyModalVisible(true); + }, []); + + const changeCurrency = useCallback((newCurrency: keyof typeof CONST.CURRENCY) => { + setCurrency(newCurrency); + setIsCurrencyModalVisible(false); + }, []); + + if (!shouldShowPaymentCardForm) { + return null; + } + + return ( + <> + {headerContent} + addPaymentCard(formData, currency)} + submitButtonText={submitButtonText} + scrollContextEnabled + style={[styles.mh5, styles.flexGrow1]} + > + + + + + + + + + + + {!!showAddressField && ( + + + + )} + + {!!showStateSelector && ( + + + + )} + {!!showCurrencyField && ( + + {(isHovered) => ( + + )} + + )} + {!!showAcceptTerms && ( + + + + )} + + } + currentCurrency={currency} + onCurrencyChange={changeCurrency} + onClose={() => setIsCurrencyModalVisible(false)} + /> + {footerContent} + + + ); +} + +PaymentCardForm.displayName = 'PaymentCardForm'; + +export default PaymentCardForm; diff --git a/src/components/AddPaymentMethodMenu.tsx b/src/components/AddPaymentMethodMenu.tsx index ac9657694500..734e8affa9ea 100644 --- a/src/components/AddPaymentMethodMenu.tsx +++ b/src/components/AddPaymentMethodMenu.tsx @@ -67,7 +67,7 @@ function AddPaymentMethodMenu({ // which then starts a bottom up flow and creates a Collect workspace where the payer is an admin and payee is an employee. const isIOUReport = ReportUtils.isIOUReport(iouReport ?? {}); const canUseBusinessBankAccount = - ReportUtils.isExpenseReport(iouReport ?? {}) || (isIOUReport && !ReportActionsUtils.hasRequestFromCurrentAccount(iouReport?.reportID ?? '', session?.accountID ?? 0)); + ReportUtils.isExpenseReport(iouReport ?? {}) || (isIOUReport && !ReportActionsUtils.hasRequestFromCurrentAccount(iouReport?.reportID ?? '-1', session?.accountID ?? -1)); const canUsePersonalBankAccount = shouldShowPersonalBankAccountOption || isIOUReport; diff --git a/src/components/AddPlaidBankAccount.tsx b/src/components/AddPlaidBankAccount.tsx index 366f14ec9780..a112b36705c3 100644 --- a/src/components/AddPlaidBankAccount.tsx +++ b/src/components/AddPlaidBankAccount.tsx @@ -18,7 +18,6 @@ import FullPageOfflineBlockingView from './BlockingViews/FullPageOfflineBlocking import FormHelpMessage from './FormHelpMessage'; import Icon from './Icon'; import getBankIcon from './Icon/BankIcons'; -import Picker from './Picker'; import PlaidLink from './PlaidLink'; import RadioButtons from './RadioButtons'; import Text from './Text'; @@ -59,9 +58,6 @@ type AddPlaidBankAccountProps = AddPlaidBankAccountOnyxProps & { /** Are we adding a withdrawal account? */ allowDebit?: boolean; - /** Is displayed in new VBBA */ - isDisplayedInNewVBBA?: boolean; - /** Is displayed in new enable wallet flow */ isDisplayedInWalletFlow?: boolean; @@ -84,7 +80,6 @@ function AddPlaidBankAccount({ bankAccountID = 0, allowDebit = false, isPlaidDisabled, - isDisplayedInNewVBBA = false, errorText = '', onInputChange = () => {}, isDisplayedInWalletFlow = false, @@ -93,7 +88,7 @@ function AddPlaidBankAccount({ const styles = useThemeStyles(); const plaidBankAccounts = plaidData?.bankAccounts ?? []; const defaultSelectedPlaidAccount = plaidBankAccounts.find((account) => account.plaidAccountID === selectedPlaidAccountID); - const defaultSelectedPlaidAccountID = defaultSelectedPlaidAccount?.plaidAccountID ?? ''; + const defaultSelectedPlaidAccountID = defaultSelectedPlaidAccount?.plaidAccountID ?? '-1'; const defaultSelectedPlaidAccountMask = plaidBankAccounts.find((account) => account.plaidAccountID === selectedPlaidAccountID)?.mask ?? ''; const subscribedKeyboardShortcuts = useRef void>>([]); const previousNetworkState = useRef(); @@ -177,6 +172,7 @@ function AddPlaidBankAccount({ })); const {icon, iconSize, iconStyles} = getBankIcon({styles}); const plaidErrors = plaidData?.errors; + // eslint-disable-next-line @typescript-eslint/non-nullable-type-assertion-style const plaidDataErrorMessage = !isEmptyObject(plaidErrors) ? (Object.values(plaidErrors)[0] as string) : ''; const bankName = plaidData?.bankName; @@ -259,62 +255,32 @@ function AddPlaidBankAccount({ return {renderPlaidLink()}; } - if (isDisplayedInNewVBBA || isDisplayedInWalletFlow) { - return ( - - {translate(isDisplayedInWalletFlow ? 'walletPage.chooseYourBankAccount' : 'bankAccount.chooseAnAccount')} - {!!text && {text}} - - - - {bankName} - {selectedPlaidAccountMask.length > 0 && ( - {`${translate('bankAccount.accountEnding')} ${selectedPlaidAccountMask}`} - )} - - - {`${translate('bankAccount.chooseAnAccountBelow')}:`} - - - - ); - } - - // Plaid bank accounts view return ( - {!!text && {text}} - + {translate(isDisplayedInWalletFlow ? 'walletPage.chooseYourBankAccount' : 'bankAccount.chooseAnAccount')} + {!!text && {text}} + - {bankName} - - - + + {bankName} + {selectedPlaidAccountMask.length > 0 && ( + {`${translate('bankAccount.accountEnding')} ${selectedPlaidAccountMask}`} + )} + + {`${translate('bankAccount.chooseAnAccountBelow')}:`} + + ); } diff --git a/src/components/AddressForm.tsx b/src/components/AddressForm.tsx index 296ecce7d092..27822fb390a6 100644 --- a/src/components/AddressForm.tsx +++ b/src/components/AddressForm.tsx @@ -3,7 +3,6 @@ import {View} from 'react-native'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import * as ErrorUtils from '@libs/ErrorUtils'; -import type {MaybePhraseKey} from '@libs/Localize'; import * as ValidationUtils from '@libs/ValidationUtils'; import CONST from '@src/CONST'; import type {Country} from '@src/CONST'; @@ -76,7 +75,7 @@ function AddressForm({ const zipSampleFormat = (country && (CONST.COUNTRY_ZIP_REGEX_DATA[country] as CountryZipRegex)?.samples) ?? ''; - const zipFormat: MaybePhraseKey = ['common.zipCodeExampleFormat', {zipSampleFormat}]; + const zipFormat = translate('common.zipCodeExampleFormat', {zipSampleFormat}); const isUSAForm = country === CONST.COUNTRY.US; @@ -87,50 +86,53 @@ function AddressForm({ * @returns - An object containing the errors for each inputID */ - const validator = useCallback((values: FormOnyxValues): Errors => { - const errors: Errors & { - zipPostCode?: string | string[]; - } = {}; - const requiredFields = ['addressLine1', 'city', 'country', 'state'] as const; - - // Check "State" dropdown is a valid state if selected Country is USA - if (values.country === CONST.COUNTRY.US && !values.state) { - errors.state = 'common.error.fieldRequired'; - } - - // Add "Field required" errors if any required field is empty - requiredFields.forEach((fieldKey) => { - const fieldValue = values[fieldKey] ?? ''; - if (ValidationUtils.isRequiredFulfilled(fieldValue)) { - return; + const validator = useCallback( + (values: FormOnyxValues): Errors => { + const errors: Errors & { + zipPostCode?: string | string[]; + } = {}; + const requiredFields = ['addressLine1', 'city', 'country', 'state'] as const; + + // Check "State" dropdown is a valid state if selected Country is USA + if (values.country === CONST.COUNTRY.US && !values.state) { + errors.state = translate('common.error.fieldRequired'); } - errors[fieldKey] = 'common.error.fieldRequired'; - }); + // Add "Field required" errors if any required field is empty + requiredFields.forEach((fieldKey) => { + const fieldValue = values[fieldKey] ?? ''; + if (ValidationUtils.isRequiredFulfilled(fieldValue)) { + return; + } + + errors[fieldKey] = translate('common.error.fieldRequired'); + }); - // If no country is selected, default value is an empty string and there's no related regex data so we default to an empty object - const countryRegexDetails = (values.country ? CONST.COUNTRY_ZIP_REGEX_DATA?.[values.country] : {}) as CountryZipRegex; + // If no country is selected, default value is an empty string and there's no related regex data so we default to an empty object + const countryRegexDetails = (values.country ? CONST.COUNTRY_ZIP_REGEX_DATA?.[values.country] : {}) as CountryZipRegex; - // The postal code system might not exist for a country, so no regex either for them. - const countrySpecificZipRegex = countryRegexDetails?.regex; - const countryZipFormat = countryRegexDetails?.samples ?? ''; + // The postal code system might not exist for a country, so no regex either for them. + const countrySpecificZipRegex = countryRegexDetails?.regex; + const countryZipFormat = countryRegexDetails?.samples ?? ''; - ErrorUtils.addErrorMessage(errors, 'firstName', 'bankAccount.error.firstName'); + ErrorUtils.addErrorMessage(errors, 'firstName', translate('bankAccount.error.firstName')); - if (countrySpecificZipRegex) { - if (!countrySpecificZipRegex.test(values.zipPostCode?.trim().toUpperCase())) { - if (ValidationUtils.isRequiredFulfilled(values.zipPostCode?.trim())) { - errors.zipPostCode = ['privatePersonalDetails.error.incorrectZipFormat', countryZipFormat]; - } else { - errors.zipPostCode = 'common.error.fieldRequired'; + if (countrySpecificZipRegex) { + if (!countrySpecificZipRegex.test(values.zipPostCode?.trim().toUpperCase())) { + if (ValidationUtils.isRequiredFulfilled(values.zipPostCode?.trim())) { + errors.zipPostCode = translate('privatePersonalDetails.error.incorrectZipFormat', countryZipFormat); + } else { + errors.zipPostCode = translate('common.error.fieldRequired'); + } } + } else if (!CONST.GENERIC_ZIP_CODE_REGEX.test(values?.zipPostCode?.trim()?.toUpperCase() ?? '')) { + errors.zipPostCode = translate('privatePersonalDetails.error.incorrectZipFormat'); } - } else if (!CONST.GENERIC_ZIP_CODE_REGEX.test(values?.zipPostCode?.trim()?.toUpperCase() ?? '')) { - errors.zipPostCode = 'privatePersonalDetails.error.incorrectZipFormat'; - } - return errors; - }, []); + return errors; + }, + [translate], + ); return ( void; /** Error text to display */ - errorText?: MaybePhraseKey; + errorText?: string; /** Hint text to display */ hint?: string; diff --git a/src/components/AmountForm.tsx b/src/components/AmountForm.tsx index a102b715d526..3319a28c58b9 100644 --- a/src/components/AmountForm.tsx +++ b/src/components/AmountForm.tsx @@ -12,6 +12,7 @@ import * as MoneyRequestUtils from '@libs/MoneyRequestUtils'; import CONST from '@src/CONST'; import BigNumberPad from './BigNumberPad'; import FormHelpMessage from './FormHelpMessage'; +import isTextInputFocused from './TextInput/BaseTextInput/isTextInputFocused'; import type {BaseTextInputProps, BaseTextInputRef} from './TextInput/BaseTextInput/types'; import TextInputWithCurrencySymbol from './TextInputWithCurrencySymbol'; import type TextInputWithCurrencySymbolProps from './TextInputWithCurrencySymbol/types'; @@ -94,7 +95,7 @@ function AmountForm( if (!textInput.current) { return; } - if (!textInput.current.isFocused()) { + if (!isTextInputFocused(textInput)) { textInput.current.focus(); } }; @@ -143,7 +144,7 @@ function AmountForm( */ const updateAmountNumberPad = useCallback( (key: string) => { - if (shouldUpdateSelection && !textInput.current?.isFocused()) { + if (shouldUpdateSelection && !isTextInputFocused(textInput)) { textInput.current?.focus(); } // Backspace button is pressed @@ -168,7 +169,7 @@ function AmountForm( */ const updateLongPressHandlerState = useCallback((value: boolean) => { setShouldUpdateSelection(!value); - if (!value && !textInput.current?.isFocused()) { + if (!value && !isTextInputFocused(textInput)) { textInput.current?.focus(); } }, []); diff --git a/src/components/AmountPicker/index.tsx b/src/components/AmountPicker/index.tsx index 014932f7736b..b84ec19e2ffd 100644 --- a/src/components/AmountPicker/index.tsx +++ b/src/components/AmountPicker/index.tsx @@ -2,15 +2,12 @@ import React, {forwardRef, useState} from 'react'; import type {ForwardedRef} from 'react'; import {View} from 'react-native'; import MenuItemWithTopDescription from '@components/MenuItemWithTopDescription'; -import useStyleUtils from '@hooks/useStyleUtils'; -import variables from '@styles/variables'; import CONST from '@src/CONST'; import callOrReturn from '@src/types/utils/callOrReturn'; import AmountSelectorModal from './AmountSelectorModal'; import type {AmountPickerProps} from './types'; function AmountPicker({value, description, title, errorText = '', onInputChange, furtherDetails, rightLabel, ...rest}: AmountPickerProps, forwardedRef: ForwardedRef) { - const StyleUtils = useStyleUtils(); const [isPickerVisible, setIsPickerVisible] = useState(false); const showPickerModal = () => { @@ -29,15 +26,12 @@ function AmountPicker({value, description, title, errorText = '', onInputChange, hidePickerModal(); }; - const descStyle = !value || value.length === 0 ? StyleUtils.getFontSizeStyle(variables.fontSizeLabel) : null; - return ( string); /** Form Error description */ - errorText?: MaybePhraseKey; + errorText?: string; /** Callback to call when the input changes */ onInputChange?: (value: string | undefined) => void; diff --git a/src/components/AnchorForAttachmentsOnly/BaseAnchorForAttachmentsOnly.tsx b/src/components/AnchorForAttachmentsOnly/BaseAnchorForAttachmentsOnly.tsx index 595e28acd3bc..48604ec364c7 100644 --- a/src/components/AnchorForAttachmentsOnly/BaseAnchorForAttachmentsOnly.tsx +++ b/src/components/AnchorForAttachmentsOnly/BaseAnchorForAttachmentsOnly.tsx @@ -53,7 +53,7 @@ function BaseAnchorForAttachmentsOnly({style, source = '', displayName = '', dow }} onPressIn={onPressIn} onPressOut={onPressOut} - onLongPress={(event) => showContextMenuForReport(event, anchor, report?.reportID ?? '', action, checkIfContextMenuActive, ReportUtils.isArchivedRoom(report))} + onLongPress={(event) => showContextMenuForReport(event, anchor, report?.reportID ?? '-1', action, checkIfContextMenuActive, ReportUtils.isArchivedRoom(report))} shouldUseHapticsOnLongPress accessibilityLabel={displayName} role={CONST.ROLE.BUTTON} diff --git a/src/components/AnchorForCommentsOnly/BaseAnchorForCommentsOnly.tsx b/src/components/AnchorForCommentsOnly/BaseAnchorForCommentsOnly.tsx index 99a0ee3bf683..4c470858292c 100644 --- a/src/components/AnchorForCommentsOnly/BaseAnchorForCommentsOnly.tsx +++ b/src/components/AnchorForCommentsOnly/BaseAnchorForCommentsOnly.tsx @@ -1,4 +1,4 @@ -import Str from 'expensify-common/lib/str'; +import {Str} from 'expensify-common'; import React, {useEffect, useRef} from 'react'; // eslint-disable-next-line no-restricted-imports import type {Text as RNText} from 'react-native'; @@ -6,9 +6,9 @@ import {StyleSheet} from 'react-native'; import PressableWithSecondaryInteraction from '@components/PressableWithSecondaryInteraction'; import Text from '@components/Text'; import Tooltip from '@components/Tooltip'; +import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; -import useWindowDimensions from '@hooks/useWindowDimensions'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; import * as ReportActionContextMenu from '@pages/home/report/ContextMenu/ReportActionContextMenu'; import CONST from '@src/CONST'; @@ -30,7 +30,7 @@ function BaseAnchorForCommentsOnly({onPressIn, onPressOut, href = '', rel = '', [], ); - const {isSmallScreenWidth} = useWindowDimensions(); + const {shouldUseNarrowLayout} = useResponsiveLayout(); const linkProps: LinkProps = {}; if (onPress) { @@ -38,7 +38,7 @@ function BaseAnchorForCommentsOnly({onPressIn, onPressOut, href = '', rel = '', } else { linkProps.href = href; } - const defaultTextStyle = DeviceCapabilities.canUseTouchScreen() || isSmallScreenWidth ? {} : {...styles.userSelectText, ...styles.cursorPointer}; + const defaultTextStyle = DeviceCapabilities.canUseTouchScreen() || shouldUseNarrowLayout ? {} : {...styles.userSelectText, ...styles.cursorPointer}; const isEmail = Str.isValidEmail(href.replace(/mailto:/i, '')); return ( diff --git a/src/components/ArchivedReportFooter.tsx b/src/components/ArchivedReportFooter.tsx index 9713e40136a2..35f5aeecb5a4 100644 --- a/src/components/ArchivedReportFooter.tsx +++ b/src/components/ArchivedReportFooter.tsx @@ -30,17 +30,17 @@ function ArchivedReportFooter({report, reportClosedAction, personalDetails = {}} const styles = useThemeStyles(); const {translate} = useLocalize(); - const originalMessage = reportClosedAction?.actionName === CONST.REPORT.ACTIONS.TYPE.CLOSED ? reportClosedAction.originalMessage : null; + const originalMessage = ReportActionsUtils.isClosedAction(reportClosedAction) ? ReportActionsUtils.getOriginalMessage(reportClosedAction) : null; const archiveReason = originalMessage?.reason ?? CONST.REPORT.ARCHIVE_REASON.DEFAULT; - const actorPersonalDetails = personalDetails?.[reportClosedAction?.actorAccountID ?? 0]; + const actorPersonalDetails = personalDetails?.[reportClosedAction?.actorAccountID ?? -1]; let displayName = PersonalDetailsUtils.getDisplayNameOrDefault(actorPersonalDetails); let oldDisplayName: string | undefined; if (archiveReason === CONST.REPORT.ARCHIVE_REASON.ACCOUNT_MERGED) { const newAccountID = originalMessage?.newAccountID; const oldAccountID = originalMessage?.oldAccountID; - displayName = PersonalDetailsUtils.getDisplayNameOrDefault(personalDetails?.[newAccountID ?? 0]); - oldDisplayName = PersonalDetailsUtils.getDisplayNameOrDefault(personalDetails?.[oldAccountID ?? 0]); + displayName = PersonalDetailsUtils.getDisplayNameOrDefault(personalDetails?.[newAccountID ?? -1]); + oldDisplayName = PersonalDetailsUtils.getDisplayNameOrDefault(personalDetails?.[oldAccountID ?? -1]); } const shouldRenderHTML = archiveReason !== CONST.REPORT.ARCHIVE_REASON.DEFAULT; @@ -64,7 +64,7 @@ function ArchivedReportFooter({report, reportClosedAction, personalDetails = {}} return ( ; + reportID?: string; + accountID?: number; +}; + +const AttachmentContext = createContext({ + type: undefined, + reportID: undefined, + accountID: undefined, +}); + +AttachmentContext.displayName = 'AttachmentContext'; + +export { + // eslint-disable-next-line import/prefer-default-export + AttachmentContext, +}; diff --git a/src/components/AttachmentModal.tsx b/src/components/AttachmentModal.tsx index de98ba79d23c..c3b5acafc6fc 100644 --- a/src/components/AttachmentModal.tsx +++ b/src/components/AttachmentModal.tsx @@ -1,12 +1,14 @@ -import Str from 'expensify-common/lib/str'; +import {Str} from 'expensify-common'; import React, {memo, useCallback, useEffect, useMemo, useState} from 'react'; import {Animated, Keyboard, View} from 'react-native'; import {GestureHandlerRootView} from 'react-native-gesture-handler'; import {withOnyx} from 'react-native-onyx'; import type {OnyxEntry} from 'react-native-onyx'; import {useSharedValue} from 'react-native-reanimated'; +import type {ValueOf} from 'type-fest'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; +import useResponsiveLayout from '@hooks/useResponsiveLayout'; import useStyleUtils from '@hooks/useStyleUtils'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; @@ -16,7 +18,6 @@ import * as FileUtils from '@libs/fileDownload/FileUtils'; import Navigation from '@libs/Navigation/Navigation'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; -import useNativeDriver from '@libs/useNativeDriver'; import type {AvatarSource} from '@libs/UserUtils'; import variables from '@styles/variables'; import * as IOU from '@userActions/IOU'; @@ -100,6 +101,12 @@ type AttachmentModalProps = AttachmentModalOnyxProps & { /** The report that has this attachment */ report?: OnyxEntry | EmptyObject; + /** The type of the attachment */ + type?: ValueOf; + + /** If the attachment originates from a note, the accountID will represent the author of that note. */ + accountID?: number; + /** Optional callback to fire when we want to do something after modal show. */ onModalShow?: () => void; @@ -155,6 +162,8 @@ function AttachmentModal({ onModalClose = () => {}, isLoading = false, shouldShowNotFoundPage = false, + type = undefined, + accountID = undefined, }: AttachmentModalProps) { const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); @@ -170,8 +179,9 @@ function AttachmentModal({ const [isConfirmButtonDisabled, setIsConfirmButtonDisabled] = useState(false); const [confirmButtonFadeAnimation] = useState(() => new Animated.Value(1)); const [isDownloadButtonReadyToBeShown, setIsDownloadButtonReadyToBeShown] = React.useState(true); + const {windowWidth} = useWindowDimensions(); + const {shouldUseNarrowLayout} = useResponsiveLayout(); const nope = useSharedValue(false); - const {windowWidth, isSmallScreenWidth} = useWindowDimensions(); const isOverlayModalVisible = (isReceiptAttachment && isDeleteReceiptConfirmModalVisible) || (!isReceiptAttachment && isAttachmentInvalid); const iouType = useMemo(() => (isTrackExpenseAction ? CONST.IOU.TYPE.TRACK : CONST.IOU.TYPE.SUBMIT), [isTrackExpenseAction]); @@ -271,9 +281,9 @@ function AttachmentModal({ * Detach the receipt and close the modal. */ const deleteAndCloseModal = useCallback(() => { - IOU.detachReceipt(transaction?.transactionID ?? ''); + IOU.detachReceipt(transaction?.transactionID ?? '-1'); setIsDeleteReceiptConfirmModalVisible(false); - Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report?.reportID ?? '')); + Navigation.goBack(ROUTES.REPORT_WITH_ID_DETAILS.getRoute(report?.reportID ?? '-1')); }, [transaction, report]); const isValidFile = useCallback((fileObject: FileObject) => { @@ -348,28 +358,6 @@ function AttachmentModal({ [isValidFile, getModalType, isDirectoryCheck], ); - /** - * In order to gracefully hide/show the confirm button when the keyboard - * opens/closes, apply an animation to fade the confirm button out/in. And since - * we're only updating the opacity of the confirm button, we must also conditionally - * disable it. - * - * @param shouldFadeOut If true, fade out confirm button. Otherwise fade in. - */ - const updateConfirmButtonVisibility = useCallback( - (shouldFadeOut: boolean) => { - setIsConfirmButtonDisabled(shouldFadeOut); - const toValue = shouldFadeOut ? 0 : 1; - - Animated.timing(confirmButtonFadeAnimation, { - toValue, - duration: 100, - useNativeDriver, - }).start(); - }, - [confirmButtonFadeAnimation], - ); - /** * close the modal */ @@ -416,8 +404,8 @@ function AttachmentModal({ ROUTES.MONEY_REQUEST_STEP_SCAN.getRoute( CONST.IOU.ACTION.EDIT, iouType, - transaction?.transactionID ?? '', - report?.reportID ?? '', + transaction?.transactionID ?? '-1', + report?.reportID ?? '-1', Navigation.getActiveRouteWithoutParams(), ), ); @@ -451,7 +439,7 @@ function AttachmentModal({ let shouldShowThreeDotsButton = false; if (!isEmptyObject(report)) { headerTitleNew = translate(isReceiptAttachment ? 'common.receipt' : 'common.attachment'); - shouldShowDownloadButton = allowDownload && isDownloadButtonReadyToBeShown && !isReceiptAttachment && !isOffline; + shouldShowDownloadButton = allowDownload && isDownloadButtonReadyToBeShown && !shouldShowNotFoundPage && !isReceiptAttachment && !isOffline; shouldShowThreeDotsButton = isReceiptAttachment && isModalOpen && threeDotsMenuItems.length !== 0; } const context = useMemo( @@ -486,14 +474,14 @@ function AttachmentModal({ propagateSwipe > - {isSmallScreenWidth && } + {shouldUseNarrowLayout && } downloadAttachment()} - shouldShowCloseButton={!isSmallScreenWidth} - shouldShowBackButton={isSmallScreenWidth} + shouldShowCloseButton={!shouldUseNarrowLayout} + shouldShowBackButton={shouldUseNarrowLayout} onBackButtonPress={closeModal} onCloseButtonPress={closeModal} shouldShowThreeDotsButton={shouldShowThreeDotsButton} @@ -515,45 +503,47 @@ function AttachmentModal({ onLinkPress={() => Navigation.dismissModal()} /> )} - {!isEmptyObject(report) && !isReceiptAttachment ? ( - - ) : ( - !!sourceForAttachmentView && - shouldLoadAttachment && - !isLoading && - !shouldShowNotFoundPage && ( - - - - ) - )} + {!shouldShowNotFoundPage && + (!isEmptyObject(report) && !isReceiptAttachment ? ( + + ) : ( + !!sourceForAttachmentView && + shouldLoadAttachment && + !isLoading && ( + + + + ) + ))} {/* If we have an onConfirm method show a confirmation button */} - {!!onConfirm && ( + {!!onConfirm && !isConfirmButtonDisabled && ( {({safeAreaPaddingBottomStyle}) => ( - )} - {/** + + {isHidden ? translate('moderation.revealMessage') : translate('moderation.hideMessage')} + + + )} + {/** These are the actionable buttons that appear at the bottom of a Concierge message for example: Invite a user mentioned but not a member of the room https://github.com/Expensify/App/issues/32741 */} - {actionableItemButtons.length > 0 && ( - - )} - - ) : ( - - )} + {actionableItemButtons.length > 0 && ( + + )} + + ) : ( + + )} + ); } @@ -742,6 +746,7 @@ function ReportActionItem({ * @param hasErrors whether the report action has any errors * @returns report action item */ + const renderReportActionItem = (hovered: boolean, isWhisper: boolean, hasErrors: boolean): React.JSX.Element => { const content = renderItemContent(hovered || isContextMenuActive || isEmojiPickerActive, isWhisper, hasErrors); @@ -772,120 +777,38 @@ function ReportActionItem({ return {content}; }; - if (action.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED) { - if (ReportActionsUtils.isTransactionThread(parentReportAction)) { - const isReversedTransaction = ReportActionsUtils.isReversedTransaction(parentReportAction); - if (ReportActionsUtils.isDeletedParentAction(parentReportAction) || isReversedTransaction) { - let message: TranslationPaths; - if (isReversedTransaction) { - message = 'parentReportAction.reversedTransaction'; - } else { - message = 'parentReportAction.deletedExpense'; - } - return ( - - - - - ${translate(message)}`} /> - - - - - ); - } - return ( - - - - {renderThreadDivider} - - - ); - } - if (ReportUtils.isTaskReport(report)) { - if (ReportUtils.isCanceledTaskReport(report, parentReportAction)) { - return ( - - - - - ${translate('parentReportAction.deletedTask')}`} /> - - - - - ); - } - return ( - - - - - {renderThreadDivider} - - - ); - } - if (ReportUtils.isExpenseReport(report) || ReportUtils.isIOUReport(report) || ReportUtils.isInvoiceReport(report)) { + if (action.actionName === CONST.REPORT.ACTIONS.TYPE.TRIPPREVIEW) { + if (ReportUtils.isTripRoom(report)) { return ( - {transactionThreadReport && !isEmptyObject(transactionThreadReport) ? ( - <> - {transactionCurrency !== report.currency && ( - <> - - {renderThreadDivider} - - )} - - - - {renderThreadDivider} - - - - ) : ( - <> - - {renderThreadDivider} - - )} + ); } + } + + if (action.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED) { + const transactionID = ReportActionsUtils.isMoneyRequestAction(parentReportActionForTransactionThread) + ? ReportActionsUtils.getOriginalMessage(parentReportActionForTransactionThread)?.IOUTransactionID + : '-1'; return ( - ); } if (action.actionName === CONST.REPORT.ACTIONS.TYPE.RENAMED) { return ; } - if (action.actionName === CONST.REPORT.ACTIONS.TYPE.CHRONOS_OOO_LIST) { + if (ReportActionsUtils.isChronosOOOListAction(action)) { return ( 1; - const iouReportID = isIOUReport(action) && action.originalMessage.IOUReportID ? action.originalMessage.IOUReportID.toString() : '0'; + const iouReportID = + ReportActionsUtils.isMoneyRequestAction(action) && ReportActionsUtils.getOriginalMessage(action)?.IOUReportID + ? (ReportActionsUtils.getOriginalMessage(action)?.IOUReportID ?? '').toString() + : '-1'; const transactionsWithReceipts = ReportUtils.getTransactionsWithReceipts(iouReportID); - const isWhisper = whisperedTo.length > 0 && transactionsWithReceipts.length === 0 && !action.pendingAction; + const isWhisper = whisperedTo.length > 0 && transactionsWithReceipts.length === 0; const whisperedToPersonalDetails = isWhisper ? (Object.values(personalDetails ?? {}).filter((details) => whisperedTo.includes(details?.accountID ?? -1)) as OnyxTypes.PersonalDetails[]) : []; @@ -929,7 +860,7 @@ function ReportActionItem({ isSmallScreenWidth && DeviceCapabilities.canUseTouchScreen() && ControlSelection.block()} onPressOut={() => ControlSelection.unblock()} onSecondaryInteraction={showPopover} @@ -939,26 +870,29 @@ function ReportActionItem({ accessible > {(hovered) => ( {shouldDisplayNewMarker && (!shouldUseThreadDividerLine || !isFirstVisibleReportAction) && } - + {shouldDisplayContextMenu && ( + + )} ({ iouReport: { key: ({action}) => { const iouReportID = ReportActionsUtils.getIOUReportIDFromReportActionPreview(action); - return `${ONYXKEYS.COLLECTION.REPORT}${iouReportID ?? 0}`; + return `${ONYXKEYS.COLLECTION.REPORT}${iouReportID ?? -1}`; }, initialValue: {} as OnyxTypes.Report, }, - policy: { - key: ({report}) => `${ONYXKEYS.COLLECTION.POLICY}${report.policyID ?? 0}`, - initialValue: {} as OnyxTypes.Policy, - }, emojiReactions: { key: ({action}) => `${ONYXKEYS.COLLECTION.REPORT_ACTIONS_REACTIONS}${action.reportActionID}`, initialValue: {}, @@ -1032,23 +962,20 @@ export default withOnyx({ userWallet: { key: ONYXKEYS.USER_WALLET, }, - transaction: { - key: ({parentReportActionForTransactionThread}) => { - const transactionID = (parentReportActionForTransactionThread as OnyxTypes.OriginalMessageIOU)?.originalMessage.IOUTransactionID - ? (parentReportActionForTransactionThread as OnyxTypes.OriginalMessageIOU).originalMessage.IOUTransactionID - : 0; - return `${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID}`; - }, - }, linkedTransactionRouteError: { - key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${(action as OnyxTypes.OriginalMessageIOU)?.originalMessage?.IOUTransactionID ?? 0}`, + key: ({action}) => + `${ONYXKEYS.COLLECTION.TRANSACTION}${ReportActionsUtils.isMoneyRequestAction(action) ? ReportActionsUtils.getOriginalMessage(action)?.IOUTransactionID ?? -1 : -1}`, selector: (transaction: OnyxEntry) => transaction?.errorFields?.route ?? null, }, + modal: { + key: ONYXKEYS.MODAL, + }, })( memo(ReportActionItem, (prevProps, nextProps) => { const prevParentReportAction = prevProps.parentReportAction; const nextParentReportAction = nextProps.parentReportAction; return ( + prevProps.modal?.willAlertModalBecomeVisible === nextProps.modal?.willAlertModalBecomeVisible && prevProps.displayAsGroup === nextProps.displayAsGroup && prevProps.isMostRecentIOUReportAction === nextProps.isMostRecentIOUReportAction && prevProps.shouldDisplayNewMarker === nextProps.shouldDisplayNewMarker && @@ -1074,12 +1001,11 @@ export default withOnyx({ prevProps.report?.nonReimbursableTotal === nextProps.report?.nonReimbursableTotal && prevProps.linkedReportActionID === nextProps.linkedReportActionID && lodashIsEqual(prevProps.report.fieldList, nextProps.report.fieldList) && - lodashIsEqual(prevProps.policy, nextProps.policy) && lodashIsEqual(prevProps.transactionThreadReport, nextProps.transactionThreadReport) && lodashIsEqual(prevProps.reportActions, nextProps.reportActions) && - lodashIsEqual(prevProps.transaction, nextProps.transaction) && lodashIsEqual(prevProps.linkedTransactionRouteError, nextProps.linkedTransactionRouteError) && - lodashIsEqual(prevParentReportAction, nextParentReportAction) + lodashIsEqual(prevParentReportAction, nextParentReportAction) && + prevProps.modal?.willAlertModalBecomeVisible === nextProps.modal?.willAlertModalBecomeVisible ); }), ); diff --git a/src/pages/home/report/ReportActionItemBasicMessage.tsx b/src/pages/home/report/ReportActionItemBasicMessage.tsx index a28f2af24448..20098933b02e 100644 --- a/src/pages/home/report/ReportActionItemBasicMessage.tsx +++ b/src/pages/home/report/ReportActionItemBasicMessage.tsx @@ -1,4 +1,4 @@ -import Str from 'expensify-common/lib/str'; +import {Str} from 'expensify-common'; import React from 'react'; import {View} from 'react-native'; import Text from '@components/Text'; diff --git a/src/pages/home/report/ReportActionItemContentCreated.tsx b/src/pages/home/report/ReportActionItemContentCreated.tsx new file mode 100644 index 000000000000..a48d1d370db2 --- /dev/null +++ b/src/pages/home/report/ReportActionItemContentCreated.tsx @@ -0,0 +1,202 @@ +import lodashIsEqual from 'lodash/isEqual'; +import React, {memo, useMemo} from 'react'; +import {View} from 'react-native'; +import {useOnyx} from 'react-native-onyx'; +import type {OnyxEntry} from 'react-native-onyx'; +import OfflineWithFeedback from '@components/OfflineWithFeedback'; +import RenderHTML from '@components/RenderHTML'; +import MoneyReportView from '@components/ReportActionItem/MoneyReportView'; +import MoneyRequestView from '@components/ReportActionItem/MoneyRequestView'; +import TaskView from '@components/ReportActionItem/TaskView'; +import {ShowContextMenuContext} from '@components/ShowContextMenuContext'; +import type {ShowContextMenuContextProps} from '@components/ShowContextMenuContext'; +import SpacerView from '@components/SpacerView'; +import UnreadActionIndicator from '@components/UnreadActionIndicator'; +import useLocalize from '@hooks/useLocalize'; +import useThemeStyles from '@hooks/useThemeStyles'; +import * as ReportActionsUtils from '@libs/ReportActionsUtils'; +import * as ReportUtils from '@libs/ReportUtils'; +import * as TransactionUtils from '@libs/TransactionUtils'; +import type {TranslationPaths} from '@src/languages/types'; +import ONYXKEYS from '@src/ONYXKEYS'; +import type * as OnyxTypes from '@src/types/onyx'; +import {isEmptyObject} from '@src/types/utils/EmptyObject'; +import AnimatedEmptyStateBackground from './AnimatedEmptyStateBackground'; +import ReportActionItemCreated from './ReportActionItemCreated'; +import ReportActionItemSingle from './ReportActionItemSingle'; + +type ReportActionItemContentCreatedProps = { + /** The context value containing the report and action data, along with the show context menu props */ + contextValue: ShowContextMenuContextProps & { + report: OnyxTypes.Report; + action: OnyxTypes.ReportAction; + }; + + /** Report action belonging to the report's parent */ + parentReportAction: OnyxEntry; + + /** The transaction ID */ + transactionID: string | undefined; + + /** The draft message */ + draftMessage: string | undefined; + + /** Flag to show, hide the thread divider line */ + shouldHideThreadDividerLine: boolean; +}; + +function ReportActionItemContentCreated({contextValue, parentReportAction, transactionID, draftMessage, shouldHideThreadDividerLine}: ReportActionItemContentCreatedProps) { + const styles = useThemeStyles(); + const {translate} = useLocalize(); + + const {report, action, transactionThreadReport} = contextValue; + + const [policy] = useOnyx(`${ONYXKEYS.COLLECTION.POLICY}${report.policyID ?? '-1'}`); + const [transaction] = useOnyx(`${ONYXKEYS.COLLECTION.TRANSACTION}${transactionID ?? '-1'}`); + + const transactionCurrency = TransactionUtils.getCurrency(transaction); + + const renderThreadDivider = useMemo( + () => + shouldHideThreadDividerLine ? ( + + ) : ( + + ), + [shouldHideThreadDividerLine, report.reportID, styles.reportHorizontalRule], + ); + + if (ReportActionsUtils.isTransactionThread(parentReportAction)) { + const isReversedTransaction = ReportActionsUtils.isReversedTransaction(parentReportAction); + + if (ReportActionsUtils.isDeletedParentAction(parentReportAction) || isReversedTransaction) { + let message: TranslationPaths; + + if (isReversedTransaction) { + message = 'parentReportAction.reversedTransaction'; + } else { + message = 'parentReportAction.deletedExpense'; + } + + return ( + + + + + ${translate(message)}`} /> + + + + + ); + } + + return ( + + + + {renderThreadDivider} + + + ); + } + + if (ReportUtils.isTaskReport(report)) { + if (ReportUtils.isCanceledTaskReport(report, parentReportAction)) { + return ( + + + + + ${translate('parentReportAction.deletedTask')}`} /> + + + + + ); + } + + return ( + + + + + {renderThreadDivider} + + + ); + } + + if (ReportUtils.isExpenseReport(report) || ReportUtils.isIOUReport(report) || ReportUtils.isInvoiceReport(report)) { + return ( + + {transactionThreadReport && !isEmptyObject(transactionThreadReport) ? ( + <> + {transactionCurrency !== report.currency && ( + <> + + {renderThreadDivider} + + )} + + + + {renderThreadDivider} + + + + ) : ( + <> + + {renderThreadDivider} + + )} + + ); + } + + return ( + + ); +} + +ReportActionItemContentCreated.displayName = 'ReportActionItemContentCreated'; + +export default memo( + ReportActionItemContentCreated, + (prevProps, nextProps) => + lodashIsEqual(prevProps.contextValue, nextProps.contextValue) && + lodashIsEqual(prevProps.parentReportAction, nextProps.parentReportAction) && + prevProps.transactionID === nextProps.transactionID && + prevProps.draftMessage === nextProps.draftMessage && + prevProps.shouldHideThreadDividerLine === nextProps.shouldHideThreadDividerLine, +); diff --git a/src/pages/home/report/ReportActionItemFragment.tsx b/src/pages/home/report/ReportActionItemFragment.tsx index 8f19d452f150..27227251b0b6 100644 --- a/src/pages/home/report/ReportActionItemFragment.tsx +++ b/src/pages/home/report/ReportActionItemFragment.tsx @@ -10,8 +10,9 @@ import convertToLTR from '@libs/convertToLTR'; import * as ReportUtils from '@libs/ReportUtils'; import CONST from '@src/CONST'; import type * as OnyxCommon from '@src/types/onyx/OnyxCommon'; -import type {ActionName, DecisionName, OriginalMessageSource} from '@src/types/onyx/OriginalMessage'; +import type {DecisionName, OriginalMessageSource} from '@src/types/onyx/OriginalMessage'; import type {Message} from '@src/types/onyx/ReportAction'; +import type ReportActionName from '@src/types/onyx/ReportActionName'; import AttachmentCommentFragment from './comment/AttachmentCommentFragment'; import TextCommentFragment from './comment/TextCommentFragment'; @@ -59,7 +60,7 @@ type ReportActionItemFragmentProps = { pendingAction?: OnyxCommon.PendingAction; /** The report action name */ - actionName?: ActionName; + actionName?: ReportActionName; moderationDecision?: DecisionName; }; @@ -70,7 +71,7 @@ const MUTED_ACTIONS = [ CONST.REPORT.ACTIONS.TYPE.APPROVED, CONST.REPORT.ACTIONS.TYPE.MOVED, CONST.REPORT.ACTIONS.TYPE.ACTIONABLE_JOIN_REQUEST, -] as ActionName[]; +] as ReportActionName[]; function ReportActionItemFragment({ pendingAction, diff --git a/src/pages/home/report/ReportActionItemMessage.tsx b/src/pages/home/report/ReportActionItemMessage.tsx index 35bf2507ba64..d97a7218bf7f 100644 --- a/src/pages/home/report/ReportActionItemMessage.tsx +++ b/src/pages/home/report/ReportActionItemMessage.tsx @@ -12,7 +12,7 @@ import * as ReportUtils from '@libs/ReportUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; import type {ReportAction, Transaction} from '@src/types/onyx'; -import type {OriginalMessageAddComment} from '@src/types/onyx/OriginalMessage'; +import type {Message} from '@src/types/onyx/ReportAction'; import TextCommentFragment from './comment/TextCommentFragment'; import ReportActionItemFragment from './ReportActionItemFragment'; @@ -42,7 +42,13 @@ function ReportActionItemMessage({action, transaction, displayAsGroup, reportID, const styles = useThemeStyles(); const {translate} = useLocalize(); - const fragments = (action.previousMessage ?? action.message ?? []).filter((item) => !!item); + const actionMessage = action.previousMessage ?? action.message; + let fragments: Message[] = []; + if (Array.isArray(actionMessage)) { + fragments = actionMessage.filter((item): item is Message => !!item); + } else { + fragments = actionMessage ? [actionMessage] : []; + } const isIOUReport = ReportActionsUtils.isMoneyRequestAction(action); if (ReportActionsUtils.isMemberChangeAction(action)) { @@ -63,7 +69,7 @@ function ReportActionItemMessage({action, transaction, displayAsGroup, reportID, let iouMessage: string | undefined; if (isIOUReport) { - const originalMessage = action.actionName === CONST.REPORT.ACTIONS.TYPE.IOU ? action.originalMessage : null; + const originalMessage = action.actionName === CONST.REPORT.ACTIONS.TYPE.IOU ? ReportActionsUtils.getOriginalMessage(action) : null; const iouReportID = originalMessage?.IOUReportID; if (iouReportID) { iouMessage = ReportUtils.getIOUReportActionDisplayMessage(action, transaction); @@ -89,8 +95,8 @@ function ReportActionItemMessage({action, transaction, displayAsGroup, reportID, isThreadParentMessage={ReportActionsUtils.isThreadParentMessage(action, reportID)} pendingAction={action.pendingAction} actionName={action.actionName} - source={(action.originalMessage as OriginalMessageAddComment['originalMessage'])?.source} - accountID={action.actorAccountID ?? 0} + source={ReportActionsUtils.isAddCommentAction(action) ? ReportActionsUtils.getOriginalMessage(action)?.source : ''} + accountID={action.actorAccountID ?? -1} style={style} displayAsGroup={displayAsGroup} isApprovedOrSubmittedReportAction={isApprovedOrSubmittedReportAction} @@ -100,7 +106,7 @@ function ReportActionItemMessage({action, transaction, displayAsGroup, reportID, // to decide if the fragment should be from left to right for RTL display names e.g. Arabic for proper // formatting. isFragmentContainingDisplayName={index === 0} - moderationDecision={action.message?.[0]?.moderationDecision?.decision} + moderationDecision={ReportActionsUtils.getReportActionMessage(action)?.moderationDecision?.decision} /> )); @@ -125,6 +131,6 @@ ReportActionItemMessage.displayName = 'ReportActionItemMessage'; export default withOnyx({ transaction: { - key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${ReportActionsUtils.getLinkedTransactionID(action) ?? 0}`, + key: ({action}) => `${ONYXKEYS.COLLECTION.TRANSACTION}${ReportActionsUtils.getLinkedTransactionID(action) ?? -1}`, }, })(ReportActionItemMessage); diff --git a/src/pages/home/report/ReportActionItemMessageEdit.tsx b/src/pages/home/report/ReportActionItemMessageEdit.tsx index 6cb03e8dae05..d3c8ca3af8de 100644 --- a/src/pages/home/report/ReportActionItemMessageEdit.tsx +++ b/src/pages/home/report/ReportActionItemMessageEdit.tsx @@ -1,8 +1,7 @@ -import ExpensiMark from 'expensify-common/lib/ExpensiMark'; import lodashDebounce from 'lodash/debounce'; import type {ForwardedRef} from 'react'; import React, {forwardRef, useCallback, useEffect, useMemo, useRef, useState} from 'react'; -import {Keyboard, View} from 'react-native'; +import {InteractionManager, Keyboard, View} from 'react-native'; import type {NativeSyntheticEvent, TextInput, TextInputFocusEventData, TextInputKeyPressEventData} from 'react-native'; import {useOnyx} from 'react-native-onyx'; import type {Emoji} from '@assets/emojis/types'; @@ -27,6 +26,7 @@ import * as EmojiUtils from '@libs/EmojiUtils'; import focusComposerWithDelay from '@libs/focusComposerWithDelay'; import type {Selection} from '@libs/focusComposerWithDelay/types'; import focusEditAfterCancelDelete from '@libs/focusEditAfterCancelDelete'; +import {parseHtmlToMarkdown} from '@libs/OnyxAwareParser'; import onyxSubscribe from '@libs/onyxSubscribe'; import ReportActionComposeFocusManager from '@libs/ReportActionComposeFocusManager'; import * as ReportActionsUtils from '@libs/ReportActionsUtils'; @@ -58,6 +58,9 @@ type ReportActionItemMessageEditProps = { /** Whether or not the emoji picker is disabled */ shouldDisableEmojiPicker?: boolean; + + /** Whether report is from group policy */ + isGroupPolicyReport?: boolean; }; // native ids @@ -66,8 +69,11 @@ const messageEditInput = 'messageEditInput'; const shouldUseForcedSelectionRange = shouldUseEmojiPickerSelection(); +// video source -> video attributes +const draftMessageVideoAttributeCache = new Map(); + function ReportActionItemMessageEdit( - {action, draftMessage, reportID, index, shouldDisableEmojiPicker = false}: ReportActionItemMessageEditProps, + {action, draftMessage, reportID, index, isGroupPolicyReport, shouldDisableEmojiPicker = false}: ReportActionItemMessageEditProps, forwardedRef: ForwardedRef, ) { const [preferredSkinTone] = useOnyx(ONYXKEYS.PREFERRED_EMOJI_SKIN_TONE, {initialValue: CONST.EMOJI_DEFAULT_SKIN_TONE}); @@ -105,13 +111,12 @@ function ReportActionItemMessageEdit( const isCommentPendingSaved = useRef(false); useEffect(() => { - const parser = new ExpensiMark(); - const originalMessage = parser.htmlToMarkdown(action.message?.[0]?.html ?? ''); - if ( - ReportActionsUtils.isDeletedAction(action) || - Boolean(action.message && draftMessage === originalMessage) || - Boolean(prevDraftMessage === draftMessage || isCommentPendingSaved.current) - ) { + draftMessageVideoAttributeCache.clear(); + + const originalMessage = parseHtmlToMarkdown(ReportActionsUtils.getReportActionHtml(action), undefined, undefined, (videoSource, attrs) => { + draftMessageVideoAttributeCache.set(videoSource, attrs); + }); + if (ReportActionsUtils.isDeletedAction(action) || !!(action.message && draftMessage === originalMessage) || !!(prevDraftMessage === draftMessage || isCommentPendingSaved.current)) { return; } setDraft(draftMessage); @@ -130,7 +135,7 @@ function ReportActionItemMessageEdit( const unsubscribeOnyxModal = onyxSubscribe({ key: ONYXKEYS.MODAL, callback: (modalArg) => { - if (modalArg === null) { + if (modalArg === undefined) { return; } setModal(modalArg); @@ -140,7 +145,7 @@ function ReportActionItemMessageEdit( const unsubscribeOnyxFocused = onyxSubscribe({ key: ONYXKEYS.INPUT_FOCUSED, callback: (modalArg) => { - if (modalArg === null) { + if (modalArg === undefined) { return; } setOnyxFocused(modalArg); @@ -301,7 +306,7 @@ function ReportActionItemMessageEdit( ReportActionContextMenu.showDeleteModal(reportID, action, true, deleteDraft, () => focusEditAfterCancelDelete(textInputRef.current)); return; } - Report.editReportComment(reportID, action, trimmedNewDraft); + Report.editReportComment(reportID, action, trimmedNewDraft, Object.fromEntries(draftMessageVideoAttributeCache)); deleteDraft(); }, [action, deleteDraft, draft, reportID]); @@ -406,7 +411,11 @@ function ReportActionItemMessageEdit( style={[styles.textInputCompose, styles.flex1, styles.bgTransparent]} onFocus={() => { setIsFocused(true); - reportScrollManager.scrollToIndex(index, true); + InteractionManager.runAfterInteractions(() => { + requestAnimationFrame(() => { + reportScrollManager.scrollToIndex(index, true); + }); + }); setShouldShowComposeInputKeyboardAware(false); // Clear active report action when another action gets focused @@ -428,6 +437,7 @@ function ReportActionItemMessageEdit( }} selection={selection} onSelectionChange={(e) => setSelection(e.nativeEvent.selection)} + isGroupPolicyReport={isGroupPolicyReport} /> diff --git a/src/pages/home/report/ReportActionItemParentAction.tsx b/src/pages/home/report/ReportActionItemParentAction.tsx index e97c51377476..720c2b174164 100644 --- a/src/pages/home/report/ReportActionItemParentAction.tsx +++ b/src/pages/home/report/ReportActionItemParentAction.tsx @@ -63,6 +63,7 @@ function ReportActionItemParentAction({ }: ReportActionItemParentActionProps) { const styles = useThemeStyles(); const ancestorIDs = useRef(ReportUtils.getAllAncestorReportActionIDs(report)); + const ancestorReports = useRef>>({}); const [allAncestors, setAllAncestors] = useState([]); const {isOffline} = useNetwork(); @@ -73,7 +74,8 @@ function ReportActionItemParentAction({ unsubscribeReports.push( onyxSubscribe({ key: `${ONYXKEYS.COLLECTION.REPORT}${ancestorReportID}`, - callback: () => { + callback: (val) => { + ancestorReports.current[ancestorReportID] = val; setAllAncestors(ReportUtils.getAllAncestorReportActions(report)); }, }), @@ -101,7 +103,7 @@ function ReportActionItemParentAction({ {allAncestors.map((ancestor) => ( { - const isVisibleAction = ReportActionsUtils.shouldReportActionBeVisible(ancestor.reportAction, ancestor.reportAction.reportActionID ?? ''); + const isVisibleAction = ReportActionsUtils.shouldReportActionBeVisible(ancestor.reportAction, ancestor.reportAction.reportActionID ?? '-1'); // Pop the thread report screen before navigating to the chat report. - Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(ancestor.report.parentReportID ?? '')); + Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(ancestor.report.parentReportID ?? '-1')); if (isVisibleAction && !isOffline) { // Pop the chat report screen before navigating to the linked report action. - Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(ancestor.report.parentReportID ?? '', ancestor.reportAction.reportActionID)); + Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(ancestor.report.parentReportID ?? '-1', ancestor.reportAction.reportActionID)); } } : undefined diff --git a/src/pages/home/report/ReportActionItemSingle.tsx b/src/pages/home/report/ReportActionItemSingle.tsx index f71db06c2d44..ac2228bf272a 100644 --- a/src/pages/home/report/ReportActionItemSingle.tsx +++ b/src/pages/home/report/ReportActionItemSingle.tsx @@ -19,6 +19,7 @@ import useThemeStyles from '@hooks/useThemeStyles'; import ControlSelection from '@libs/ControlSelection'; import DateUtils from '@libs/DateUtils'; import Navigation from '@libs/Navigation/Navigation'; +import {getReportActionMessage} from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; import CONST from '@src/CONST'; import ROUTES from '@src/ROUTES'; @@ -171,7 +172,7 @@ function ReportActionItemSingle({ const shouldDisableDetailPage = useMemo( () => - CONST.RESTRICTED_ACCOUNT_IDS.includes(actorAccountID ?? 0) || + CONST.RESTRICTED_ACCOUNT_IDS.includes(actorAccountID ?? -1) || (!isWorkspaceActor && ReportUtils.isOptimisticPersonalDetail(action?.delegateAccountID ? Number(action.delegateAccountID) : actorAccountID ?? -1)), [action, isWorkspaceActor, actorAccountID], ); @@ -198,8 +199,8 @@ function ReportActionItemSingle({ } return ( @@ -249,16 +250,16 @@ function ReportActionItemSingle({ ))} - {Boolean(hasEmojiStatus) && ( + {!!hasEmojiStatus && ( sortedVisibleReportActions.find((item) => !ReportActionsUtils.isWhisperAction(item)) ?? null, [sortedVisibleReportActions]); - const lastActionIndex = sortedVisibleReportActions[0]?.reportActionID; const reportActionSize = useRef(sortedVisibleReportActions.length); - const hasNewestReportAction = newestVisibleReportAction?.created === report.lastVisibleActionCreated; + const hasNewestReportAction = sortedVisibleReportActions[0]?.created === report.lastVisibleActionCreated; const hasNewestReportActionRef = useRef(hasNewestReportAction); hasNewestReportActionRef.current = hasNewestReportAction; const previousLastIndex = useRef(lastActionIndex); const isLastPendingActionIsDelete = sortedReportActions?.[0]?.pendingAction === CONST.RED_BRICK_ROAD_PENDING_ACTION.DELETE; - const linkedReportActionID = route.params?.reportActionID ?? ''; + const linkedReportActionID = route.params?.reportActionID ?? '-1'; // This state is used to force a re-render when the user manually marks a message as unread // by using a timestamp you can force re-renders without having to worry about if another message was marked as unread before @@ -447,12 +444,14 @@ function ReportActionsList({ * Evaluate new unread marker visibility for each of the report actions. */ const shouldDisplayNewMarker = useCallback( - (reportAction: OnyxTypes.ReportAction, index: number): boolean => { + (reportAction: OnyxTypes.ReportAction, index: number, lastReadTime?: string, shouldCheckWithCurrentUnreadMarker?: boolean): boolean => { + // if lastReadTime is null, use the lastReadTimeRef.current + const baseLastReadTime = lastReadTime ?? lastReadTimeRef.current; let shouldDisplay = false; - if (!currentUnreadMarker) { + if (!currentUnreadMarker || !shouldCheckWithCurrentUnreadMarker) { const nextMessage = sortedVisibleReportActions[index + 1]; - const isCurrentMessageUnread = isMessageUnread(reportAction, lastReadTimeRef.current); - shouldDisplay = isCurrentMessageUnread && (!nextMessage || !isMessageUnread(nextMessage, lastReadTimeRef.current)) && !ReportActionsUtils.shouldHideNewMarker(reportAction); + const isCurrentMessageUnread = isMessageUnread(reportAction, baseLastReadTime); + shouldDisplay = isCurrentMessageUnread && (!nextMessage || !isMessageUnread(nextMessage, baseLastReadTime)) && !ReportActionsUtils.shouldHideNewMarker(reportAction); if (shouldDisplay && !messageManuallyMarkedUnread) { const isWithinVisibleThreshold = scrollingVerticalOffset.current < MSG_VISIBLE_THRESHOLD ? reportAction.created < (userActiveSince.current ?? '') : true; // Prevent displaying a new marker line when report action is of type "REPORT_PREVIEW" and last actor is the current user @@ -487,24 +486,40 @@ function ReportActionsList({ return !ReportUtils.isCanceledTaskReport(report, parentReportAction); } - return ReportUtils.isExpenseReport(report) || ReportUtils.isIOUReport(report); + return ReportUtils.isExpenseReport(report) || ReportUtils.isIOUReport(report) || ReportUtils.isInvoiceReport(report); }, [parentReportAction, report, sortedVisibleReportActions]); + // storing the last read time used to render the unread marker + const markerLastReadTimeRef = useRef(); + + useEffect(() => { + if (currentUnreadMarker) { + return; + } + markerLastReadTimeRef.current = undefined; + }, [currentUnreadMarker]); + const calculateUnreadMarker = useCallback(() => { // Iterate through the report actions and set appropriate unread marker. // This is to avoid a warning of: // Cannot update a component (ReportActionsList) while rendering a different component (CellRenderer). let markerFound = false; sortedVisibleReportActions.forEach((reportAction, index) => { - if (!shouldDisplayNewMarker(reportAction, index)) { + if (!shouldDisplayNewMarker(reportAction, index, markerLastReadTimeRef.current, false)) { return; } markerFound = true; - if (!currentUnreadMarker && currentUnreadMarker !== reportAction.reportActionID) { + if (!currentUnreadMarker || currentUnreadMarker !== reportAction.reportActionID) { cacheUnreadMarkers.set(report.reportID, reportAction.reportActionID); setCurrentUnreadMarker(reportAction.reportActionID); } }); + + // if marker can be found, set the markerLastReadTimeRef to the last read time if necessary + if (markerFound && !markerLastReadTimeRef.current) { + markerLastReadTimeRef.current = lastReadTimeRef.current; + } + if (!markerFound && !linkedReportActionID) { setCurrentUnreadMarker(null); } @@ -532,14 +547,11 @@ function ReportActionsList({ lastMessageTime.current = null; if ( scrollingVerticalOffset.current >= MSG_VISIBLE_THRESHOLD || - !( - sortedVisibleReportActions && - sortedVisibleReportActions.some( - (reportAction) => - newMessageTimeReference && - newMessageTimeReference < reportAction.created && - (ReportActionsUtils.isReportPreviewAction(reportAction) ? reportAction.childLastActorAccountID : reportAction.actorAccountID) !== Report.getCurrentUserAccountID(), - ) + !sortedVisibleReportActions.some( + (reportAction) => + newMessageTimeReference && + newMessageTimeReference < reportAction.created && + (ReportActionsUtils.isReportPreviewAction(reportAction) ? reportAction.childLastActorAccountID : reportAction.actorAccountID) !== Report.getCurrentUserAccountID(), ) ) { return; @@ -573,7 +585,7 @@ function ReportActionsList({ displayAsGroup={ReportActionsUtils.isConsecutiveActionMadeByPreviousActor(sortedVisibleReportActions, index)} mostRecentIOUReportActionID={mostRecentIOUReportActionID} shouldHideThreadDividerLine={shouldHideThreadDividerLine} - shouldDisplayNewMarker={shouldDisplayNewMarker(reportAction, index)} + shouldDisplayNewMarker={shouldDisplayNewMarker(reportAction, index, markerLastReadTimeRef.current, true)} shouldDisplayReplyDivider={sortedVisibleReportActions.length > 1} isFirstVisibleReportAction={firstVisibleReportActionID === reportAction.reportActionID} shouldUseThreadDividerLine={shouldUseThreadDividerLine} diff --git a/src/pages/home/report/ReportActionsListItemRenderer.tsx b/src/pages/home/report/ReportActionsListItemRenderer.tsx index 18118e48f7cb..c095f3fa0cb0 100644 --- a/src/pages/home/report/ReportActionsListItemRenderer.tsx +++ b/src/pages/home/report/ReportActionsListItemRenderer.tsx @@ -86,7 +86,7 @@ function ReportActionsListItemRenderer({ pendingAction: reportAction.pendingAction, actionName: reportAction.actionName, errors: reportAction.errors, - originalMessage: reportAction.originalMessage, + originalMessage: reportAction?.originalMessage, childCommenterCount: reportAction.childCommenterCount, linkMetadata: reportAction.linkMetadata, childReportID: reportAction.childReportID, @@ -115,7 +115,7 @@ function ReportActionsListItemRenderer({ reportAction.pendingAction, reportAction.actionName, reportAction.errors, - reportAction.originalMessage, + reportAction?.originalMessage, reportAction.childCommenterCount, reportAction.linkMetadata, reportAction.childReportID, diff --git a/src/pages/home/report/ReportActionsView.tsx b/src/pages/home/report/ReportActionsView.tsx index 5e18378ff949..3f4a3ab726ce 100755 --- a/src/pages/home/report/ReportActionsView.tsx +++ b/src/pages/home/report/ReportActionsView.tsx @@ -164,7 +164,7 @@ function ReportActionsView({ const parentReportActionForTransactionThread = useMemo( () => isEmptyObject(transactionThreadReportActions) - ? null + ? undefined : (allReportActions.find((action) => action.reportActionID === transactionThreadReport?.parentReportActionID) as OnyxEntry), [allReportActions, transactionThreadReportActions, transactionThreadReport?.parentReportActionID], ); @@ -216,11 +216,11 @@ function ReportActionsView({ if (!isEmptyObject(transactionThreadReport)) { // Get newer actions based on the newest reportAction for the current report const newestActionCurrentReport = reportActionIDMap.find((item) => item.reportID === reportID); - Report.getNewerActions(newestActionCurrentReport?.reportID ?? '0', newestActionCurrentReport?.reportActionID ?? '0'); + Report.getNewerActions(newestActionCurrentReport?.reportID ?? '-1', newestActionCurrentReport?.reportActionID ?? '-1'); // Get newer actions based on the newest reportAction for the transaction thread report const newestActionTransactionThreadReport = reportActionIDMap.find((item) => item.reportID === transactionThreadReport.reportID); - Report.getNewerActions(newestActionTransactionThreadReport?.reportID ?? '0', newestActionTransactionThreadReport?.reportActionID ?? '0'); + Report.getNewerActions(newestActionTransactionThreadReport?.reportID ?? '-1', newestActionTransactionThreadReport?.reportActionID ?? '-1'); } else { Report.getNewerActions(reportID, newestReportAction.reportActionID); } @@ -251,18 +251,6 @@ function ReportActionsView({ const oldestReportAction = useMemo(() => reportActions?.at(-1), [reportActions]); const hasCreatedAction = oldestReportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.CREATED; - useEffect(() => { - if (!reportActionID || indexOfLinkedAction > -1) { - return; - } - - // This function is triggered when a user clicks on a link to navigate to a report. - // For each link click, we retrieve the report data again, even though it may already be cached. - // There should be only one openReport execution per page start or navigating - Report.openReport(reportID, reportActionID); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [route, indexOfLinkedAction]); - useEffect(() => { const wasLoginChangedDetected = prevAuthTokenType === CONST.AUTH_TOKEN_TYPES.ANONYMOUS && !session?.authTokenType; if (wasLoginChangedDetected && didUserLogInDuringSession() && isUserCreatedPolicyRoom(report)) { @@ -319,11 +307,11 @@ function ReportActionsView({ if (!isEmptyObject(transactionThreadReport)) { // Get older actions based on the oldest reportAction for the current report const oldestActionCurrentReport = reportActionIDMap.findLast((item) => item.reportID === reportID); - Report.getOlderActions(oldestActionCurrentReport?.reportID ?? '0', oldestActionCurrentReport?.reportActionID ?? '0'); + Report.getOlderActions(oldestActionCurrentReport?.reportID ?? '-1', oldestActionCurrentReport?.reportActionID ?? '-1'); // Get older actions based on the oldest reportAction for the transaction thread report const oldestActionTransactionThreadReport = reportActionIDMap.findLast((item) => item.reportID === transactionThreadReport.reportID); - Report.getOlderActions(oldestActionTransactionThreadReport?.reportID ?? '0', oldestActionTransactionThreadReport?.reportActionID ?? '0'); + Report.getOlderActions(oldestActionTransactionThreadReport?.reportID ?? '-1', oldestActionTransactionThreadReport?.reportActionID ?? '-1'); } else { // Retrieve the next REPORT.ACTIONS.LIMIT sized page of comments Report.getOlderActions(reportID, oldestReportAction.reportActionID); @@ -479,15 +467,17 @@ function ReportActionsView({ actions.push(optimisticCreatedAction); } - const reportPreviewAction = ReportActionsUtils.getReportPreviewAction(report.chatReportID ?? '', report.reportID); - const moneyRequestActions = reportActions.filter( - (action) => - action.actionName === CONST.REPORT.ACTIONS.TYPE.IOU && - action.originalMessage && - (action.originalMessage.type === CONST.IOU.REPORT_ACTION_TYPE.CREATE || - Boolean(action.originalMessage.type === CONST.IOU.REPORT_ACTION_TYPE.PAY && action.originalMessage.IOUDetails) || - action.originalMessage.type === CONST.IOU.REPORT_ACTION_TYPE.TRACK), - ); + const reportPreviewAction = ReportActionsUtils.getReportPreviewAction(report.chatReportID ?? '-1', report.reportID); + const moneyRequestActions = reportActions.filter((action) => { + const originalMessage = ReportActionsUtils.isMoneyRequestAction(action) ? ReportActionsUtils.getOriginalMessage(action) : undefined; + return ( + ReportActionsUtils.isMoneyRequestAction(action) && + originalMessage && + (originalMessage?.type === CONST.IOU.REPORT_ACTION_TYPE.CREATE || + !!(originalMessage?.type === CONST.IOU.REPORT_ACTION_TYPE.PAY && originalMessage?.IOUDetails) || + originalMessage?.type === CONST.IOU.REPORT_ACTION_TYPE.TRACK) + ); + }); if (report.total && moneyRequestActions.length < (reportPreviewAction?.childMoneyRequestCount ?? 0) && isEmptyObject(transactionThreadReport)) { const optimisticIOUAction = ReportUtils.buildOptimisticIOUReportAction( @@ -512,7 +502,7 @@ function ReportActionsView({ // Update pending action of created action if we have some requests that are pending // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const createdAction = actions.pop()!; - if (moneyRequestActions.filter((action) => Boolean(action.pendingAction)).length > 0) { + if (moneyRequestActions.filter((action) => !!action.pendingAction).length > 0) { createdAction.pendingAction = CONST.RED_BRICK_ROAD_PENDING_ACTION.UPDATE; } @@ -557,6 +547,10 @@ ReportActionsView.displayName = 'ReportActionsView'; ReportActionsView.initMeasured = false; function arePropsEqual(oldProps: ReportActionsViewProps, newProps: ReportActionsViewProps): boolean { + if (!lodashIsEqual(oldProps.transactionThreadReport, newProps.transactionThreadReport)) { + return false; + } + if (!lodashIsEqual(oldProps.isReadyForCommentLinking, newProps.isReadyForCommentLinking)) { return false; } diff --git a/src/pages/home/report/ReportAttachments.tsx b/src/pages/home/report/ReportAttachments.tsx index 82b49d1e260c..7c6b6f7fa6a2 100644 --- a/src/pages/home/report/ReportAttachments.tsx +++ b/src/pages/home/report/ReportAttachments.tsx @@ -1,33 +1,39 @@ import type {StackScreenProps} from '@react-navigation/stack'; import React, {useCallback} from 'react'; +import {useOnyx} from 'react-native-onyx'; import AttachmentModal from '@components/AttachmentModal'; import type {Attachment} from '@components/Attachments/types'; import ComposerFocusManager from '@libs/ComposerFocusManager'; import Navigation from '@libs/Navigation/Navigation'; import type {AuthScreensParamList} from '@libs/Navigation/types'; -import * as ReportUtils from '@libs/ReportUtils'; +import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type SCREENS from '@src/SCREENS'; -type ReportAttachmentsProps = StackScreenProps; +type ReportAttachmentsProps = StackScreenProps; function ReportAttachments({route}: ReportAttachmentsProps) { const reportID = route.params.reportID; - const report = ReportUtils.getReport(reportID); + const type = route.params.type; + const accountID = route.params.accountID; + const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reportID || -1}`); + const [isLoadingApp] = useOnyx(ONYXKEYS.IS_LOADING_APP); // In native the imported images sources are of type number. Ref: https://reactnative.dev/docs/image#imagesource const source = Number(route.params.source) || route.params.source; const onCarouselAttachmentChange = useCallback( (attachment: Attachment) => { - const routeToNavigate = ROUTES.REPORT_ATTACHMENTS.getRoute(reportID, String(attachment.source)); + const routeToNavigate = ROUTES.ATTACHMENTS.getRoute(reportID, type, String(attachment.source), Number(accountID)); Navigation.navigate(routeToNavigate); }, - [reportID], + [reportID, accountID, type], ); return ( ); } diff --git a/src/pages/home/report/ReportFooter.tsx b/src/pages/home/report/ReportFooter.tsx index ac56fe916bc9..bff2d322120b 100644 --- a/src/pages/home/report/ReportFooter.tsx +++ b/src/pages/home/report/ReportFooter.tsx @@ -1,17 +1,22 @@ import lodashIsEqual from 'lodash/isEqual'; import React, {memo, useCallback} from 'react'; import {Keyboard, View} from 'react-native'; -import {withOnyx} from 'react-native-onyx'; +import {useOnyx} from 'react-native-onyx'; import type {OnyxEntry} from 'react-native-onyx'; import AnonymousReportFooter from '@components/AnonymousReportFooter'; import ArchivedReportFooter from '@components/ArchivedReportFooter'; +import Banner from '@components/Banner'; import BlockedReportFooter from '@components/BlockedReportFooter'; +import * as Expensicons from '@components/Icon/Expensicons'; import OfflineIndicator from '@components/OfflineIndicator'; import {usePersonalDetails} from '@components/OnyxProvider'; import SwipeableView from '@components/SwipeableView'; +import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; +import Log from '@libs/Log'; +import * as PolicyUtils from '@libs/PolicyUtils'; import * as ReportUtils from '@libs/ReportUtils'; import * as UserUtils from '@libs/UserUtils'; import variables from '@styles/variables'; @@ -25,23 +30,19 @@ import type {EmptyObject} from '@src/types/utils/EmptyObject'; import ReportActionCompose from './ReportActionCompose/ReportActionCompose'; import SystemChatReportFooterMessage from './SystemChatReportFooterMessage'; -type ReportFooterOnyxProps = { - /** Whether to show the compose input */ - shouldShowComposeInput: OnyxEntry; - - /** Session info for the currently logged in user. */ - session: OnyxEntry; - - /** Whether user is blocked from chat. */ - blockedFromChat: OnyxEntry; -}; - -type ReportFooterProps = ReportFooterOnyxProps & { +type ReportFooterProps = { /** Report object for the current report */ report?: OnyxTypes.Report; + /** Report metadata */ + reportMetadata?: OnyxEntry; + + /** Additional report details */ reportNameValuePairs?: OnyxEntry; + /** The policy of the report */ + policy: OnyxEntry; + /** The last report action */ lastReportAction?: OnyxEntry; @@ -51,9 +52,6 @@ type ReportFooterProps = ReportFooterOnyxProps & { /** The pending action when we are adding a chat */ pendingAction?: PendingAction; - /** Height of the list which the composer is part of */ - listHeight?: number; - /** Whether the report is ready for display */ isReportReadyForDisplay?: boolean; @@ -70,29 +68,50 @@ type ReportFooterProps = ReportFooterOnyxProps & { function ReportFooter({ lastReportAction, pendingAction, - session, - report = {reportID: '0'}, + report = {reportID: '-1'}, + reportMetadata, reportNameValuePairs, - shouldShowComposeInput = false, + policy, isEmptyChat = true, isReportReadyForDisplay = true, - listHeight = 0, isComposerFullSize = false, - blockedFromChat, onComposerBlur, onComposerFocus, }: ReportFooterProps) { const styles = useThemeStyles(); const {isOffline} = useNetwork(); + const {translate} = useLocalize(); const {windowWidth, isSmallScreenWidth} = useWindowDimensions(); + + const [shouldShowComposeInput] = useOnyx(ONYXKEYS.SHOULD_SHOW_COMPOSE_INPUT, {initialValue: false}); + const [isAnonymousUser] = useOnyx(ONYXKEYS.SESSION, {selector: (session) => session?.authTokenType === CONST.AUTH_TOKEN_TYPES.ANONYMOUS}); + const [isBlockedFromChat] = useOnyx(ONYXKEYS.NVP_BLOCKED_FROM_CHAT, { + selector: (dateString) => { + if (!dateString) { + return false; + } + try { + return new Date(dateString) >= new Date(); + } catch (error) { + // If the NVP is malformed, we'll assume the user is not blocked from chat. This is not expected, so if it happens we'll log an alert. + Log.alert(`[${CONST.ERROR.ENSURE_BUGBOT}] Found malformed ${ONYXKEYS.NVP_BLOCKED_FROM_CHAT} nvp`, dateString); + return false; + } + }, + }); + const chatFooterStyles = {...styles.chatFooter, minHeight: !isOffline ? CONST.CHAT_FOOTER_MIN_HEIGHT : 0}; const isArchivedRoom = ReportUtils.isArchivedRoom(report, reportNameValuePairs); - const isAnonymousUser = session?.authTokenType === CONST.AUTH_TOKEN_TYPES.ANONYMOUS; const isSmallSizeLayout = windowWidth - (isSmallScreenWidth ? 0 : variables.sideBarWidth) < variables.anonymousReportFooterBreakpoint; - const hideComposer = !ReportUtils.canUserPerformWriteAction(report, reportNameValuePairs) || blockedFromChat; + + // If a user just signed in and is viewing a public report, optimistically show the composer while loading the report, since they will have write access when the response comes back. + const shouldShowComposerOptimistically = !isAnonymousUser && ReportUtils.isPublicRoom(report) && !!reportMetadata?.isLoadingInitialReportActions; + const shouldHideComposer = (!ReportUtils.canUserPerformWriteAction(report, reportNameValuePairs) && !shouldShowComposerOptimistically) || isBlockedFromChat; const canWriteInReport = ReportUtils.canWriteInReport(report); const isSystemChat = ReportUtils.isSystemChat(report); + const isAdminsOnlyPostingRoom = ReportUtils.isAdminsOnlyPostingRoom(report); + const isUserPolicyAdmin = PolicyUtils.isPolicyAdmin(policy); const allPersonalDetails = usePersonalDetails(); @@ -149,8 +168,14 @@ function ReportFooter({ return ( <> - {hideComposer && ( - + {shouldHideComposer && ( + {isAnonymousUser && !isArchivedRoom && ( )} {isArchivedRoom && } - {!isArchivedRoom && blockedFromChat && } + {!isArchivedRoom && isBlockedFromChat && } {!isAnonymousUser && !canWriteInReport && isSystemChat && } - {!isSmallScreenWidth && {hideComposer && }} + {isAdminsOnlyPostingRoom && !isUserPolicyAdmin && !isArchivedRoom && !isAnonymousUser && !isBlockedFromChat && ( + + )} + {!isSmallScreenWidth && ( + {shouldHideComposer && } + )} )} - {!hideComposer && (!!shouldShowComposeInput || !isSmallScreenWidth) && ( + {!shouldHideComposer && (!!shouldShowComposeInput || !isSmallScreenWidth) && ( @@ -188,29 +222,14 @@ function ReportFooter({ ReportFooter.displayName = 'ReportFooter'; -export default withOnyx({ - shouldShowComposeInput: { - key: ONYXKEYS.SHOULD_SHOW_COMPOSE_INPUT, - initialValue: false, - }, - session: { - key: ONYXKEYS.SESSION, - }, - blockedFromChat: { - key: ONYXKEYS.NVP_BLOCKED_FROM_CHAT, - }, -})( - memo( - ReportFooter, - (prevProps, nextProps) => - lodashIsEqual(prevProps.report, nextProps.report) && - prevProps.pendingAction === nextProps.pendingAction && - prevProps.listHeight === nextProps.listHeight && - prevProps.isComposerFullSize === nextProps.isComposerFullSize && - prevProps.isEmptyChat === nextProps.isEmptyChat && - prevProps.lastReportAction === nextProps.lastReportAction && - prevProps.shouldShowComposeInput === nextProps.shouldShowComposeInput && - prevProps.isReportReadyForDisplay === nextProps.isReportReadyForDisplay && - lodashIsEqual(prevProps.session, nextProps.session), - ), +export default memo( + ReportFooter, + (prevProps, nextProps) => + lodashIsEqual(prevProps.report, nextProps.report) && + prevProps.pendingAction === nextProps.pendingAction && + prevProps.isComposerFullSize === nextProps.isComposerFullSize && + prevProps.isEmptyChat === nextProps.isEmptyChat && + prevProps.lastReportAction === nextProps.lastReportAction && + prevProps.isReportReadyForDisplay === nextProps.isReportReadyForDisplay && + lodashIsEqual(prevProps.reportMetadata, nextProps.reportMetadata), ); diff --git a/src/pages/home/report/SystemChatReportFooterMessage.tsx b/src/pages/home/report/SystemChatReportFooterMessage.tsx index c9ccac8f5c18..1c1ff2120674 100644 --- a/src/pages/home/report/SystemChatReportFooterMessage.tsx +++ b/src/pages/home/report/SystemChatReportFooterMessage.tsx @@ -1,5 +1,5 @@ import React, {useMemo} from 'react'; -import {withOnyx} from 'react-native-onyx'; +import {useOnyx, withOnyx} from 'react-native-onyx'; import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import Banner from '@components/Banner'; import * as Expensicons from '@components/Icon/Expensicons'; @@ -8,7 +8,6 @@ import TextLink from '@components/TextLink'; import useLocalize from '@hooks/useLocalize'; import useThemeStyles from '@hooks/useThemeStyles'; import * as PolicyUtils from '@libs/PolicyUtils'; -import * as ReportUtils from '@libs/ReportUtils'; import Navigation from '@navigation/Navigation'; import * as ReportInstance from '@userActions/Report'; import type {OnboardingPurposeType} from '@src/CONST'; @@ -34,21 +33,23 @@ function SystemChatReportFooterMessage({choice, policies, activePolicyID}: Syste const {translate} = useLocalize(); const styles = useThemeStyles(); - const adminChatReport = useMemo(() => { + const adminChatReportID = useMemo(() => { const adminPolicy = activePolicyID - ? PolicyUtils.getPolicy(activePolicyID ?? '') + ? PolicyUtils.getPolicy(activePolicyID) : Object.values(policies ?? {}).find((policy) => PolicyUtils.shouldShowPolicy(policy, false) && policy?.role === CONST.POLICY.ROLE.ADMIN && policy?.chatReportIDAdmins); - return ReportUtils.getReport(String(adminPolicy?.chatReportIDAdmins)); + return String(adminPolicy?.chatReportIDAdmins ?? -1); }, [activePolicyID, policies]); + const [adminChatReport] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${adminChatReportID}`); + const content = useMemo(() => { switch (choice) { case CONST.ONBOARDING_CHOICES.MANAGE_TEAM: return ( <> {translate('systemChatFooterMessage.newDotManageTeam.phrase1')} - Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(adminChatReport?.reportID ?? ''))}> + Navigation.navigate(ROUTES.REPORT_WITH_ID.getRoute(adminChatReport?.reportID ?? '-1'))}> {adminChatReport?.reportName ?? CONST.REPORT.WORKSPACE_CHAT_ROOMS.ADMINS} {translate('systemChatFooterMessage.newDotManageTeam.phrase2')} @@ -67,10 +68,17 @@ function SystemChatReportFooterMessage({choice, policies, activePolicyID}: Syste return ( {content}} + content={ + + {content} + + } /> ); } @@ -86,6 +94,5 @@ export default withOnyx { - const isVisibleAction = ReportActionsUtils.shouldReportActionBeVisible(ancestor.reportAction, ancestor.reportAction.reportActionID ?? ''); + const isVisibleAction = ReportActionsUtils.shouldReportActionBeVisible(ancestor.reportAction, ancestor.reportAction.reportActionID ?? '-1'); // Pop the thread report screen before navigating to the chat report. - Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(ancestor.report.parentReportID ?? '')); + Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(ancestor.report.parentReportID ?? '-1')); if (isVisibleAction && !isOffline) { // Pop the chat report screen before navigating to the linked report action. - Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(ancestor.report.parentReportID ?? '', ancestor.reportAction.reportActionID)); + Navigation.goBack(ROUTES.REPORT_WITH_ID.getRoute(ancestor.report.parentReportID ?? '-1', ancestor.reportAction.reportActionID)); } }} accessibilityLabel={translate('threads.thread')} diff --git a/src/pages/home/report/comment/TextCommentFragment.tsx b/src/pages/home/report/comment/TextCommentFragment.tsx index cf1ab6f8aa19..28b4f9eebc88 100644 --- a/src/pages/home/report/comment/TextCommentFragment.tsx +++ b/src/pages/home/report/comment/TextCommentFragment.tsx @@ -1,4 +1,4 @@ -import Str from 'expensify-common/lib/str'; +import {Str} from 'expensify-common'; import {isEmpty} from 'lodash'; import React, {memo} from 'react'; import type {StyleProp, TextStyle} from 'react-native'; @@ -53,7 +53,7 @@ function TextCommentFragment({fragment, styleAsDeleted, styleAsMuted = false, so // on other device, only render it as text if the only difference is
    tag const containsOnlyEmojis = EmojiUtils.containsOnlyEmojis(text ?? ''); if (!shouldRenderAsText(html, text ?? '') && !(containsOnlyEmojis && styleAsDeleted)) { - const editedTag = fragment?.isEdited ? `` : ''; + const editedTag = fragment?.isEdited ? `` : ''; const htmlWithDeletedTag = styleAsDeleted ? `${html}` : html; const htmlContent = containsOnlyEmojis ? Str.replaceAll(htmlWithDeletedTag, '', '') : htmlWithDeletedTag; diff --git a/src/pages/home/report/comment/shouldRenderAsText/index.native.ts b/src/pages/home/report/comment/shouldRenderAsText/index.native.ts index 7c5758f8720d..ac68a9e660cf 100644 --- a/src/pages/home/report/comment/shouldRenderAsText/index.native.ts +++ b/src/pages/home/report/comment/shouldRenderAsText/index.native.ts @@ -1,4 +1,4 @@ -import Str from 'expensify-common/lib/str'; +import {Str} from 'expensify-common'; /** * Whether to render the report action as text diff --git a/src/pages/home/report/comment/shouldRenderAsText/index.ts b/src/pages/home/report/comment/shouldRenderAsText/index.ts index f26f43c528eb..7e8200671c1a 100644 --- a/src/pages/home/report/comment/shouldRenderAsText/index.ts +++ b/src/pages/home/report/comment/shouldRenderAsText/index.ts @@ -1,4 +1,4 @@ -import Str from 'expensify-common/lib/str'; +import {Str} from 'expensify-common'; /** * Whether to render the report action as text diff --git a/src/pages/home/report/reportActionFragmentPropTypes.js b/src/pages/home/report/reportActionFragmentPropTypes.js deleted file mode 100644 index 5d2e3b951a1d..000000000000 --- a/src/pages/home/report/reportActionFragmentPropTypes.js +++ /dev/null @@ -1,32 +0,0 @@ -import PropTypes from 'prop-types'; - -export default PropTypes.shape({ - /** The type of the action item fragment. Used to render a corresponding component */ - type: PropTypes.string.isRequired, - - /** The text content of the fragment. */ - text: PropTypes.string.isRequired, - - /** Used to apply additional styling. Style refers to a predetermined constant and not a class name. e.g. 'normal' - * or 'strong' - */ - style: PropTypes.string, - - /** ID of a report */ - reportID: PropTypes.string, - - /** ID of a policy */ - policyID: PropTypes.string, - - /** The target of a link fragment e.g. '_blank' */ - target: PropTypes.string, - - /** The destination of a link fragment e.g. 'https://www.expensify.com' */ - href: PropTypes.string, - - /** An additional avatar url - not the main avatar url but used within a message. */ - iconUrl: PropTypes.string, - - /** Fragment edited flag */ - isEdited: PropTypes.bool, -}); diff --git a/src/pages/home/report/reportActionPropTypes.js b/src/pages/home/report/reportActionPropTypes.js deleted file mode 100644 index 5f9643571e54..000000000000 --- a/src/pages/home/report/reportActionPropTypes.js +++ /dev/null @@ -1,31 +0,0 @@ -import PropTypes from 'prop-types'; -import reportActionFragmentPropTypes from './reportActionFragmentPropTypes'; - -export default { - /** The ID of the reportAction. It is the string representation of the a 64-bit integer. */ - reportActionID: PropTypes.string, - - /** Name of the action e.g. ADD_COMMENT */ - actionName: PropTypes.string, - - /** Person who created the action */ - person: PropTypes.arrayOf(reportActionFragmentPropTypes), - - /** ISO-formatted datetime */ - created: PropTypes.string, - - /** report action message */ - message: PropTypes.arrayOf(reportActionFragmentPropTypes), - - /** Original message associated with this action */ - originalMessage: PropTypes.shape({ - // The ID of the iou transaction - IOUTransactionID: PropTypes.string, - - /** accountIDs of the people to which the whisper was sent to (if any). Returns empty array if it is not a whisper */ - whisperedTo: PropTypes.arrayOf(PropTypes.number), - }), - - /** Error message that's come back from the server. */ - error: PropTypes.string, -}; diff --git a/src/pages/home/report/withReportAndReportActionOrNotFound.tsx b/src/pages/home/report/withReportAndReportActionOrNotFound.tsx index e5e203fb5030..cd85939e8bec 100644 --- a/src/pages/home/report/withReportAndReportActionOrNotFound.tsx +++ b/src/pages/home/report/withReportAndReportActionOrNotFound.tsx @@ -2,12 +2,11 @@ import type {StackScreenProps} from '@react-navigation/stack'; import type {ComponentType, ForwardedRef, RefAttributes} from 'react'; import React, {useCallback, useEffect} from 'react'; -import type {OnyxCollection, OnyxEntry, WithOnyxInstanceState} from 'react-native-onyx'; +import type {OnyxCollection, OnyxEntry, WithOnyxState} from 'react-native-onyx'; import {withOnyx} from 'react-native-onyx'; import FullscreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; import withWindowDimensions from '@components/withWindowDimensions'; import type {WindowDimensionsProps} from '@components/withWindowDimensions/types'; -import compose from '@libs/compose'; import getComponentDisplayName from '@libs/getComponentDisplayName'; import type {FlagCommentNavigatorParamList, SplitDetailsNavigatorParamList} from '@libs/Navigation/types'; import * as ReportUtils from '@libs/ReportUtils'; @@ -32,7 +31,7 @@ type OnyxProps = { reportActions: OnyxEntry; /** The report's parentReportAction */ - parentReportAction: OnyxEntry; + parentReportAction: NonNullable> | null; /** The policies which the user has access to */ policies: OnyxCollection; @@ -103,13 +102,13 @@ export default function , OnyxProps>({ report: { key: ({route}) => `${ONYXKEYS.COLLECTION.REPORT}${route.params.reportID}`, }, parentReport: { - key: ({report}) => `${ONYXKEYS.COLLECTION.REPORT}${report ? report.parentReportID : '0'}`, + key: ({report}) => `${ONYXKEYS.COLLECTION.REPORT}${report ? report.parentReportID : '-1'}`, }, reportMetadata: { key: ({route}) => `${ONYXKEYS.COLLECTION.REPORT_METADATA}${route.params.reportID}`, @@ -129,7 +128,7 @@ export default function `${ONYXKEYS.COLLECTION.REPORT_ACTIONS}${report ? report.parentReportID : 0}`, - selector: (parentReportActions: OnyxEntry, props: WithOnyxInstanceState): OnyxEntry => { + selector: (parentReportActions: OnyxEntry, props?: WithOnyxState): NonNullable> | null => { const parentReportActionID = props?.report?.parentReportActionID; if (!parentReportActionID) { return null; @@ -138,9 +137,8 @@ export default function - - {emojiStatus} - + + + {emojiStatus} + +
    ); diff --git a/src/pages/home/sidebar/ProfileAvatarWithIndicator.tsx b/src/pages/home/sidebar/ProfileAvatarWithIndicator.tsx index b29506ea8e8f..833c76f6f071 100644 --- a/src/pages/home/sidebar/ProfileAvatarWithIndicator.tsx +++ b/src/pages/home/sidebar/ProfileAvatarWithIndicator.tsx @@ -24,7 +24,7 @@ function ProfileAvatarWithIndicator({isSelected = false}: ProfileAvatarWithIndic source={currentUserPersonalDetails.avatar} accountID={currentUserPersonalDetails.accountID} fallbackIcon={currentUserPersonalDetails.fallbackIcon} - isLoading={isLoading && !currentUserPersonalDetails.avatar} + isLoading={!!(isLoading && !currentUserPersonalDetails.avatar)} />
    diff --git a/src/pages/home/sidebar/SidebarLinksData.tsx b/src/pages/home/sidebar/SidebarLinksData.tsx index 3852cb0d12e7..635d4df5cb58 100644 --- a/src/pages/home/sidebar/SidebarLinksData.tsx +++ b/src/pages/home/sidebar/SidebarLinksData.tsx @@ -47,7 +47,7 @@ function SidebarLinksData({insets, isLoadingApp = true, onLinkClick, priorityMod const policyMemberAccountIDs = getPolicyEmployeeListByIdWithoutCurrentUser(policies, activeWorkspaceID, accountID); // eslint-disable-next-line react-hooks/exhaustive-deps - useEffect(() => Policy.openWorkspace(activeWorkspaceID ?? '', policyMemberAccountIDs), [activeWorkspaceID]); + useEffect(() => Policy.openWorkspace(activeWorkspaceID ?? '-1', policyMemberAccountIDs), [activeWorkspaceID]); const isLoading = isLoadingApp; const {orderedReportIDs, currentReportID} = useReportIDs(); diff --git a/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.tsx b/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.tsx index 07dfa5b1b32a..f0fa320c1483 100644 --- a/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.tsx +++ b/src/pages/home/sidebar/SidebarScreen/BaseSidebarScreen.tsx @@ -40,7 +40,7 @@ function BaseSidebarScreen() { {({insets}) => ( <> diff --git a/src/pages/home/sidebar/SidebarScreen/FloatingActionButtonAndPopover.tsx b/src/pages/home/sidebar/SidebarScreen/FloatingActionButtonAndPopover.tsx index 2e55405d3cac..ff5cfa05b57b 100644 --- a/src/pages/home/sidebar/SidebarScreen/FloatingActionButtonAndPopover.tsx +++ b/src/pages/home/sidebar/SidebarScreen/FloatingActionButtonAndPopover.tsx @@ -9,6 +9,7 @@ import type {SvgProps} from 'react-native-svg'; import FloatingActionButton from '@components/FloatingActionButton'; import * as Expensicons from '@components/Icon/Expensicons'; import PopoverMenu from '@components/PopoverMenu'; +import Text from '@components/Text'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; import usePermissions from '@hooks/usePermissions'; @@ -193,12 +194,22 @@ function FloatingActionButtonAndPopover( // eslint-disable-next-line react-hooks/exhaustive-deps }, [personalDetails, session?.accountID, quickActionReport, quickActionPolicy]); + const renderQuickActionTooltip = useCallback( + () => ( + + {translate('quickAction.tooltip.title')} + {translate('quickAction.tooltip.subtitle')} + + ), + [styles.quickActionTooltipTitle, styles.quickActionTooltipSubtitle, translate], + ); + const quickActionTitle = useMemo(() => { if (isEmptyObject(quickActionReport)) { return ''; } if (quickAction?.action === CONST.QUICK_ACTIONS.SEND_MONEY && quickActionAvatars.length > 0) { - const name: string = ReportUtils.getDisplayNameForParticipant(+(quickActionAvatars[0]?.id ?? 0), true) ?? ''; + const name: string = ReportUtils.getDisplayNameForParticipant(+(quickActionAvatars[0]?.id ?? -1), true) ?? ''; return translate('quickAction.paySomeone', {name}); } const titleKey = getQuickActionTitle(quickAction?.action ?? ('' as QuickActionName)); @@ -212,13 +223,13 @@ function FloatingActionButtonAndPopover( if (quickActionAvatars.length === 0) { return false; } - const displayName = personalDetails?.[quickActionAvatars[0]?.id ?? 0]?.firstName ?? ''; + const displayName = personalDetails?.[quickActionAvatars[0]?.id ?? -1]?.firstName ?? ''; return quickAction?.action === CONST.QUICK_ACTIONS.SEND_MONEY && displayName.length === 0; }, [personalDetails, quickActionReport, quickAction?.action, quickActionAvatars]); const navigateToQuickAction = () => { const isValidReport = !(isEmptyObject(quickActionReport) || ReportUtils.isArchivedRoom(quickActionReport)); - const quickActionReportID = isValidReport ? quickActionReport?.reportID ?? '' : ReportUtils.generateReportID(); + const quickActionReportID = isValidReport ? quickActionReport?.reportID ?? '-1' : ReportUtils.generateReportID(); switch (quickAction?.action) { case CONST.QUICK_ACTIONS.REQUEST_MANUAL: IOU.startMoneyRequest(CONST.IOU.TYPE.SUBMIT, quickActionReportID, CONST.IOU.REQUEST_TYPE.MANUAL, true); @@ -242,7 +253,7 @@ function FloatingActionButtonAndPopover( IOU.startMoneyRequest(CONST.IOU.TYPE.PAY, quickActionReportID, CONST.IOU.REQUEST_TYPE.MANUAL, true); return; case CONST.QUICK_ACTIONS.ASSIGN_TASK: - Task.clearOutTaskInfoAndNavigate(isValidReport ? quickActionReportID : '', isValidReport ? quickActionReport : undefined, quickAction.targetAccountID ?? 0, true); + Task.clearOutTaskInfoAndNavigate(isValidReport ? quickActionReportID : '', isValidReport ? quickActionReport : undefined, quickAction.targetAccountID ?? -1, true); break; case CONST.QUICK_ACTIONS.TRACK_MANUAL: IOU.startMoneyRequest(CONST.IOU.TYPE.TRACK, quickActionReportID, CONST.IOU.REQUEST_TYPE.MANUAL, true); @@ -460,6 +471,10 @@ function FloatingActionButtonAndPopover( numberOfLinesDescription: 1, onSelected: () => interceptAnonymousUser(() => navigateToQuickAction()), shouldShowSubscriptRightAvatar: ReportUtils.isPolicyExpenseChat(quickActionReport), + shouldRenderTooltip: quickAction?.isFirstQuickAction, + shouldForceRenderingTooltipLeft: true, + renderTooltipContent: renderQuickActionTooltip, + tooltipWrapperStyle: styles.quickActionTooltipWrapper, }, ] : []), diff --git a/src/pages/iou/HoldReasonPage.tsx b/src/pages/iou/HoldReasonPage.tsx index 18b290a81ea4..1cfc65d987d0 100644 --- a/src/pages/iou/HoldReasonPage.tsx +++ b/src/pages/iou/HoldReasonPage.tsx @@ -1,6 +1,7 @@ import type {RouteProp} from '@react-navigation/native'; import React, {useCallback, useEffect} from 'react'; import {View} from 'react-native'; +import {useOnyx} from 'react-native-onyx'; import FormProvider from '@components/Form/FormProvider'; import InputWrapper from '@components/Form/InputWrapper'; import type {FormInputErrors, FormOnyxValues} from '@components/Form/types'; @@ -45,12 +46,12 @@ function HoldReasonPage({route}: HoldReasonPageProps) { const {transactionID, reportID, backTo} = route.params; - const report = ReportUtils.getReport(reportID); + const [report] = useOnyx(`${ONYXKEYS.COLLECTION.REPORT}${reportID || -1}`); // We first check if the report is part of a policy - if not, then it's a personal request (1:1 request) // For personal requests, we need to allow both users to put the request on hold const isWorkspaceRequest = ReportUtils.isReportInGroupPolicy(report); - const parentReportAction = ReportActionsUtils.getReportAction(report?.parentReportID ?? '', report?.parentReportActionID ?? ''); + const parentReportAction = ReportActionsUtils.getReportAction(report?.parentReportID ?? '-1', report?.parentReportActionID ?? '-1'); const navigateBack = () => { Navigation.navigate(backTo); @@ -60,7 +61,7 @@ function HoldReasonPage({route}: HoldReasonPageProps) { // We have extra isWorkspaceRequest condition since, for 1:1 requests, canEditMoneyRequest will rightly return false // as we do not allow requestee to edit fields like description and amount. // But, we still want the requestee to be able to put the request on hold - if (!ReportUtils.canEditMoneyRequest(parentReportAction) && isWorkspaceRequest) { + if (ReportActionsUtils.isMoneyRequestAction(parentReportAction) && !ReportUtils.canEditMoneyRequest(parentReportAction) && isWorkspaceRequest) { return; } @@ -73,20 +74,20 @@ function HoldReasonPage({route}: HoldReasonPageProps) { const errors: FormInputErrors = ValidationUtils.getFieldRequiredErrors(values, [INPUT_IDS.COMMENT]); if (!values.comment) { - errors.comment = 'common.error.fieldRequired'; + errors.comment = translate('common.error.fieldRequired'); } // We have extra isWorkspaceRequest condition since, for 1:1 requests, canEditMoneyRequest will rightly return false // as we do not allow requestee to edit fields like description and amount. // But, we still want the requestee to be able to put the request on hold - if (!ReportUtils.canEditMoneyRequest(parentReportAction) && isWorkspaceRequest) { + if (ReportActionsUtils.isMoneyRequestAction(parentReportAction) && !ReportUtils.canEditMoneyRequest(parentReportAction) && isWorkspaceRequest) { const formErrors = {}; - ErrorUtils.addErrorMessage(formErrors, 'reportModified', 'common.error.requestModified'); + ErrorUtils.addErrorMessage(formErrors, 'reportModified', translate('common.error.requestModified')); FormActions.setErrors(ONYXKEYS.FORMS.MONEY_REQUEST_HOLD_FORM, formErrors); } return errors; }, - [parentReportAction, isWorkspaceRequest], + [parentReportAction, isWorkspaceRequest, translate], ); useEffect(() => { diff --git a/src/pages/iou/MoneyRequestAmountForm.tsx b/src/pages/iou/MoneyRequestAmountForm.tsx index 46bd34006550..ff061e7382c6 100644 --- a/src/pages/iou/MoneyRequestAmountForm.tsx +++ b/src/pages/iou/MoneyRequestAmountForm.tsx @@ -10,13 +10,13 @@ import MoneyRequestAmountInput from '@components/MoneyRequestAmountInput'; import type {MoneyRequestAmountInputRef} from '@components/MoneyRequestAmountInput'; import ScrollView from '@components/ScrollView'; import SettlementButton from '@components/SettlementButton'; +import isTextInputFocused from '@components/TextInput/BaseTextInput/isTextInputFocused'; import useLocalize from '@hooks/useLocalize'; import usePrevious from '@hooks/usePrevious'; import useThemeStyles from '@hooks/useThemeStyles'; import useWindowDimensions from '@hooks/useWindowDimensions'; import * as CurrencyUtils from '@libs/CurrencyUtils'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; -import type {MaybePhraseKey} from '@libs/Localize'; import * as MoneyRequestUtils from '@libs/MoneyRequestUtils'; import Navigation from '@libs/Navigation/Navigation'; import type {BaseTextInputRef} from '@src/components/TextInput/BaseTextInput/types'; @@ -64,11 +64,14 @@ type MoneyRequestAmountFormProps = { /** The current tab we have navigated to in the expense modal. String that corresponds to the expense type. */ selectedTab?: SelectedTabRequest; + + /** Whether the user input should be kept or not */ + shouldKeepUserInput?: boolean; }; const isAmountInvalid = (amount: string) => !amount.length || parseFloat(amount) < 0.01; const isTaxAmountInvalid = (currentAmount: string, taxAmount: number, isTaxAmountForm: boolean) => - isTaxAmountForm && Number.parseFloat(currentAmount) > CurrencyUtils.convertToFrontendAmount(Math.abs(taxAmount)); + isTaxAmountForm && Number.parseFloat(currentAmount) > CurrencyUtils.convertToFrontendAmountAsInteger(Math.abs(taxAmount)); const AMOUNT_VIEW_ID = 'amountView'; const NUM_PAD_CONTAINER_VIEW_ID = 'numPadContainerView'; @@ -88,6 +91,7 @@ function MoneyRequestAmountForm( onCurrencyButtonPress, onSubmitButtonPress, selectedTab = CONST.TAB_REQUEST.MANUAL, + shouldKeepUserInput = false, }: MoneyRequestAmountFormProps, forwardedRef: ForwardedRef, ) { @@ -98,7 +102,7 @@ function MoneyRequestAmountForm( const textInput = useRef(null); const moneyRequestAmountInput = useRef(null); - const [formError, setFormError] = useState(''); + const [formError, setFormError] = useState(''); const [shouldUpdateSelection, setShouldUpdateSelection] = useState(true); const isFocused = useIsFocused(); @@ -126,7 +130,8 @@ function MoneyRequestAmountForm( if (!textInput.current) { return; } - if (!textInput.current.isFocused()) { + + if (!isTextInputFocused(textInput)) { textInput.current.focus(); } }; @@ -144,7 +149,7 @@ function MoneyRequestAmountForm( }, [isFocused, wasFocused]); const initializeAmount = useCallback((newAmount: number) => { - const frontendAmount = newAmount ? CurrencyUtils.convertToFrontendAmount(newAmount).toString() : ''; + const frontendAmount = newAmount ? CurrencyUtils.convertToFrontendAmountAsString(newAmount) : ''; moneyRequestAmountInput.current?.changeAmount(frontendAmount); moneyRequestAmountInput.current?.changeSelection({ start: frontendAmount.length, @@ -167,7 +172,7 @@ function MoneyRequestAmountForm( */ const updateAmountNumberPad = useCallback( (key: string) => { - if (shouldUpdateSelection && !textInput.current?.isFocused()) { + if (shouldUpdateSelection && !isTextInputFocused(textInput)) { textInput.current?.focus(); } const currentAmount = moneyRequestAmountInput.current?.getAmount() ?? ''; @@ -194,7 +199,7 @@ function MoneyRequestAmountForm( */ const updateLongPressHandlerState = useCallback((value: boolean) => { setShouldUpdateSelection(!value); - if (!value && !textInput.current?.isFocused()) { + if (!value && !isTextInputFocused(textInput)) { textInput.current?.focus(); } }, []); @@ -209,39 +214,22 @@ function MoneyRequestAmountForm( // Skip the check for tax amount form as 0 is a valid input const currentAmount = moneyRequestAmountInput.current?.getAmount() ?? ''; if (!currentAmount.length || (!isTaxAmountForm && isAmountInvalid(currentAmount))) { - setFormError('iou.error.invalidAmount'); + setFormError(translate('iou.error.invalidAmount')); return; } if (isTaxAmountInvalid(currentAmount, taxAmount, isTaxAmountForm)) { - setFormError(['iou.error.invalidTaxAmount', {amount: formattedTaxAmount}]); + setFormError(translate('iou.error.invalidTaxAmount', {amount: formattedTaxAmount})); return; } - // Update display amount string post-edit to ensure consistency with backend amount - // Reference: https://github.com/Expensify/App/issues/30505 - const backendAmount = CurrencyUtils.convertToBackendAmount(Number.parseFloat(currentAmount)); - initializeAmount(backendAmount); - onSubmitButtonPress({amount: currentAmount, currency, paymentMethod: iouPaymentType}); }, - [taxAmount, onSubmitButtonPress, currency, formattedTaxAmount, initializeAmount], + [taxAmount, onSubmitButtonPress, currency, translate, formattedTaxAmount], ); const buttonText: string = useMemo(() => { - const currentAmount = moneyRequestAmountInput.current?.getAmount() ?? ''; if (skipConfirmation) { - if (currentAmount !== '') { - const currencyAmount = CurrencyUtils.convertToDisplayString(CurrencyUtils.convertToBackendAmount(Number.parseFloat(currentAmount)), currency) ?? ''; - let text = translate('iou.submitAmount', {amount: currencyAmount}); - if (iouType === CONST.IOU.TYPE.SPLIT) { - text = translate('iou.splitAmount', {amount: currencyAmount}); - } else if (iouType === CONST.IOU.TYPE.TRACK) { - text = translate('iou.trackAmount', {amount: currencyAmount}); - } - return text[0].toUpperCase() + text.slice(1); - } - if (iouType === CONST.IOU.TYPE.SPLIT) { return translate('iou.splitExpense'); } @@ -251,7 +239,7 @@ function MoneyRequestAmountForm( return translate('iou.submitExpense'); } return isEditing ? translate('common.save') : translate('common.next'); - }, [skipConfirmation, iouType, currency, isEditing, translate]); + }, [skipConfirmation, iouType, isEditing, translate]); const canUseTouchScreen = DeviceCapabilities.canUseTouchScreen(); @@ -287,6 +275,7 @@ function MoneyRequestAmountForm( } textInput.current = ref; }} + shouldKeepUserInput={shouldKeepUserInput} moneyRequestAmountInputRef={moneyRequestAmountInput} inputStyle={[styles.iouAmountTextInput]} containerStyle={[styles.iouAmountTextInputContainer]} @@ -320,7 +309,7 @@ function MoneyRequestAmountForm( addBankAccountRoute={bankAccountRoute} addDebitCardRoute={ROUTES.IOU_SEND_ADD_DEBIT_CARD} currency={currency ?? CONST.CURRENCY.USD} - policyID={policyID ?? ''} + policyID={policyID ?? '-1'} style={[styles.w100, canUseTouchScreen ? styles.mt5 : styles.mt3]} buttonSize={CONST.DROPDOWN_BUTTON_SIZE.LARGE} kycWallAnchorAlignment={{ diff --git a/src/pages/iou/SplitBillDetailsPage.tsx b/src/pages/iou/SplitBillDetailsPage.tsx index 7d0b9bb15b07..5ae5e2dfb438 100644 --- a/src/pages/iou/SplitBillDetailsPage.tsx +++ b/src/pages/iou/SplitBillDetailsPage.tsx @@ -5,17 +5,22 @@ import {withOnyx} from 'react-native-onyx'; import type {OnyxEntry} from 'react-native-onyx'; import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import Icon from '@components/Icon'; +import * as Expensicons from '@components/Icon/Expensicons'; import MoneyRequestConfirmationList from '@components/MoneyRequestConfirmationList'; import MoneyRequestHeaderStatusBar from '@components/MoneyRequestHeaderStatusBar'; import ScreenWrapper from '@components/ScreenWrapper'; import useLocalize from '@hooks/useLocalize'; +import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import type {SplitDetailsNavigatorParamList} from '@libs/Navigation/types'; import * as OptionsListUtils from '@libs/OptionsListUtils'; +import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; import withReportAndReportActionOrNotFound from '@pages/home/report/withReportAndReportActionOrNotFound'; import type {WithReportAndReportActionOrNotFoundProps} from '@pages/home/report/withReportAndReportActionOrNotFound'; +import variables from '@styles/variables'; import * as IOU from '@userActions/IOU'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -55,10 +60,11 @@ type SplitBillDetailsPageProps = WithReportAndReportActionOrNotFoundProps & function SplitBillDetailsPage({personalDetails, report, route, reportActions, transaction, draftTransaction, session}: SplitBillDetailsPageProps) { const styles = useThemeStyles(); - const reportID = report?.reportID ?? ''; + const reportID = report?.reportID ?? '-1'; const {translate} = useLocalize(); + const theme = useTheme(); const reportAction = useMemo(() => reportActions?.[route.params.reportActionID] ?? ({} as ReportAction), [reportActions, route.params.reportActionID]); - const participantAccountIDs = reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU ? reportAction?.originalMessage.participantAccountIDs ?? [] : []; + const participantAccountIDs = ReportActionsUtils.isMoneyRequestAction(reportAction) ? ReportActionsUtils.getOriginalMessage(reportAction)?.participantAccountIDs ?? [] : []; // In case this is workspace split expense, we manually add the workspace as the second participant of the split expense // because we don't save any accountID in the report action's originalMessage other than the payee's accountID @@ -89,7 +95,7 @@ function SplitBillDetailsPage({personalDetails, report, route, reportActions, tr } = ReportUtils.getTransactionDetails(isEditingSplitBill && draftTransaction ? draftTransaction : transaction) ?? {}; const onConfirm = useCallback( - () => IOU.completeSplitBill(reportID, reportAction, draftTransaction, session?.accountID ?? 0, session?.email ?? ''), + () => IOU.completeSplitBill(reportID, reportAction, draftTransaction, session?.accountID ?? -1, session?.email ?? ''), [reportID, reportAction, draftTransaction, session?.accountID, session?.email], ); @@ -100,8 +106,15 @@ function SplitBillDetailsPage({personalDetails, report, route, reportActions, tr {isScanning && ( + } + description={translate('iou.receiptScanInProgressDescription')} shouldShowBorderBottom shouldStyleFlexGrow={false} /> @@ -114,6 +127,7 @@ function SplitBillDetailsPage({personalDetails, report, route, reportActions, tr iouCurrencyCode={splitCurrency} iouComment={splitComment} iouCreated={splitCreated} + shouldDisplayReceipt iouMerchant={splitMerchant} iouCategory={splitCategory} iouIsBillable={splitBillable} @@ -145,16 +159,16 @@ const WrappedComponent = withOnyx { const reportAction = reportActions?.[route.params.reportActionID]; - const IOUTransactionID = - reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU && reportAction?.originalMessage?.IOUTransactionID ? reportAction.originalMessage.IOUTransactionID : 0; + const originalMessage = reportAction && ReportActionsUtils.isMoneyRequestAction(reportAction) ? ReportActionsUtils.getOriginalMessage(reportAction) : undefined; + const IOUTransactionID = reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU && originalMessage?.IOUTransactionID ? originalMessage.IOUTransactionID : 0; return `${ONYXKEYS.COLLECTION.TRANSACTION}${IOUTransactionID}`; }, }, draftTransaction: { key: ({route, reportActions}) => { const reportAction = reportActions?.[route.params.reportActionID]; - const IOUTransactionID = - reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU && reportAction?.originalMessage?.IOUTransactionID ? reportAction.originalMessage.IOUTransactionID : 0; + const originalMessage = reportAction && ReportActionsUtils.isMoneyRequestAction(reportAction) ? ReportActionsUtils.getOriginalMessage(reportAction) : undefined; + const IOUTransactionID = reportAction?.actionName === CONST.REPORT.ACTIONS.TYPE.IOU && originalMessage?.IOUTransactionID ? originalMessage.IOUTransactionID : 0; return `${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${IOUTransactionID}`; }, }, diff --git a/src/pages/iou/request/IOURequestStartPage.tsx b/src/pages/iou/request/IOURequestStartPage.tsx index 1bbf0d02a941..44f3c1b6a1bc 100644 --- a/src/pages/iou/request/IOURequestStartPage.tsx +++ b/src/pages/iou/request/IOURequestStartPage.tsx @@ -3,7 +3,6 @@ import React, {useCallback, useEffect, useRef, useState} from 'react'; import {View} from 'react-native'; import type {OnyxCollection, OnyxEntry} from 'react-native-onyx'; import {withOnyx} from 'react-native-onyx'; -import FullPageNotFoundView from '@components/BlockingViews/FullPageNotFoundView'; import DragAndDropProvider from '@components/DragAndDrop/Provider'; import FullScreenLoadingIndicator from '@components/FullscreenLoadingIndicator'; import HeaderWithBackButton from '@components/HeaderWithBackButton'; @@ -13,13 +12,12 @@ import useLocalize from '@hooks/useLocalize'; import usePermissions from '@hooks/usePermissions'; import useThemeStyles from '@hooks/useThemeStyles'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; -import * as IOUUtils from '@libs/IOUUtils'; import * as KeyDownPressListener from '@libs/KeyboardShortcut/KeyDownPressListener'; import Navigation from '@libs/Navigation/Navigation'; import OnyxTabNavigator, {TopTab} from '@libs/Navigation/OnyxTabNavigator'; -import * as PolicyUtils from '@libs/PolicyUtils'; import * as ReportUtils from '@libs/ReportUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; +import AccessOrNotFoundWrapper from '@pages/workspace/AccessOrNotFoundWrapper'; import * as IOU from '@userActions/IOU'; import type {IOURequestType} from '@userActions/IOU'; import CONST from '@src/CONST'; @@ -105,9 +103,6 @@ function IOURequestStartPage({ const isExpenseReport = ReportUtils.isExpenseReport(report); const shouldDisplayDistanceRequest = (!!canUseP2PDistanceRequests || isExpenseChat || isExpenseReport || isFromGlobalCreate) && iouType !== CONST.IOU.TYPE.SPLIT; - // Allow the user to submit the expense if we are submitting the expense in global menu or the report can create the exoense - const isAllowedToCreateRequest = isEmptyObject(report?.reportID) || ReportUtils.canCreateRequest(report, policy, iouType) || PolicyUtils.canSendInvoice(allPolicies); - const navigateBack = () => { Navigation.closeRHPFlow(); }; @@ -126,15 +121,21 @@ function IOURequestStartPage({ } return ( - - {({safeAreaPaddingBottomStyle}) => ( - + + {({safeAreaPaddingBottomStyle}) => ( - {() => } + + {() => ( + + )} + {() => } {shouldDisplayDistanceRequest && {() => }} @@ -159,9 +167,9 @@ function IOURequestStartPage({ )} - - )} - + )} + + ); } @@ -178,7 +186,7 @@ export default withOnyx( key: `${ONYXKEYS.COLLECTION.SELECTED_TAB}${CONST.TAB.IOU_REQUEST_TYPE}`, }, transaction: { - key: ({route}) => `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${route?.params.transactionID ?? 0}`, + key: ({route}) => `${ONYXKEYS.COLLECTION.TRANSACTION_DRAFT}${route?.params.transactionID ?? -1}`, }, allPolicies: { key: ONYXKEYS.COLLECTION.POLICY, diff --git a/src/pages/iou/request/MoneyRequestParticipantsSelector.tsx b/src/pages/iou/request/MoneyRequestParticipantsSelector.tsx index 8c334dbbf9fb..46c0d10e08ac 100644 --- a/src/pages/iou/request/MoneyRequestParticipantsSelector.tsx +++ b/src/pages/iou/request/MoneyRequestParticipantsSelector.tsx @@ -19,9 +19,8 @@ import usePermissions from '@hooks/usePermissions'; import useScreenWrapperTranstionStatus from '@hooks/useScreenWrapperTransitionStatus'; import useThemeStyles from '@hooks/useThemeStyles'; import * as DeviceCapabilities from '@libs/DeviceCapabilities'; -import type {MaybePhraseKey} from '@libs/Localize'; -import type {Options} from '@libs/OptionsListUtils'; import * as OptionsListUtils from '@libs/OptionsListUtils'; +import * as ReportUtils from '@libs/ReportUtils'; import * as Policy from '@userActions/Policy/Policy'; import * as Report from '@userActions/Report'; import type {IOUAction, IOURequestType, IOUType} from '@src/CONST'; @@ -65,7 +64,7 @@ function MoneyRequestParticipantsSelector({participants = [], onFinish, onPartic shouldInitialize: didScreenTransitionEnd, }); - const offlineMessage: MaybePhraseKey = isOffline ? [`${translate('common.youAppearToBeOffline')} ${translate('search.resultsAreLimited')}`, {isTranslated: true}] : ''; + const offlineMessage: string = isOffline ? `${translate('common.youAppearToBeOffline')} ${translate('search.resultsAreLimited')}` : ''; const isIOUSplit = iouType === CONST.IOU.TYPE.SPLIT; const isCategorizeOrShareAction = [CONST.IOU.ACTION.CATEGORIZE, CONST.IOU.ACTION.SHARE].some((option) => option === action); @@ -76,21 +75,25 @@ function MoneyRequestParticipantsSelector({participants = [], onFinish, onPartic Report.searchInServer(debouncedSearchTerm.trim()); }, [debouncedSearchTerm]); - /** - * Returns the sections needed for the SelectionList - * - * @returns {Array} - */ - const [sections, newChatOptions] = useMemo(() => { - const newSections: OptionsListUtils.CategorySection[] = []; + const defaultOptions = useMemo(() => { if (!areOptionsInitialized || !didScreenTransitionEnd) { - return [newSections, {}]; + return { + userToInvite: null, + recentReports: [], + personalDetails: [], + currentUserOption: null, + headerMessage: '', + categoryOptions: [], + tagOptions: [], + taxRatesOptions: [], + }; } - const chatOptions = OptionsListUtils.getFilteredOptions( + + const optionList = OptionsListUtils.getFilteredOptions( options.reports, options.personalDetails, betas, - debouncedSearchTerm, + '', participants, CONST.EXPENSIFY_EMAILS, @@ -109,19 +112,67 @@ function MoneyRequestParticipantsSelector({participants = [], onFinish, onPartic // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing (canUseP2PDistanceRequests || iouRequestType !== CONST.IOU.REQUEST_TYPE.DISTANCE) && !isCategorizeOrShareAction, false, + false, + 0, undefined, undefined, undefined, undefined, undefined, - undefined, - !isCategorizeOrShareAction, - isCategorizeOrShareAction ? 0 : undefined, + iouType === CONST.IOU.TYPE.INVOICE, ); + return optionList; + }, [ + action, + areOptionsInitialized, + betas, + canUseP2PDistanceRequests, + didScreenTransitionEnd, + iouRequestType, + iouType, + isCategorizeOrShareAction, + options.personalDetails, + options.reports, + participants, + ]); + + const chatOptions = useMemo(() => { + if (!areOptionsInitialized) { + return { + userToInvite: null, + recentReports: [], + personalDetails: [], + currentUserOption: null, + headerMessage: '', + categoryOptions: [], + tagOptions: [], + taxRatesOptions: [], + }; + } + + const newOptions = OptionsListUtils.filterOptions(defaultOptions, debouncedSearchTerm, { + betas, + selectedOptions: participants, + excludeLogins: CONST.EXPENSIFY_EMAILS, + maxRecentReportsToShow: CONST.IOU.MAX_RECENT_REPORTS_TO_SHOW, + }); + return newOptions; + }, [areOptionsInitialized, betas, defaultOptions, debouncedSearchTerm, participants]); + + /** + * Returns the sections needed for the OptionsSelector + * @returns {Array} + */ + const [sections, header] = useMemo(() => { + const newSections: OptionsListUtils.CategorySection[] = []; + if (!areOptionsInitialized || !didScreenTransitionEnd) { + return [newSections, '']; + } + const formatResults = OptionsListUtils.formatSectionsFromSearchTerm( debouncedSearchTerm, - participants.map((participant) => ({...participant, reportID: participant.reportID ?? ''})), + participants.map((participant) => ({...participant, reportID: participant.reportID ?? '-1'})), chatOptions.recentReports, chatOptions.personalDetails, personalDetails, @@ -156,23 +207,15 @@ function MoneyRequestParticipantsSelector({participants = [], onFinish, onPartic }); } - return [newSections, chatOptions]; - }, [ - areOptionsInitialized, - options.reports, - options.personalDetails, - betas, - debouncedSearchTerm, - participants, - iouType, - action, - canUseP2PDistanceRequests, - iouRequestType, - personalDetails, - translate, - didScreenTransitionEnd, - isCategorizeOrShareAction, - ]); + const headerMessage = OptionsListUtils.getHeaderMessage( + (chatOptions.personalDetails ?? []).length + (chatOptions.recentReports ?? []).length !== 0, + !!chatOptions?.userToInvite, + debouncedSearchTerm.trim(), + participants.some((participant) => participant?.searchText?.toLowerCase().includes(debouncedSearchTerm.trim().toLowerCase())), + ); + + return [newSections, headerMessage]; + }, [debouncedSearchTerm, chatOptions, areOptionsInitialized, didScreenTransitionEnd, participants, personalDetails, translate]); /** * Adds a single participant to the expense @@ -190,10 +233,9 @@ function MoneyRequestParticipantsSelector({participants = [], onFinish, onPartic ]; if (iouType === CONST.IOU.TYPE.INVOICE) { - const primaryPolicy = Policy.getPrimaryPolicy(activePolicyID); - + const policyID = option.item && ReportUtils.isInvoiceRoom(option.item) ? option.policyID : Policy.getPrimaryPolicy(activePolicyID)?.id; newParticipants.push({ - policyID: primaryPolicy?.id, + policyID, isSender: true, selected: false, iouType, @@ -250,18 +292,7 @@ function MoneyRequestParticipantsSelector({participants = [], onFinish, onPartic [participants, onParticipantsAdded], ); - const headerMessage = useMemo( - () => - OptionsListUtils.getHeaderMessage( - ((newChatOptions as Options)?.personalDetails ?? []).length + ((newChatOptions as Options)?.recentReports ?? []).length !== 0, - Boolean((newChatOptions as Options)?.userToInvite), - debouncedSearchTerm.trim(), - participants.some((participant) => participant?.searchText?.toLowerCase().includes(debouncedSearchTerm.trim().toLowerCase())), - ), - [newChatOptions, participants, debouncedSearchTerm], - ); - - // Right now you can't split an expense with a workspace and other additional participants + // Right now you can't split a request with a workspace and other additional participants // This is getting properly fixed in https://github.com/Expensify/App/issues/27508, but as a stop-gap to prevent // the app from crashing on native when you try to do this, we'll going to hide the button if you have a workspace and other participants const hasPolicyExpenseChatParticipant = participants.some((participant) => participant.isPolicyExpenseChat); @@ -309,7 +340,7 @@ function MoneyRequestParticipantsSelector({participants = [], onFinish, onPartic )} @@ -358,8 +389,9 @@ function MoneyRequestParticipantsSelector({participants = [], onFinish, onPartic onChangeText={setSearchTerm} shouldPreventDefaultFocusOnSelectRow={!DeviceCapabilities.canUseTouchScreen()} onSelectRow={(item) => (isIOUSplit ? addParticipantToSelection(item) : addSingleParticipant(item))} + shouldDebounceRowSelect footerContent={footerContent} - headerMessage={headerMessage} + headerMessage={header} showLoadingPlaceholder={!areOptionsInitialized || !didScreenTransitionEnd} canSelectMultiple={isIOUSplit && isAllowedToSplit} isLoadingNewOptions={!!isSearchingForReports} diff --git a/src/pages/iou/request/step/IOURequestStepAmount.tsx b/src/pages/iou/request/step/IOURequestStepAmount.tsx index 18dc951f949b..04c8e772844b 100644 --- a/src/pages/iou/request/step/IOURequestStepAmount.tsx +++ b/src/pages/iou/request/step/IOURequestStepAmount.tsx @@ -54,6 +54,9 @@ type IOURequestStepAmountProps = IOURequestStepAmountOnyxProps & WithWritableReportOrNotFoundProps & { /** The transaction object being modified in Onyx */ transaction: OnyxEntry; + + /** Whether the user input should be kept or not */ + shouldKeepUserInput?: boolean; }; function IOURequestStepAmount({ @@ -68,6 +71,7 @@ function IOURequestStepAmount({ splitDraftTransaction, skipConfirmation, draftTransaction, + shouldKeepUserInput = false, }: IOURequestStepAmountProps) { const {translate} = useLocalize(); const textInput = useRef(null); @@ -78,7 +82,8 @@ function IOURequestStepAmount({ const isEditing = action === CONST.IOU.ACTION.EDIT; const isSplitBill = iouType === CONST.IOU.TYPE.SPLIT; const isEditingSplitBill = isEditing && isSplitBill; - const {amount: transactionAmount} = ReportUtils.getTransactionDetails(isEditingSplitBill && !isEmptyObject(splitDraftTransaction) ? splitDraftTransaction : transaction) ?? {amount: 0}; + const currentTransaction = isEditingSplitBill && !isEmptyObject(splitDraftTransaction) ? splitDraftTransaction : transaction; + const {amount: transactionAmount} = ReportUtils.getTransactionDetails(currentTransaction) ?? {amount: 0}; const {currency: originalCurrency} = ReportUtils.getTransactionDetails(isEditing ? draftTransaction : transaction) ?? {currency: CONST.CURRENCY.USD}; const currency = CurrencyUtils.isValidCurrencyCode(selectedCurrency) ? selectedCurrency : originalCurrency; @@ -117,7 +122,7 @@ function IOURequestStepAmount({ if (isSaveButtonPressed.current) { return; } - TransactionEdit.removeDraftTransaction(transaction?.transactionID ?? ''); + TransactionEdit.removeDraftTransaction(transaction?.transactionID ?? '-1'); }; // eslint-disable-next-line react-hooks/exhaustive-deps }, []); @@ -163,7 +168,11 @@ function IOURequestStepAmount({ const amountInSmallestCurrencyUnits = CurrencyUtils.convertToBackendAmount(Number.parseFloat(amount)); // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing - IOU.setMoneyRequestAmount(transactionID, amountInSmallestCurrencyUnits, currency || CONST.CURRENCY.USD); + IOU.setMoneyRequestAmount(transactionID, amountInSmallestCurrencyUnits, currency || CONST.CURRENCY.USD, shouldKeepUserInput); + + // Initially when we're creating money request, we do not know the participant and hence if the request is with workspace with tax tracking enabled + // So, we reset the taxAmount here and calculate it in the hook in MoneyRequestConfirmationList component + IOU.setMoneyRequestTaxAmount(transactionID, null); if (backTo) { Navigation.goBack(backTo); @@ -176,7 +185,7 @@ function IOURequestStepAmount({ if (report?.reportID && !ReportUtils.isArchivedRoom(report)) { const selectedParticipants = IOU.setMoneyRequestParticipantsFromReport(transactionID, report); const participants = selectedParticipants.map((participant) => { - const participantAccountID = participant?.accountID ?? 0; + const participantAccountID = participant?.accountID ?? -1; return participantAccountID ? OptionsListUtils.getParticipantsOption(participant, personalDetails) : OptionsListUtils.getReportOption(participant); }); const backendAmount = CurrencyUtils.convertToBackendAmount(Number.parseFloat(amount)); @@ -269,25 +278,30 @@ function IOURequestStepAmount({ } // If the value hasn't changed, don't request to save changes on the server and just close the modal - const transactionCurrency = TransactionUtils.getCurrency(transaction); - if (newAmount === TransactionUtils.getAmount(transaction) && currency === transactionCurrency) { - Navigation.dismissModal(); - return; - } + const transactionCurrency = TransactionUtils.getCurrency(currentTransaction); + if (newAmount === TransactionUtils.getAmount(currentTransaction) && currency === transactionCurrency) { + if (isSplitBill) { + Navigation.goBack(backTo); + } else { + Navigation.dismissModal(); + } - if (isSplitBill) { - IOU.setDraftSplitTransaction(transactionID, {amount: newAmount, currency}); - Navigation.goBack(backTo); return; } // If currency has changed, then we get the default tax rate based on currency, otherwise we use the current tax rate selected in transaction, if we have it. - const transactionTaxCode = transaction?.taxCode ?? ''; - const defaultTaxCode = TransactionUtils.getDefaultTaxCode(policy, transaction, currency) ?? ''; + const transactionTaxCode = ReportUtils.getTransactionDetails(currentTransaction)?.taxCode; + const defaultTaxCode = TransactionUtils.getDefaultTaxCode(policy, currentTransaction, currency) ?? ''; const taxCode = (currency !== transactionCurrency ? defaultTaxCode : transactionTaxCode) ?? defaultTaxCode; - const taxPercentage = TransactionUtils.getTaxValue(policy, transaction, taxCode) ?? ''; + const taxPercentage = TransactionUtils.getTaxValue(policy, currentTransaction, taxCode) ?? ''; const taxAmount = CurrencyUtils.convertToBackendAmount(TransactionUtils.calculateTaxAmount(taxPercentage, newAmount)); + if (isSplitBill) { + IOU.setDraftSplitTransaction(transactionID, {amount: newAmount, currency, taxCode, taxAmount}); + Navigation.goBack(backTo); + return; + } + IOU.updateMoneyRequestAmountAndCurrency({transactionID, transactionThreadReportID: reportID, currency, amount: newAmount, taxAmount, policy, taxCode}); Navigation.dismissModal(); }; @@ -306,9 +320,10 @@ function IOURequestStepAmount({ amount={Math.abs(transactionAmount)} skipConfirmation={shouldSkipConfirmation ?? false} iouType={iouType} - policyID={policy?.id ?? ''} + policyID={policy?.id ?? '-1'} bankAccountRoute={ReportUtils.getBankAccountRoute(report)} ref={(e) => (textInput.current = e)} + shouldKeepUserInput={transaction?.shouldShowOriginalAmount} onCurrencyButtonPress={navigateToCurrencySelectionPage} onSubmitButtonPress={saveAmountAndCurrency} selectedTab={iouRequestType} @@ -322,7 +337,7 @@ IOURequestStepAmount.displayName = 'IOURequestStepAmount'; const IOURequestStepAmountWithOnyx = withOnyx({ splitDraftTransaction: { key: ({route}) => { - const transactionID = route.params.transactionID ?? 0; + const transactionID = route.params.transactionID ?? -1; return `${ONYXKEYS.COLLECTION.SPLIT_TRANSACTION_DRAFT}${transactionID}`; }, }, @@ -334,7 +349,7 @@ const IOURequestStepAmountWithOnyx = withOnyx { - const transactionID = route.params.transactionID ?? 0; + const transactionID = route.params.transactionID ?? -1; return `${ONYXKEYS.COLLECTION.SKIP_CONFIRMATION}${transactionID}`; }, }, @@ -342,7 +357,7 @@ const IOURequestStepAmountWithOnyx = withOnyx `${ONYXKEYS.COLLECTION.POLICY}${report ? report.policyID : '0'}`, + key: ({report}) => `${ONYXKEYS.COLLECTION.POLICY}${report ? report.policyID : '-1'}`, }, })(IOURequestStepAmount); diff --git a/src/pages/iou/request/step/IOURequestStepCategory.tsx b/src/pages/iou/request/step/IOURequestStepCategory.tsx index a38380904851..601fb4dc29da 100644 --- a/src/pages/iou/request/step/IOURequestStepCategory.tsx +++ b/src/pages/iou/request/step/IOURequestStepCategory.tsx @@ -1,15 +1,22 @@ import lodashIsEmpty from 'lodash/isEmpty'; import React, {useEffect} from 'react'; +import {ActivityIndicator, View} from 'react-native'; import type {OnyxEntry} from 'react-native-onyx'; import {withOnyx} from 'react-native-onyx'; +import Button from '@components/Button'; import CategoryPicker from '@components/CategoryPicker'; +import FixedFooter from '@components/FixedFooter'; +import * as Illustrations from '@components/Icon/Illustrations'; import type {ListItem} from '@components/SelectionList/types'; import Text from '@components/Text'; +import WorkspaceEmptyStateSection from '@components/WorkspaceEmptyStateSection'; import useLocalize from '@hooks/useLocalize'; import useNetwork from '@hooks/useNetwork'; +import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; import Navigation from '@libs/Navigation/Navigation'; import * as OptionsListUtils from '@libs/OptionsListUtils'; +import * as ReportActionsUtils from '@libs/ReportActionsUtils'; import * as ReportUtils from '@libs/ReportUtils'; import * as TransactionUtils from '@libs/TransactionUtils'; import * as IOU from '@userActions/IOU'; @@ -75,6 +82,7 @@ function IOURequestStepCategory({ const policy = policyReal ?? policyDraft; const policyCategories = policyCategoriesReal ?? policyCategoriesDraft; const styles = useThemeStyles(); + const theme = useTheme(); const {translate} = useLocalize(); const isEditing = action === CONST.IOU.ACTION.EDIT; const isEditingSplitBill = isEditing && iouType === CONST.IOU.TYPE.SPLIT; @@ -92,17 +100,18 @@ function IOURequestStepCategory({ const isSplitBill = iouType === CONST.IOU.TYPE.SPLIT; const canEditSplitBill = isSplitBill && reportAction && session?.accountID === reportAction.actorAccountID && TransactionUtils.areRequiredFieldsEmpty(transaction); // eslint-disable-next-line rulesdir/no-negated-variables - const shouldShowNotFoundPage = !shouldShowCategory || (isEditing && (isSplitBill ? !canEditSplitBill : !ReportUtils.canEditMoneyRequest(reportAction))); + const shouldShowNotFoundPage = isEditing && (isSplitBill ? !canEditSplitBill : !ReportActionsUtils.isMoneyRequestAction(reportAction) || !ReportUtils.canEditMoneyRequest(reportAction)); const fetchData = () => { if (policy && policyCategories) { return; } - PolicyActions.openDraftWorkspaceRequest(report?.policyID ?? ''); + PolicyActions.openDraftWorkspaceRequest(report?.policyID ?? '-1'); }; - - useNetwork({onReconnect: fetchData}); + const {isOffline} = useNetwork({onReconnect: fetchData}); + const isLoading = !isOffline && policyCategories === undefined; + const shouldShowEmptyState = !isLoading && !shouldShowCategory; useEffect(() => { fetchData(); @@ -136,7 +145,7 @@ function IOURequestStepCategory({ IOU.setMoneyRequestCategory(transactionID, updatedCategory); if (action === CONST.IOU.ACTION.CATEGORIZE) { - Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, iouType, transactionID, report?.reportID ?? '')); + Navigation.navigate(ROUTES.MONEY_REQUEST_STEP_CONFIRMATION.getRoute(action, iouType, transactionID, report?.reportID ?? '-1')); return; } @@ -150,14 +159,52 @@ function IOURequestStepCategory({ shouldShowWrapper shouldShowNotFoundPage={shouldShowNotFoundPage} testID={IOURequestStepCategory.displayName} - includeSafeAreaPaddingBottom={false} > - {translate('iou.categorySelection')} - + {isLoading && ( + + )} + {shouldShowEmptyState && ( + + + +