├── .gitignore ├── Ch08 ├── myproject │ ├── .gitignore │ ├── package.json │ ├── index.js │ └── package-lock.json └── README.md ├── Ch09 ├── myproject │ ├── .gitignore │ ├── .env.example │ ├── package.json │ ├── en-index.js │ ├── index.js │ └── package-lock.json └── README.md ├── Ch10 ├── myproject │ ├── .gitignore │ ├── .env.example │ ├── package.json │ ├── refactor-index.js │ └── commemt-index.js └── README.md ├── .DS_Store ├── img └── bar.png ├── Ch15 └── README.md ├── 後記 └── README.md ├── Ch16 └── README.md ├── Ch05 └── README.md ├── Ch12 └── README.md ├── Ch03 └── README.md ├── Ch14 └── README.md ├── Ch17 └── README.md ├── Ch11 ├── README.md └── PRD.md ├── Ch01 └── README.md ├── Ch13 └── README.md ├── Ch07 └── README.md ├── Ch02 └── README.md ├── README.md ├── Ch18 └── README.md ├── Ch06 └── README.md ├── Ch04 └── README.md └── LICENSE /.gitignore: -------------------------------------------------------------------------------- 1 | 書籍用圖 -------------------------------------------------------------------------------- /Ch08/myproject/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /Ch09/myproject/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /Ch10/myproject/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dean9703111/chatGPT/HEAD/.DS_Store -------------------------------------------------------------------------------- /img/bar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dean9703111/chatGPT/HEAD/img/bar.png -------------------------------------------------------------------------------- /Ch09/myproject/.env.example: -------------------------------------------------------------------------------- 1 | CHANNEL_ACCESS_TOKEN= 2 | CHANNEL_SECRET= 3 | OPENAI_API_KEY= -------------------------------------------------------------------------------- /Ch10/myproject/.env.example: -------------------------------------------------------------------------------- 1 | CHANNEL_ACCESS_TOKEN= 2 | CHANNEL_SECRET= 3 | OPENAI_API_KEY= -------------------------------------------------------------------------------- /Ch15/README.md: -------------------------------------------------------------------------------- 1 | # Ch15 ChatGPT 會對專家造成威脅嗎?我的工作會受到影響嗎? 2 | 3 | ### 參考資料 4 | 1. [凱因斯錯了!每週只要工作15小時?](https://www.gvm.com.tw/article/54200) -------------------------------------------------------------------------------- /後記/README.md: -------------------------------------------------------------------------------- 1 | # 後記 —— 想跟讀者說的話! 2 | 3 | 筆者的 Medium:https://medium.com/@dean-lin/list/chatgpt-openai-ddcc9c53a4ac 4 | 5 | All Things AI:https://allthingsai.com -------------------------------------------------------------------------------- /Ch08/myproject/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "myproject", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@line/bot-sdk": "^7.5.2", 13 | "express": "^4.18.2", 14 | "openai": "^3.1.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Ch09/myproject/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "myproject", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@line/bot-sdk": "^7.5.2", 13 | "express": "^4.18.2", 14 | "openai": "^3.1.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Ch10/myproject/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "myproject", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@line/bot-sdk": "^7.5.2", 13 | "express": "^4.18.2", 14 | "openai": "^3.1.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Ch16/README.md: -------------------------------------------------------------------------------- 1 | # Ch16 Midjourney 起手式 2 | 3 | ### 16.1 註冊 Midjourney 4 | 5 | Midjourney 官網: https://midjourney.com/ 6 | 7 | ### 16.2 進入 Discord,用簡單的關鍵字讓 Midjourney 產生絕美圖片 8 | 9 | `Very cute rabbit in small house eat orange` 10 | 11 | ### 16.3 不想被洗版?在 Discord 建立伺服器,並邀請 Midjourney bot 加入 12 | 13 | `chinese new year, cute rabbit, firecracker --ar 3:2` 14 | 15 | ### 參考資料 16 | 1. [一鍵挑戰大師畫作?MidJourney AI 作品摘下美術比賽桂冠引熱議](https://technews.tw/2022/09/23/midjourney-ai/) -------------------------------------------------------------------------------- /Ch05/README.md: -------------------------------------------------------------------------------- 1 | # Ch5 讓 ChatGPT 變聰明的 3 個小技巧 2 | 3 | ### 5.1 設定 ChatGPT 快捷鍵(簡寫) 4 | 5 | `接下來的對話,如果我只傳送「c」這個字母,就是「繼續完成回答」的意思。` 6 | 7 | ### 5.2 用符號讓 ChatGPT 理解要處理的任務 8 | 9 | `優化文案「ERP 系統,量身打造,系統廠首選」` 10 | 11 | ``` 12 | 優化「」內的文案,擴充到 1000 字,分段描述。 13 | 「ERP 系統,為客戶量身打造,系統廠首選」 14 | ``` 15 | 16 | ### 5.3 設定 ChatGPT 回應的語言 17 | 18 | `不管我使用什麼語言詢問,接下來的對話都使用「繁體中文」回答我。` 19 | 20 | ``` 21 | 不管我使用什麼語言詢問,接下來的對話都使用「繁體中文」回答我。 22 | Explain decorator pattern, use example with node.js. 23 | ``` -------------------------------------------------------------------------------- /Ch12/README.md: -------------------------------------------------------------------------------- 1 | # Ch12 了解 ChatGPT 有哪些問題與限制 2 | 3 | ### 12.2 回答的資料有限 4 | 5 | 讓 ChatGPT 連網的 Chrome快掛「WebChatGPT」:https://chrome.google.com/webstore/detail/webchatgpt-chatgpt-with-i/lpfemeioodjbpieminkklglpmhlngfcn 6 | 7 | `請推薦幾間在台北評分高的滷肉飯` 8 | 9 | ### 12.3 拒絕回答敏感問題(ex:股票、虛擬貨幣漲跌、暴力、犯罪...) 10 | 11 | `請告訴我台灣「台積電」這個股票未來走勢` 12 | 13 | ### 參考資料 14 | 1. [Introducing ChatGPT Plus](https://openai.com/blog/chatgpt-plus/) 15 | 2. [微軟推出以ChatGPT強化的新版Bing搜尋、Edge,開放大眾試用](https://www.ithome.com.tw/news/155429) -------------------------------------------------------------------------------- /Ch03/README.md: -------------------------------------------------------------------------------- 1 | # Ch3 寫出有效的 Prompt,讓 ChatGPT 給你期待的回覆 2 | 3 | ### 3.2 如果 Prompt 不完善會發生什麼事? 4 | 5 | - `幫我寫一份求職履歷。` 6 | - `幫我寫一份「工程師」的求職履歷。` 7 | - `幫我用繁體中文寫一份讓面試官眼睛一亮的求職履歷。我是一名 Backend 工程師,有 5 年的工作經驗,熟悉 Node.js、MYSQL、PostgreSQL 等技術,也有 GCP K8s 的經驗,做過 RMA、OTA 等系統。` 8 | 9 | ### 3.4 請 ChatGPT 擔任某個領域的「專家」 10 | 11 | `我希望你擔任一個優秀的旅行社服務人員。我會輸入“地點”的資訊,你只需要告訴我當地的“美食”、“景點”、“注意事項”。回答的字數不要超過 400 字,用“摘要”就好。我要詢問的第一個地點是“宜蘭”。` 12 | 13 | ### 3.5 一些額外的建議 14 | 15 | `請推薦幾間在台北評分高的滷肉飯餐廳` 16 | 17 | ### 參考資料 18 | 19 | 1. [The Art of ChatGPT Prompting](https://fka.gumroad.com/l/art-of-chatgpt-prompting) -------------------------------------------------------------------------------- /Ch14/README.md: -------------------------------------------------------------------------------- 1 | # Ch14 會從萬事問 Google 變成萬事問 ChatGPT 嗎? 2 | 3 | ### 14.1 我們現在是如何使用 Google 的?而 ChatGPT 有何不同? 4 | 5 | Google:`泰式料理 台北` 6 | 7 | ChatGPT:`在 git 如何阻止 .env 檔上傳。` 8 | 9 | ### 14.4 有能力完成,但不想花時間 10 | 11 | 撰寫帶有「特殊需求」的報告: 12 | - `比較瀑布式開發與敏捷式開發的不同,並以敏捷式開發比較好作為結論。` 13 | - `介紹 Git 常用的分支策略,並說明為何會這樣設計。` 14 | 15 | 整理「複雜情境」的問題: 16 | - `團隊在跑 Scrum 時大家都不關心彼此的報告內容,我身為 Scrum Master 可以如何引導?` 17 | - `核心價值對公司來說有什麼意義?以軟體公司舉例。` 18 | 19 | ### 參考資料 20 | 1. [聊天機器人 ChatGPT 轟動全球,但目前還是無法撼動 Google](https://applealmond.com/posts/168498) 21 | 2. [ChatGPT 即將取代 Google?微軟為什麼要砸錢投資?全方位 ChatGPT 分析來了](https://kopu.chat/chatgpt/) -------------------------------------------------------------------------------- /Ch17/README.md: -------------------------------------------------------------------------------- 1 | # Ch17 了解 Midjourney 不同 Settings 對產圖的影響 2 | 3 | ### 17.2 MJ version 1、2、3、4、Niji Mode … 版本間的差異 4 | 5 | `handsome boy` 6 | 7 | ### 17.4 Style low、med、high 的差異 8 | 9 | `elegant lady` 10 | 11 | ### 17.5 Remix mode如何使用? 12 | 13 | `quokka` 14 | 15 | `quokka wearing sunglasses --v 4` 16 | 17 | ### 17.9 調整產出圖片的比例 18 | 19 | `In the dark wine cellar, a ring imbued with magic is placed on top of an ancient and thick book, with a beam of moonlight shining upon it. --ar 3:2 --s 750 --q 0.5` 20 | 21 | ### 參考資料 22 | 1. [Settings and Presets](https://docs.midjourney.com/docs/settings-and-presets) -------------------------------------------------------------------------------- /Ch11/README.md: -------------------------------------------------------------------------------- 1 | # Ch11 太兇殘了!竟然靠聊天就能產出 PRD,PM 還不趕快學起來! 2 | 3 | ### 11.1 聊出 PRD 的步驟 4 | 5 | **SETP 1**:說明自己要做的事,並初步詢問建議 6 | ``` 7 | 我要幫公司做一個線上測驗系統,給來公司面試的人做測試。 8 | 預計會有中文、英文、邏輯等 3 個考試項目。 9 | 在系統的規劃上,我有什麼需要注意的嗎? 10 | ``` 11 | 12 | **SETP 2**:簡述需求,請 ChatGPT 補充細節 13 | ``` 14 | 我預計系統會分成兩塊,一個是給考生使用,另一個是給管理者使用。 15 | 管理者可以新增考生、管理試卷、查看分數。 16 | 上述需求可以幫我列出要考慮的細節嗎? 17 | ``` 18 | 19 | **SETP 3**:讓 ChatGPT 做更詳盡的規劃 20 | - `關於考生登入的系統,可以幫我規劃他的操作步驟嗎?` 21 | 22 | - `關於管理者的系統,可以幫我把它可能會用的功能細分整理嗎?` 23 | 24 | **SETP 4**:請 ChatGPT 產出 PRD 25 | - `可以幫忙把剛剛聊的內容整理成一份「產品需求規格書」嗎?細節越詳細越好。` 26 | 27 | [PRD 的草稿](PRD.md) 28 | 29 | ### 參考資料 30 | 1. [Markdown 版本的 PRD](https://github.com/dean9703111/chatGPT/blob/master/Ch11/PRD.md) -------------------------------------------------------------------------------- /Ch01/README.md: -------------------------------------------------------------------------------- 1 | # Ch1 了解他的能力範圍,以及對我們有什麼實際幫助 2 | 3 | ### 1.4 ChatGPT 如何使用? 4 | 5 | **SETP 1**:前往這個網址註冊:https://chat.openai.com/ 6 | 7 | **SETP 4**:嘗試輸入第一段對話。 8 | `我過年都在趕稿心情很低落,需要鼓勵!` 9 | 10 | ### 1.7 ChatGPT 有使用手冊與社群嗎? 11 | 12 | - OpenAI API doc:https://beta.openai.com/docs/introduction 13 | - reddit:https://www.reddit.com/r/ChatGPT/ 14 | - OpenAI Community:https://community.openai.com/ 15 | - ChatGPT Taiwan:https://www.facebook.com/groups/529961532367250 16 | 17 | ### 參考資料 18 | 19 | 1. [夯爆!ChatGPT月活用戶達1億 增速創史上最快](https://tw.news.yahoo.com/夯爆-chatgpt月活用戶達1億-增速創史上最快-044842639.html) 20 | 2. [百度擬推陸版ChatGPT 概念股熱](https://ctee.com.tw/news/china/800638.html) 21 | 3. [Google 罕見2月舉行發表會!傳將發布「AI黑科技」迎戰ChatGPT](https://3c.ltn.com.tw/news/52128) -------------------------------------------------------------------------------- /Ch13/README.md: -------------------------------------------------------------------------------- 1 | # Ch13 ChatGPT 的翻譯有比 Google 翻譯更優秀嗎? 2 | 3 | ### 13.1 賦予 ChatGPT 英文翻譯專家的人設 4 | 5 | `I want you to act as an English translator, spelling corrector and improver. I will speak to you in any language and you will detect the language, translate it and answer in the corrected and improved version of my text, in English. I want you to replace my simplified A0-level words and sentences with more beautiful and elegant, upper level English words and sentences. Keep the meaning same, but make them more literary. I want you to only reply the correction, the improvements and nothing else, do not write explanations. My first sentence is “不要懷疑!我就是專家”` 6 | 7 | ### 13.2 翻譯「個人經歷」 8 | 9 | `具備跨部門溝通能力,能有效整合不同部門的需求,找出各自的痛點並提出多方可接受的解決方案。` 10 | 11 | ### 13.3 翻譯「千秋萬載,一統江湖」 12 | 13 | `千秋萬載,一統江湖` 14 | 15 | ### 13.4 結論:好的技術幫我們節省時間 16 | 17 | `I understand where you’re coming from.` -------------------------------------------------------------------------------- /Ch11/PRD.md: -------------------------------------------------------------------------------- 1 | # PRD 草稿 2 | 3 | ## 產品需求規格書 4 | 5 | ### 1. 概述 6 | - 本產品為公司用來進行測驗的線上測驗系統 7 | - 系統分成兩個部分,一個給考生使用,另一個給管理者使用 8 | - 測驗項目包括中文、英文、邏輯等 9 | 10 | ### 2. 功能 11 | 12 | #### 2.1 考生系統 13 | - 登入系統:使用 Email 和密碼登入系統,登入成功後顯示考試項目列表。 14 | - 選擇測驗項目:考生可以選擇做的測驗項目,如中文、英文、邏輯等。 15 | - 開始測驗:考生在選定測驗項目後,可以開始測驗,在限定時間內完成測驗。考試界面顯示考試題目、答案選項、考試時間等資訊。 16 | - 提交測驗:考生完成測驗後,需要提交答案。 17 | 18 | #### 2.2 管理者系統 19 | - 登入系統:管理者可以使用帳號密碼登入系統 20 | - 管理考生:管理者可以新增、修改、刪除考生的資料。 21 | - 管理試卷:管理者可以新增、修改、刪除試卷。 22 | - 分配試卷:管理者可以將試卷分配給特定的考生。 23 | - 查看分數:管理者可以查看考生的分數,並對分數進行統計。 24 | - 管理測驗項目:管理者可以新增、修改、刪除測驗項目。 25 | - 管理試卷題目:管理者可以新增、修改、刪除試卷中的題目。 26 | - 管理題目類型:管理者可以新增、修改、刪除題目類型,例如單選題、填空題、算數題等。 27 | - 管理考試時間:管理者可以設定每個測驗項目的考試時間。 28 | - 管理考試截止日期:管理者可以設定每個測驗項目的考試截止日期。 29 | - 匯出報表:管理者可以將考生的分數匯出為報表,方便查看和分析。 30 | 31 | ### 3.技術規格 32 | - 前端:Vue.js 框架。 33 | - 後端:Node.js Express 框架。 34 | - 資料庫:使用 MySQL 資料庫。 35 | - 安全性:使用 JWT 驗證機制保護系統。 36 | 37 | ### 4.時程規劃 38 | - 需求分析:1週 39 | - 系統設計:2週 40 | - 程式開發:4週 41 | - 測試與除錯:2週 42 | - 部署與上線:1週 43 | 44 | ### 5.責任人員 45 | - 產品經理:負責整體需求分析、系統設計和時程規劃 46 | - 前端開發人員:負責系統前端開發和實現 47 | - 後端開發人員:負責系統後端開發和實現 48 | - 資料庫開發人員:負責系統資料庫開發和實現 49 | - 測試工程師:負責系統測試和除錯 50 | - 部署工程師:負責系統部署和上線 -------------------------------------------------------------------------------- /Ch07/README.md: -------------------------------------------------------------------------------- 1 | # Ch7 超強的 Chrome 外掛!更多元的專家選擇! 2 | 3 | AIPRM for ChatGPT:https://chrome.google.com/webstore/detail/aiprm-for-chatgpt/ojnbohmppadfgpejeebfnmnknjdlckgj?hl=en 4 | 5 | ### 7.1 使用Public Prompts 6 | 7 | `How to make money with ChatGPT` 8 | 9 | ### 7.2 建立自己的Own Prompts 10 | 11 | - Prompt Template: 12 | ``` 13 | Please ignore all previous instructions. 14 | I want you to act as a Golang developer and writes fluently [TARGETLANGUAGE]. You should provide me with some examples of Golang code, and I will provide you with some code examples. You should also suggest some Golang tools that can be used to develop Golang, and if you need help, you can ask me for help. I will reply with the code examples, and you should only reply with code examples that are suitable for Golang development. You can also suggest any other Golang-related topics, such as how to improve Golang's performance, how to integrate Golang with other languages, and so on. I hope you can give me advice. 15 | [PROMPT] 16 | ``` 17 | - Teaser:`A senior Golang developer, can provide you advices.` 18 | - Prompt Hint:`Any Golang questions.` 19 | - Title:`Golang developer` 20 | 21 | `Give me a simple example.` -------------------------------------------------------------------------------- /Ch08/myproject/index.js: -------------------------------------------------------------------------------- 1 | const openai = require('openai'); 2 | const line = require('@line/bot-sdk'); 3 | 4 | openai.apiKey = "YOUR_OPENAI_API_KEY"; 5 | 6 | const config = { 7 | channelAccessToken: 'YOUR_CHANNEL_ACCESS_TOKEN', 8 | channelSecret: 'YOUR_CHANNEL_SECRET' 9 | }; 10 | 11 | const client = new line.Client(config); 12 | 13 | const express = require('express'); 14 | const app = express(); 15 | const port = 3000; 16 | 17 | app.post('/webhook', line.middleware(config), (req, res) => { 18 | Promise 19 | .all(req.body.events.map(handleEvent)) 20 | .then((result) => res.json(result)) 21 | .catch((err) => { 22 | console.error(err); 23 | res.status(500).end(); 24 | }); 25 | }); 26 | 27 | app.listen(port, () => { 28 | console.log(`app is running on port ${port}`); 29 | }); 30 | 31 | function handleEvent (event) { 32 | if (event.type !== 'message' || event.message.type !== 'text') { 33 | return Promise.resolve(null); 34 | } 35 | return openai.Completion.create({ 36 | engine: "text-davinci-002", 37 | prompt: event.message.text, 38 | }).then(response => { 39 | return client.replyMessage(event.replyToken, { 40 | type: 'text', 41 | text: response.choices[0].text 42 | }); 43 | }); 44 | } -------------------------------------------------------------------------------- /Ch09/myproject/en-index.js: -------------------------------------------------------------------------------- 1 | const line = require('@line/bot-sdk'); 2 | const express = require('express'); 3 | const openai = require('openai'); 4 | 5 | openai.apiKey = "YOUR_API_KEY"; 6 | 7 | const config = { 8 | channelAccessToken: 'YOUR_CHANNEL_ACCESS_TOKEN', 9 | channelSecret: 'YOUR_CHANNEL_SECRET' 10 | }; 11 | 12 | const client = new line.Client(config); 13 | 14 | const app = express(); 15 | 16 | app.post('/webhook', line.middleware(config), (req, res) => { 17 | Promise 18 | .all(req.body.events.map(handleEvent)) 19 | .then((result) => res.json(result)) 20 | .catch((err) => { 21 | console.error(err); 22 | res.status(500).end(); 23 | }); 24 | }); 25 | 26 | function handleEvent (event) { 27 | if (event.type !== 'message' || event.message.type !== 'text') { 28 | return Promise.resolve(null); 29 | } 30 | 31 | return openai 32 | .engines 33 | .completions 34 | .create({ 35 | prompt: event.message.text, 36 | engine: "text-davinci-002", 37 | maxTokens: 100 38 | }) 39 | .then((completions) => { 40 | const message = completions.choices[0].text; 41 | return client.replyMessage(event.replyToken, { 42 | type: 'text', 43 | text: message 44 | }); 45 | }); 46 | } 47 | 48 | app.listen(3000); 49 | console.log('LINE Bot is running on 3000 port'); -------------------------------------------------------------------------------- /Ch02/README.md: -------------------------------------------------------------------------------- 1 | # Ch2 太犯規了吧?ChatGPT 居然能做到這麼多事 2 | 3 | ### 2.1 公文撰寫 4 | 5 | `想請你幫我寫一則公告,目前公司的系統基於安全性考量需要升級,需要在 1 月 20 號下午 2 點到 3 點進行維護。` 6 | 7 | ### 2.2 Email 撰寫 8 | 9 | `請幫我寫一封“通過工作試用期“的感謝信,要描述自己這 3 個月的努力與進步。` 10 | 11 | ### 2.3 履歷撰寫 12 | 13 | `幫我用繁體中文寫一份讓面試官眼睛一亮的求職履歷。我是一名 Backend 工程師,有 5 年的工作經驗,熟悉 Node.js、MYSQL、PostgreSQL 等技術,也有 GCP K8s 的經驗,做過 RMA、OTA 等系統。` 14 | 15 | `我可以在履歷中補充哪些細節,讓面試官覺得我 Backend 經驗豐富、值得信賴。` 16 | 17 | `我是一名 Frontend 工程師,使用 Vue 框架,如何在履歷中強調自己對購物車系統這個專案的貢獻。` 18 | 19 | ### 2.4 公司活動企劃 20 | 21 | `公司請我規劃 2 個月後的自強活動,目前公司的人數約 100 人,平均年齡在 40 歲上下,科技業,希望能增加員工間的向心力,請問怎麼規劃比較合適呢?` 22 | 23 | ### 2.5 標題、文案發想 24 | 25 | - ➤ 標題發想 26 | `請以” 轉職工程師年薪百萬”為主題,產生 10 個讓人想報名補習班的標題。` 27 | - ➤ 引導ChatGPT回答 28 | `加上“年後轉職”的條件,寫出5個類似“轉職工程師,年薪百萬不是夢!”的標題。` 29 | - ➤ 產生文案 30 | `請以“年終前的決定,轉職工程師,開啟高薪之路!”為標題,用“活潑有趣的語氣”寫一篇補習班的行銷文案。` 31 | 32 | ### 2.6 撰寫文章大綱、內文、摘要、抓 Keyword 33 | 34 | - ➤ 產生大綱 35 | `以“Side Project 對工程師的重要性”為標題,寫出激勵人心的文章大綱。` 36 | - ➤ 濃縮摘要 37 | `請將上方的內文濃縮為“200”字的預告摘要,要能引起閱讀興趣。` 38 | - ➤ 抓 Keyword 39 | `請從上方的內文中,產生出 5 個能強調文章重點、提高 SEO的關鍵字。` 40 | 41 | ### 2.7 讓文字更為通順&改錯字 42 | 43 | `幫我把這段話弄得通順:「我想應該有很多人在寫文章時會遇到一個狀況,就是某一段話你怎麼寫都不太順;此時,你可以把這段話丟給 ChatGPT,詢問他的建議。」` 44 | 45 | `檢查錯漏字:「老闆的名子的叫黑寶,他愛吃西爪這個水果。」` 46 | 47 | ### 2.8 寫詩 48 | 49 | ``` 50 | 你是一名文學素養深厚的詩人,我想請你幫我的朋友寫一首氣勢雄渾的詩。 51 | 他在 29 歲出版過 3 本書,經營部落格兩年來發表了 200 多篇文章,累積瀏覽數破 50 萬人次,在公司擔任過開發人員、專案經理、技術領導,還斜槓專欄作家、Podcast、魔術師。 52 | 字數 200 字內。 53 | ``` 54 | 55 | ### 參考資料 56 | 1. [超簡單!一次上手ChatGPT使用教學 文案 報告 論文](https://www.youtube.com/watch?v=WizoCwjEKsg) 57 | -------------------------------------------------------------------------------- /Ch10/myproject/refactor-index.js: -------------------------------------------------------------------------------- 1 | require("dotenv").config(); 2 | const line = require("@line/bot-sdk"); 3 | const express = require("express"); 4 | const { Configuration, OpenAIApi } = require("openai"); 5 | 6 | const app = express(); 7 | const client = new line.Client({ 8 | channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN, 9 | channelSecret: process.env.CHANNEL_SECRET, 10 | }); 11 | const openai = new OpenAIApi( 12 | new Configuration({ 13 | apiKey: process.env.OPENAI_API_KEY, 14 | }) 15 | ); 16 | 17 | app.post( 18 | "/webhook", 19 | line.middleware({ 20 | channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN, 21 | channelSecret: process.env.CHANNEL_SECRET, 22 | }), 23 | async (req, res) => { 24 | try { 25 | const results = await Promise.all(req.body.events.map(handleEvent)); 26 | res.json(results); 27 | } catch (err) { 28 | console.error(err); 29 | res.status(500).end(); 30 | } 31 | } 32 | ); 33 | 34 | const handleEvent = async (event) => { 35 | if (event.type !== "message" || event.message.type !== "text") { 36 | return null; 37 | } 38 | 39 | const { 40 | data: { choices }, 41 | } = await openai.createCompletion({ 42 | prompt: event.message.text, 43 | model: "text-davinci-003", 44 | max_tokens: 1000, 45 | }); 46 | 47 | const message = choices[0].text.trim(); 48 | return client.replyMessage(event.replyToken, { 49 | type: "text", 50 | text: message, 51 | }); 52 | }; 53 | 54 | app.listen(3000); 55 | console.log("LINE Bot is running on 3000 port"); -------------------------------------------------------------------------------- /Ch09/myproject/index.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config(); // 皆採用 .env 讀取 2 | const line = require('@line/bot-sdk'); 3 | const express = require('express'); 4 | 5 | // 原案套件使用方式錯誤,我直接改掉 6 | const { Configuration, OpenAIApi } = require("openai"); 7 | const configuration = new Configuration({ 8 | apiKey: process.env.OPENAI_API_KEY, 9 | }); 10 | const openai = new OpenAIApi(configuration); 11 | 12 | const config = { 13 | channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN, 14 | channelSecret: process.env.CHANNEL_SECRET, 15 | }; 16 | 17 | const client = new line.Client(config); 18 | 19 | const app = express(); 20 | 21 | app.post('/webhook', line.middleware(config), (req, res) => { 22 | Promise 23 | .all(req.body.events.map(handleEvent)) 24 | .then((result) => res.json(result)) 25 | .catch((err) => { 26 | console.error(err); 27 | res.status(500).end(); 28 | }); 29 | }); 30 | 31 | function handleEvent (event) { 32 | if (event.type !== 'message' || event.message.type !== 'text') { 33 | return Promise.resolve(null); 34 | } 35 | 36 | return openai.createCompletion({ // 調整成正確的使用方法 37 | prompt: event.message.text, 38 | model: "text-davinci-003", // 應用 model 而非 engine 39 | max_tokens: 1000 // 應用 max_tokens 而非 maxTokens 40 | }).then((completions) => { 41 | // 原案少了 data 這層結構,還要加上 trim() 去除空白 42 | const message = completions.data.choices[0].text.trim(); 43 | return client.replyMessage(event.replyToken, { 44 | type: 'text', 45 | text: message 46 | }); 47 | }); 48 | } 49 | 50 | app.listen(3000); 51 | console.log('LINE Bot is running on 3000 port'); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ChatGPT 與 AI 繪圖效率大師([此書已有新版](https://www.tenlong.com.tw/products/9786263339989)) 2 | 3 | ## 從日常到職場的全方位應用總整理,48 小時迎接減壓新生活! 4 | 5 | ![img](./img/bar.png) 6 | 7 | 有興趣的朋友可以到天瓏書局選購,感謝大家的支持。[購書連結](https://www.tenlong.com.tw/products/9786263334137) 8 | 9 | --- 10 | 11 | #### 公告 12 | Midjourney 官方於 2023.03.30 停止免費試用,據說是因為太多人用免洗帳號濫用服務所導致。 13 | 筆者猜測,等大多數人都上手 AI 產品後,這些服務都會轉為付費制度,因為運算其實很花錢;等那個時刻到來時,我們就要更認真比對各家服務的差異,選擇最值得的服務來買。 14 | 15 | --- 16 | 17 | ### 參考資源目錄 18 | 19 | > **小提醒** 20 | > 本書會提供許多的 Prompt 供讀者參考。 21 | > 但無論是 ChatGPT 還是作為 Bonus 的 Midjourney,即使一模一樣的 Prompt 還是會得到不同的結果,不過好的 Prompt 能讓我們得到更理想的答案。 22 | 23 | ### PART 1:ChatGPT 是在夯什麼? 24 | 25 | [Ch1. 了解他的能力範圍,以及對我們有什麼實際幫助](Ch01) 26 | [Ch2. 太犯規了吧?ChatGPT 居然能做到這麼多事!?](Ch02) 27 | 28 | ### PART 2:ChatGPT 的提問技巧 29 | 30 | [Ch3. 寫出有效的 Prompt,讓 ChatGPT 給你期待的回覆](Ch03) 31 | [Ch4. ChatGPT 的中文跟英文能力一樣好嗎?會影響答案的品質嗎?](Ch04) 32 | [Ch5. 讓 ChatGPT 變聰明的 3 個小技巧](Ch05) 33 | [Ch6. 不藏私!那些讓 ChatGPT 化身專家的驚人 Promt!](Ch06) 34 | [Ch7. 超強的 Chrome 外掛!更多元的專家選擇!](Ch07) 35 | 36 | ### PART 3:ChatGPT 在不同領域的應用案例 37 | 38 | [Ch8. 靠問 ChatGPT 寫程式,能完成 OpenAI & LINE Bot 的 Side Project 嗎?(上)](Ch08) 39 | [Ch9. 靠問 ChatGPT 寫程式,能完成 OpenAI & LINE Bot 的 Side Project 嗎?(下)](Ch09) 40 | [Ch10. 工程師福音!讓 ChatGPT 幫忙做 Code Review、Refactoring、Comments](Ch10) 41 | [Ch11. 太兇殘了!竟然靠聊天就能產出 PRD,PM 還不趕快學起來!](Ch11) 42 | 43 | ### PART 4:目前的窘境 44 | 45 | [Ch12. 了解 ChatGPT 有哪些問題與限制](Ch12) 46 | 47 | ### PART 5:對 ChatGPT 的疑問與質疑 48 | 49 | [Ch13. ChatGPT 的翻譯有比 Google 翻譯更優秀嗎?](Ch13) 50 | [Ch14. 會從萬事問 Google 變成萬事問 ChatGPT 嗎?](Ch14) 51 | [Ch15. ChatGPT 會對專家造成威脅嗎?我的工作會受到影響嗎?](Ch15) 52 | 53 | ### Bonus:用關鍵字讓 AI 產生絕美圖片 54 | 55 | [Ch16. Midjourney 起手式](Ch16) 56 | [Ch17. 了解 Midjourney 不同 Settings 對產圖的影響](Ch17) 57 | [Ch18. 掌握關鍵技巧,讓你使用 Midjourney 像個專家!](Ch18) 58 | 59 | [後記 —— 想跟讀者說的話!](後記) 60 | -------------------------------------------------------------------------------- /Ch10/myproject/commemt-index.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config(); 2 | const line = require('@line/bot-sdk'); 3 | const express = require('express'); 4 | const { Configuration, OpenAIApi } = require("openai"); 5 | 6 | // Initialize express app 7 | const app = express(); 8 | 9 | // Get config values from environment variables 10 | const config = { 11 | channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN, 12 | channelSecret: process.env.CHANNEL_SECRET, 13 | }; 14 | 15 | // Initialize line client 16 | const client = new line.Client(config); 17 | 18 | // Initialize openai api 19 | const openai = new OpenAIApi(new Configuration({ 20 | apiKey: process.env.OPENAI_API_KEY, 21 | })); 22 | 23 | // Handle post requests to /webhook 24 | app.post('/webhook', line.middleware(config), async (req, res) => { 25 | try { 26 | // Map handleEvent function over all events and wait for all promises to resolve 27 | const results = await Promise.all(req.body.events.map(handleEvent)); 28 | res.json(results); 29 | } catch (err) { 30 | console.error(err); 31 | res.status(500).end(); 32 | } 33 | }); 34 | 35 | // Handle a single event 36 | const handleEvent = async (event) => { 37 | // Only handle message events of type text 38 | if (event.type !== 'message' || event.message.type !== 'text') { 39 | return null; 40 | } 41 | 42 | // Get choices from openai response 43 | const { data: { choices } } = await openai.createCompletion({ 44 | prompt: event.message.text, 45 | model: "text-davinci-003", 46 | max_tokens: 1000 47 | }); 48 | 49 | // Send the first choice as a message reply 50 | const message = choices[0].text.trim; 51 | return client.replyMessage(event.replyToken, { type: 'text', text: message }); 52 | }; 53 | 54 | // Start listening on port 3000 55 | app.listen(3000); 56 | console.log('LINE Bot is running on 3000 port'); -------------------------------------------------------------------------------- /Ch08/README.md: -------------------------------------------------------------------------------- 1 | # Ch8 靠問 ChatGPT 寫程式,能完成 OpenAI & LINE Bot 的 Side Project 嗎?(上) 2 | 3 | ### 8.1 詢問 ChatGPT 實作的步驟 4 | 5 | `我想用 Node.js 寫一個在 Line 上面使用 ChatGPT 的程式,請告訴我具體步驟。` 6 | 7 | ### 8.2 前置作業 1:申請 OpenAI API key 8 | 9 | **SETP 1**:進入 OpenAI 官網:https://openai.com/api/ 10 | 11 | ### 8.3 前置作業 2:取得 LINE 的 Channel access token 和 Channel secret 12 | 13 | `在 LINE 的開發者平台中,如何取得 Channel access token 和 Channel secret` 14 | 15 | **SETP 1**:登入開發者平台(原則上有LINE的帳號就可以直接登入),網址:https://developers.line.biz/zh-hant 16 | 17 | 18 | ### 8.4 建立 OpenAI-LINE Bot 的 Node.js 專案 19 | 20 | > 如果讀者的環境尚未安裝 Node.js 與 npm,接下來的操作會卡住。 21 | > 筆者過去有寫一篇基礎環境設定的文章:「[工程師的開發環境大補帖:Node.js、NVM、git、yarn、VSCode](https://medium.com/dean-lin/3f21ea161898」,大家可以參考看看。 22 | 23 | **SETP 1**:在終端機輸入 `mkdir myproject` 建立一個新的專案目錄。 24 | 25 | **SETP 2**:接著輸入 `cd myproject` 進入該目錄。 26 | 27 | **SETP 3**:輸入 `npm init` 建立一個 package.json 檔案,並設定專案的相關資訊(全部按 enter採默認值也可以)。 28 | 29 | **SETP 4**:安裝 "openai"、"@line/bot-sdk"、"express" 等套件 30 | ``` 31 | npm install openai @line/bot-sdk express 32 | ``` 33 | **SETP 5**:輸入 `touch index.js` 建立一個新的檔案放程式碼。 34 | 35 | **SETP 6**:在 index.js 中引用所需的套件,並設定 OpenAI 的 API key、LINE Bot 的 channelAccessToken、channelSecret。 36 | ```js 37 | const openai = require('openai'); 38 | const line = require('@line/bot-sdk'); 39 | 40 | openai.apiKey = "YOUR_OPENAI_API_KEY"; 41 | 42 | const config = { 43 | channelAccessToken: 'YOUR_CHANNEL_ACCESS_TOKEN', 44 | channelSecret: 'YOUR_CHANNEL_SECRET' 45 | }; 46 | 47 | const client = new line.Client(config); 48 | ``` 49 | 50 | **SETP 7**:在 index.js 中建立一個 HTTP server 並設定 line 的 webhook。 51 | ```js 52 | const express = require('express'); 53 | const app = express(); 54 | const port = 3000; 55 | 56 | app.post('/webhook', line.middleware(config), (req, res) => { 57 | Promise 58 | .all(req.body.events.map(handleEvent)) 59 | .then((result) => res.json(result)) 60 | .catch((err) => { 61 | console.error(err); 62 | res.status(500).end(); 63 | }); 64 | }); 65 | 66 | app.listen(port, () => { 67 | console.log(`app is running on port ${port}`); 68 | }); 69 | ``` 70 | 71 | **SETP 8**:在 index.js 中建立一個事件處理函式,當使用者發送訊息時,使用 OpenAI API 將訊息傳給 ChatGPT,並將回應的結果傳回給使用者。 72 | ```js 73 | function handleEvent (event) { 74 | if (event.type !== 'message' || event.message.type !== 'text') { 75 | return Promise.resolve(null); 76 | } 77 | return openai.Completion.create({ 78 | engine: "text-davinci-002", 79 | prompt: event.message.text, 80 | }).then(response => { 81 | return client.replyMessage(event.replyToken, { 82 | type: 'text', 83 | text: response.choices[0].text 84 | }); 85 | }); 86 | } 87 | ``` 88 | 89 | **SETP 9**:啟動伺服器 `node index.js`。 90 | 91 | ### 8.5 小結:一切沒有想像中的順利 92 | 93 | `我按造步驟執行後,會噴錯誤:「TypeError: line.Client is not a constructor」` 94 | 95 | `我調整後,會噴錯誤:「TypeError: Cannot read properties of undefined (reading 'validateSignature')」` 96 | 97 | 參考資料: 98 | 1. [本篇文章的程式碼](https://github.com/dean9703111/chatGPT/tree/master/Ch08/myproject) -------------------------------------------------------------------------------- /Ch18/README.md: -------------------------------------------------------------------------------- 1 | # Ch18 掌握關鍵技巧,讓你使用 Midjourney 像個專家! 2 | 3 | ### 18.1 讓創作融入大師的畫風、定義自己想要的場景 4 | 5 | - **繪圖的「風格」**:A stylized Cyberpunk(賽博龐克)、A stylized Cthulhu Mythos(克蘇魯神話)。 6 | - **場景的「風格」**:realism(現實主義)、surrealism(超現實主義)、anti-utopia(反烏托邦)。 7 | - **場景的「物件」**:ruins(廢墟)、city(城市)、street(街道)、universe(宇宙)。 8 | - **使用某個藝術家的「畫風」**:Miyazaki Hayao(宮崎駿)、Shinkai Makoto(新海誠)、Pablo Picasso(畢卡索)、Vincent Van Gogh(梵谷)。 9 | - **使用某個遊戲的「畫風」**:botw(曠野之息)、Pokémon(寶可夢)、The Elder Scrolls(上古卷軸)。 10 | 11 | `hero, universe , A stylized Cthulhu Mythos, anti-utopia` 12 | 13 | ### 18.2 調整圖片的「視角、燈光」 14 | 15 | - **Composition(視角)**:closeup view(特寫鏡頭)、Wide-angle view(廣角鏡頭)、A bird's-eye view(鳥瞰)。 16 | - **Lighting(燈光)**:Soft light(柔光)、Cold light(冷光)。 17 | 18 | - `Strawberry Cake, closeup view, Soft light` 19 | - `ruins, Wide-angle view, Cold light` 20 | 21 | ### 18.3 讓產出的圖片有「鏡頭感」 22 | 23 | - photography(攝影)、cinematic(電影) 24 | - in focus(對焦)、depth of field(景深) 25 | 26 | - `Strawberry Cake, photography, closeup view, in focus, Soft light` 27 | - `ruins, cinematic, Wide-angle view, depth of field, Cold light` 28 | 29 | ### 18.4 「關鍵字」跟「描述句」的差異 30 | 31 | - `cat, book, campus, Miyazaki Hayao, winter` 32 | - `A cat roams the winter campus, holding a book.` 33 | 34 | ### 18.5 為圖片增加情感類型的語句 35 | 36 | - **積極正向**:Loving(愛)、hopeful(希望)、inspiring(鼓舞人心)、beautiful(美麗)。 37 | - **消極負面**:horror(恐懼)、sadness(悲傷)、darkness(黑暗)。 38 | 39 | `The hero rises from the ruins, Long Shot, in focus, hopeful, Dramatic lighting` 40 | 41 | ### 18.6 如果沒有靈感、失去方向怎麼辦? 42 | 43 | Midjourney 的 Community Showcase:https://midjourney.com/showcase/recent/ 44 | 45 | ### 18.7 不會英文,不懂藝術,是不是就無法操作了? 46 | 47 | `ruins, Baroque architecture, Long Shot(LS) , Architectural rendering , bright` 48 | 49 | ### 18.8 透過介面(UI)來產生 Prompt 50 | 51 | MidJourney Prompt Helper:https://prompt.noonshot.com/ 52 | 53 | `Light bulb::2 sunlight::1 microscopy::1 gold color::1` 54 | 55 | ### 18.9 搭配 ChatGPT 的 Chrome 外掛,讓大神幫你一把 56 | 57 | `Online meeting` 58 | 59 | - `Online Meeting, a team meeting of a tech company, each member is wearing a VR headset, the meeting room has high-tech gadgets and displays, futuristic atmosphere, 3d rendering, --ar 16:9 --v 4` 60 | - `Online Meeting, a virtual job interview, the interviewee is sitting at their home office, with a professional setup, nervous and focused mood, digital illustration, --ar 9:16 --v 4` 61 | - `Online Meeting, a virtual conference, with a keynote speaker giving a presentation, the audience is composed of avatars from around the world, an engaged and focused mood, digital artwork, --ar 16:9 --v 4` 62 | - `Online Meeting, a family video call, the participants are all in their own homes, with a warm and relaxed atmosphere, photography, macro lens 50mm, f/2.8, 1/200 sec, ISO 200, --ar 1:1 --v 4` 63 | 64 | ### 參考資料: 65 | 1. [Midjourney 技巧收集](https://docs.google.com/spreadsheets/d/1GuAeSFtICsjQEwsRP2f--IayDxW9Dl0SCLOVov56FMc/edit?fbclid=IwAR31xelZ9YrMSJT5AYra-rRz5YYQiKa3dx0mhs6EMuU-o1INIw3uVGCGuGw#gid=1629975637) 66 | 2. [Midjourney AI 台灣社群](https://www.facebook.com/groups/midjourneytw/) 67 | 3. [MidJourney-Styles-and-Keywords-Reference](https://github.com/willwulfken/MidJourney-Styles-and-Keywords-Reference) -------------------------------------------------------------------------------- /Ch06/README.md: -------------------------------------------------------------------------------- 1 | # Ch6 不藏私!那些讓 ChatGPT 化身專家的驚人 Prompt 2 | 3 | Awesome ChatGPT Prompts:https://github.com/f/awesome-chatgpt-prompts 4 | 5 | ### 6.1 這些Prompt能幫你增加職場生產力 6 | 7 | - ➤ 英文翻譯員 8 | Act as an English Translator and Improver 9 | - `I want you to act as an English translator, spelling corrector and improver. I will speak to you in any language and you will detect the language, translate it and answer in the corrected and improved version of my text, in English. I want you to replace my simplified A0-level words and sentences with more beautiful and elegant, upper level English words and sentences. Keep the meaning same, but make them more literary. I want you to only reply the correction, the improvements and nothing else, do not write explanations. My first sentence is "你所提供的語言都會被翻譯成英文,且用更好的英文單字與句字呈現"` 10 | - ➤ 特定職位的面試官 11 | Act as position Interviewer 12 | - `I want you to act as an interviewer. I will be the candidate and you will ask me the interview questions for the position position. I want you to only reply as the interviewer. Do not write all the conservation at once. I want you to only do the interview with me. Ask me the questions and wait for my answers. Do not write explanations. Ask me the questions one by one like an interviewer does and wait for my answers. My first sentence is "Hi"` 13 | - ➤ 招募人員 14 | Act as a Recruiter 15 | - `I want you to act as a recruiter. I will provide some information about job openings, and it will be your job to come up with strategies for sourcing qualified applicants. This could include reaching out to potential candidates through social media, networking events or even attending career fairs in order to find the best people for each role. My first request is "I need help improve my CV.”` 16 | - ➤ 廣告商 17 | Act as an Advertiser 18 | - `I want you to act as an advertiser. You will create a campaign to promote a product or service of your choice. You will choose a target audience, develop key messages and slogans, select the media channels for promotion, and decide on any additional activities needed to reach your goals. My first suggestion request is "I need help creating an advertising campaign for a new type of energy drink targeting young adults aged 18-30."` 19 | - ➤ 演說家 20 | Act as an Elocutionist 21 | - `I want you to act as an elocutionist. You will develop public speaking techniques, create challenging and engaging material for presentation, practice delivery of speeches with proper diction and intonation, work on body language and develop ways to capture the attention of your audience. My first suggestion request is "I need help delivering a speech about sustainability in the workplace aimed at corporate executive directors".` 22 | - ➤ 網頁設計顧問 23 | Act as a Web Design Consultant 24 | - `I want you to act as a web design consultant. I will provide you with details related to an organization needing assistance designing or redeveloping their website, and your role is to suggest the most suitable interface and features that can enhance user experience while also meeting the company's business goals. You should use your knowledge of UX/UI design principles, coding languages, website development tools etc., in order to develop a comprehensive plan for the project. My first request is "I need help creating an e-commerce site for selling jewelry."` 25 | 26 | ### 6.2 找不到符合需求的專家?那就自己產生一個! 27 | 28 | ChatGPT Prompt Generator:https://huggingface.co/spaces/merve/ChatGPT-prompt-generator 29 | -------------------------------------------------------------------------------- /Ch04/README.md: -------------------------------------------------------------------------------- 1 | # Ch4 ChatGPT 的中文跟英文能力一樣好嗎?會影響答案的品質嗎? 2 | 3 | `ChatGPT 的中文跟英文能力一樣好嗎?` 4 | 5 | ### 4.1 ChatGPT 能給我們期待的書籍摘要嗎? 6 | 7 | - ➤ 用中文詢問 ChatGPT 「失控的正向思考」摘要 8 | - `請給我“失控的正向思考”這本書的重點摘要,以及適合閱讀的對象。` 9 | 10 | - `這本書的英文名稱是“How Positive Thinking is Undermining America”。` 11 | - ➤ 用英文詢問 ChatGPT 「失控的正向思考」摘要 12 | - `Please provide me with a summary of the key points and the suitable audience of the book "How Positive Thinking is Undermining America".` 13 | - ➤ 用中文詢問 ChatGPT 「天龍八部」摘要 14 | - `請給我“天龍八部”這本書的重點摘要,以及適合閱讀的對象。` 15 | - ➤ 用英文詢問 ChatGPT 「天龍八部」摘要 16 | - `Please provide me with a summary of the key points and the suitable audience of the book "Demi-Gods and Semi-Devils".` 17 | 18 | ### 4.2 擔任「 Node.js Backend Developer 面試官」,中文與英文的差異在哪? 19 | 20 | - ➤ 中文面試官 21 | - `我希望你能擔任一個面試官,我將是候選人,你將向我提出 Node.js Backend Developer 職位的面試問題。我希望你像是面試官一樣的回應,不要一次問完所有問題。我希望你只對我進行面試,問我問題,並等待我的回答,不要額外的解釋。像面試官那樣一個一個地問我問題,並等待我的回答就好。我的第一句話是 "你好"` 22 | 23 | - `我的名字是 Dean,目前是一名 Senior Backend Developer,熟悉 Node.js 的 Express 框架以及 MySQL 資料庫等技術。` 24 | 25 | - `有 5 年的開發經驗,期間完成多個系統,比如線上打卡系統、線上測驗系統、購物車系統。` 26 | 27 | - `過去採用 K8s 技術,可以根據實際的流量來做 autoscaling。` 28 | 29 | - `如果資料量太大導致搜尋效率變慢,我會在搜尋用到的欄位加上 index 提升效率。` 30 | 31 | - `針對大流量的情境,我也有設計過用 Redis 這類記憶體資料庫來處理,讓使用者有更好的體驗。` 32 | - ➤ 英文面試官 33 | - `I want you to act as an interviewer. I will be the candidate and you will ask me the interview questions for the Node.js Backend Developer position. I want you to only reply as the interviewer. Do not write all the conservation at once. I want you to only do the interview with me. Ask me the questions and wait for my answers. Do not write explanations. Ask me the questions one by one like an interviewer does and wait for my answers. My first sentence is "Hi"` 34 | 35 | - `I have 5 years of experience in Node.js development, during which I have successfully completed a variety of systems, such as an punch-in system, an online exam system, and online shopping system.` 36 | 37 | - `In the online shopping system project, we faced the challenge of high concurrency. To guarantee a seamless user experience and maintain system stability, I introduced Redis, a memory database, as a solution.` 38 | 39 | - `I am familiar with multiple frameworks such as Express, Koa, AdonisJS. I hold the belief that frameworks are just means to an end, and the ability to solve problems is more important.` 40 | 41 | - `Upon receiving a bug report, my initial step is to reproduce the user's actions in the development environment to clarify the issue, and use console.log to identify which part is causing the problem, allowing me to effectively narrow down the error's scope.` 42 | 43 | - `I utilize MongoDB for handling big data, as it offers excellent performance and low scalability costs, and offers great flexibility of adding new columns.` 44 | 45 | - `The first step is to identify which areas of the application are causing performance issues. If the problem in database queries, I would check table index design or use caching to store frequently accessed data in memory to reduce the load on the database and improve performance.` 46 | 47 | - `It is an honor to participate in this interview and I look forward to the opportunity to work together in the future.` 48 | 49 | ### 4.3 如果英文不好,有什麼曲線救國的方案? 50 | 51 | - `I want you to act as an English translator, spelling corrector and improver. I will speak to you in any language and you will detect the language, translate it and answer in the corrected and improved version of my text, in English. I want you to replace my simplified A0-level words and sentences with more beautiful and elegant, upper level English words and sentences. Keep the meaning same, but make them more literary. I want you to only reply the correction, the improvements and nothing else, do not write explanations. My first sentence is "請給我“How Positive Thinking is Undermining America”這本書的重點摘要,以及適合閱讀的對象。"` 52 | 53 | - `Please give me a summary of the key points and the appropriate audience for the book "Bright-Sided: How Positive Thinking is Undermining America".And I want you to act as traditional chinese translator.` 54 | 55 | ### 參考資料: 56 | 1. [Awesome ChatGPT Prompts](https://github.com/f/awesome-chatgpt-prompts) -------------------------------------------------------------------------------- /Ch09/README.md: -------------------------------------------------------------------------------- 1 | # Ch9 靠問 ChatGPT 寫程式,能完成 OpenAI & LINE Bot 的 Side Project 嗎?(下) 2 | 3 | ### 9.1 在 local 建立一個可以讓 Line 訪問的 HTTP server(ngrok) 4 | 5 | `有辦法在 local 建立一個 HTTP server 並設定 Line 的 webhook 嗎` 6 | 7 | `我目前使用 mac 系統,要如何使用 ngrok 呢?需要詳細步驟` 8 | 9 | **SETP 1**:先到 ngrok 的官網下載 ngrok 的 Mac 版本:https://ngrok.com/download 。 10 | 11 | **SETP 3**:打開終端機,輸入 `ngrok http 3000` 12 | 13 | ### 9.3 測試功能&痛苦的 Debug 之路 14 | 15 | ```js 16 | const line = require('@line/bot-sdk'); 17 | const express = require('express'); 18 | const openai = require('openai'); 19 | 20 | openai.apiKey = "YOUR_API_KEY"; 21 | 22 | const config = { 23 | channelAccessToken: 'YOUR_CHANNEL_ACCESS_TOKEN', 24 | channelSecret: 'YOUR_CHANNEL_SECRET' 25 | }; 26 | 27 | const client = new line.Client(config); 28 | 29 | const app = express(); 30 | 31 | app.post('/webhook', line.middleware(config), (req, res) => { 32 | Promise 33 | .all(req.body.events.map(handleEvent)) 34 | .then((result) => res.json(result)) 35 | .catch((err) => { 36 | console.error(err); 37 | res.status(500).end(); 38 | }); 39 | }); 40 | 41 | function handleEvent (event) { 42 | if (event.type !== 'message' || event.message.type !== 'text') { 43 | return Promise.resolve(null); 44 | } 45 | 46 | return openai 47 | .engines 48 | .completions 49 | .create({ 50 | prompt: event.message.text, 51 | engine: "text-davinci-002", 52 | maxTokens: 100 53 | }) 54 | .then((completions) => { 55 | const message = completions.choices[0].text; 56 | return client.replyMessage(event.replyToken, { 57 | type: 'text', 58 | text: message 59 | }); 60 | }); 61 | } 62 | 63 | app.listen(3000); 64 | console.log('LINE Bot is running on 3000 port'); 65 | ``` 66 | 67 | ### 9.4 ChatGPT並不是萬能,Bug還得靠自己處理 68 | 69 | openai 套件:https://www.npmjs.com/package/openai 70 | 71 | 官網給的範例程式: 72 | ```js 73 | const { Configuration, OpenAIApi } = require("openai"); 74 | 75 | const configuration = new Configuration({ 76 | apiKey: process.env.OPENAI_API_KEY, 77 | }); 78 | const openai = new OpenAIApi(configuration); 79 | 80 | const completion = await openai.createCompletion({ 81 | model: "text-davinci-002", 82 | prompt: "Hello world", 83 | }); 84 | console.log(completion.data.choices[0].text); 85 | ``` 86 | 87 | 修改好的程式: 88 | ```js 89 | require('dotenv').config(); // 皆採用 .env 讀取 90 | const line = require('@line/bot-sdk'); 91 | const express = require('express'); 92 | 93 | // 原案套件使用方式錯誤,我直接改掉 94 | const { Configuration, OpenAIApi } = require("openai"); 95 | const configuration = new Configuration({ 96 | apiKey: process.env.OPENAI_API_KEY, 97 | }); 98 | const openai = new OpenAIApi(configuration); 99 | 100 | const config = { 101 | channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN, 102 | channelSecret: process.env.CHANNEL_SECRET, 103 | }; 104 | 105 | const client = new line.Client(config); 106 | 107 | const app = express(); 108 | 109 | app.post('/webhook', line.middleware(config), (req, res) => { 110 | Promise 111 | .all(req.body.events.map(handleEvent)) 112 | .then((result) => res.json(result)) 113 | .catch((err) => { 114 | console.error(err); 115 | res.status(500).end(); 116 | }); 117 | }); 118 | 119 | function handleEvent (event) { 120 | if (event.type !== 'message' || event.message.type !== 'text') { 121 | return Promise.resolve(null); 122 | } 123 | 124 | return openai.createCompletion({ // 調整成正確的使用方法 125 | prompt: event.message.text, 126 | model: "text-davinci-003", // 應用 model 而非 engine 127 | max_tokens: 1000 // 應用 max_tokens 而非 maxTokens 128 | }).then((completions) => { 129 | // 原案少了 data 這層結構,還要加上 trim() 去除空白 130 | const message = completions.data.choices[0].text.trim(); 131 | return client.replyMessage(event.replyToken, { 132 | type: 'text', 133 | text: message 134 | }); 135 | }); 136 | } 137 | 138 | app.listen(3000); 139 | console.log('LINE Bot is running on 3000 port'); 140 | ``` 141 | 142 | ### 參考資料: 143 | 1. [用英文溝通 ChatGPT 得到的程式](https://github.com/dean9703111/chatGPT/blob/master/Ch09/myproject/en-index.js) 144 | 2. [筆者自己優化得到的解答](https://github.com/dean9703111/chatGPT/blob/master/Ch09/myproject/index.js) 145 | -------------------------------------------------------------------------------- /Ch10/README.md: -------------------------------------------------------------------------------- 1 | # Ch10 工程師福音!讓 ChatGPT 來協助 Code Review、Refactoring、Comments 2 | 3 | ### 10.1 直接把程式碼丟進 ChatGPT 會發生什麼事? 4 | 5 | 把程式的「註解」都拿掉: 6 | ```js 7 | require("dotenv").config(); 8 | const line = require("@line/bot-sdk"); 9 | const express = require("express"); 10 | const { Configuration, OpenAIApi } = require("openai"); 11 | const configuration = new Configuration({ 12 | apiKey: process.env.OPENAI_API_KEY, 13 | }); 14 | const openai = new OpenAIApi(configuration); 15 | 16 | const config = { 17 | channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN, 18 | channelSecret: process.env.CHANNEL_SECRET, 19 | }; 20 | 21 | const client = new line.Client(config); 22 | 23 | const app = express(); 24 | 25 | app.post("/webhook", line.middleware(config), (req, res) => { 26 | Promise.all(req.body.events.map(handleEvent)) 27 | .then((result) => res.json(result)) 28 | .catch((err) => { 29 | console.error(err); 30 | res.status(500).end(); 31 | }); 32 | }); 33 | 34 | function handleEvent(event) { 35 | if (event.type !== "message" || event.message.type !== "text") { 36 | return Promise.resolve(null); 37 | } 38 | 39 | return openai 40 | .createCompletion({ 41 | prompt: event.message.text, 42 | model: "text-davinci-003", 43 | max_tokens: 1000, 44 | }) 45 | .then((completions) => { 46 | const message = completions.data.choices[0].text.trim(); 47 | return client.replyMessage(event.replyToken, { 48 | type: "text", 49 | text: message, 50 | }); 51 | }); 52 | } 53 | 54 | app.listen(3000); 55 | console.log("LINE Bot is running on 3000 port"); 56 | ``` 57 | 58 | ### 10.2 讓 ChatGPT 用中文解釋程式(Review and explain) 59 | 60 | `Review code and explain in traditional Chinese [List of points]` 61 | 62 | ### 10.3 用 ChatGPT 重構程式(Refactoring) 63 | 64 | `Refactoring the code and explain in traditional Chinese` 65 | 66 | 下面是 ChatGPT 重構後的程式: 67 | ```js 68 | require("dotenv").config(); 69 | const line = require("@line/bot-sdk"); 70 | const express = require("express"); 71 | const { Configuration, OpenAIApi } = require("openai"); 72 | 73 | const app = express(); 74 | const client = new line.Client({ 75 | channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN, 76 | channelSecret: process.env.CHANNEL_SECRET, 77 | }); 78 | const openai = new OpenAIApi( 79 | new Configuration({ 80 | apiKey: process.env.OPENAI_API_KEY, 81 | }) 82 | ); 83 | 84 | app.post( 85 | "/webhook", 86 | line.middleware({ 87 | channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN, 88 | channelSecret: process.env.CHANNEL_SECRET, 89 | }), 90 | async (req, res) => { 91 | try { 92 | const results = await Promise.all(req.body.events.map(handleEvent)); 93 | res.json(results); 94 | } catch (err) { 95 | console.error(err); 96 | res.status(500).end(); 97 | } 98 | } 99 | ); 100 | 101 | const handleEvent = async (event) => { 102 | if (event.type !== "message" || event.message.type !== "text") { 103 | return null; 104 | } 105 | 106 | const { 107 | data: { choices }, 108 | } = await openai.createCompletion({ 109 | prompt: event.message.text, 110 | model: "text-davinci-003", 111 | max_tokens: 1000, 112 | }); 113 | 114 | const message = choices[0].text.trim(); 115 | return client.replyMessage(event.replyToken, { 116 | type: "text", 117 | text: message, 118 | }); 119 | }; 120 | 121 | app.listen(3000); 122 | console.log("LINE Bot is running on 3000 port"); 123 | ``` 124 | 125 | 把 line 設定 config 的部分調整回來 126 | 127 | ```js 128 | const config = { 129 | channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN, 130 | channelSecret: process.env.CHANNEL_SECRET, 131 | }; 132 | const client = new line.Client(config); 133 | app.post('/webhook', line.middleware(config), async (req, res) => { 134 | // code.. 135 | } 136 | ``` 137 | 138 | ### 10.4 用 ChatGPT 幫程式加上註解(Comments) 139 | 140 | 加上註解:`add code comments` 141 | 142 | ```js 143 | require('dotenv').config(); 144 | const line = require('@line/bot-sdk'); 145 | const express = require('express'); 146 | const { Configuration, OpenAIApi } = require("openai"); 147 | 148 | // Initialize express app 149 | const app = express(); 150 | 151 | // Get config values from environment variables 152 | const config = { 153 | channelAccessToken: process.env.CHANNEL_ACCESS_TOKEN, 154 | channelSecret: process.env.CHANNEL_SECRET, 155 | }; 156 | 157 | // Initialize line client 158 | const client = new line.Client(config); 159 | 160 | // Initialize openai api 161 | const openai = new OpenAIApi(new Configuration({ 162 | apiKey: process.env.OPENAI_API_KEY, 163 | })); 164 | 165 | // Handle post requests to /webhook 166 | app.post('/webhook', line.middleware(config), async (req, res) => { 167 | try { 168 | // Map handleEvent function over all events and wait for all promises to resolve 169 | const results = await Promise.all(req.body.events.map(handleEvent)); 170 | res.json(results); 171 | } catch (err) { 172 | console.error(err); 173 | res.status(500).end(); 174 | } 175 | }); 176 | 177 | // Handle a single event 178 | const handleEvent = async (event) => { 179 | // Only handle message events of type text 180 | if (event.type !== 'message' || event.message.type !== 'text') { 181 | return null; 182 | } 183 | 184 | // Get choices from openai response 185 | const { data: { choices } } = await openai.createCompletion({ 186 | prompt: event.message.text, 187 | model: "text-davinci-003", 188 | max_tokens: 1000 189 | }); 190 | 191 | // Send the first choice as a message reply 192 | const message = choices[0].text.trim; 193 | return client.replyMessage(event.replyToken, { type: 'text', text: message }); 194 | }; 195 | 196 | // Start listening on port 3000 197 | app.listen(3000); 198 | console.log('LINE Bot is running on 3000 port'); 199 | ``` 200 | 201 | 移除所有註解:`remove code comments` 202 | 203 | ### 參考資料 204 | 1. [ChatGPT Refactor 後的程式](https://github.com/dean9703111/chatGPT/blob/master/Ch10/myproject/refactor-index.js) 205 | 2. [ChatGPT Refactor 並加上註解的程式](https://github.com/dean9703111/chatGPT/blob/master/Ch10/myproject/commemt-index.js) -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /Ch08/myproject/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "myproject", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "myproject", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@line/bot-sdk": "^7.5.2", 13 | "express": "^4.18.2", 14 | "openai": "^3.1.0" 15 | } 16 | }, 17 | "node_modules/@line/bot-sdk": { 18 | "version": "7.5.2", 19 | "resolved": "https://registry.npmjs.org/@line/bot-sdk/-/bot-sdk-7.5.2.tgz", 20 | "integrity": "sha512-mMaDnr+mOqQDLYJcUp+fQwZklg/LoOZzNILlWdsj2IFD2nXF+HhAm3KEy5tyUx629Y2bCx6nv9Jl0UlMwBiAiw==", 21 | "dependencies": { 22 | "@types/body-parser": "^1.19.2", 23 | "@types/node": "^16.0.0", 24 | "axios": "^0.27.0", 25 | "body-parser": "^1.20.0", 26 | "file-type": "^16.5.4", 27 | "form-data": "^4.0.0" 28 | }, 29 | "engines": { 30 | "node": ">=10" 31 | } 32 | }, 33 | "node_modules/@tokenizer/token": { 34 | "version": "0.3.0", 35 | "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", 36 | "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" 37 | }, 38 | "node_modules/@types/body-parser": { 39 | "version": "1.19.2", 40 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", 41 | "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", 42 | "dependencies": { 43 | "@types/connect": "*", 44 | "@types/node": "*" 45 | } 46 | }, 47 | "node_modules/@types/connect": { 48 | "version": "3.4.35", 49 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 50 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 51 | "dependencies": { 52 | "@types/node": "*" 53 | } 54 | }, 55 | "node_modules/@types/node": { 56 | "version": "16.18.11", 57 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", 58 | "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==" 59 | }, 60 | "node_modules/accepts": { 61 | "version": "1.3.8", 62 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 63 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 64 | "dependencies": { 65 | "mime-types": "~2.1.34", 66 | "negotiator": "0.6.3" 67 | }, 68 | "engines": { 69 | "node": ">= 0.6" 70 | } 71 | }, 72 | "node_modules/array-flatten": { 73 | "version": "1.1.1", 74 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 75 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 76 | }, 77 | "node_modules/asynckit": { 78 | "version": "0.4.0", 79 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 80 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 81 | }, 82 | "node_modules/axios": { 83 | "version": "0.27.2", 84 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", 85 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", 86 | "dependencies": { 87 | "follow-redirects": "^1.14.9", 88 | "form-data": "^4.0.0" 89 | } 90 | }, 91 | "node_modules/body-parser": { 92 | "version": "1.20.1", 93 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 94 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 95 | "dependencies": { 96 | "bytes": "3.1.2", 97 | "content-type": "~1.0.4", 98 | "debug": "2.6.9", 99 | "depd": "2.0.0", 100 | "destroy": "1.2.0", 101 | "http-errors": "2.0.0", 102 | "iconv-lite": "0.4.24", 103 | "on-finished": "2.4.1", 104 | "qs": "6.11.0", 105 | "raw-body": "2.5.1", 106 | "type-is": "~1.6.18", 107 | "unpipe": "1.0.0" 108 | }, 109 | "engines": { 110 | "node": ">= 0.8", 111 | "npm": "1.2.8000 || >= 1.4.16" 112 | } 113 | }, 114 | "node_modules/bytes": { 115 | "version": "3.1.2", 116 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 117 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 118 | "engines": { 119 | "node": ">= 0.8" 120 | } 121 | }, 122 | "node_modules/call-bind": { 123 | "version": "1.0.2", 124 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 125 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 126 | "dependencies": { 127 | "function-bind": "^1.1.1", 128 | "get-intrinsic": "^1.0.2" 129 | }, 130 | "funding": { 131 | "url": "https://github.com/sponsors/ljharb" 132 | } 133 | }, 134 | "node_modules/combined-stream": { 135 | "version": "1.0.8", 136 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 137 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 138 | "dependencies": { 139 | "delayed-stream": "~1.0.0" 140 | }, 141 | "engines": { 142 | "node": ">= 0.8" 143 | } 144 | }, 145 | "node_modules/content-disposition": { 146 | "version": "0.5.4", 147 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 148 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 149 | "dependencies": { 150 | "safe-buffer": "5.2.1" 151 | }, 152 | "engines": { 153 | "node": ">= 0.6" 154 | } 155 | }, 156 | "node_modules/content-type": { 157 | "version": "1.0.5", 158 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 159 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 160 | "engines": { 161 | "node": ">= 0.6" 162 | } 163 | }, 164 | "node_modules/cookie": { 165 | "version": "0.5.0", 166 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 167 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 168 | "engines": { 169 | "node": ">= 0.6" 170 | } 171 | }, 172 | "node_modules/cookie-signature": { 173 | "version": "1.0.6", 174 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 175 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 176 | }, 177 | "node_modules/debug": { 178 | "version": "2.6.9", 179 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 180 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 181 | "dependencies": { 182 | "ms": "2.0.0" 183 | } 184 | }, 185 | "node_modules/delayed-stream": { 186 | "version": "1.0.0", 187 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 188 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 189 | "engines": { 190 | "node": ">=0.4.0" 191 | } 192 | }, 193 | "node_modules/depd": { 194 | "version": "2.0.0", 195 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 196 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 197 | "engines": { 198 | "node": ">= 0.8" 199 | } 200 | }, 201 | "node_modules/destroy": { 202 | "version": "1.2.0", 203 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 204 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 205 | "engines": { 206 | "node": ">= 0.8", 207 | "npm": "1.2.8000 || >= 1.4.16" 208 | } 209 | }, 210 | "node_modules/ee-first": { 211 | "version": "1.1.1", 212 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 213 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 214 | }, 215 | "node_modules/encodeurl": { 216 | "version": "1.0.2", 217 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 218 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 219 | "engines": { 220 | "node": ">= 0.8" 221 | } 222 | }, 223 | "node_modules/escape-html": { 224 | "version": "1.0.3", 225 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 226 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 227 | }, 228 | "node_modules/etag": { 229 | "version": "1.8.1", 230 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 231 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 232 | "engines": { 233 | "node": ">= 0.6" 234 | } 235 | }, 236 | "node_modules/express": { 237 | "version": "4.18.2", 238 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 239 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 240 | "dependencies": { 241 | "accepts": "~1.3.8", 242 | "array-flatten": "1.1.1", 243 | "body-parser": "1.20.1", 244 | "content-disposition": "0.5.4", 245 | "content-type": "~1.0.4", 246 | "cookie": "0.5.0", 247 | "cookie-signature": "1.0.6", 248 | "debug": "2.6.9", 249 | "depd": "2.0.0", 250 | "encodeurl": "~1.0.2", 251 | "escape-html": "~1.0.3", 252 | "etag": "~1.8.1", 253 | "finalhandler": "1.2.0", 254 | "fresh": "0.5.2", 255 | "http-errors": "2.0.0", 256 | "merge-descriptors": "1.0.1", 257 | "methods": "~1.1.2", 258 | "on-finished": "2.4.1", 259 | "parseurl": "~1.3.3", 260 | "path-to-regexp": "0.1.7", 261 | "proxy-addr": "~2.0.7", 262 | "qs": "6.11.0", 263 | "range-parser": "~1.2.1", 264 | "safe-buffer": "5.2.1", 265 | "send": "0.18.0", 266 | "serve-static": "1.15.0", 267 | "setprototypeof": "1.2.0", 268 | "statuses": "2.0.1", 269 | "type-is": "~1.6.18", 270 | "utils-merge": "1.0.1", 271 | "vary": "~1.1.2" 272 | }, 273 | "engines": { 274 | "node": ">= 0.10.0" 275 | } 276 | }, 277 | "node_modules/file-type": { 278 | "version": "16.5.4", 279 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", 280 | "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", 281 | "dependencies": { 282 | "readable-web-to-node-stream": "^3.0.0", 283 | "strtok3": "^6.2.4", 284 | "token-types": "^4.1.1" 285 | }, 286 | "engines": { 287 | "node": ">=10" 288 | }, 289 | "funding": { 290 | "url": "https://github.com/sindresorhus/file-type?sponsor=1" 291 | } 292 | }, 293 | "node_modules/finalhandler": { 294 | "version": "1.2.0", 295 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 296 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 297 | "dependencies": { 298 | "debug": "2.6.9", 299 | "encodeurl": "~1.0.2", 300 | "escape-html": "~1.0.3", 301 | "on-finished": "2.4.1", 302 | "parseurl": "~1.3.3", 303 | "statuses": "2.0.1", 304 | "unpipe": "~1.0.0" 305 | }, 306 | "engines": { 307 | "node": ">= 0.8" 308 | } 309 | }, 310 | "node_modules/follow-redirects": { 311 | "version": "1.15.2", 312 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 313 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 314 | "funding": [ 315 | { 316 | "type": "individual", 317 | "url": "https://github.com/sponsors/RubenVerborgh" 318 | } 319 | ], 320 | "engines": { 321 | "node": ">=4.0" 322 | }, 323 | "peerDependenciesMeta": { 324 | "debug": { 325 | "optional": true 326 | } 327 | } 328 | }, 329 | "node_modules/form-data": { 330 | "version": "4.0.0", 331 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 332 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 333 | "dependencies": { 334 | "asynckit": "^0.4.0", 335 | "combined-stream": "^1.0.8", 336 | "mime-types": "^2.1.12" 337 | }, 338 | "engines": { 339 | "node": ">= 6" 340 | } 341 | }, 342 | "node_modules/forwarded": { 343 | "version": "0.2.0", 344 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 345 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 346 | "engines": { 347 | "node": ">= 0.6" 348 | } 349 | }, 350 | "node_modules/fresh": { 351 | "version": "0.5.2", 352 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 353 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 354 | "engines": { 355 | "node": ">= 0.6" 356 | } 357 | }, 358 | "node_modules/function-bind": { 359 | "version": "1.1.1", 360 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 361 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 362 | }, 363 | "node_modules/get-intrinsic": { 364 | "version": "1.2.0", 365 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 366 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 367 | "dependencies": { 368 | "function-bind": "^1.1.1", 369 | "has": "^1.0.3", 370 | "has-symbols": "^1.0.3" 371 | }, 372 | "funding": { 373 | "url": "https://github.com/sponsors/ljharb" 374 | } 375 | }, 376 | "node_modules/has": { 377 | "version": "1.0.3", 378 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 379 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 380 | "dependencies": { 381 | "function-bind": "^1.1.1" 382 | }, 383 | "engines": { 384 | "node": ">= 0.4.0" 385 | } 386 | }, 387 | "node_modules/has-symbols": { 388 | "version": "1.0.3", 389 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 390 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 391 | "engines": { 392 | "node": ">= 0.4" 393 | }, 394 | "funding": { 395 | "url": "https://github.com/sponsors/ljharb" 396 | } 397 | }, 398 | "node_modules/http-errors": { 399 | "version": "2.0.0", 400 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 401 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 402 | "dependencies": { 403 | "depd": "2.0.0", 404 | "inherits": "2.0.4", 405 | "setprototypeof": "1.2.0", 406 | "statuses": "2.0.1", 407 | "toidentifier": "1.0.1" 408 | }, 409 | "engines": { 410 | "node": ">= 0.8" 411 | } 412 | }, 413 | "node_modules/iconv-lite": { 414 | "version": "0.4.24", 415 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 416 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 417 | "dependencies": { 418 | "safer-buffer": ">= 2.1.2 < 3" 419 | }, 420 | "engines": { 421 | "node": ">=0.10.0" 422 | } 423 | }, 424 | "node_modules/ieee754": { 425 | "version": "1.2.1", 426 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 427 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 428 | "funding": [ 429 | { 430 | "type": "github", 431 | "url": "https://github.com/sponsors/feross" 432 | }, 433 | { 434 | "type": "patreon", 435 | "url": "https://www.patreon.com/feross" 436 | }, 437 | { 438 | "type": "consulting", 439 | "url": "https://feross.org/support" 440 | } 441 | ] 442 | }, 443 | "node_modules/inherits": { 444 | "version": "2.0.4", 445 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 446 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 447 | }, 448 | "node_modules/ipaddr.js": { 449 | "version": "1.9.1", 450 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 451 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 452 | "engines": { 453 | "node": ">= 0.10" 454 | } 455 | }, 456 | "node_modules/media-typer": { 457 | "version": "0.3.0", 458 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 459 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 460 | "engines": { 461 | "node": ">= 0.6" 462 | } 463 | }, 464 | "node_modules/merge-descriptors": { 465 | "version": "1.0.1", 466 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 467 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 468 | }, 469 | "node_modules/methods": { 470 | "version": "1.1.2", 471 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 472 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 473 | "engines": { 474 | "node": ">= 0.6" 475 | } 476 | }, 477 | "node_modules/mime": { 478 | "version": "1.6.0", 479 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 480 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 481 | "bin": { 482 | "mime": "cli.js" 483 | }, 484 | "engines": { 485 | "node": ">=4" 486 | } 487 | }, 488 | "node_modules/mime-db": { 489 | "version": "1.52.0", 490 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 491 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 492 | "engines": { 493 | "node": ">= 0.6" 494 | } 495 | }, 496 | "node_modules/mime-types": { 497 | "version": "2.1.35", 498 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 499 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 500 | "dependencies": { 501 | "mime-db": "1.52.0" 502 | }, 503 | "engines": { 504 | "node": ">= 0.6" 505 | } 506 | }, 507 | "node_modules/ms": { 508 | "version": "2.0.0", 509 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 510 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 511 | }, 512 | "node_modules/negotiator": { 513 | "version": "0.6.3", 514 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 515 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 516 | "engines": { 517 | "node": ">= 0.6" 518 | } 519 | }, 520 | "node_modules/object-inspect": { 521 | "version": "1.12.3", 522 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 523 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 524 | "funding": { 525 | "url": "https://github.com/sponsors/ljharb" 526 | } 527 | }, 528 | "node_modules/on-finished": { 529 | "version": "2.4.1", 530 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 531 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 532 | "dependencies": { 533 | "ee-first": "1.1.1" 534 | }, 535 | "engines": { 536 | "node": ">= 0.8" 537 | } 538 | }, 539 | "node_modules/openai": { 540 | "version": "3.1.0", 541 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.1.0.tgz", 542 | "integrity": "sha512-v5kKFH5o+8ld+t0arudj833Mgm3GcgBnbyN9946bj6u7bvel4Yg6YFz2A4HLIYDzmMjIo0s6vSG9x73kOwvdCg==", 543 | "dependencies": { 544 | "axios": "^0.26.0", 545 | "form-data": "^4.0.0" 546 | } 547 | }, 548 | "node_modules/openai/node_modules/axios": { 549 | "version": "0.26.1", 550 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 551 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 552 | "dependencies": { 553 | "follow-redirects": "^1.14.8" 554 | } 555 | }, 556 | "node_modules/parseurl": { 557 | "version": "1.3.3", 558 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 559 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 560 | "engines": { 561 | "node": ">= 0.8" 562 | } 563 | }, 564 | "node_modules/path-to-regexp": { 565 | "version": "0.1.7", 566 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 567 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 568 | }, 569 | "node_modules/peek-readable": { 570 | "version": "4.1.0", 571 | "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", 572 | "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", 573 | "engines": { 574 | "node": ">=8" 575 | }, 576 | "funding": { 577 | "type": "github", 578 | "url": "https://github.com/sponsors/Borewit" 579 | } 580 | }, 581 | "node_modules/proxy-addr": { 582 | "version": "2.0.7", 583 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 584 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 585 | "dependencies": { 586 | "forwarded": "0.2.0", 587 | "ipaddr.js": "1.9.1" 588 | }, 589 | "engines": { 590 | "node": ">= 0.10" 591 | } 592 | }, 593 | "node_modules/qs": { 594 | "version": "6.11.0", 595 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 596 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 597 | "dependencies": { 598 | "side-channel": "^1.0.4" 599 | }, 600 | "engines": { 601 | "node": ">=0.6" 602 | }, 603 | "funding": { 604 | "url": "https://github.com/sponsors/ljharb" 605 | } 606 | }, 607 | "node_modules/range-parser": { 608 | "version": "1.2.1", 609 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 610 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 611 | "engines": { 612 | "node": ">= 0.6" 613 | } 614 | }, 615 | "node_modules/raw-body": { 616 | "version": "2.5.1", 617 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 618 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 619 | "dependencies": { 620 | "bytes": "3.1.2", 621 | "http-errors": "2.0.0", 622 | "iconv-lite": "0.4.24", 623 | "unpipe": "1.0.0" 624 | }, 625 | "engines": { 626 | "node": ">= 0.8" 627 | } 628 | }, 629 | "node_modules/readable-stream": { 630 | "version": "3.6.0", 631 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 632 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 633 | "dependencies": { 634 | "inherits": "^2.0.3", 635 | "string_decoder": "^1.1.1", 636 | "util-deprecate": "^1.0.1" 637 | }, 638 | "engines": { 639 | "node": ">= 6" 640 | } 641 | }, 642 | "node_modules/readable-web-to-node-stream": { 643 | "version": "3.0.2", 644 | "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", 645 | "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", 646 | "dependencies": { 647 | "readable-stream": "^3.6.0" 648 | }, 649 | "engines": { 650 | "node": ">=8" 651 | }, 652 | "funding": { 653 | "type": "github", 654 | "url": "https://github.com/sponsors/Borewit" 655 | } 656 | }, 657 | "node_modules/safe-buffer": { 658 | "version": "5.2.1", 659 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 660 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 661 | "funding": [ 662 | { 663 | "type": "github", 664 | "url": "https://github.com/sponsors/feross" 665 | }, 666 | { 667 | "type": "patreon", 668 | "url": "https://www.patreon.com/feross" 669 | }, 670 | { 671 | "type": "consulting", 672 | "url": "https://feross.org/support" 673 | } 674 | ] 675 | }, 676 | "node_modules/safer-buffer": { 677 | "version": "2.1.2", 678 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 679 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 680 | }, 681 | "node_modules/send": { 682 | "version": "0.18.0", 683 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 684 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 685 | "dependencies": { 686 | "debug": "2.6.9", 687 | "depd": "2.0.0", 688 | "destroy": "1.2.0", 689 | "encodeurl": "~1.0.2", 690 | "escape-html": "~1.0.3", 691 | "etag": "~1.8.1", 692 | "fresh": "0.5.2", 693 | "http-errors": "2.0.0", 694 | "mime": "1.6.0", 695 | "ms": "2.1.3", 696 | "on-finished": "2.4.1", 697 | "range-parser": "~1.2.1", 698 | "statuses": "2.0.1" 699 | }, 700 | "engines": { 701 | "node": ">= 0.8.0" 702 | } 703 | }, 704 | "node_modules/send/node_modules/ms": { 705 | "version": "2.1.3", 706 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 707 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 708 | }, 709 | "node_modules/serve-static": { 710 | "version": "1.15.0", 711 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 712 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 713 | "dependencies": { 714 | "encodeurl": "~1.0.2", 715 | "escape-html": "~1.0.3", 716 | "parseurl": "~1.3.3", 717 | "send": "0.18.0" 718 | }, 719 | "engines": { 720 | "node": ">= 0.8.0" 721 | } 722 | }, 723 | "node_modules/setprototypeof": { 724 | "version": "1.2.0", 725 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 726 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 727 | }, 728 | "node_modules/side-channel": { 729 | "version": "1.0.4", 730 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 731 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 732 | "dependencies": { 733 | "call-bind": "^1.0.0", 734 | "get-intrinsic": "^1.0.2", 735 | "object-inspect": "^1.9.0" 736 | }, 737 | "funding": { 738 | "url": "https://github.com/sponsors/ljharb" 739 | } 740 | }, 741 | "node_modules/statuses": { 742 | "version": "2.0.1", 743 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 744 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 745 | "engines": { 746 | "node": ">= 0.8" 747 | } 748 | }, 749 | "node_modules/string_decoder": { 750 | "version": "1.3.0", 751 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 752 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 753 | "dependencies": { 754 | "safe-buffer": "~5.2.0" 755 | } 756 | }, 757 | "node_modules/strtok3": { 758 | "version": "6.3.0", 759 | "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", 760 | "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", 761 | "dependencies": { 762 | "@tokenizer/token": "^0.3.0", 763 | "peek-readable": "^4.1.0" 764 | }, 765 | "engines": { 766 | "node": ">=10" 767 | }, 768 | "funding": { 769 | "type": "github", 770 | "url": "https://github.com/sponsors/Borewit" 771 | } 772 | }, 773 | "node_modules/toidentifier": { 774 | "version": "1.0.1", 775 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 776 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 777 | "engines": { 778 | "node": ">=0.6" 779 | } 780 | }, 781 | "node_modules/token-types": { 782 | "version": "4.2.1", 783 | "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", 784 | "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", 785 | "dependencies": { 786 | "@tokenizer/token": "^0.3.0", 787 | "ieee754": "^1.2.1" 788 | }, 789 | "engines": { 790 | "node": ">=10" 791 | }, 792 | "funding": { 793 | "type": "github", 794 | "url": "https://github.com/sponsors/Borewit" 795 | } 796 | }, 797 | "node_modules/type-is": { 798 | "version": "1.6.18", 799 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 800 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 801 | "dependencies": { 802 | "media-typer": "0.3.0", 803 | "mime-types": "~2.1.24" 804 | }, 805 | "engines": { 806 | "node": ">= 0.6" 807 | } 808 | }, 809 | "node_modules/unpipe": { 810 | "version": "1.0.0", 811 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 812 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 813 | "engines": { 814 | "node": ">= 0.8" 815 | } 816 | }, 817 | "node_modules/util-deprecate": { 818 | "version": "1.0.2", 819 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 820 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 821 | }, 822 | "node_modules/utils-merge": { 823 | "version": "1.0.1", 824 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 825 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 826 | "engines": { 827 | "node": ">= 0.4.0" 828 | } 829 | }, 830 | "node_modules/vary": { 831 | "version": "1.1.2", 832 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 833 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 834 | "engines": { 835 | "node": ">= 0.8" 836 | } 837 | } 838 | }, 839 | "dependencies": { 840 | "@line/bot-sdk": { 841 | "version": "7.5.2", 842 | "resolved": "https://registry.npmjs.org/@line/bot-sdk/-/bot-sdk-7.5.2.tgz", 843 | "integrity": "sha512-mMaDnr+mOqQDLYJcUp+fQwZklg/LoOZzNILlWdsj2IFD2nXF+HhAm3KEy5tyUx629Y2bCx6nv9Jl0UlMwBiAiw==", 844 | "requires": { 845 | "@types/body-parser": "^1.19.2", 846 | "@types/node": "^16.0.0", 847 | "axios": "^0.27.0", 848 | "body-parser": "^1.20.0", 849 | "file-type": "^16.5.4", 850 | "form-data": "^4.0.0" 851 | } 852 | }, 853 | "@tokenizer/token": { 854 | "version": "0.3.0", 855 | "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", 856 | "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" 857 | }, 858 | "@types/body-parser": { 859 | "version": "1.19.2", 860 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", 861 | "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", 862 | "requires": { 863 | "@types/connect": "*", 864 | "@types/node": "*" 865 | } 866 | }, 867 | "@types/connect": { 868 | "version": "3.4.35", 869 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 870 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 871 | "requires": { 872 | "@types/node": "*" 873 | } 874 | }, 875 | "@types/node": { 876 | "version": "16.18.11", 877 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", 878 | "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==" 879 | }, 880 | "accepts": { 881 | "version": "1.3.8", 882 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 883 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 884 | "requires": { 885 | "mime-types": "~2.1.34", 886 | "negotiator": "0.6.3" 887 | } 888 | }, 889 | "array-flatten": { 890 | "version": "1.1.1", 891 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 892 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 893 | }, 894 | "asynckit": { 895 | "version": "0.4.0", 896 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 897 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 898 | }, 899 | "axios": { 900 | "version": "0.27.2", 901 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", 902 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", 903 | "requires": { 904 | "follow-redirects": "^1.14.9", 905 | "form-data": "^4.0.0" 906 | } 907 | }, 908 | "body-parser": { 909 | "version": "1.20.1", 910 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 911 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 912 | "requires": { 913 | "bytes": "3.1.2", 914 | "content-type": "~1.0.4", 915 | "debug": "2.6.9", 916 | "depd": "2.0.0", 917 | "destroy": "1.2.0", 918 | "http-errors": "2.0.0", 919 | "iconv-lite": "0.4.24", 920 | "on-finished": "2.4.1", 921 | "qs": "6.11.0", 922 | "raw-body": "2.5.1", 923 | "type-is": "~1.6.18", 924 | "unpipe": "1.0.0" 925 | } 926 | }, 927 | "bytes": { 928 | "version": "3.1.2", 929 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 930 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 931 | }, 932 | "call-bind": { 933 | "version": "1.0.2", 934 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 935 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 936 | "requires": { 937 | "function-bind": "^1.1.1", 938 | "get-intrinsic": "^1.0.2" 939 | } 940 | }, 941 | "combined-stream": { 942 | "version": "1.0.8", 943 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 944 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 945 | "requires": { 946 | "delayed-stream": "~1.0.0" 947 | } 948 | }, 949 | "content-disposition": { 950 | "version": "0.5.4", 951 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 952 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 953 | "requires": { 954 | "safe-buffer": "5.2.1" 955 | } 956 | }, 957 | "content-type": { 958 | "version": "1.0.5", 959 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 960 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" 961 | }, 962 | "cookie": { 963 | "version": "0.5.0", 964 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 965 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 966 | }, 967 | "cookie-signature": { 968 | "version": "1.0.6", 969 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 970 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 971 | }, 972 | "debug": { 973 | "version": "2.6.9", 974 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 975 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 976 | "requires": { 977 | "ms": "2.0.0" 978 | } 979 | }, 980 | "delayed-stream": { 981 | "version": "1.0.0", 982 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 983 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 984 | }, 985 | "depd": { 986 | "version": "2.0.0", 987 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 988 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 989 | }, 990 | "destroy": { 991 | "version": "1.2.0", 992 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 993 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 994 | }, 995 | "ee-first": { 996 | "version": "1.1.1", 997 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 998 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 999 | }, 1000 | "encodeurl": { 1001 | "version": "1.0.2", 1002 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1003 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 1004 | }, 1005 | "escape-html": { 1006 | "version": "1.0.3", 1007 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1008 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1009 | }, 1010 | "etag": { 1011 | "version": "1.8.1", 1012 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1013 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 1014 | }, 1015 | "express": { 1016 | "version": "4.18.2", 1017 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 1018 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 1019 | "requires": { 1020 | "accepts": "~1.3.8", 1021 | "array-flatten": "1.1.1", 1022 | "body-parser": "1.20.1", 1023 | "content-disposition": "0.5.4", 1024 | "content-type": "~1.0.4", 1025 | "cookie": "0.5.0", 1026 | "cookie-signature": "1.0.6", 1027 | "debug": "2.6.9", 1028 | "depd": "2.0.0", 1029 | "encodeurl": "~1.0.2", 1030 | "escape-html": "~1.0.3", 1031 | "etag": "~1.8.1", 1032 | "finalhandler": "1.2.0", 1033 | "fresh": "0.5.2", 1034 | "http-errors": "2.0.0", 1035 | "merge-descriptors": "1.0.1", 1036 | "methods": "~1.1.2", 1037 | "on-finished": "2.4.1", 1038 | "parseurl": "~1.3.3", 1039 | "path-to-regexp": "0.1.7", 1040 | "proxy-addr": "~2.0.7", 1041 | "qs": "6.11.0", 1042 | "range-parser": "~1.2.1", 1043 | "safe-buffer": "5.2.1", 1044 | "send": "0.18.0", 1045 | "serve-static": "1.15.0", 1046 | "setprototypeof": "1.2.0", 1047 | "statuses": "2.0.1", 1048 | "type-is": "~1.6.18", 1049 | "utils-merge": "1.0.1", 1050 | "vary": "~1.1.2" 1051 | } 1052 | }, 1053 | "file-type": { 1054 | "version": "16.5.4", 1055 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", 1056 | "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", 1057 | "requires": { 1058 | "readable-web-to-node-stream": "^3.0.0", 1059 | "strtok3": "^6.2.4", 1060 | "token-types": "^4.1.1" 1061 | } 1062 | }, 1063 | "finalhandler": { 1064 | "version": "1.2.0", 1065 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 1066 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 1067 | "requires": { 1068 | "debug": "2.6.9", 1069 | "encodeurl": "~1.0.2", 1070 | "escape-html": "~1.0.3", 1071 | "on-finished": "2.4.1", 1072 | "parseurl": "~1.3.3", 1073 | "statuses": "2.0.1", 1074 | "unpipe": "~1.0.0" 1075 | } 1076 | }, 1077 | "follow-redirects": { 1078 | "version": "1.15.2", 1079 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 1080 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" 1081 | }, 1082 | "form-data": { 1083 | "version": "4.0.0", 1084 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 1085 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 1086 | "requires": { 1087 | "asynckit": "^0.4.0", 1088 | "combined-stream": "^1.0.8", 1089 | "mime-types": "^2.1.12" 1090 | } 1091 | }, 1092 | "forwarded": { 1093 | "version": "0.2.0", 1094 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1095 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 1096 | }, 1097 | "fresh": { 1098 | "version": "0.5.2", 1099 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1100 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 1101 | }, 1102 | "function-bind": { 1103 | "version": "1.1.1", 1104 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1105 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1106 | }, 1107 | "get-intrinsic": { 1108 | "version": "1.2.0", 1109 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 1110 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 1111 | "requires": { 1112 | "function-bind": "^1.1.1", 1113 | "has": "^1.0.3", 1114 | "has-symbols": "^1.0.3" 1115 | } 1116 | }, 1117 | "has": { 1118 | "version": "1.0.3", 1119 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1120 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1121 | "requires": { 1122 | "function-bind": "^1.1.1" 1123 | } 1124 | }, 1125 | "has-symbols": { 1126 | "version": "1.0.3", 1127 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1128 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 1129 | }, 1130 | "http-errors": { 1131 | "version": "2.0.0", 1132 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1133 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1134 | "requires": { 1135 | "depd": "2.0.0", 1136 | "inherits": "2.0.4", 1137 | "setprototypeof": "1.2.0", 1138 | "statuses": "2.0.1", 1139 | "toidentifier": "1.0.1" 1140 | } 1141 | }, 1142 | "iconv-lite": { 1143 | "version": "0.4.24", 1144 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1145 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1146 | "requires": { 1147 | "safer-buffer": ">= 2.1.2 < 3" 1148 | } 1149 | }, 1150 | "ieee754": { 1151 | "version": "1.2.1", 1152 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1153 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 1154 | }, 1155 | "inherits": { 1156 | "version": "2.0.4", 1157 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1158 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1159 | }, 1160 | "ipaddr.js": { 1161 | "version": "1.9.1", 1162 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1163 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1164 | }, 1165 | "media-typer": { 1166 | "version": "0.3.0", 1167 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1168 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 1169 | }, 1170 | "merge-descriptors": { 1171 | "version": "1.0.1", 1172 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1173 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1174 | }, 1175 | "methods": { 1176 | "version": "1.1.2", 1177 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1178 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 1179 | }, 1180 | "mime": { 1181 | "version": "1.6.0", 1182 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1183 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1184 | }, 1185 | "mime-db": { 1186 | "version": "1.52.0", 1187 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1188 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1189 | }, 1190 | "mime-types": { 1191 | "version": "2.1.35", 1192 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1193 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1194 | "requires": { 1195 | "mime-db": "1.52.0" 1196 | } 1197 | }, 1198 | "ms": { 1199 | "version": "2.0.0", 1200 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1201 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1202 | }, 1203 | "negotiator": { 1204 | "version": "0.6.3", 1205 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1206 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1207 | }, 1208 | "object-inspect": { 1209 | "version": "1.12.3", 1210 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 1211 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" 1212 | }, 1213 | "on-finished": { 1214 | "version": "2.4.1", 1215 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1216 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1217 | "requires": { 1218 | "ee-first": "1.1.1" 1219 | } 1220 | }, 1221 | "openai": { 1222 | "version": "3.1.0", 1223 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.1.0.tgz", 1224 | "integrity": "sha512-v5kKFH5o+8ld+t0arudj833Mgm3GcgBnbyN9946bj6u7bvel4Yg6YFz2A4HLIYDzmMjIo0s6vSG9x73kOwvdCg==", 1225 | "requires": { 1226 | "axios": "^0.26.0", 1227 | "form-data": "^4.0.0" 1228 | }, 1229 | "dependencies": { 1230 | "axios": { 1231 | "version": "0.26.1", 1232 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 1233 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 1234 | "requires": { 1235 | "follow-redirects": "^1.14.8" 1236 | } 1237 | } 1238 | } 1239 | }, 1240 | "parseurl": { 1241 | "version": "1.3.3", 1242 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1243 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1244 | }, 1245 | "path-to-regexp": { 1246 | "version": "0.1.7", 1247 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1248 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1249 | }, 1250 | "peek-readable": { 1251 | "version": "4.1.0", 1252 | "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", 1253 | "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==" 1254 | }, 1255 | "proxy-addr": { 1256 | "version": "2.0.7", 1257 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1258 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1259 | "requires": { 1260 | "forwarded": "0.2.0", 1261 | "ipaddr.js": "1.9.1" 1262 | } 1263 | }, 1264 | "qs": { 1265 | "version": "6.11.0", 1266 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1267 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1268 | "requires": { 1269 | "side-channel": "^1.0.4" 1270 | } 1271 | }, 1272 | "range-parser": { 1273 | "version": "1.2.1", 1274 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1275 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1276 | }, 1277 | "raw-body": { 1278 | "version": "2.5.1", 1279 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1280 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1281 | "requires": { 1282 | "bytes": "3.1.2", 1283 | "http-errors": "2.0.0", 1284 | "iconv-lite": "0.4.24", 1285 | "unpipe": "1.0.0" 1286 | } 1287 | }, 1288 | "readable-stream": { 1289 | "version": "3.6.0", 1290 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1291 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1292 | "requires": { 1293 | "inherits": "^2.0.3", 1294 | "string_decoder": "^1.1.1", 1295 | "util-deprecate": "^1.0.1" 1296 | } 1297 | }, 1298 | "readable-web-to-node-stream": { 1299 | "version": "3.0.2", 1300 | "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", 1301 | "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", 1302 | "requires": { 1303 | "readable-stream": "^3.6.0" 1304 | } 1305 | }, 1306 | "safe-buffer": { 1307 | "version": "5.2.1", 1308 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1309 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1310 | }, 1311 | "safer-buffer": { 1312 | "version": "2.1.2", 1313 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1314 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1315 | }, 1316 | "send": { 1317 | "version": "0.18.0", 1318 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1319 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1320 | "requires": { 1321 | "debug": "2.6.9", 1322 | "depd": "2.0.0", 1323 | "destroy": "1.2.0", 1324 | "encodeurl": "~1.0.2", 1325 | "escape-html": "~1.0.3", 1326 | "etag": "~1.8.1", 1327 | "fresh": "0.5.2", 1328 | "http-errors": "2.0.0", 1329 | "mime": "1.6.0", 1330 | "ms": "2.1.3", 1331 | "on-finished": "2.4.1", 1332 | "range-parser": "~1.2.1", 1333 | "statuses": "2.0.1" 1334 | }, 1335 | "dependencies": { 1336 | "ms": { 1337 | "version": "2.1.3", 1338 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1339 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1340 | } 1341 | } 1342 | }, 1343 | "serve-static": { 1344 | "version": "1.15.0", 1345 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1346 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1347 | "requires": { 1348 | "encodeurl": "~1.0.2", 1349 | "escape-html": "~1.0.3", 1350 | "parseurl": "~1.3.3", 1351 | "send": "0.18.0" 1352 | } 1353 | }, 1354 | "setprototypeof": { 1355 | "version": "1.2.0", 1356 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1357 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1358 | }, 1359 | "side-channel": { 1360 | "version": "1.0.4", 1361 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1362 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1363 | "requires": { 1364 | "call-bind": "^1.0.0", 1365 | "get-intrinsic": "^1.0.2", 1366 | "object-inspect": "^1.9.0" 1367 | } 1368 | }, 1369 | "statuses": { 1370 | "version": "2.0.1", 1371 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1372 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 1373 | }, 1374 | "string_decoder": { 1375 | "version": "1.3.0", 1376 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1377 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1378 | "requires": { 1379 | "safe-buffer": "~5.2.0" 1380 | } 1381 | }, 1382 | "strtok3": { 1383 | "version": "6.3.0", 1384 | "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", 1385 | "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", 1386 | "requires": { 1387 | "@tokenizer/token": "^0.3.0", 1388 | "peek-readable": "^4.1.0" 1389 | } 1390 | }, 1391 | "toidentifier": { 1392 | "version": "1.0.1", 1393 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1394 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1395 | }, 1396 | "token-types": { 1397 | "version": "4.2.1", 1398 | "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", 1399 | "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", 1400 | "requires": { 1401 | "@tokenizer/token": "^0.3.0", 1402 | "ieee754": "^1.2.1" 1403 | } 1404 | }, 1405 | "type-is": { 1406 | "version": "1.6.18", 1407 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1408 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1409 | "requires": { 1410 | "media-typer": "0.3.0", 1411 | "mime-types": "~2.1.24" 1412 | } 1413 | }, 1414 | "unpipe": { 1415 | "version": "1.0.0", 1416 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1417 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1418 | }, 1419 | "util-deprecate": { 1420 | "version": "1.0.2", 1421 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1422 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1423 | }, 1424 | "utils-merge": { 1425 | "version": "1.0.1", 1426 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1427 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1428 | }, 1429 | "vary": { 1430 | "version": "1.1.2", 1431 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1432 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1433 | } 1434 | } 1435 | } 1436 | -------------------------------------------------------------------------------- /Ch09/myproject/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "myproject", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "myproject", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@line/bot-sdk": "^7.5.2", 13 | "express": "^4.18.2", 14 | "openai": "^3.1.0" 15 | } 16 | }, 17 | "node_modules/@line/bot-sdk": { 18 | "version": "7.5.2", 19 | "resolved": "https://registry.npmjs.org/@line/bot-sdk/-/bot-sdk-7.5.2.tgz", 20 | "integrity": "sha512-mMaDnr+mOqQDLYJcUp+fQwZklg/LoOZzNILlWdsj2IFD2nXF+HhAm3KEy5tyUx629Y2bCx6nv9Jl0UlMwBiAiw==", 21 | "dependencies": { 22 | "@types/body-parser": "^1.19.2", 23 | "@types/node": "^16.0.0", 24 | "axios": "^0.27.0", 25 | "body-parser": "^1.20.0", 26 | "file-type": "^16.5.4", 27 | "form-data": "^4.0.0" 28 | }, 29 | "engines": { 30 | "node": ">=10" 31 | } 32 | }, 33 | "node_modules/@tokenizer/token": { 34 | "version": "0.3.0", 35 | "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", 36 | "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" 37 | }, 38 | "node_modules/@types/body-parser": { 39 | "version": "1.19.2", 40 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", 41 | "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", 42 | "dependencies": { 43 | "@types/connect": "*", 44 | "@types/node": "*" 45 | } 46 | }, 47 | "node_modules/@types/connect": { 48 | "version": "3.4.35", 49 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 50 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 51 | "dependencies": { 52 | "@types/node": "*" 53 | } 54 | }, 55 | "node_modules/@types/node": { 56 | "version": "16.18.11", 57 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", 58 | "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==" 59 | }, 60 | "node_modules/accepts": { 61 | "version": "1.3.8", 62 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 63 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 64 | "dependencies": { 65 | "mime-types": "~2.1.34", 66 | "negotiator": "0.6.3" 67 | }, 68 | "engines": { 69 | "node": ">= 0.6" 70 | } 71 | }, 72 | "node_modules/array-flatten": { 73 | "version": "1.1.1", 74 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 75 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 76 | }, 77 | "node_modules/asynckit": { 78 | "version": "0.4.0", 79 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 80 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 81 | }, 82 | "node_modules/axios": { 83 | "version": "0.27.2", 84 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", 85 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", 86 | "dependencies": { 87 | "follow-redirects": "^1.14.9", 88 | "form-data": "^4.0.0" 89 | } 90 | }, 91 | "node_modules/body-parser": { 92 | "version": "1.20.1", 93 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 94 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 95 | "dependencies": { 96 | "bytes": "3.1.2", 97 | "content-type": "~1.0.4", 98 | "debug": "2.6.9", 99 | "depd": "2.0.0", 100 | "destroy": "1.2.0", 101 | "http-errors": "2.0.0", 102 | "iconv-lite": "0.4.24", 103 | "on-finished": "2.4.1", 104 | "qs": "6.11.0", 105 | "raw-body": "2.5.1", 106 | "type-is": "~1.6.18", 107 | "unpipe": "1.0.0" 108 | }, 109 | "engines": { 110 | "node": ">= 0.8", 111 | "npm": "1.2.8000 || >= 1.4.16" 112 | } 113 | }, 114 | "node_modules/bytes": { 115 | "version": "3.1.2", 116 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 117 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", 118 | "engines": { 119 | "node": ">= 0.8" 120 | } 121 | }, 122 | "node_modules/call-bind": { 123 | "version": "1.0.2", 124 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 125 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 126 | "dependencies": { 127 | "function-bind": "^1.1.1", 128 | "get-intrinsic": "^1.0.2" 129 | }, 130 | "funding": { 131 | "url": "https://github.com/sponsors/ljharb" 132 | } 133 | }, 134 | "node_modules/combined-stream": { 135 | "version": "1.0.8", 136 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 137 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 138 | "dependencies": { 139 | "delayed-stream": "~1.0.0" 140 | }, 141 | "engines": { 142 | "node": ">= 0.8" 143 | } 144 | }, 145 | "node_modules/content-disposition": { 146 | "version": "0.5.4", 147 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 148 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 149 | "dependencies": { 150 | "safe-buffer": "5.2.1" 151 | }, 152 | "engines": { 153 | "node": ">= 0.6" 154 | } 155 | }, 156 | "node_modules/content-type": { 157 | "version": "1.0.5", 158 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 159 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", 160 | "engines": { 161 | "node": ">= 0.6" 162 | } 163 | }, 164 | "node_modules/cookie": { 165 | "version": "0.5.0", 166 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 167 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", 168 | "engines": { 169 | "node": ">= 0.6" 170 | } 171 | }, 172 | "node_modules/cookie-signature": { 173 | "version": "1.0.6", 174 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 175 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 176 | }, 177 | "node_modules/debug": { 178 | "version": "2.6.9", 179 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 180 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 181 | "dependencies": { 182 | "ms": "2.0.0" 183 | } 184 | }, 185 | "node_modules/delayed-stream": { 186 | "version": "1.0.0", 187 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 188 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 189 | "engines": { 190 | "node": ">=0.4.0" 191 | } 192 | }, 193 | "node_modules/depd": { 194 | "version": "2.0.0", 195 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 196 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", 197 | "engines": { 198 | "node": ">= 0.8" 199 | } 200 | }, 201 | "node_modules/destroy": { 202 | "version": "1.2.0", 203 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 204 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", 205 | "engines": { 206 | "node": ">= 0.8", 207 | "npm": "1.2.8000 || >= 1.4.16" 208 | } 209 | }, 210 | "node_modules/ee-first": { 211 | "version": "1.1.1", 212 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 213 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 214 | }, 215 | "node_modules/encodeurl": { 216 | "version": "1.0.2", 217 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 218 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 219 | "engines": { 220 | "node": ">= 0.8" 221 | } 222 | }, 223 | "node_modules/escape-html": { 224 | "version": "1.0.3", 225 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 226 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 227 | }, 228 | "node_modules/etag": { 229 | "version": "1.8.1", 230 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 231 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", 232 | "engines": { 233 | "node": ">= 0.6" 234 | } 235 | }, 236 | "node_modules/express": { 237 | "version": "4.18.2", 238 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 239 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 240 | "dependencies": { 241 | "accepts": "~1.3.8", 242 | "array-flatten": "1.1.1", 243 | "body-parser": "1.20.1", 244 | "content-disposition": "0.5.4", 245 | "content-type": "~1.0.4", 246 | "cookie": "0.5.0", 247 | "cookie-signature": "1.0.6", 248 | "debug": "2.6.9", 249 | "depd": "2.0.0", 250 | "encodeurl": "~1.0.2", 251 | "escape-html": "~1.0.3", 252 | "etag": "~1.8.1", 253 | "finalhandler": "1.2.0", 254 | "fresh": "0.5.2", 255 | "http-errors": "2.0.0", 256 | "merge-descriptors": "1.0.1", 257 | "methods": "~1.1.2", 258 | "on-finished": "2.4.1", 259 | "parseurl": "~1.3.3", 260 | "path-to-regexp": "0.1.7", 261 | "proxy-addr": "~2.0.7", 262 | "qs": "6.11.0", 263 | "range-parser": "~1.2.1", 264 | "safe-buffer": "5.2.1", 265 | "send": "0.18.0", 266 | "serve-static": "1.15.0", 267 | "setprototypeof": "1.2.0", 268 | "statuses": "2.0.1", 269 | "type-is": "~1.6.18", 270 | "utils-merge": "1.0.1", 271 | "vary": "~1.1.2" 272 | }, 273 | "engines": { 274 | "node": ">= 0.10.0" 275 | } 276 | }, 277 | "node_modules/file-type": { 278 | "version": "16.5.4", 279 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", 280 | "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", 281 | "dependencies": { 282 | "readable-web-to-node-stream": "^3.0.0", 283 | "strtok3": "^6.2.4", 284 | "token-types": "^4.1.1" 285 | }, 286 | "engines": { 287 | "node": ">=10" 288 | }, 289 | "funding": { 290 | "url": "https://github.com/sindresorhus/file-type?sponsor=1" 291 | } 292 | }, 293 | "node_modules/finalhandler": { 294 | "version": "1.2.0", 295 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 296 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 297 | "dependencies": { 298 | "debug": "2.6.9", 299 | "encodeurl": "~1.0.2", 300 | "escape-html": "~1.0.3", 301 | "on-finished": "2.4.1", 302 | "parseurl": "~1.3.3", 303 | "statuses": "2.0.1", 304 | "unpipe": "~1.0.0" 305 | }, 306 | "engines": { 307 | "node": ">= 0.8" 308 | } 309 | }, 310 | "node_modules/follow-redirects": { 311 | "version": "1.15.2", 312 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 313 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", 314 | "funding": [ 315 | { 316 | "type": "individual", 317 | "url": "https://github.com/sponsors/RubenVerborgh" 318 | } 319 | ], 320 | "engines": { 321 | "node": ">=4.0" 322 | }, 323 | "peerDependenciesMeta": { 324 | "debug": { 325 | "optional": true 326 | } 327 | } 328 | }, 329 | "node_modules/form-data": { 330 | "version": "4.0.0", 331 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 332 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 333 | "dependencies": { 334 | "asynckit": "^0.4.0", 335 | "combined-stream": "^1.0.8", 336 | "mime-types": "^2.1.12" 337 | }, 338 | "engines": { 339 | "node": ">= 6" 340 | } 341 | }, 342 | "node_modules/forwarded": { 343 | "version": "0.2.0", 344 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 345 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", 346 | "engines": { 347 | "node": ">= 0.6" 348 | } 349 | }, 350 | "node_modules/fresh": { 351 | "version": "0.5.2", 352 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 353 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", 354 | "engines": { 355 | "node": ">= 0.6" 356 | } 357 | }, 358 | "node_modules/function-bind": { 359 | "version": "1.1.1", 360 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 361 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 362 | }, 363 | "node_modules/get-intrinsic": { 364 | "version": "1.2.0", 365 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 366 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 367 | "dependencies": { 368 | "function-bind": "^1.1.1", 369 | "has": "^1.0.3", 370 | "has-symbols": "^1.0.3" 371 | }, 372 | "funding": { 373 | "url": "https://github.com/sponsors/ljharb" 374 | } 375 | }, 376 | "node_modules/has": { 377 | "version": "1.0.3", 378 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 379 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 380 | "dependencies": { 381 | "function-bind": "^1.1.1" 382 | }, 383 | "engines": { 384 | "node": ">= 0.4.0" 385 | } 386 | }, 387 | "node_modules/has-symbols": { 388 | "version": "1.0.3", 389 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 390 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 391 | "engines": { 392 | "node": ">= 0.4" 393 | }, 394 | "funding": { 395 | "url": "https://github.com/sponsors/ljharb" 396 | } 397 | }, 398 | "node_modules/http-errors": { 399 | "version": "2.0.0", 400 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 401 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 402 | "dependencies": { 403 | "depd": "2.0.0", 404 | "inherits": "2.0.4", 405 | "setprototypeof": "1.2.0", 406 | "statuses": "2.0.1", 407 | "toidentifier": "1.0.1" 408 | }, 409 | "engines": { 410 | "node": ">= 0.8" 411 | } 412 | }, 413 | "node_modules/iconv-lite": { 414 | "version": "0.4.24", 415 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 416 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 417 | "dependencies": { 418 | "safer-buffer": ">= 2.1.2 < 3" 419 | }, 420 | "engines": { 421 | "node": ">=0.10.0" 422 | } 423 | }, 424 | "node_modules/ieee754": { 425 | "version": "1.2.1", 426 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 427 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 428 | "funding": [ 429 | { 430 | "type": "github", 431 | "url": "https://github.com/sponsors/feross" 432 | }, 433 | { 434 | "type": "patreon", 435 | "url": "https://www.patreon.com/feross" 436 | }, 437 | { 438 | "type": "consulting", 439 | "url": "https://feross.org/support" 440 | } 441 | ] 442 | }, 443 | "node_modules/inherits": { 444 | "version": "2.0.4", 445 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 446 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 447 | }, 448 | "node_modules/ipaddr.js": { 449 | "version": "1.9.1", 450 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 451 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", 452 | "engines": { 453 | "node": ">= 0.10" 454 | } 455 | }, 456 | "node_modules/media-typer": { 457 | "version": "0.3.0", 458 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 459 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", 460 | "engines": { 461 | "node": ">= 0.6" 462 | } 463 | }, 464 | "node_modules/merge-descriptors": { 465 | "version": "1.0.1", 466 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 467 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 468 | }, 469 | "node_modules/methods": { 470 | "version": "1.1.2", 471 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 472 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", 473 | "engines": { 474 | "node": ">= 0.6" 475 | } 476 | }, 477 | "node_modules/mime": { 478 | "version": "1.6.0", 479 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 480 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", 481 | "bin": { 482 | "mime": "cli.js" 483 | }, 484 | "engines": { 485 | "node": ">=4" 486 | } 487 | }, 488 | "node_modules/mime-db": { 489 | "version": "1.52.0", 490 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 491 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 492 | "engines": { 493 | "node": ">= 0.6" 494 | } 495 | }, 496 | "node_modules/mime-types": { 497 | "version": "2.1.35", 498 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 499 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 500 | "dependencies": { 501 | "mime-db": "1.52.0" 502 | }, 503 | "engines": { 504 | "node": ">= 0.6" 505 | } 506 | }, 507 | "node_modules/ms": { 508 | "version": "2.0.0", 509 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 510 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 511 | }, 512 | "node_modules/negotiator": { 513 | "version": "0.6.3", 514 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 515 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", 516 | "engines": { 517 | "node": ">= 0.6" 518 | } 519 | }, 520 | "node_modules/object-inspect": { 521 | "version": "1.12.3", 522 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 523 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 524 | "funding": { 525 | "url": "https://github.com/sponsors/ljharb" 526 | } 527 | }, 528 | "node_modules/on-finished": { 529 | "version": "2.4.1", 530 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 531 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 532 | "dependencies": { 533 | "ee-first": "1.1.1" 534 | }, 535 | "engines": { 536 | "node": ">= 0.8" 537 | } 538 | }, 539 | "node_modules/openai": { 540 | "version": "3.1.0", 541 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.1.0.tgz", 542 | "integrity": "sha512-v5kKFH5o+8ld+t0arudj833Mgm3GcgBnbyN9946bj6u7bvel4Yg6YFz2A4HLIYDzmMjIo0s6vSG9x73kOwvdCg==", 543 | "dependencies": { 544 | "axios": "^0.26.0", 545 | "form-data": "^4.0.0" 546 | } 547 | }, 548 | "node_modules/openai/node_modules/axios": { 549 | "version": "0.26.1", 550 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 551 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 552 | "dependencies": { 553 | "follow-redirects": "^1.14.8" 554 | } 555 | }, 556 | "node_modules/parseurl": { 557 | "version": "1.3.3", 558 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 559 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", 560 | "engines": { 561 | "node": ">= 0.8" 562 | } 563 | }, 564 | "node_modules/path-to-regexp": { 565 | "version": "0.1.7", 566 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 567 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 568 | }, 569 | "node_modules/peek-readable": { 570 | "version": "4.1.0", 571 | "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", 572 | "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", 573 | "engines": { 574 | "node": ">=8" 575 | }, 576 | "funding": { 577 | "type": "github", 578 | "url": "https://github.com/sponsors/Borewit" 579 | } 580 | }, 581 | "node_modules/proxy-addr": { 582 | "version": "2.0.7", 583 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 584 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 585 | "dependencies": { 586 | "forwarded": "0.2.0", 587 | "ipaddr.js": "1.9.1" 588 | }, 589 | "engines": { 590 | "node": ">= 0.10" 591 | } 592 | }, 593 | "node_modules/qs": { 594 | "version": "6.11.0", 595 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 596 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 597 | "dependencies": { 598 | "side-channel": "^1.0.4" 599 | }, 600 | "engines": { 601 | "node": ">=0.6" 602 | }, 603 | "funding": { 604 | "url": "https://github.com/sponsors/ljharb" 605 | } 606 | }, 607 | "node_modules/range-parser": { 608 | "version": "1.2.1", 609 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 610 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", 611 | "engines": { 612 | "node": ">= 0.6" 613 | } 614 | }, 615 | "node_modules/raw-body": { 616 | "version": "2.5.1", 617 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 618 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 619 | "dependencies": { 620 | "bytes": "3.1.2", 621 | "http-errors": "2.0.0", 622 | "iconv-lite": "0.4.24", 623 | "unpipe": "1.0.0" 624 | }, 625 | "engines": { 626 | "node": ">= 0.8" 627 | } 628 | }, 629 | "node_modules/readable-stream": { 630 | "version": "3.6.0", 631 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 632 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 633 | "dependencies": { 634 | "inherits": "^2.0.3", 635 | "string_decoder": "^1.1.1", 636 | "util-deprecate": "^1.0.1" 637 | }, 638 | "engines": { 639 | "node": ">= 6" 640 | } 641 | }, 642 | "node_modules/readable-web-to-node-stream": { 643 | "version": "3.0.2", 644 | "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", 645 | "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", 646 | "dependencies": { 647 | "readable-stream": "^3.6.0" 648 | }, 649 | "engines": { 650 | "node": ">=8" 651 | }, 652 | "funding": { 653 | "type": "github", 654 | "url": "https://github.com/sponsors/Borewit" 655 | } 656 | }, 657 | "node_modules/safe-buffer": { 658 | "version": "5.2.1", 659 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 660 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 661 | "funding": [ 662 | { 663 | "type": "github", 664 | "url": "https://github.com/sponsors/feross" 665 | }, 666 | { 667 | "type": "patreon", 668 | "url": "https://www.patreon.com/feross" 669 | }, 670 | { 671 | "type": "consulting", 672 | "url": "https://feross.org/support" 673 | } 674 | ] 675 | }, 676 | "node_modules/safer-buffer": { 677 | "version": "2.1.2", 678 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 679 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 680 | }, 681 | "node_modules/send": { 682 | "version": "0.18.0", 683 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 684 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 685 | "dependencies": { 686 | "debug": "2.6.9", 687 | "depd": "2.0.0", 688 | "destroy": "1.2.0", 689 | "encodeurl": "~1.0.2", 690 | "escape-html": "~1.0.3", 691 | "etag": "~1.8.1", 692 | "fresh": "0.5.2", 693 | "http-errors": "2.0.0", 694 | "mime": "1.6.0", 695 | "ms": "2.1.3", 696 | "on-finished": "2.4.1", 697 | "range-parser": "~1.2.1", 698 | "statuses": "2.0.1" 699 | }, 700 | "engines": { 701 | "node": ">= 0.8.0" 702 | } 703 | }, 704 | "node_modules/send/node_modules/ms": { 705 | "version": "2.1.3", 706 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 707 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 708 | }, 709 | "node_modules/serve-static": { 710 | "version": "1.15.0", 711 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 712 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 713 | "dependencies": { 714 | "encodeurl": "~1.0.2", 715 | "escape-html": "~1.0.3", 716 | "parseurl": "~1.3.3", 717 | "send": "0.18.0" 718 | }, 719 | "engines": { 720 | "node": ">= 0.8.0" 721 | } 722 | }, 723 | "node_modules/setprototypeof": { 724 | "version": "1.2.0", 725 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 726 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 727 | }, 728 | "node_modules/side-channel": { 729 | "version": "1.0.4", 730 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 731 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 732 | "dependencies": { 733 | "call-bind": "^1.0.0", 734 | "get-intrinsic": "^1.0.2", 735 | "object-inspect": "^1.9.0" 736 | }, 737 | "funding": { 738 | "url": "https://github.com/sponsors/ljharb" 739 | } 740 | }, 741 | "node_modules/statuses": { 742 | "version": "2.0.1", 743 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 744 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", 745 | "engines": { 746 | "node": ">= 0.8" 747 | } 748 | }, 749 | "node_modules/string_decoder": { 750 | "version": "1.3.0", 751 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 752 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 753 | "dependencies": { 754 | "safe-buffer": "~5.2.0" 755 | } 756 | }, 757 | "node_modules/strtok3": { 758 | "version": "6.3.0", 759 | "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", 760 | "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", 761 | "dependencies": { 762 | "@tokenizer/token": "^0.3.0", 763 | "peek-readable": "^4.1.0" 764 | }, 765 | "engines": { 766 | "node": ">=10" 767 | }, 768 | "funding": { 769 | "type": "github", 770 | "url": "https://github.com/sponsors/Borewit" 771 | } 772 | }, 773 | "node_modules/toidentifier": { 774 | "version": "1.0.1", 775 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 776 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", 777 | "engines": { 778 | "node": ">=0.6" 779 | } 780 | }, 781 | "node_modules/token-types": { 782 | "version": "4.2.1", 783 | "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", 784 | "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", 785 | "dependencies": { 786 | "@tokenizer/token": "^0.3.0", 787 | "ieee754": "^1.2.1" 788 | }, 789 | "engines": { 790 | "node": ">=10" 791 | }, 792 | "funding": { 793 | "type": "github", 794 | "url": "https://github.com/sponsors/Borewit" 795 | } 796 | }, 797 | "node_modules/type-is": { 798 | "version": "1.6.18", 799 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 800 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 801 | "dependencies": { 802 | "media-typer": "0.3.0", 803 | "mime-types": "~2.1.24" 804 | }, 805 | "engines": { 806 | "node": ">= 0.6" 807 | } 808 | }, 809 | "node_modules/unpipe": { 810 | "version": "1.0.0", 811 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 812 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", 813 | "engines": { 814 | "node": ">= 0.8" 815 | } 816 | }, 817 | "node_modules/util-deprecate": { 818 | "version": "1.0.2", 819 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 820 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 821 | }, 822 | "node_modules/utils-merge": { 823 | "version": "1.0.1", 824 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 825 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", 826 | "engines": { 827 | "node": ">= 0.4.0" 828 | } 829 | }, 830 | "node_modules/vary": { 831 | "version": "1.1.2", 832 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 833 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", 834 | "engines": { 835 | "node": ">= 0.8" 836 | } 837 | } 838 | }, 839 | "dependencies": { 840 | "@line/bot-sdk": { 841 | "version": "7.5.2", 842 | "resolved": "https://registry.npmjs.org/@line/bot-sdk/-/bot-sdk-7.5.2.tgz", 843 | "integrity": "sha512-mMaDnr+mOqQDLYJcUp+fQwZklg/LoOZzNILlWdsj2IFD2nXF+HhAm3KEy5tyUx629Y2bCx6nv9Jl0UlMwBiAiw==", 844 | "requires": { 845 | "@types/body-parser": "^1.19.2", 846 | "@types/node": "^16.0.0", 847 | "axios": "^0.27.0", 848 | "body-parser": "^1.20.0", 849 | "file-type": "^16.5.4", 850 | "form-data": "^4.0.0" 851 | } 852 | }, 853 | "@tokenizer/token": { 854 | "version": "0.3.0", 855 | "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", 856 | "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" 857 | }, 858 | "@types/body-parser": { 859 | "version": "1.19.2", 860 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", 861 | "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", 862 | "requires": { 863 | "@types/connect": "*", 864 | "@types/node": "*" 865 | } 866 | }, 867 | "@types/connect": { 868 | "version": "3.4.35", 869 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 870 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 871 | "requires": { 872 | "@types/node": "*" 873 | } 874 | }, 875 | "@types/node": { 876 | "version": "16.18.11", 877 | "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.11.tgz", 878 | "integrity": "sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==" 879 | }, 880 | "accepts": { 881 | "version": "1.3.8", 882 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 883 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 884 | "requires": { 885 | "mime-types": "~2.1.34", 886 | "negotiator": "0.6.3" 887 | } 888 | }, 889 | "array-flatten": { 890 | "version": "1.1.1", 891 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 892 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 893 | }, 894 | "asynckit": { 895 | "version": "0.4.0", 896 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 897 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 898 | }, 899 | "axios": { 900 | "version": "0.27.2", 901 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", 902 | "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==", 903 | "requires": { 904 | "follow-redirects": "^1.14.9", 905 | "form-data": "^4.0.0" 906 | } 907 | }, 908 | "body-parser": { 909 | "version": "1.20.1", 910 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", 911 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", 912 | "requires": { 913 | "bytes": "3.1.2", 914 | "content-type": "~1.0.4", 915 | "debug": "2.6.9", 916 | "depd": "2.0.0", 917 | "destroy": "1.2.0", 918 | "http-errors": "2.0.0", 919 | "iconv-lite": "0.4.24", 920 | "on-finished": "2.4.1", 921 | "qs": "6.11.0", 922 | "raw-body": "2.5.1", 923 | "type-is": "~1.6.18", 924 | "unpipe": "1.0.0" 925 | } 926 | }, 927 | "bytes": { 928 | "version": "3.1.2", 929 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 930 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 931 | }, 932 | "call-bind": { 933 | "version": "1.0.2", 934 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 935 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 936 | "requires": { 937 | "function-bind": "^1.1.1", 938 | "get-intrinsic": "^1.0.2" 939 | } 940 | }, 941 | "combined-stream": { 942 | "version": "1.0.8", 943 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 944 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 945 | "requires": { 946 | "delayed-stream": "~1.0.0" 947 | } 948 | }, 949 | "content-disposition": { 950 | "version": "0.5.4", 951 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 952 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 953 | "requires": { 954 | "safe-buffer": "5.2.1" 955 | } 956 | }, 957 | "content-type": { 958 | "version": "1.0.5", 959 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", 960 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" 961 | }, 962 | "cookie": { 963 | "version": "0.5.0", 964 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 965 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 966 | }, 967 | "cookie-signature": { 968 | "version": "1.0.6", 969 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 970 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 971 | }, 972 | "debug": { 973 | "version": "2.6.9", 974 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 975 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 976 | "requires": { 977 | "ms": "2.0.0" 978 | } 979 | }, 980 | "delayed-stream": { 981 | "version": "1.0.0", 982 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 983 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" 984 | }, 985 | "depd": { 986 | "version": "2.0.0", 987 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 988 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 989 | }, 990 | "destroy": { 991 | "version": "1.2.0", 992 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 993 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 994 | }, 995 | "ee-first": { 996 | "version": "1.1.1", 997 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 998 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 999 | }, 1000 | "encodeurl": { 1001 | "version": "1.0.2", 1002 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1003 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 1004 | }, 1005 | "escape-html": { 1006 | "version": "1.0.3", 1007 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 1008 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 1009 | }, 1010 | "etag": { 1011 | "version": "1.8.1", 1012 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1013 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 1014 | }, 1015 | "express": { 1016 | "version": "4.18.2", 1017 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", 1018 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", 1019 | "requires": { 1020 | "accepts": "~1.3.8", 1021 | "array-flatten": "1.1.1", 1022 | "body-parser": "1.20.1", 1023 | "content-disposition": "0.5.4", 1024 | "content-type": "~1.0.4", 1025 | "cookie": "0.5.0", 1026 | "cookie-signature": "1.0.6", 1027 | "debug": "2.6.9", 1028 | "depd": "2.0.0", 1029 | "encodeurl": "~1.0.2", 1030 | "escape-html": "~1.0.3", 1031 | "etag": "~1.8.1", 1032 | "finalhandler": "1.2.0", 1033 | "fresh": "0.5.2", 1034 | "http-errors": "2.0.0", 1035 | "merge-descriptors": "1.0.1", 1036 | "methods": "~1.1.2", 1037 | "on-finished": "2.4.1", 1038 | "parseurl": "~1.3.3", 1039 | "path-to-regexp": "0.1.7", 1040 | "proxy-addr": "~2.0.7", 1041 | "qs": "6.11.0", 1042 | "range-parser": "~1.2.1", 1043 | "safe-buffer": "5.2.1", 1044 | "send": "0.18.0", 1045 | "serve-static": "1.15.0", 1046 | "setprototypeof": "1.2.0", 1047 | "statuses": "2.0.1", 1048 | "type-is": "~1.6.18", 1049 | "utils-merge": "1.0.1", 1050 | "vary": "~1.1.2" 1051 | } 1052 | }, 1053 | "file-type": { 1054 | "version": "16.5.4", 1055 | "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", 1056 | "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", 1057 | "requires": { 1058 | "readable-web-to-node-stream": "^3.0.0", 1059 | "strtok3": "^6.2.4", 1060 | "token-types": "^4.1.1" 1061 | } 1062 | }, 1063 | "finalhandler": { 1064 | "version": "1.2.0", 1065 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 1066 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 1067 | "requires": { 1068 | "debug": "2.6.9", 1069 | "encodeurl": "~1.0.2", 1070 | "escape-html": "~1.0.3", 1071 | "on-finished": "2.4.1", 1072 | "parseurl": "~1.3.3", 1073 | "statuses": "2.0.1", 1074 | "unpipe": "~1.0.0" 1075 | } 1076 | }, 1077 | "follow-redirects": { 1078 | "version": "1.15.2", 1079 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", 1080 | "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" 1081 | }, 1082 | "form-data": { 1083 | "version": "4.0.0", 1084 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 1085 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 1086 | "requires": { 1087 | "asynckit": "^0.4.0", 1088 | "combined-stream": "^1.0.8", 1089 | "mime-types": "^2.1.12" 1090 | } 1091 | }, 1092 | "forwarded": { 1093 | "version": "0.2.0", 1094 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 1095 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 1096 | }, 1097 | "fresh": { 1098 | "version": "0.5.2", 1099 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1100 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 1101 | }, 1102 | "function-bind": { 1103 | "version": "1.1.1", 1104 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1105 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1106 | }, 1107 | "get-intrinsic": { 1108 | "version": "1.2.0", 1109 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", 1110 | "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", 1111 | "requires": { 1112 | "function-bind": "^1.1.1", 1113 | "has": "^1.0.3", 1114 | "has-symbols": "^1.0.3" 1115 | } 1116 | }, 1117 | "has": { 1118 | "version": "1.0.3", 1119 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1120 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1121 | "requires": { 1122 | "function-bind": "^1.1.1" 1123 | } 1124 | }, 1125 | "has-symbols": { 1126 | "version": "1.0.3", 1127 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1128 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 1129 | }, 1130 | "http-errors": { 1131 | "version": "2.0.0", 1132 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 1133 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 1134 | "requires": { 1135 | "depd": "2.0.0", 1136 | "inherits": "2.0.4", 1137 | "setprototypeof": "1.2.0", 1138 | "statuses": "2.0.1", 1139 | "toidentifier": "1.0.1" 1140 | } 1141 | }, 1142 | "iconv-lite": { 1143 | "version": "0.4.24", 1144 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1145 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1146 | "requires": { 1147 | "safer-buffer": ">= 2.1.2 < 3" 1148 | } 1149 | }, 1150 | "ieee754": { 1151 | "version": "1.2.1", 1152 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1153 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 1154 | }, 1155 | "inherits": { 1156 | "version": "2.0.4", 1157 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1158 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1159 | }, 1160 | "ipaddr.js": { 1161 | "version": "1.9.1", 1162 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1163 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1164 | }, 1165 | "media-typer": { 1166 | "version": "0.3.0", 1167 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1168 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 1169 | }, 1170 | "merge-descriptors": { 1171 | "version": "1.0.1", 1172 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1173 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1174 | }, 1175 | "methods": { 1176 | "version": "1.1.2", 1177 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1178 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 1179 | }, 1180 | "mime": { 1181 | "version": "1.6.0", 1182 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1183 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1184 | }, 1185 | "mime-db": { 1186 | "version": "1.52.0", 1187 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1188 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1189 | }, 1190 | "mime-types": { 1191 | "version": "2.1.35", 1192 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1193 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1194 | "requires": { 1195 | "mime-db": "1.52.0" 1196 | } 1197 | }, 1198 | "ms": { 1199 | "version": "2.0.0", 1200 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1201 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1202 | }, 1203 | "negotiator": { 1204 | "version": "0.6.3", 1205 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1206 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1207 | }, 1208 | "object-inspect": { 1209 | "version": "1.12.3", 1210 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 1211 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" 1212 | }, 1213 | "on-finished": { 1214 | "version": "2.4.1", 1215 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1216 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1217 | "requires": { 1218 | "ee-first": "1.1.1" 1219 | } 1220 | }, 1221 | "openai": { 1222 | "version": "3.1.0", 1223 | "resolved": "https://registry.npmjs.org/openai/-/openai-3.1.0.tgz", 1224 | "integrity": "sha512-v5kKFH5o+8ld+t0arudj833Mgm3GcgBnbyN9946bj6u7bvel4Yg6YFz2A4HLIYDzmMjIo0s6vSG9x73kOwvdCg==", 1225 | "requires": { 1226 | "axios": "^0.26.0", 1227 | "form-data": "^4.0.0" 1228 | }, 1229 | "dependencies": { 1230 | "axios": { 1231 | "version": "0.26.1", 1232 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 1233 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 1234 | "requires": { 1235 | "follow-redirects": "^1.14.8" 1236 | } 1237 | } 1238 | } 1239 | }, 1240 | "parseurl": { 1241 | "version": "1.3.3", 1242 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1243 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1244 | }, 1245 | "path-to-regexp": { 1246 | "version": "0.1.7", 1247 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1248 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1249 | }, 1250 | "peek-readable": { 1251 | "version": "4.1.0", 1252 | "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", 1253 | "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==" 1254 | }, 1255 | "proxy-addr": { 1256 | "version": "2.0.7", 1257 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1258 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1259 | "requires": { 1260 | "forwarded": "0.2.0", 1261 | "ipaddr.js": "1.9.1" 1262 | } 1263 | }, 1264 | "qs": { 1265 | "version": "6.11.0", 1266 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", 1267 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", 1268 | "requires": { 1269 | "side-channel": "^1.0.4" 1270 | } 1271 | }, 1272 | "range-parser": { 1273 | "version": "1.2.1", 1274 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1275 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1276 | }, 1277 | "raw-body": { 1278 | "version": "2.5.1", 1279 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1280 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1281 | "requires": { 1282 | "bytes": "3.1.2", 1283 | "http-errors": "2.0.0", 1284 | "iconv-lite": "0.4.24", 1285 | "unpipe": "1.0.0" 1286 | } 1287 | }, 1288 | "readable-stream": { 1289 | "version": "3.6.0", 1290 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1291 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1292 | "requires": { 1293 | "inherits": "^2.0.3", 1294 | "string_decoder": "^1.1.1", 1295 | "util-deprecate": "^1.0.1" 1296 | } 1297 | }, 1298 | "readable-web-to-node-stream": { 1299 | "version": "3.0.2", 1300 | "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", 1301 | "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", 1302 | "requires": { 1303 | "readable-stream": "^3.6.0" 1304 | } 1305 | }, 1306 | "safe-buffer": { 1307 | "version": "5.2.1", 1308 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1309 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1310 | }, 1311 | "safer-buffer": { 1312 | "version": "2.1.2", 1313 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1314 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1315 | }, 1316 | "send": { 1317 | "version": "0.18.0", 1318 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1319 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1320 | "requires": { 1321 | "debug": "2.6.9", 1322 | "depd": "2.0.0", 1323 | "destroy": "1.2.0", 1324 | "encodeurl": "~1.0.2", 1325 | "escape-html": "~1.0.3", 1326 | "etag": "~1.8.1", 1327 | "fresh": "0.5.2", 1328 | "http-errors": "2.0.0", 1329 | "mime": "1.6.0", 1330 | "ms": "2.1.3", 1331 | "on-finished": "2.4.1", 1332 | "range-parser": "~1.2.1", 1333 | "statuses": "2.0.1" 1334 | }, 1335 | "dependencies": { 1336 | "ms": { 1337 | "version": "2.1.3", 1338 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1339 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1340 | } 1341 | } 1342 | }, 1343 | "serve-static": { 1344 | "version": "1.15.0", 1345 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1346 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1347 | "requires": { 1348 | "encodeurl": "~1.0.2", 1349 | "escape-html": "~1.0.3", 1350 | "parseurl": "~1.3.3", 1351 | "send": "0.18.0" 1352 | } 1353 | }, 1354 | "setprototypeof": { 1355 | "version": "1.2.0", 1356 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1357 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1358 | }, 1359 | "side-channel": { 1360 | "version": "1.0.4", 1361 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1362 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1363 | "requires": { 1364 | "call-bind": "^1.0.0", 1365 | "get-intrinsic": "^1.0.2", 1366 | "object-inspect": "^1.9.0" 1367 | } 1368 | }, 1369 | "statuses": { 1370 | "version": "2.0.1", 1371 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1372 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 1373 | }, 1374 | "string_decoder": { 1375 | "version": "1.3.0", 1376 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1377 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1378 | "requires": { 1379 | "safe-buffer": "~5.2.0" 1380 | } 1381 | }, 1382 | "strtok3": { 1383 | "version": "6.3.0", 1384 | "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", 1385 | "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", 1386 | "requires": { 1387 | "@tokenizer/token": "^0.3.0", 1388 | "peek-readable": "^4.1.0" 1389 | } 1390 | }, 1391 | "toidentifier": { 1392 | "version": "1.0.1", 1393 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1394 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1395 | }, 1396 | "token-types": { 1397 | "version": "4.2.1", 1398 | "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", 1399 | "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", 1400 | "requires": { 1401 | "@tokenizer/token": "^0.3.0", 1402 | "ieee754": "^1.2.1" 1403 | } 1404 | }, 1405 | "type-is": { 1406 | "version": "1.6.18", 1407 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1408 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1409 | "requires": { 1410 | "media-typer": "0.3.0", 1411 | "mime-types": "~2.1.24" 1412 | } 1413 | }, 1414 | "unpipe": { 1415 | "version": "1.0.0", 1416 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1417 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1418 | }, 1419 | "util-deprecate": { 1420 | "version": "1.0.2", 1421 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1422 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" 1423 | }, 1424 | "utils-merge": { 1425 | "version": "1.0.1", 1426 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1427 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 1428 | }, 1429 | "vary": { 1430 | "version": "1.1.2", 1431 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1432 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 1433 | } 1434 | } 1435 | } 1436 | --------------------------------------------------------------------------------