From 095cfc0aab5698c5551acf8220e77a91f9417ec3 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Thu, 24 Aug 2023 17:47:03 +0800 Subject: [PATCH] doc: add new site for doc --- .gitignore | 4 +- docs/.vitepress/common.ts | 89 ++ docs/.vitepress/config.mts | 14 + docs/.vitepress/en.ts | 73 + docs/.vitepress/zh.ts | 83 ++ docs/api/overview.md | 69 + docs/api/packages/algorithm.md | 636 ++++++++ docs/api/packages/compare.md | 375 +++++ docs/en/api/overview.md | 70 + docs/en/api/packages/algorithm.md | 636 ++++++++ docs/en/api/packages/compare.md | 374 +++++ docs/en/guide/getting_started.md | 50 + docs/en/guide/introduction.md | 18 + docs/en/index.md | 36 + docs/guide/getting_started.md | 48 + docs/guide/introduction.md | 18 + docs/index.md | 45 + docs/lancet_logo.png | Bin 0 -> 18948 bytes docs/lancet_logo_mini.png | Bin 0 -> 9551 bytes docs/{ => olddocs}/algorithm.md | 0 docs/{ => olddocs}/algorithm_zh-CN.md | 0 docs/{ => olddocs}/compare.md | 0 docs/{ => olddocs}/compare_zh-CN.md | 0 docs/{ => olddocs}/concurrency.md | 0 docs/{ => olddocs}/concurrency_zh-CN.md | 0 docs/{ => olddocs}/condition.md | 0 docs/{ => olddocs}/condition_zh-CN.md | 0 docs/{ => olddocs}/convertor.md | 0 docs/{ => olddocs}/convertor_zh-CN.md | 0 docs/{ => olddocs}/cryptor.md | 0 docs/{ => olddocs}/cryptor_zh-CN.md | 0 .../datastructure/copyonwritelist.md | 0 .../datastructure/copyonwritelist_zh-CN.md | 0 docs/{ => olddocs}/datastructure/hashmap.md | 0 .../datastructure/hashmap_zh-CN.md | 0 docs/{ => olddocs}/datastructure/heap.md | 0 .../{ => olddocs}/datastructure/heap_zh-CN.md | 0 docs/{ => olddocs}/datastructure/link.md | 0 .../{ => olddocs}/datastructure/link_zh-CN.md | 0 docs/{ => olddocs}/datastructure/list.md | 0 .../{ => olddocs}/datastructure/list_zh-CN.md | 0 docs/{ => olddocs}/datastructure/queue.md | 0 .../datastructure/queue_zh-CN.md | 0 docs/{ => olddocs}/datastructure/set.md | 0 docs/{ => olddocs}/datastructure/set_zh-CN.md | 0 docs/{ => olddocs}/datastructure/stack.md | 0 .../datastructure/stack_zh-CN.md | 0 docs/{ => olddocs}/datastructure/tree.md | 0 .../{ => olddocs}/datastructure/tree_zh-CN.md | 0 docs/{ => olddocs}/datetime.md | 0 docs/{ => olddocs}/datetime_zh-CN.md | 0 docs/{ => olddocs}/fileutil.md | 0 docs/{ => olddocs}/fileutil_zh-CN.md | 0 docs/{ => olddocs}/formatter.md | 0 docs/{ => olddocs}/formatter_zh-CN.md | 0 docs/{ => olddocs}/function.md | 0 docs/{ => olddocs}/function_zh-CN.md | 0 docs/{ => olddocs}/maputil.md | 0 docs/{ => olddocs}/maputil_zh-CN.md | 0 docs/{ => olddocs}/mathutil.md | 0 docs/{ => olddocs}/mathutil_zh-CN.md | 0 docs/{ => olddocs}/netutil.md | 0 docs/{ => olddocs}/netutil_zh-CN.md | 0 docs/{ => olddocs}/pointer.md | 0 docs/{ => olddocs}/pointer_zh-CN.md | 0 docs/{ => olddocs}/random.md | 0 docs/{ => olddocs}/random_zh-CN.md | 0 docs/{ => olddocs}/retry.md | 0 docs/{ => olddocs}/retry_zh-CN.md | 0 docs/{ => olddocs}/slice.md | 0 docs/{ => olddocs}/slice_zh-CN.md | 0 docs/{ => olddocs}/stream.md | 0 docs/{ => olddocs}/stream_zh-CN.md | 0 docs/{ => olddocs}/structs/field.md | 0 docs/{ => olddocs}/structs/field_zh-CN.md | 0 docs/{ => olddocs}/structs/struct.md | 0 docs/{ => olddocs}/structs/struct_zh-CN.md | 0 docs/{ => olddocs}/strutil.md | 0 docs/{ => olddocs}/strutil_zh-CN.md | 0 docs/{ => olddocs}/system.md | 0 docs/{ => olddocs}/system_zh-CN.md | 0 docs/{ => olddocs}/tuple.md | 0 docs/{ => olddocs}/tuple_zh-CN.md | 0 docs/{ => olddocs}/validator.md | 0 docs/{ => olddocs}/validator_zh-CN.md | 0 docs/{ => olddocs}/xerror.md | 0 docs/{ => olddocs}/xerror_zh-CN.md | 0 docs/package-lock.json | 1277 +++++++++++++++++ docs/package.json | 13 + 89 files changed, 3927 insertions(+), 1 deletion(-) create mode 100644 docs/.vitepress/common.ts create mode 100644 docs/.vitepress/config.mts create mode 100644 docs/.vitepress/en.ts create mode 100644 docs/.vitepress/zh.ts create mode 100644 docs/api/overview.md create mode 100644 docs/api/packages/algorithm.md create mode 100644 docs/api/packages/compare.md create mode 100644 docs/en/api/overview.md create mode 100644 docs/en/api/packages/algorithm.md create mode 100644 docs/en/api/packages/compare.md create mode 100644 docs/en/guide/getting_started.md create mode 100644 docs/en/guide/introduction.md create mode 100644 docs/en/index.md create mode 100644 docs/guide/getting_started.md create mode 100644 docs/guide/introduction.md create mode 100644 docs/index.md create mode 100644 docs/lancet_logo.png create mode 100644 docs/lancet_logo_mini.png rename docs/{ => olddocs}/algorithm.md (100%) rename docs/{ => olddocs}/algorithm_zh-CN.md (100%) rename docs/{ => olddocs}/compare.md (100%) rename docs/{ => olddocs}/compare_zh-CN.md (100%) rename docs/{ => olddocs}/concurrency.md (100%) rename docs/{ => olddocs}/concurrency_zh-CN.md (100%) rename docs/{ => olddocs}/condition.md (100%) rename docs/{ => olddocs}/condition_zh-CN.md (100%) rename docs/{ => olddocs}/convertor.md (100%) rename docs/{ => olddocs}/convertor_zh-CN.md (100%) rename docs/{ => olddocs}/cryptor.md (100%) rename docs/{ => olddocs}/cryptor_zh-CN.md (100%) rename docs/{ => olddocs}/datastructure/copyonwritelist.md (100%) rename docs/{ => olddocs}/datastructure/copyonwritelist_zh-CN.md (100%) rename docs/{ => olddocs}/datastructure/hashmap.md (100%) rename docs/{ => olddocs}/datastructure/hashmap_zh-CN.md (100%) rename docs/{ => olddocs}/datastructure/heap.md (100%) rename docs/{ => olddocs}/datastructure/heap_zh-CN.md (100%) rename docs/{ => olddocs}/datastructure/link.md (100%) rename docs/{ => olddocs}/datastructure/link_zh-CN.md (100%) rename docs/{ => olddocs}/datastructure/list.md (100%) rename docs/{ => olddocs}/datastructure/list_zh-CN.md (100%) rename docs/{ => olddocs}/datastructure/queue.md (100%) rename docs/{ => olddocs}/datastructure/queue_zh-CN.md (100%) rename docs/{ => olddocs}/datastructure/set.md (100%) rename docs/{ => olddocs}/datastructure/set_zh-CN.md (100%) rename docs/{ => olddocs}/datastructure/stack.md (100%) rename docs/{ => olddocs}/datastructure/stack_zh-CN.md (100%) rename docs/{ => olddocs}/datastructure/tree.md (100%) rename docs/{ => olddocs}/datastructure/tree_zh-CN.md (100%) rename docs/{ => olddocs}/datetime.md (100%) rename docs/{ => olddocs}/datetime_zh-CN.md (100%) rename docs/{ => olddocs}/fileutil.md (100%) rename docs/{ => olddocs}/fileutil_zh-CN.md (100%) rename docs/{ => olddocs}/formatter.md (100%) rename docs/{ => olddocs}/formatter_zh-CN.md (100%) rename docs/{ => olddocs}/function.md (100%) rename docs/{ => olddocs}/function_zh-CN.md (100%) rename docs/{ => olddocs}/maputil.md (100%) rename docs/{ => olddocs}/maputil_zh-CN.md (100%) rename docs/{ => olddocs}/mathutil.md (100%) rename docs/{ => olddocs}/mathutil_zh-CN.md (100%) rename docs/{ => olddocs}/netutil.md (100%) rename docs/{ => olddocs}/netutil_zh-CN.md (100%) rename docs/{ => olddocs}/pointer.md (100%) rename docs/{ => olddocs}/pointer_zh-CN.md (100%) rename docs/{ => olddocs}/random.md (100%) rename docs/{ => olddocs}/random_zh-CN.md (100%) rename docs/{ => olddocs}/retry.md (100%) rename docs/{ => olddocs}/retry_zh-CN.md (100%) rename docs/{ => olddocs}/slice.md (100%) rename docs/{ => olddocs}/slice_zh-CN.md (100%) rename docs/{ => olddocs}/stream.md (100%) rename docs/{ => olddocs}/stream_zh-CN.md (100%) rename docs/{ => olddocs}/structs/field.md (100%) rename docs/{ => olddocs}/structs/field_zh-CN.md (100%) rename docs/{ => olddocs}/structs/struct.md (100%) rename docs/{ => olddocs}/structs/struct_zh-CN.md (100%) rename docs/{ => olddocs}/strutil.md (100%) rename docs/{ => olddocs}/strutil_zh-CN.md (100%) rename docs/{ => olddocs}/system.md (100%) rename docs/{ => olddocs}/system_zh-CN.md (100%) rename docs/{ => olddocs}/tuple.md (100%) rename docs/{ => olddocs}/tuple_zh-CN.md (100%) rename docs/{ => olddocs}/validator.md (100%) rename docs/{ => olddocs}/validator_zh-CN.md (100%) rename docs/{ => olddocs}/xerror.md (100%) rename docs/{ => olddocs}/xerror_zh-CN.md (100%) create mode 100644 docs/package-lock.json create mode 100644 docs/package.json diff --git a/.gitignore b/.gitignore index 246bdb6..c98433c 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,6 @@ fileutil/unzip/* fileutil/tempdir/* slice/testdata/* cryptor/*.pem -test \ No newline at end of file +test +docs/node_modules +docs/.vitepress/cache \ No newline at end of file diff --git a/docs/.vitepress/common.ts b/docs/.vitepress/common.ts new file mode 100644 index 0000000..8e5e9e8 --- /dev/null +++ b/docs/.vitepress/common.ts @@ -0,0 +1,89 @@ +import { defineConfig, HeadConfig } from 'vitepress' + +export const META_IMAGE = '/lancet_logo.png' +export const isProduction = process.env.NETLIFY && process.env.CONTEXT === 'production' + +if (process.env.NETLIFY) { + console.log('Netlify build', process.env.CONTEXT) +} + +const productionHead: HeadConfig[] = [ + [ + 'script', + { + src: 'https://unpkg.com/thesemetrics@latest', + async: '', + type: 'text/javascript', + }, + ], +] + +const rControl = /[\u0000-\u001f]/g +const rSpecial = /[\s~`!@#$%^&*()\-_+=[\]{}|\\;:"'“”‘’<>,.?/]+/g +const rCombining = /[\u0300-\u036F]/g + +/** + * Default slugification function + */ +export const slugify = (str: string): string => + str + .normalize('NFKD') + // Remove accents + .replace(rCombining, '') + // Remove control characters + .replace(rControl, '') + // Replace special characters + .replace(rSpecial, '-') + // ensure it doesn't start with a number + .replace(/^(\d)/, '_$1') + +export const commonConfig = defineConfig({ + title: 'Lancet', + appearance: 'dark', + + markdown: { + theme: { + dark: 'dracula-soft', + light: 'vitesse-light', + }, + + attrs: { + leftDelimiter: '%{', + rightDelimiter: '}%', + }, + + anchor: { + slugify, + }, + }, + + head: [ + // ['link', { rel: 'icon', type: 'image/svg+xml', href: '/logo.svg' }], + ['link', { rel: 'icon', type: 'image/png', href: '/lancet_logo_mini.png' }], + ['meta', { name: 'theme-color', content: '#5f67ee' }], + ['meta', { name: 'og:type', content: 'website' }], + ['meta', { name: 'og:locale', content: 'zh' }], + + ...(isProduction ? productionHead : []), + ], + + themeConfig: { + logo: { src: '/lancet_logo_mini.png', width: 24, height: 24 }, + outline: [2, 3], + + search: { + provider: 'local', + }, + socialLinks: [ + { + icon: 'github', + link: 'https://github.com/duke-git/lancet', + }, + ], + + footer: { + copyright: 'Copyright © 2023-present Duke Du', + message: 'Released under the MIT License.', + }, + }, +}) diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts new file mode 100644 index 0000000..aad6c3d --- /dev/null +++ b/docs/.vitepress/config.mts @@ -0,0 +1,14 @@ +import { defineConfig } from 'vitepress' +import { commonConfig } from './common' +import { zhConfig } from './zh' +import { enConfig } from './en' + +// https://vitepress.dev/reference/site-config +export default defineConfig({ + ...commonConfig, + + locales: { + root: { label: '简体中文', lang: 'zh-CN', link: '/', ...zhConfig }, + en: { label: 'English', lang: 'en-US', link: '/en/', ...enConfig }, + }, +}) diff --git a/docs/.vitepress/en.ts b/docs/.vitepress/en.ts new file mode 100644 index 0000000..d5c1b1b --- /dev/null +++ b/docs/.vitepress/en.ts @@ -0,0 +1,73 @@ +import type { DefaultTheme, LocaleSpecificConfig } from 'vitepress' + +export const META_URL = 'https://lancet.go.dev' +export const META_TITLE = 'Lancet' +export const META_DESCRIPTION = 'A powerful util function library of Go' + +export const enConfig: LocaleSpecificConfig = { + description: META_DESCRIPTION, + + head: [ + ['meta', { property: 'og:url', content: META_URL }], + ['meta', { property: 'og:description', content: META_DESCRIPTION }], + ['meta', { property: 'twitter:url', content: META_URL }], + ['meta', { property: 'twitter:title', content: META_TITLE }], + ['meta', { property: 'twitter:description', content: META_DESCRIPTION }], + ], + + themeConfig: { + nav: [ + { + text: 'Home', + link: '/en/', + activeMatch: '^/en/', + }, + { + text: 'Guide', + link: '/en/guide/introduction', + activeMatch: '^/en/guide/', + }, + { text: 'API', link: '/en/api/overview', activeMatch: '^/en/api/' }, + { + text: 'Links', + items: [ + { + text: 'Releaselog', + link: 'https://github.com/duke-git/lancet/releases', + }, + ], + }, + ], + + sidebar: { + '/en/': [ + { + text: 'Introduction', + items: [ + { + text: 'What is Lancet?', + link: '/en/guide/introduction', + }, + { + text: 'getting started', + link: '/en/guide/getting_started', + }, + ], + }, + ], + '/en/api/': [ + { + text: 'overview', + items: [{ text: 'overview of API', link: '/en/api/overview' }], + }, + { + text: 'packages', + items: [ + { text: 'algorithm', link: '/en/api/packages/algorithm' }, + { text: 'compare', link: '/en/api/packages/compare' }, + ], + }, + ], + }, + }, +} diff --git a/docs/.vitepress/zh.ts b/docs/.vitepress/zh.ts new file mode 100644 index 0000000..f740d4d --- /dev/null +++ b/docs/.vitepress/zh.ts @@ -0,0 +1,83 @@ +import type { DefaultTheme, LocaleSpecificConfig } from 'vitepress' + +export const META_URL = 'https://lancet.go.dev' +export const META_TITLE = 'Lancet' +export const META_DESCRIPTION = '一个强大的Go语言工具函数库' + +export const zhConfig: LocaleSpecificConfig = { + description: META_DESCRIPTION, + + head: [ + ['meta', { property: 'og:url', content: META_URL }], + ['meta', { property: 'og:description', content: META_DESCRIPTION }], + ['meta', { property: 'twitter:url', content: META_URL }], + ['meta', { property: 'twitter:title', content: META_TITLE }], + ['meta', { property: 'twitter:description', content: META_DESCRIPTION }], + ], + + themeConfig: { + outline: { + label: '本页内容', + }, + + docFooter: { + prev: '上一页', + next: '下一页', + }, + + nav: [ + { + text: '首页', + link: '/', + activeMatch: '^/', + }, + { + text: '指南', + link: '/guide/introduction', + activeMatch: '^/guide/', + }, + { text: 'API', link: '/api/overview', activeMatch: '^/api/' }, + { + text: '相关链接', + items: [ + { + text: '更新日志', + link: 'https://github.com/duke-git/lancet/releases', + }, + ], + }, + ], + + sidebar: { + '/': [ + { + text: '介绍', + items: [ + { + text: 'Lancet是什么?', + link: '/guide/introduction', + }, + { + text: '开始', + link: '/guide/getting_started', + }, + ], + }, + ], + + '/api/': [ + { + text: '概览', + items: [{ text: 'API概述', link: '/api/overview' }], + }, + { + text: 'API文档', + items: [ + { text: '算法', link: '/api/packages/algorithm' }, + { text: '比较器', link: '/api/packages/compare' }, + ], + }, + ], + }, + }, +} diff --git a/docs/api/overview.md b/docs/api/overview.md new file mode 100644 index 0000000..0ee0c0b --- /dev/null +++ b/docs/api/overview.md @@ -0,0 +1,69 @@ +--- +outline: deep +--- + +# API概述 + +lancet(柳叶刀)是一个强大、全面、高效、可复用的go语言工具函数库。包含25个包,超过600个工具函数。功能涵盖字符串处理、切片处理、网络、并发、加解密、文件处理、时间/日期、流处理、迭代器等等。 + + + + +
+

lancet功能模块

+
+
algorithm
+
compare
+
concurrency
+
condition
+
convertor
+
cryptor
+
datastructure
+
datetime
+
fileutil
+
formatter
+
function
+
iterator
+
maputil
+
mathutil
+
netutil
+
pointer
+
random
+
retry
+
slice
+
stream
+
structs
+
strutil
+
system
+
tuple
+
validator
+
xerror
+
+
\ No newline at end of file diff --git a/docs/api/packages/algorithm.md b/docs/api/packages/algorithm.md new file mode 100644 index 0000000..3f3b7de --- /dev/null +++ b/docs/api/packages/algorithm.md @@ -0,0 +1,636 @@ +# Algorithm + +algorithm 算法包实现一些基本算法,sort,search,lrucache。 + +
+ +## 源码 + +- [https://github.com/duke-git/lancet/blob/main/algorithm/sort.go](https://github.com/duke-git/lancet/blob/main/algorithm/sort.go) +- [https://github.com/duke-git/lancet/blob/main/algorithm/search.go](https://github.com/duke-git/lancet/blob/main/algorithm/search.go) +- [https://github.com/duke-git/lancet/blob/main/algorithm/lru_cache.go](https://github.com/duke-git/lancet/blob/main/algorithm/lru_cache.go) + +
+ +## 用法 + +```go +import ( + "github.com/duke-git/lancet/v2/algorithm" +) +``` + +
+ +## 目录 + +- [BubbleSort](#BubbleSort) +- [InsertionSort](#InsertionSort) +- [SelectionSort](#SelectionSort) +- [ShellSort](#ShellSort) +- [QuickSort](#QuickSort) +- [HeapSort](#HeapSort) +- [MergeSort](#MergeSort) +- [CountSort](#CountSort) +- [BinarySearch](#BinarySearch) +- [BinaryIterativeSearch](#BinaryIterativeSearch) +- [LinearSearch](#LinearSearch) +- [LRUCache](#LRUCache) + +
+ +## 文档 + +### BubbleSort + +

冒泡排序,参数comparator需要实现包lancetconstraints.Comparator。

+ +函数签名: + +```go +func BubbleSort[T any](slice []T, comparator lancetconstraints.Comparator) +``` + +示例:[运行](https://go.dev/play/p/GNdv7Jg2Taj) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{2, 1, 5, 3, 6, 4} + comparator := &intComparator{} + + algorithm.BubbleSort(numbers, comparator) + + fmt.Println(numbers) + + // Output: + // [1 2 3 4 5 6] +} +``` + +### InsertionSort + +

插入排序,参数comparator需要实现包lancetconstraints.Comparator。

+ +函数签名: + +```go +func InsertionSort[T any](slice []T, comparator lancetconstraints.Comparator) +``` + +示例:[运行](https://go.dev/play/p/G5LJiWgJJW6) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type people struct { + Name string + Age int +} + +// PeopleAageComparator sort people slice by age field +type peopleAgeComparator struct{} + +// Compare implements github.com/duke-git/lancet/lancetconstraints/constraints.go/Comparator +func (pc *peopleAgeComparator) Compare(v1 any, v2 any) int { + p1, _ := v1.(people) + p2, _ := v2.(people) + + //ascending order + if p1.Age < p2.Age { + return -1 + } else if p1.Age > p2.Age { + return 1 + } + + return 0 +} + +func main() { + peoples := []people{ + {Name: "a", Age: 20}, + {Name: "b", Age: 10}, + {Name: "c", Age: 17}, + {Name: "d", Age: 8}, + {Name: "e", Age: 28}, + } + + comparator := &peopleAgeComparator{} + + algorithm.InsertionSort(peoples, comparator) + + fmt.Println(peoples) + + // Output: + // [{d 8} {b 10} {c 17} {a 20} {e 28}] +} +``` + +### SelectionSort + +

选择排序,参数comparator需要实现包lancetconstraints.Comparator。

+ +函数签名: + +```go +func SelectionSort[T any](slice []T, comparator lancetconstraints.Comparator) +``` + +示例:[运行](https://go.dev/play/p/oXovbkekayS) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{2, 1, 5, 3, 6, 4} + comparator := &intComparator{} + + algorithm.SelectionSort(numbers, comparator) + + fmt.Println(numbers) + + // Output: + // [1 2 3 4 5 6] +} +``` + +### ShellSort + +

希尔排序,参数comparator需要实现包lancetconstraints.Comparator。

+ +函数签名: + +```go +func ShellSort[T any](slice []T, comparator lancetconstraints.Comparator) +``` + +示例:[运行](https://go.dev/play/p/3ibkszpJEu3) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{2, 1, 5, 3, 6, 4} + comparator := &intComparator{} + + algorithm.ShellSort(numbers, comparator) + + fmt.Println(numbers) + + // Output: + // [1 2 3 4 5 6] +} +``` + +### QuickSort + +

快速排序,参数comparator需要实现包lancetconstraints.Comparator。

+ +函数签名: + +```go +func QuickSort[T any](slice []T comparator lancetconstraints.Comparator) +``` + +示例:[运行](https://go.dev/play/p/7Y7c1Elk3ax) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{2, 1, 5, 3, 6, 4} + comparator := &intComparator{} + + algorithm.QuickSort(numbers, comparator) + + fmt.Println(numbers) + + // Output: + // [1 2 3 4 5 6] +} +``` + +### HeapSort + +

堆排序,参数comparator需要实现包lancetconstraints.Comparator。

+ +函数签名: + +```go +func HeapSort[T any](slice []T, comparator lancetconstraints.Comparator) +``` + +示例:[运行](https://go.dev/play/p/u6Iwa1VZS_f) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{2, 1, 5, 3, 6, 4} + comparator := &intComparator{} + + algorithm.HeapSort(numbers, comparator) + + fmt.Println(numbers) + + // Output: + // [1 2 3 4 5 6] +} +``` + +### MergeSort + +

归并排序,参数comparator需要实现包lancetconstraints.Comparator。

+ +函数签名: + +```go +func MergeSort[T any](slice []T, comparator lancetconstraints.Comparator) +``` + +示例:[运行](https://go.dev/play/p/ydinn9YzUJn) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{2, 1, 5, 3, 6, 4} + comparator := &intComparator{} + + algorithm.MergeSort(numbers, comparator) + + fmt.Println(numbers) + + // Output: + // [1 2 3 4 5 6] +} +``` + +### CountSort + +

计数排序,参数comparator需要实现包lancetconstraints.Comparator。

+ +函数签名: + +```go +func CountSort[T any](slice []T, comparator lancetconstraints.Comparator) []T +``` + +示例:[运行](https://go.dev/play/p/tB-Umgm0DrP) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{2, 1, 5, 3, 6, 4} + comparator := &intComparator{} + + sortedNums := algorithm.CountSort(numbers, comparator) + + fmt.Println(sortedNums) + + // Output: + // [1 2 3 4 5 6] +} +``` + +### BinarySearch + +

二分递归查找,返回元素索引,未找到元素返回-1,参数comparator需要实现包lancetconstraints.Comparator。

+ +函数签名: + +```go +func BinarySearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int +``` + +示例: [运行](https://go.dev/play/p/t6MeGiUSN47) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{1, 2, 3, 4, 5, 6, 7, 8} + comparator := &intComparator{} + + result1 := algorithm.BinarySearch(numbers, 5, 0, len(numbers)-1, comparator) + result2 := algorithm.BinarySearch(numbers, 9, 0, len(numbers)-1, comparator) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 4 + // -1 +} +``` + +### BinaryIterativeSearch + +

二分迭代查找,返回元素索引,未找到元素返回-1,参数comparator需要实现包lancetconstraints.Comparator。

+ +函数签名: + +```go +func BinaryIterativeSearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int +``` + +示例: [运行](https://go.dev/play/p/Anozfr8ZLH3) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{1, 2, 3, 4, 5, 6, 7, 8} + comparator := &intComparator{} + + result1 := algorithm.BinaryIterativeSearch(numbers, 5, 0, len(numbers)-1, comparator) + result2 := algorithm.BinaryIterativeSearch(numbers, 9, 0, len(numbers)-1, comparator) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 4 + // -1 +} +``` + +### LinearSearch + +

基于传入的相等函数线性查找元素,返回元素索引,未找到元素返回-1。

+ +函数签名: + +```go +func LinearSearch[T any](slice []T, target T, equal func(a, b T) bool) int +``` + +示例: [运行](https://go.dev/play/p/IsS7rgn5s3x) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +func main() { + numbers := []int{3, 4, 5, 3, 2, 1} + + equalFunc := func(a, b int) bool { + return a == b + } + + result1 := algorithm.LinearSearch(numbers, 3, equalFunc) + result2 := algorithm.LinearSearch(numbers, 6, equalFunc) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 0 + // -1 +} +``` + +### LRUCache + +

lru算法实现缓存。

+ +函数签名: + +```go +func NewLRUCache[K comparable, V any](capacity int) *LRUCache[K, V] +func (l *LRUCache[K, V]) Get(key K) (V, bool) +func (l *LRUCache[K, V]) Put(key K, value V) +func (l *LRUCache[K, V]) Delete(key K) bool +func (l *LRUCache[K, V]) Len() int +``` + +示例:[运行](https://go.dev/play/p/-EZjgOURufP) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +func main() { + cache := algorithm.NewLRUCache[int, int](2) + + cache.Put(1, 1) + cache.Put(2, 2) + + result1, ok1 := cache.Get(1) + result2, ok2 := cache.Get(2) + result3, ok3 := cache.Get(3) + + fmt.Println(result1, ok1) + fmt.Println(result2, ok2) + fmt.Println(result3, ok3) + + fmt.Println(cache.Len()) + + ok := cache.Delete(2) + fmt.Println(ok) + + + // Output: + // 1 true + // 2 true + // 0 false + // 2 + // true +} +``` diff --git a/docs/api/packages/compare.md b/docs/api/packages/compare.md new file mode 100644 index 0000000..aa15604 --- /dev/null +++ b/docs/api/packages/compare.md @@ -0,0 +1,375 @@ +# Compare + +compare包提供几个轻量级的类型比较函数。 + +
+ +## 源码: + +- [https://github.com/duke-git/lancet/blob/main/compare/compare.go](https://github.com/duke-git/lancet/blob/main/compare/compare.go) + +- [https://github.com/duke-git/lancet/blob/main/compare/compare_internal.go](https://github.com/duke-git/lancet/blob/main/compare/compare_internal.go) + +
+ +## 用法: + +```go +import ( + "github.com/duke-git/lancet/v2/condition" +) +``` + +
+ +## 目录 + +- [Equal](#Equal) +- [EqualValue](#EqualValue) +- [LessThan](#LessThan) +- [GreaterThan](#GreaterThan) +- [LessOrEqual](#LessOrEqual) +- [GreaterOrEqual](#GreaterOrEqual) +- [InDelta](#InDelta) + + +
+ +## 文档 + +### Equal + +

检查两个值是否相等(检查类型和值)

+ +函数签名: + +```go +func Equal(left, right any) bool +``` + +示例: [运行](https://go.dev/play/p/wmVxR-to4lz) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := compare.Equal(1, 1) + result2 := compare.Equal("1", "1") + result3 := compare.Equal([]int{1, 2, 3}, []int{1, 2, 3}) + result4 := compare.Equal(map[int]string{1: "a", 2: "b"}, map[int]string{1: "a", 2: "b"}) + + result5 := compare.Equal(1, "1") + result6 := compare.Equal(1, int64(1)) + result7 := compare.Equal([]int{1, 2}, []int{1, 2, 3}) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + fmt.Println(result7) + + // Output: + // true + // true + // true + // true + // false + // false + // false +} +``` + +### EqualValue + +

检查两个值是否相等(只检查值)

+ +函数签名: + +```go +func EqualValue(left, right any) bool +``` + +示例: [运行](https://go.dev/play/p/fxnna_LLD9u) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := compare.EqualValue(1, 1) + result2 := compare.EqualValue(int(1), int64(1)) + result3 := compare.EqualValue(1, "1") + result4 := compare.EqualValue(1, "2") + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + + // Output: + // true + // true + // true + // false +} +``` + +### LessThan + +

验证参数`left`的值是否小于参数`right`的值。

+ +函数签名: + +```go +func LessThan(left, right any) bool +``` + +示例: [运行](https://go.dev/play/p/cYh7FQQj0ne) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := compare.LessThan(1, 2) + result2 := compare.LessThan(1.1, 2.2) + result3 := compare.LessThan("a", "b") + + time1 := time.Now() + time2 := time1.Add(time.Second) + result4 := compare.LessThan(time1, time2) + + result5 := compare.LessThan(2, 1) + result6 := compare.LessThan(1, int64(2)) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + + // Output: + // true + // true + // true + // true + // false + // false +} +``` + +### GreaterThan + +

验证参数`left`的值是否大于参数`right`的值。

+ +函数签名: + +```go +func GreaterThan(left, right any) bool +``` + +示例: [运行](https://go.dev/play/p/9-NYDFZmIMp) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := compare.GreaterThan(2, 1) + result2 := compare.GreaterThan(2.2, 1.1) + result3 := compare.GreaterThan("b", "a") + + time1 := time.Now() + time2 := time1.Add(time.Second) + result4 := compare.GreaterThan(time2, time1) + + result5 := compare.GreaterThan(1, 2) + result6 := compare.GreaterThan(int64(2), 1) + result7 := compare.GreaterThan("b", "c") + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + fmt.Println(result7) + + // Output: + // true + // true + // true + // true + // false + // false + // false +} +``` + +### LessOrEqual + +

验证参数`left`的值是否小于或等于参数`right`的值。

+ +函数签名: + +```go +func LessOrEqual(left, right any) bool +``` + +示例: [运行](https://go.dev/play/p/e4T_scwoQzp) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := compare.LessOrEqual(1, 1) + result2 := compare.LessOrEqual(1.1, 2.2) + result3 := compare.LessOrEqual("a", "b") + + time1 := time.Now() + time2 := time1.Add(time.Second) + result4 := compare.LessOrEqual(time1, time2) + + result5 := compare.LessOrEqual(2, 1) + result6 := compare.LessOrEqual(1, int64(2)) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + + // Output: + // true + // true + // true + // true + // false + // false +} +``` + +### GreaterOrEqual + +

验证参数`left`的值是否大于或参数`right`的值。

+ +函数签名: + +```go +func GreaterOrEqual(left, right any) bool +``` + +示例: [运行](https://go.dev/play/p/vx8mP0U8DFk) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := compare.GreaterOrEqual(1, 1) + result2 := compare.GreaterOrEqual(2.2, 1.1) + result3 := compare.GreaterOrEqual("b", "b") + + time1 := time.Now() + time2 := time1.Add(time.Second) + result4 := compare.GreaterOrEqual(time2, time1) + + result5 := compare.GreaterOrEqual(1, 2) + result6 := compare.GreaterOrEqual(int64(2), 1) + result7 := compare.GreaterOrEqual("b", "c") + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + fmt.Println(result7) + + // Output: + // true + // true + // true + // true + // false + // false + // false +} +``` + +### InDelta + +

检查增量内两个值是否相等。

+ +函数签名: + +```go +func InDelta[T constraints.Integer | constraints.Float](left, right T, delta float64) bool +``` + +示例: [运行](https://go.dev/play/p/TuDdcNtMkjo) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := InDelta(1, 1, 0) + result2 := InDelta(1, 2, 0) + + result3 := InDelta(2.0/3.0, 0.66667, 0.001) + result4 := InDelta(2.0/3.0, 0.0, 0.001) + + result5 := InDelta(float64(74.96)-float64(20.48), 54.48, 0) + result6 := InDelta(float64(74.96)-float64(20.48), 54.48, 1e-14) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + + // Output: + // true + // false + // true + // false + // false + // true +} +``` diff --git a/docs/en/api/overview.md b/docs/en/api/overview.md new file mode 100644 index 0000000..782f777 --- /dev/null +++ b/docs/en/api/overview.md @@ -0,0 +1,70 @@ +--- +outline: deep +--- + +# API Overview + +Lancet (Lancet) is a powerful, comprehensive, efficient and reusable go language tool function library. Contains 25 packages, more than 600 utility functions. Functions cover string processing, slice processing, network, concurrency, encryption and decryption, file processing, time/date, stream processing, iterators, and more. + + + + +
+

lancet function module

+
+
algorithm
+
compare
+
concurrency
+
condition
+
convertor
+
cryptor
+
datastructure
+
datetime
+
fileutil
+
formatter
+
function
+
iterator
+
maputil
+
mathutil
+
netutil
+
pointer
+
random
+
retry
+
slice
+
stream
+
structs
+
strutil
+
system
+
tuple
+
validator
+
xerror
+
+
+ diff --git a/docs/en/api/packages/algorithm.md b/docs/en/api/packages/algorithm.md new file mode 100644 index 0000000..0a6437b --- /dev/null +++ b/docs/en/api/packages/algorithm.md @@ -0,0 +1,636 @@ +# Algorithm + +Package algorithm implements some basic algorithm. eg. sort, search. + +
+ +## Source + +- [https://github.com/duke-git/lancet/blob/main/algorithm/sort.go](https://github.com/duke-git/lancet/blob/main/algorithm/sort.go) +- [https://github.com/duke-git/lancet/blob/main/algorithm/search.go](https://github.com/duke-git/lancet/blob/main/algorithm/search.go) +- [https://github.com/duke-git/lancet/blob/main/algorithm/lru_cache.go](https://github.com/duke-git/lancet/blob/main/algorithm/lru_cache.go) + +
+ +## Usage + +```go +import ( + "github.com/duke-git/lancet/v2/algorithm" +) +``` + +
+ +## Index + +- [BubbleSort](#BubbleSort) +- [InsertionSort](#InsertionSort) +- [SelectionSort](#SelectionSort) +- [ShellSort](#ShellSort) +- [QuickSort](#QuickSort) +- [HeapSort](#HeapSort) +- [MergeSort](#MergeSort) +- [CountSort](#CountSort) +- [BinarySearch](#BinarySearch) +- [BinaryIterativeSearch](#BinaryIterativeSearch) +- [LinearSearch](#LinearSearch) +- [LRUCache](#LRUCache) + +
+ +## Documentation + +### BubbleSort + +

Sort slice with bubble sort algorithm. Param comparator should implements lancetconstraints.Comparator.

+ +Signature: + +```go +func BubbleSort[T any](slice []T, comparator lancetconstraints.Comparator) +``` + +Example: [Run](https://go.dev/play/p/GNdv7Jg2Taj) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{2, 1, 5, 3, 6, 4} + comparator := &intComparator{} + + algorithm.BubbleSort(numbers, comparator) + + fmt.Println(numbers) + + // Output: + // [1 2 3 4 5 6] +} +``` + +### InsertionSort + +

Sort slice with insertion sort algorithm. Param comparator should implements lancetconstraints.Comparator.

+ +Signature: + +```go +func InsertionSort[T any](slice []T, comparator lancetconstraints.Comparator) +``` + +Example: [Run](https://go.dev/play/p/G5LJiWgJJW6) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type people struct { + Name string + Age int +} + +// PeopleAageComparator sort people slice by age field +type peopleAgeComparator struct{} + +// Compare implements github.com/duke-git/lancet/lancetconstraints/constraints.go/Comparator +func (pc *peopleAgeComparator) Compare(v1 any, v2 any) int { + p1, _ := v1.(people) + p2, _ := v2.(people) + + //ascending order + if p1.Age < p2.Age { + return -1 + } else if p1.Age > p2.Age { + return 1 + } + + return 0 +} + +func main() { + peoples := []people{ + {Name: "a", Age: 20}, + {Name: "b", Age: 10}, + {Name: "c", Age: 17}, + {Name: "d", Age: 8}, + {Name: "e", Age: 28}, + } + + comparator := &peopleAgeComparator{} + + algorithm.InsertionSort(peoples, comparator) + + fmt.Println(peoples) + + // Output: + // [{d 8} {b 10} {c 17} {a 20} {e 28}] +} +``` + +### SelectionSort + +

Sort slice with selection sort algorithm. Param comparator should implements lancetconstraints.Comparator.

+ +Signature: + +```go +func SelectionSort[T any](slice []T, comparator lancetconstraints.Comparator) +``` + +Example: [Run](https://go.dev/play/p/oXovbkekayS) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{2, 1, 5, 3, 6, 4} + comparator := &intComparator{} + + algorithm.SelectionSort(numbers, comparator) + + fmt.Println(numbers) + + // Output: + // [1 2 3 4 5 6] +} +``` + +### ShellSort + +

Sort slice with shell sort algorithm. Param comparator should implements lancetconstraints.Comparator.

+ +Signature: + +```go +func ShellSort[T any](slice []T, comparator lancetconstraints.Comparator) +``` + +Example: [Run](https://go.dev/play/p/3ibkszpJEu3) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{2, 1, 5, 3, 6, 4} + comparator := &intComparator{} + + algorithm.ShellSort(numbers, comparator) + + fmt.Println(numbers) + + // Output: + // [1 2 3 4 5 6] +} +``` + +### QuickSort + +

Sort slice with quick sort algorithm. Param comparator should implements lancetconstraints.Comparator.

+ +Signature: + +```go +func QuickSort[T any](slice []T comparator lancetconstraints.Comparator) +``` + +Example:[Run](https://go.dev/play/p/7Y7c1Elk3ax) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{2, 1, 5, 3, 6, 4} + comparator := &intComparator{} + + algorithm.QuickSort(numbers, comparator) + + fmt.Println(numbers) + + // Output: + // [1 2 3 4 5 6] +} +``` + +### HeapSort + +

Sort slice with heap sort algorithm. Param comparator should implements lancetconstraints.Comparator.

+ +Signature: + +```go +func HeapSort[T any](slice []T, comparator lancetconstraints.Comparator) +``` + +Example: [Run](https://go.dev/play/p/u6Iwa1VZS_f) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{2, 1, 5, 3, 6, 4} + comparator := &intComparator{} + + algorithm.HeapSort(numbers, comparator) + + fmt.Println(numbers) + + // Output: + // [1 2 3 4 5 6] +} +``` + +### MergeSort + +

Sort slice with merge sort algorithm. Param comparator should implements lancetconstraints.Comparator.

+ +Signature: + +```go +func MergeSort[T any](slice []T, comparator lancetconstraints.Comparator) +``` + +Example: [Run](https://go.dev/play/p/ydinn9YzUJn) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{2, 1, 5, 3, 6, 4} + comparator := &intComparator{} + + algorithm.MergeSort(numbers, comparator) + + fmt.Println(numbers) + + // Output: + // [1 2 3 4 5 6] +} +``` + +### CountSort + +

Sort slice with count sort algorithm. Param comparator should implements lancetconstraints.Comparator.

+ +Signature: + +```go +func CountSort[T any](slice []T, comparator lancetconstraints.Comparator) []T +``` + +Example: [Run](https://go.dev/play/p/tB-Umgm0DrP) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{2, 1, 5, 3, 6, 4} + comparator := &intComparator{} + + sortedNums := algorithm.CountSort(numbers, comparator) + + fmt.Println(sortedNums) + + // Output: + // [1 2 3 4 5 6] +} +``` + +### BinarySearch + +

BinarySearch search for target within a sorted slice, recursive call itself. If a target is found, the index of the target is returned. Else the function return -1.

+ +Signature: + +```go +func BinarySearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int +``` + +Example: [Run](https://go.dev/play/p/t6MeGiUSN47) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{1, 2, 3, 4, 5, 6, 7, 8} + comparator := &intComparator{} + + result1 := algorithm.BinarySearch(numbers, 5, 0, len(numbers)-1, comparator) + result2 := algorithm.BinarySearch(numbers, 9, 0, len(numbers)-1, comparator) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 4 + // -1 +} +``` + +### BinaryIterativeSearch + +

BinaryIterativeSearch search for target within a sorted slice, recursive call itself. If a target is found, the index of the target is returned. Else the function return -1.

+ +Signature: + +```go +func BinaryIterativeSearch[T any](sortedSlice []T, target T, lowIndex, highIndex int, comparator lancetconstraints.Comparator) int +``` + +Example: [Run](https://go.dev/play/p/Anozfr8ZLH3) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +type intComparator struct{} + +func (c *intComparator) Compare(v1 any, v2 any) int { + val1, _ := v1.(int) + val2, _ := v2.(int) + + //ascending order + if val1 < val2 { + return -1 + } else if val1 > val2 { + return 1 + } + return 0 +} + +func main() { + numbers := []int{1, 2, 3, 4, 5, 6, 7, 8} + comparator := &intComparator{} + + result1 := algorithm.BinaryIterativeSearch(numbers, 5, 0, len(numbers)-1, comparator) + result2 := algorithm.BinaryIterativeSearch(numbers, 9, 0, len(numbers)-1, comparator) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 4 + // -1 +} +``` + +### LinearSearch + +

return the index of target in slice base on equal function.If a target is found, the index of the target is returned. Else the function return -1.

+ +Signature: + +```go +func LinearSearch[T any](slice []T, target T, equal func(a, b T) bool) int +``` + +Example: [Run](https://go.dev/play/p/IsS7rgn5s3x) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +func main() { + numbers := []int{3, 4, 5, 3, 2, 1} + + equalFunc := func(a, b int) bool { + return a == b + } + + result1 := algorithm.LinearSearch(numbers, 3, equalFunc) + result2 := algorithm.LinearSearch(numbers, 6, equalFunc) + + fmt.Println(result1) + fmt.Println(result2) + + // Output: + // 0 + // -1 +} +``` + +### LRUCache + +

LRUCache implements mem cache with lru.

+ +Signature: + +```go +func NewLRUCache[K comparable, V any](capacity int) *LRUCache[K, V] +func (l *LRUCache[K, V]) Get(key K) (V, bool) +func (l *LRUCache[K, V]) Put(key K, value V) +func (l *LRUCache[K, V]) Delete(key K) bool +func (l *LRUCache[K, V]) Len() int +``` + +Example: [Run](https://go.dev/play/p/IsS7rgn5s3x) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/algorithm" +) + +func main() { + cache := algorithm.NewLRUCache[int, int](2) + + cache.Put(1, 1) + cache.Put(2, 2) + + result1, ok1 := cache.Get(1) + result2, ok2 := cache.Get(2) + result3, ok3 := cache.Get(3) + + fmt.Println(result1, ok1) + fmt.Println(result2, ok2) + fmt.Println(result3, ok3) + + fmt.Println(cache.Len()) + + ok := cache.Delete(2) + fmt.Println(ok) + + + // Output: + // 1 true + // 2 true + // 0 false + // 2 + // true +} +``` diff --git a/docs/en/api/packages/compare.md b/docs/en/api/packages/compare.md new file mode 100644 index 0000000..026e008 --- /dev/null +++ b/docs/en/api/packages/compare.md @@ -0,0 +1,374 @@ +# Compare + +Package compare provides a lightweight comparison function on any type. + +
+ +## Source: + +- [https://github.com/duke-git/lancet/blob/main/compare/compare.go](https://github.com/duke-git/lancet/blob/main/compare/compare.go) + +- [https://github.com/duke-git/lancet/blob/main/compare/compare_internal.go](https://github.com/duke-git/lancet/blob/main/compare/compare_internal.go) + +
+ +## Usage: + +```go +import ( + "github.com/duke-git/lancet/v2/condition" +) +``` + +
+ +## Index + +- [Equal](#Equal) +- [EqualValue](#EqualValue) +- [LessThan](#LessThan) +- [GreaterThan](#GreaterThan) +- [LessOrEqual](#LessOrEqual) +- [GreaterOrEqual](#GreaterOrEqual) +- [InDelta](#InDelta) + +
+ +## Documentation + +### Equal + +

Checks if two values are equal or not. (check both type and value)

+ +Signature: [Run](https://go.dev/play/p/wmVxR-to4lz) + +```go +func Equal(left, right any) bool +``` + +Example: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := compare.Equal(1, 1) + result2 := compare.Equal("1", "1") + result3 := compare.Equal([]int{1, 2, 3}, []int{1, 2, 3}) + result4 := compare.Equal(map[int]string{1: "a", 2: "b"}, map[int]string{1: "a", 2: "b"}) + + result5 := compare.Equal(1, "1") + result6 := compare.Equal(1, int64(1)) + result7 := compare.Equal([]int{1, 2}, []int{1, 2, 3}) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + fmt.Println(result7) + + // Output: + // true + // true + // true + // true + // false + // false + // false +} +``` + +### EqualValue + +

Checks if two values are equal or not. (check value only)

+ +Signature: [Run](https://go.dev/play/p/fxnna_LLD9u) + +```go +func EqualValue(left, right any) bool +``` + +Example: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := compare.EqualValue(1, 1) + result2 := compare.EqualValue(int(1), int64(1)) + result3 := compare.EqualValue(1, "1") + result4 := compare.EqualValue(1, "2") + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + + // Output: + // true + // true + // true + // false +} +``` + +### LessThan + +

Checks if value `left` less than value `right`.

+ +Signature: [Run](https://go.dev/play/p/cYh7FQQj0ne) + +```go +func LessThan(left, right any) bool +``` + +Example: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := compare.LessThan(1, 2) + result2 := compare.LessThan(1.1, 2.2) + result3 := compare.LessThan("a", "b") + + time1 := time.Now() + time2 := time1.Add(time.Second) + result4 := compare.LessThan(time1, time2) + + result5 := compare.LessThan(2, 1) + result6 := compare.LessThan(1, int64(2)) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + + // Output: + // true + // true + // true + // true + // false + // false +} +``` + +### GreaterThan + +

Checks if value `left` greater than value `right`.

+ +Signature: + +```go +func GreaterThan(left, right any) bool +``` + +Example: [Run](https://go.dev/play/p/9-NYDFZmIMp) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := compare.GreaterThan(2, 1) + result2 := compare.GreaterThan(2.2, 1.1) + result3 := compare.GreaterThan("b", "a") + + time1 := time.Now() + time2 := time1.Add(time.Second) + result4 := compare.GreaterThan(time2, time1) + + result5 := compare.GreaterThan(1, 2) + result6 := compare.GreaterThan(int64(2), 1) + result7 := compare.GreaterThan("b", "c") + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + fmt.Println(result7) + + // Output: + // true + // true + // true + // true + // false + // false + // false +} +``` + +### LessOrEqual + +

Checks if value `left` less than or equal than value `right`.

+ +Signature: + +```go +func LessOrEqual(left, right any) bool +``` + +Example: [Run](https://go.dev/play/p/e4T_scwoQzp) + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := compare.LessOrEqual(1, 1) + result2 := compare.LessOrEqual(1.1, 2.2) + result3 := compare.LessOrEqual("a", "b") + + time1 := time.Now() + time2 := time1.Add(time.Second) + result4 := compare.LessOrEqual(time1, time2) + + result5 := compare.LessOrEqual(2, 1) + result6 := compare.LessOrEqual(1, int64(2)) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + + // Output: + // true + // true + // true + // true + // false + // false +} +``` + +### GreaterOrEqual + +

Checks if value `left` less greater or equal than value `right`.

+ +Signature: [Run](https://go.dev/play/p/vx8mP0U8DFk) + +```go +func GreaterOrEqual(left, right any) bool +``` + +Example: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := compare.GreaterOrEqual(1, 1) + result2 := compare.GreaterOrEqual(2.2, 1.1) + result3 := compare.GreaterOrEqual("b", "b") + + time1 := time.Now() + time2 := time1.Add(time.Second) + result4 := compare.GreaterOrEqual(time2, time1) + + result5 := compare.GreaterOrEqual(1, 2) + result6 := compare.GreaterOrEqual(int64(2), 1) + result7 := compare.GreaterOrEqual("b", "c") + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + fmt.Println(result7) + + // Output: + // true + // true + // true + // true + // false + // false + // false +} +``` + +### InDelta + +

Checks if two values are equal or not within a delta.

+ +Signature: [Run](https://go.dev/play/p/TuDdcNtMkjo) + +```go +func InDelta[T constraints.Integer | constraints.Float](left, right T, delta float64) bool +``` + +Example: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/compare" +) + +func main() { + result1 := InDelta(1, 1, 0) + result2 := InDelta(1, 2, 0) + + result3 := InDelta(2.0/3.0, 0.66667, 0.001) + result4 := InDelta(2.0/3.0, 0.0, 0.001) + + result5 := InDelta(float64(74.96)-float64(20.48), 54.48, 0) + result6 := InDelta(float64(74.96)-float64(20.48), 54.48, 1e-14) + + fmt.Println(result1) + fmt.Println(result2) + fmt.Println(result3) + fmt.Println(result4) + fmt.Println(result5) + fmt.Println(result6) + + // Output: + // true + // false + // true + // false + // false + // true +} +``` diff --git a/docs/en/guide/getting_started.md b/docs/en/guide/getting_started.md new file mode 100644 index 0000000..bdd0c72 --- /dev/null +++ b/docs/en/guide/getting_started.md @@ -0,0 +1,50 @@ +--- +outline: deep +--- + +# Installation + +1. For users who use go1.18 and above, it is recommended to install lancet v2.x.x. Cause in v2.x.x all functions was rewriten with generics of go1.18. + +```go +go get github.com/duke-git/lancet/v2 // will install latest version of v2.x.x +``` + +2. For users who use version below go1.18, you should install v1.x.x. The latest of v1.x.x is v1.4.1. + +```go +go get github.com/duke-git/lancet // below go1.18, install latest version of v1.x.x +``` + + +## Usage + +Lancet organizes the code into package structure, and you need to import the corresponding package name when use it. For example, if you use string-related functions, just import the strutil package like below: + +```go +import "github.com/duke-git/lancet/v2/strutil" +``` + +## Example + +Here takes the string function `Reverse` (reverse order string) as an example, and the strutil package needs to be imported. + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/strutil" +) + +func main() { + s := "hello" + rs := strutil.Reverse(s) + fmt.Println(rs) //olleh +} +``` + + +## More + +Check out the [APIs]([API](https://lancet.go.dev/api/overview.html)) for details. diff --git a/docs/en/guide/introduction.md b/docs/en/guide/introduction.md new file mode 100644 index 0000000..b82e12a --- /dev/null +++ b/docs/en/guide/introduction.md @@ -0,0 +1,18 @@ +--- +outline: deep +--- + +# What is lancet? + +Lancet is a powerful, efficient, and reusable util function library of go. Inspired by the java apache common package and lodash.js. + + +## Why lancet? + +Lancet makes Go dev easier by taking the hassle out of working with concurrency, net, math, slice, string, etc. +Lancet's utility methods are great for: + +- Iterating slice and array. +- Manipulating strings. +- Work with net and http. +- Other tools, eg. random, crypto, stream, retry, etc. diff --git a/docs/en/index.md b/docs/en/index.md new file mode 100644 index 0000000..02b603e --- /dev/null +++ b/docs/en/index.md @@ -0,0 +1,36 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: "Lancet" + text: "A powerful util function library of Go" + tagline: Simple, powerful, and efficient. + actions: + - theme: brand + text: Get Started + link: /en/guide/getting_started + - theme: alt + text: View on GitHub + link: https://github.com/duke-git/lancet + # - theme: alt + # text: API Examples + # link: /api-examples + image: + src: /lancet_logo.png + alt: lancet + +features: + - title: Powerful + icon: 💪 + details: support 600+ go util functions. eg. string, slice, datetime, net, crypto, concurrency... + - title: Modular by design + icon: 🏗 + details: Each module is designed as a package with no coupling between modules. + - title: Pure + icon: 💅 + details: Only depends on two kinds of libraries, go standard library and golang.org/x. + - title: Simple + icon: 👏 + details: Well structure, test for every exported function. +--- diff --git a/docs/guide/getting_started.md b/docs/guide/getting_started.md new file mode 100644 index 0000000..8d64812 --- /dev/null +++ b/docs/guide/getting_started.md @@ -0,0 +1,48 @@ +--- +outline: deep +--- + +# 安装 + +1. 使用 go1.18 及以上版本的用户,建议安装 v2.x.x。 因为 v2.x.x 应用 go1.18 的泛型重写了大部分函数。 + +```go +go get github.com/duke-git/lancet/v2 // will install latest version of v2.x.x +``` + +2. 使用 go1.18 以下版本的用户,必须安装 v1.x.x。目前最新的 v1 版本是 v1.4.1。 + +```go +go get github.com/duke-git/lancet // below go1.18, install latest version of v1.x.x +``` + +## 用法 + +lancet 是以包的结构组织代码的,使用时需要导入相应的包名。例如:如果使用字符串相关函数,需要导入 strutil 包: + +```go +import "github.com/duke-git/lancet/v2/strutil" +``` + +## 示例 + +此处以字符串工具函数 Reverse(逆序字符串)为例,需要导入 strutil 包: + +```go +package main + +import ( + "fmt" + "github.com/duke-git/lancet/v2/strutil" +) + +func main() { + s := "hello" + rs := strutil.Reverse(s) + fmt.Println(rs) //olleh +} +``` + +## More + +其他特性请参考[API](https://lancet.go.dev/api/overview.html). diff --git a/docs/guide/introduction.md b/docs/guide/introduction.md new file mode 100644 index 0000000..26f931f --- /dev/null +++ b/docs/guide/introduction.md @@ -0,0 +1,18 @@ +--- +outline: deep +--- + +# lancet是什么? + +lancet(柳叶刀)是一个强大、全面、高效、可复用的go语言工具函数库。lancet受到了java apache common包和lodash.js的启发。 + + +## 为什么选择lancet? + +Lancet 消除了处理并发、网络、数学、切片、字符串等的麻烦,使 Go 开发变得更容易。 +Lancet 的实用方法非常适合: + +- 迭代切片和数组。 +- 操作字符串。 +- 处理网络和http请求。 +- 其他工具,例如。 随机、加密、流、重试等。 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..ecbedb8 --- /dev/null +++ b/docs/index.md @@ -0,0 +1,45 @@ +--- +# https://vitepress.dev/reference/default-theme-home-page +layout: home + +hero: + name: 'Lancet' + text: '一个强大的Go语言工具函数库' + tagline: '简洁, 强大, 高效' + actions: + - theme: brand + text: 开始使用 + link: /guide/getting_started + - theme: alt + text: 在GitHub中查看 + link: https://github.com/duke-git/lancet + + image: + src: /lancet_logo.png + alt: lancet + +features: + - title: 全面 + icon: 💪 + details: 特性丰富,支持600+ go util函数。字符串、切片、日期时间、网络、加密、并发... + - title: 模块化设计 + icon: 🏗 + details: 每个模块设计成一个包,模块之间无耦合。 + - title: 纯净 + icon: 💅 + details: 只依赖go标准库和golang.org/x。 + - title: 简洁 + icon: 👏 + details: 结构良好,测试每个导出的函数。 +--- + +

+ + + + + + +

diff --git a/docs/lancet_logo.png b/docs/lancet_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..481f8906e1de3b320c09e6d516ab4b1d9e67293b GIT binary patch literal 18948 zcmV*SKwZCyP)y9+%ZTt==-I+%~A(9G27>n%4LH{zXMaKd|5O`26Vf`@FooJv}`>uitNP zZvd6k0gcW9ip==;_~r8Y5Rc9PlF<={%=Y{J+1c6l_V)7f@;5g(;_>?K?(XH~<>BGs z?DzcY_51Vs{Q!^90f)-8-S7Z|$ng06-|+dw;_@#qFZKKV*X#C}n3zvbPru*sbaZsv z?DlfH;sBY|+3xtd-|>~o=#b9pj*X5WARw&O?C?T3el$L96$@bG!Sh{g#^T6Zt zjmhW%klhLrSuspBc4~fktCMFmd7_-;yQm@`wt=vGU z+aRCV0G-#9latTr^=Z4~442fy!^2ZkQ%OllEiEmk(d(Dc>q@KKGojel*47i3)C!N! zqN1XMgM+9>H&gs9uzqPfsXlQ8N?f28@^?JMEQMKV_uiMPb%u2A{MW)%N zrlv2g-Z`t>+U4h{EJ-vD_!8+ZCeOIH1=mDk|ye z>4V7Ve8uMqo7OX&)FhYE35Ux0`T29S-9oM1JetxWn8J)8=%-OmC$0mNC}Ez;%?|EOUAP9mW2!bF8 z@}FY1G&Oaa3i4lI?q6J*e$lmCLH-Atd&|jaW%!AL{0Foi*;7a+3$go$6{O*qGbJaP zOxo^52d1mWb8={@lC-R-;S8TtkOtG1-${c5gp3#O?^Te7VqRdW$^xS9WVeDelw-rW zf(AaKR#Z2fo?{BqK-zk5yIPX#h(^Z~LnjoZaU4J6SfB&2z=!R8&bKN^qi7#3CpFE2 z;7D3gz|cz9aaqzR+OE8@Els200WNgij@oY)o6$#OFmKGJHA*tdl9g@Sy7v4=lY%q= z^V-;VP3o{%biiXxbYXZj0JD8KkQO>DRyu6@=;h&N1*toSE}exko|eff3fLe-SDiej ztGd(LF;NB^Yju$9>?zzO))}*FAg84PuXcb7K-Y;od{jZ|%HhY;6)hZ2r!5&B92;~D zPG81XAN8es%F)u{w5%P`B!mT%VHk$)&R)cHRZou1J7Jltyqy*3fZ9Qb>daqLkh;-& zb-DtX3O*WzZ`gHPBr8K7zuk-7Zry-!ysU*a8XlGx9l8xNs0~64_sk7USM}obXc5Y| z2GJpPK&rBI79Kjq7_>j0Q;@pQzW5MQ6+{P3R?LS5oi3~7w$NdWzkhj1LFzzL|7@56 z`AX=3P8Vd*(4aaDVi=+Ekv#6M>Ojkdu|Swk9JG#$QVxI%n?AIX>!3q5Cc6}*)|e+> zB$$n~wps`HFm$dXWEiT2yTsaaqCXIh&>mOJ9de_~bG-BaBBFG7 zQ#t4m=!8}eMq$gT76qv#N5{$$fX0RvUbE5FsSct8MhNni(}S;~YD#l&F3e*i4LZ_* zFIm}9K-LZd&tUN~mX8|Jd1P0G#Re1)TF2AgMpx{tKn2wSHYo0FH{OZXj_akRFxSDl zT)+}@N0b*2TFeQn9U%g!?mTw8HKToKS=az%N9<~lngbqPS&3?o;wKbt@ps2-t zu>n6KI;0L;>YySFiW-{JUgDeD8gS^rLM0yeaux5c0J%aGub%)yn2!(%0ojo}c2`x$ zJbtDakH`BwAH2QdjV{AxJ1c{T-U@_(4K+A^3(u&ljd`%t*C%X*xeqN(4@pFHurZLo zE2m|gilBd}z~J|R{ph2*bY6J~Hkc1NmGjR}3wE~A^BkM1r%6O0T2?@F5{O5tH$9=TjK$)Lk=GP1$(rR+p&GA zpo0&oLku1=I@IhGo>5ne)(d0B0N~fbiw0k?mluXE-WhmUwrPCujjmYfQWH!_Dm#zA zL8eM{y_<$q#ccHTMSkAs!rW1QGt|Df^V~q9z&b0P=>P~A;W~gh2hXUh!=e7yVF(R@ zws+YZ7PjxXHS& z{DP}fejdtI_)r}|w`WE{s&K3hHW>caN&tmpPrrDh(R|Z^bft4x;UG*0B^6TVoSXQj zcGI->zK#cg4A{tcl^jg40I_q6D>b@n)U~M&A}$wXEvGuvR51Je67CW=$?p7_Vu0%i z#4{OQ$vGNz;`o25SogPa9vyt6OGt%+sT>fInApACh!sIe)@` zXW|&FlpFj`mxx9eY|y{w-oM0M;-)ybxUga)AZ!3a1_Z~@LBG7GqpnT>ZwlnC71t6R z9J!C()h1}`pOrTJQ(#1HbltJ1rsAXN_|8E>L?QQ&fsm|#AeqEh9~)k^ zqz?8qO?$e#W%XHH(GZ6uveRWkn2o{U0Wy!ftBoJ455xizu(5ihs|9+SR{xWuJs%8l zGEJBb*;`Q?DfNJRr&B>T#NkJ;1A#>HagO25qm9ac|d$|2KhrG`m zwqGay;vsB+4%j8)?@L@adoS+li%}h3bYy6EC2VMw(uLn79kc&UR_fqm2emZt}DpDv-@~yIl*)QYdfomGu3VWan;qkG)_-RWF=R5s~d!BPM>`RJfmI@ z#|E|qVnE^-I)KXbU%o_R&h$8Hh%eZs4uCdRjC~_{OjrMk`GdW)3yCTX6doV-ewKi7gp_hjMCZGxbypitRr6zpG++^gL)m-lo~ z1|fG=C}Y`{!C=v}u|sD=X@)d)bjUc&M>df8uMaj^ndktqI6R*FGukTvHl)InQ$XY0 zIJVuc6gLoJ9mC+WE0S@24IMhmASl$O98H07`9m99N8j7E+=MZZZ!|tI z3lDsIJ-AORA6#W$8lthG#sOs|3h-|Wok!07r#EmSgTQCd^L_K%J zO+6^x@Y+L5QyYcBc2*!19i}xTnun>z- zgZ=WYt{U{PscOI($fhKgX~#R<;Oi7*#BW&TJ3_5 z;Gm8!g9CuLpUg#RdiMu1FN|B#htmlR_1qCqJ#yly_+aBTdCdyG%Q$o>I%3ZIPHXAv zovQYar(5LcP#NqgSs#9euE!7QidyVILT+?*2nVFAE81}W4pnrT3>JtE8Aos_-?Fy2 z|0CWjljFmU6;_N~$4N2Q*?c#TY31Xs%I?1~hJ%B}!SLuFI{Xo~#_m~fbdaNqL}1|V zYI&d}O4D1Pj%TD>2oC6TRgUhKyZsd(^T%HAb&c#BFNi~20A~^692KraxK)+1yLNfubyh3aaOCaYtl?{fK)g(|Ms!lgQX{&sG5T)4JyLp z#SP87ddr*D%@#;i@RgRHHjGUY)FT z>WOuUhE&RfaWqbT>ifZt-b{#5Il4NDhhFd6c3kUrncipJ0yNAD4mx)b8s^2yPpwT| zXMDubjiH_uV8E3FXza4NZgxazqR!!tR+E_~E48EBJy`YW>F~7EBR`z=u*E}p!*XY}b^QqE$9~^ZU^*qm!9Ogt z2htVvRdn&qqx89mhD~riJscI`f@Sp;paHTdomCoRuy;3K=jA%HGX>N%K3l|HqfUvD zcXVm8LUkPD&^Nq}crUS_X5MTvo22ki8|<4d94&Z1&ziG91KscNj@D#z*zfauV^oeV zmJNXD-Oo-$c6TKfzsvv>Avl;)KHA0Um?{SX4(SH4@5X-amAeJjv4Sr}fJ3m|uZrj= z=S2@%%^5%f+FY8du%l~`bmsx*1ymIWhnqG74m;pTaGu)B<}K@BjsZC>N(t5h1L!o#vuszBiBo; zKbdDTXJjA}lm?9sgkvo0WGQbG=>9Z4kd4w+(^O{>uXg}1F|>352UI(-T)lGa~0zEclPeFI;9MdheyjonewCrL-1Cg-l2o6E7Z#Z`_ zGSgMTvFEKBNWcQ5GS~xWk8u*urQZCYQ(REZ<9ho<-lslp`fQM`nAo5=kOcRm;}JQW zS1;Z*CD%yMudZwa!U}7P4^b-dAY7NMZy7voSboluc@v&?it}_7vPW`U5bM!IoEwU@(ytp z92mNnlL0uOvjT-0?1t{%qr8!B-bqfQ;V#!skJ~hja*vc>@_QjXSR6Q637CeUFMBl` zaf?1ZxBoNdKy;Wf4VA$@wxhp-)3FW&@Ut@HN$;lx(S;eDV1w5R!72GxI%h#AST|M!v zhy+1+?72}N6-g5NFCZGUb})`E!O{A>k7EZ`tvK;}@sZ@{AV*HmrFQUsxcB+pL5?mh zkbC6`&gM$)D;dTi zJc33K7Dt2bX-(v;QHw_@a$luyd8Y+vEPh<1C)mvUB%HQN;9nR-Zj-e_;546ko`@_ zfoxRDLD5d`VWEPKmajY%2dy0h2Uf$Q`BfF>hZzBl~l&nl>DrXJ$*3p>)-Z(xr zEg$o@OP-Y-P382Ozjv7HJQa4`_b91K&z5qej)+$>?5+9tZW72yJF8$E>6VG3 zoHTQEXcN6T8^<`hq?kJhjyC7ur6{hKXeB&=gigVcOmHNZ1&&9+aNcwKUJ`>t8q3Yp z(H*6>*|qgB?WgqMduSRL4Cl^~Pm`xPXA520IfSz~gNAU$)zQVm&EU z!NC~pAe5>)IWt3DS6U-`s18Jv6)GNtM*{FTQ!euUE~l3p7|#mC;t+Pa!hemr{5w-B z;4msU*tsKZ?RFpMM|#e<1r&nAj&XpPyMghmB_e-~T1r=H9H6r0D`CFqbM&9PIdW{| z&}2nhE6dt^Ij^glm?k*BfiKk<=!i!+tO@w|({eL+bU3i!*4cL1kaOj1DVGdg zi3hqKczK|n`$~pYH{>Y@4iygc`?33JO;nf)meqG;GC1V9gRU;D*Vb_g$H6sBLpoGP zWygCx#IGgQJ7}_Evy~4n((?A;{CN1#Q5F1wpsON0lw4)E(_|I@g(HDZ z<>V3}Tb6&o8XxWe#`^PU5@vJyeKdN9!e!t;2JzenUu zkY~HM5F8+qsUSM+WGc5y4`&kq1vys^H~>m?w2!-nAkJOV2g;<0G^!f5g zxOKZ?-}Ai0#8kkML}bLulMDF}#}F4w{lkqxM>T0FS5~G$@wAka!)TyuuefUn;>Z~n zu@D7RJm^p^U>qR##f~s5=k+IVC1%msNL4wytve2JQhdS8oyM*Cga(xdew5m2xWy58$yp*b~Lk+)WpYgC;BZjaBw)B%HiN7{~uk%mNll?Z{zq zjPu@)B<`Ou01gn-=%OV=1_y}F9SKB$1M_&aRK#ohM&7vT8lqCkrDP=tJIl_7(;H-Z z9^A@AIN+B=15hZ*sx`B=fY+AY+sdACjH3b`6bIpnqbf>nE`$~pow}c~^ z@(|7oxhPkGesRNr+i+3o%+EjregTcl%%o6*-Eyz9g!h_@?Twhm7J>tDkZ=$S(cz#^ zJBUd_aD0Yv0FO57MedRExf?zK;h>H#9yQxvuZ|Lwb;z;()l29o>}a>F&!8iHCv%-wh<;(X?11@;2&Q+<59x40aaB4?l&? zD;e7V*-mJn_@JdjG1x8hybaL$&h zkAW&j*EBJg%^Amg1MHDgBzBYJ-2JPi=w+a*mtoCH>U3#yrJSkrEfw>I!Hzp_K~7ev zbbw-IeeQk}2Dewlo|ii?4G0e8Sz#J1j_=9~Ia%cNxcWf0(pfnIL zINF>eyjom1;$ou%Nx_l(`Ij%k;PtL0f3AEB(IMebJG#GLt>EyylGROVKk+>01npCwK8`DT`k;NTsi>Zp{I^6`pQKh{%7x8L$W->I4&MmwmCKJu}zKI zvOMHrBq&8vLgsZc3QMI`NmsbvOH(M$|!P-Q>?(2VF?|q?qL`6mU_(VOsm1%Mw z8MPHR)(5R$A4Iwit)m;T^0m>Cr>T?C*d(8<5NJx7&9=sFZQI3JZ}iL2y7*ofpj9eMmZb zyYOg;6mwEMcq1s6j)}=eqeMR1%V7u}^2v%ih&P8c9c1Rf-@amG8b5G!#pZa5!{g-- zhE7N6TMKv)ATZcT-S8n6Via)r1P1y9THhXYF{A2Uk43Lt3mlNZp*Xt!6T_&&Gb-iY zeY+LF%H=FNz{RI^R;~%|2kzEzN0-em0EgHc=mFIjw+_`ebAdzc=%Q-)P#yr%Vtsnh zY=b4Z9p4HV(Le$i+|gC;JK};X>Jp4*4*zlkj%iAH=!)Lo)Acc?7l*p@k!dfUtnh&t zj?~kJQ&W5T)2!@l#d$E#3Lkd3dh>9Hxx6cB?_@<7#la7{)Y4TPUH`v~eB8X+8&yk} zPLCt$)U;QK$Gg+KfWy{c2N1s9CcD${1(~bx66H2fw1SjH)HXy&?z5BT@=7v?-o?bk za2%v`a7UMqO#A!a%P@R>?8w(*Gn$a-%Aur7(|>DC+TEVUN2VDG9v>V?YTB)x#!oU> zT-nI95*_hA$XNJ&AmZb3k(t6{OU}FK7(@rea0Ce)%wUh`GnfFC8prRrEw#h3Ntv@+ zasEo)Opk&7)D^-VU16{b97tEmRacB(ka<9YgX0heJ9t3A(bDqds(Ecp_hpYOU1dj? zTt9&bH4+15e<#SBU>2MQ4#ke#EuaqB>a z(dEN zEFNzK4*Vh;?7Wnd-*Ru8;02k4(!QV=hC}H)=>ORlb8wP= zYt3*Bp`%MUx|9VA4jLY7k~<5G62DZ7+CfLAdEY?|_CV4Ga^*fa>-_J*?K*sBEnu+V zfP}#=k4(QmoIZ00d1zu4-HfKe!GgoD!{8tw-_$m^1BZ>H>p|q6n%xOA*(g_yyu?XY zw1L9W#gBr+y+6;z$(4}vN~9{K4Wu;0$n?a%qca}MiiUf^LdF59`;Mw3m)OQrV{K^* zt@(_IBY}yC9}nV^9LzIfx%1XDe5>5X(G_inAcErI^k?0Sp?A^15k|ymsBw@|-jO5C zR5x)O|R*>N;z4n z=X!txj_$@shts9$W>5ZFrP>>4-<7WjZk<*2+;uH1mAv4}gmQOwb$wL{Vm@`o=xo z_&728Ctv;qAX-Paq@!q-*FJfzgV}%~&so*y7{*3A2CY<&UJ} zf1&x`Nc=GQ`SIr|B+|e~F4g9CwTTZ$` zrSD*aB({%WG^|zUD{1e(l>`Rkp>=fqj?8tT#*Xe};7ERQHqVeo8@fLxy^(27wWKJQA2L*XnmXtL7cSb8jdu8;m5+_c|4t=;f4 zRZ6*%Jf(gF1Haijx;|FRLsPy^k`5lEl21P}4IbfgKe(lI^Qy1FgW=E`>|dWNo%6{u zvDx=C<5x+f{IcvyS7k$iGBO>{9bIV3GGfL7T?p|J6itArFU##7!3e&=c}P26_bPh> zwOzU2_42~Gr_LS6o?z9cu}?KcUVGC#f)TG8nf{{NwELR#%PWGS)dyW#KWtx_4(MV2 zRpP*%VBp}hN( zR~;P?a1b6YJ6_)jme)9H9o?#)AqS7}XOul&;|dny5e!H(GTrh;_W={rK+@h-{yv=1 zSU>F}7y)4ebpzqw^1XoqhdNpLopvt!(pCegrL}p03_2(_g9gl?#)EAFNJ~Vp!dA%4-X)WNREj z!@iV5)LLJD{pW>6gYXzz1{eT>;FxxApw`jt!LYjHlvwsSnS_PS-axxorl&0RI~Ph7 zSG24Ag}?d{j5xi$fx+C-6}7`HZr@%9Hh}46?a3fvvo~;!>Xm6I-kRKb!K@zc%>LDc zzc(Hin{jWTxD8}DzHT^%7kL~d2{bM<6zaW!t^x;yrRB*Z1q&}WD39i`aKy(DFp(Li?8;I_20iAH|cpQ#FJ)eGWpgK5~;-@O0*@0)=l(xSw zi!`ObH;~d;P$yh_9*=bQ2I{qes2t~YUM`$R*AV^2=N=RXsEGJbzcTGQWm&MX!Fi1G zbFLPLIOvMnfmG$dXT0|8POJ2QSm6K=n9E5CU(e3|avK#jrP+feJc zuX-i6f`))WPrAz9!0))D>sr}u(kX=x*RJMA{c@#k=nqb@>0<1VEk;sYFn!LC&DH}z(}`};s1 z?*mp&>*$K;aGR)g*r_V9tvxl>17#dISPw`-LpZu?D2~d{y9>YZ30ZQK?My9_yoay2aNh$p$pka#xbpzr!_{j9$YE6dAkrup*UN2;*yRe)$b)CN1mx{4Ixake{ZyS1=9n+2@HjX4Kk>NogP!i-mP_!M&UHRPw zb|X8DG7gOe$RpEY&Pu5rtG*gP>X(YTH}DoBq_(U`uCjAkEC1g6WivRsz2O6nIaNvhcQ5Zp zXecz4@Sq>yupODUJXj!uhchT|C}^XeqZ_~+-KBSacZ`ji(b}H9pFI)-rKZ}Qt?(g^ zE*+T`GrEf`4|lpOY{lkuG}z7P2H+!`BzImp$4v-R|4ch%lN5guxT{X6x@v}gmx-azZ){sn2Z=Z`N_KZ0RDG9CPAK<~fz zp7I_yror-*x%3;?yWH(wnPy?3Y62~5l<4?Q^#}%p2QZeuU5FDUa1K{0djmC&Zg2#i zxzOFnyp-dpx>=q-dm2xams`IPp&=Yy9vrED?qtqNGouU9Ct_Y+OIdI{wl{Tb^oI0C zrpb_1@Uf-@-Ln{W0E^e&B4&Hu%>a%4?&6hc79D5>1rDmp{hhmyy;-9_GR+ng{IT$^ zK8{Yl0E-Ci$aDZ5nQpjLo2R?xG|o-N;rG)ld1SR-2Mu@i?k6Gy2(zsyjqH(v%TVJvo}x+WDWnmc*YMeE9F|QeFUQ=t#u)JiLrI#6RKCHH3oabqf*`7 zmg6N~+btVP>ixj)d`OA?C6~Q)_Xa8k`x-3RB5M`-qBU<4fMg)hxxsd*j?k%d|w3L8^{Ye)9QdQ z-DfU#{T|Re&E7z|t^9Ob`t-L=a1ED`b>-lpzc&yk+!5`|-3disTU~8lnf_6|H*l)* zX|?Hjqzr(CdT$`2LuIfBtiP9{6C0TWJ)mKagRsDd@@SZbhm=?wSL3yW;rJ{>cWM&0qBOT9~1>Fu25 zI6S{h8*IzhJ>k}_u2}+!WToC4$lE~B=+xhmlaAAstIA-v+Z#A#_A%;&#@A!(<-LJw z3lTja+K!2HCnUYUY~ZFAhaYf&1wMpFXi{96&i<&x+F;Ni0t;TsmA!$;Rfvt$uFldd z{mfe3u6mP1vp3LZ(Gzn&!hpRh-tsHc5t>(~1Hzg!bTdxlzKE~&_68z8I1W$Gk_c@- zn6dj#8mB>UAV9?4K$HxTth&0<=jbb|?E$+hhk!z}HxOQ;iPKeK&b#pFX#2f^a?ft0|6w^ z(r@B))%f~_LIc5J=jb*JV_1D!9u4wAS9`Jo4`}ht@;x>=?rd%Z9*xx`n75dt1E4Az#zH5}ZLFypP|m39k@4nZTH{A^=OHL=?Cwpp(} zVoxAdk&O}FaZf-`FCFD~(olw$)x zfWx*8^tgPf+Tda@{fCe#aXBlyB&_vdyN0f0xR_E+eco(u;ChJSP%j%=*3f~O!x<#~ z3?3RsSCy<5BSJ0?mZb~Vu>L16nyS1Qju84AvvWC)%U#{ZPis_W2aFv;s+yU{_<1**+JRgJA_|Vhix(#ivitLt+WHld zkxL>)bnufEi3{QBVl{Rr&QwM!+}&zZS!BxYDYM5 zFvsf7y}gFn?)dnh%H+Z(R?0UC8livzB1v)01v__Dm-YM<2^OMsh(1uDzz?AzmN6Ue zoQ+3hFdRa3jU$wsdNSR`Y}#J>JPeTm0SBbUL4u>9<9Mub7kPYq6+kFBXtEMGz=I&U zcx1GA-?{r2BYhDYkQYr>hz!|bXE;2vS!@{V=Z98A2l~GsVUoDA>%eWm!FUAbns1Cc zcE|Wu&=5O-<@NCqB09#{PDbPS7_>R&avXr+NfinxHAzs-3SVE}NK|rP78~4P=WQUg zKf9CF4P!|~e_Lr6NGwFq;2W96BFBHMBPQ5XZfoQXY>tT$3$oV}6A>g-V{bR^8PX8_ z$Dp8L(|3fjT25nRF{;Lj73cFcORikb%DIxNKm%6EHWD6h zelXX!KDOjkgslY)ii00>X}02(JmUEWFFKQXK&)^meMcy*=7a}m00hSo!qQa;0V0Y= zNY88@8QF2lLXK5Gf`iypM{^ZlR-XH~-%MXpi*0;PSDcDu1$iq6T|9=^k@MkmGU(6! zl-pUk?*Ir^&mq8|(ZRZo5au8%T{(b+TrbL+jk{Ac7%#eV(RNTAY)f`a{97}ntHi@W zF=5I!e~MUq36pdrn65$7BGy@ByjVtqV*ec5l8)0K4m^%#Kx9J~z-Vr?Kh zSuNZ6Drfub4$XC(hY}tF zK}9QhcKux5HQdwo%*xw9SB8U%MF(Vkc-6%W$~g2ch=fKM$3Z5H_?^Dvb4h@W#l7GGsl$W(5Umq9&v%Ek0HN`Dcd!a0)3yft zVo}Q1v96pOx*@{Rt?B-VZvv#;O109KLpZuPK7G+jCUlMID9&tt;QgvCH%qAORQ ztTsMxl;->{S@GbPO5Xt-s=mV)xoRDOfe&lTX(5k1ckp8-Ije75rw||bsN)0TJlfAX z_i0x;I=(qf-~bH@1h;|0(G9Q2$(#G%ysp^IQ+3dVLPhQHg}_2Mh!DA%U2+MI`bQ{h z_k&zMGA%A=AxdMa1w?XhUvP0|Z9hC3cIFJn!FUA8jxNE$Qq|mflz4KJL^!%OC#y)p z193rNz(8DG1o$7Ly|c!*>LaYt8a1C_QMnW}5>K$i58(SBgW>cd8+i8v96)sGFh`fzbt!8zPaal|M% zAOr_1^lfm9LUeRa~je0}Fsl_#QuCn~k0i)4iW z;WTpc<|zXgJ&1~Dj;^4g%2pdT_&DbnwY1}2%+}3>2FJk~57}T3A3iichxFKj;-w-m zSRq$Cx|D_&Vk2+fZZ_Lq#tREk2Eu>YfbtRl&>6?5GY?gqp)|tyL6;fq)U(1*c+kA< zWJG+NCOp&zJCc$>?1MDU;;V5qo$;tnEAE7EgxT`!u?{2>**bq%Do0|*oxAcNYmp=CqvUFSz`aF8>5zTUd0d?sO4vnt~8GBi*d{x&NGiBm7|L~jt_7|daZy@HQ%LGDtc-WRb0V= zKLQQHBlqz^r>f?S`_62xkfTF$&}1R;I0hd0Q7&h3!Yy^sOBDx3 za&7w#fdhX49!@ky9b5Ohg5iKvj;`S0JzVFIf7Qb3WA|664EA+iX=EzeF-ka#s}B_p zb|cu*0v1FVqjr*SeZ=m)_YN$0c-R~4$W<{X9CR#4Kj^kX?#g{5le&u>S5Y&rSX(eL z&2jLiyoI75zc|YnHC~-~S5Z-+;E->h!q^K;S6Eo|cMCgIsU2Mi ze@u9^ye;_N<^NXf(aD$!IXbpd2^=wKI-*}8RXI>ir>YPiz!7>0955XW z#K)V5|NkP+%%O_SG7jjBaC9k-=%C>t$Ij|WO{nLn9gBN%9Bt%DSFgPU1@%D}aUrS) z^z6$2?p@_ijxid%axf0;J}^4`#q$&R>VQMFz2H<*T3XU0()~GDu~$$2k(=8>vlL5L zs@NdqIVeHl6Mk{qMbpv?YD# zbh?_J_g~Dt#BNDU%=?eBc0%UWU#8X7tpB}se9|X<(kFe=Cwa1bN+sFzj}1h7VJS0^ z5Ceo&>C_xj3jrkjZ4}pT9ET7gl6?aSf0Max<{M2$;t+%|(eXDC#D!(^sd4VZMWW-c zve!*#SS(T>DiR%kn}JG>Id~?~5eHb6f-un$7q(7o#Gyn-T*$IcbI2q*Vgr$Nc_z^j z8;HuLz$7~21HraXq9ZmC%92ZT#D@(}|2Q27on2)?EP4BZI&>a69S}=0KTk)+Ks|l} zV#&|bL2QSJDu^JK{5&1?B?A*3apBEHFwqeg2nE4JM{Jn$iH`U%&(ko`5f2DZHxc@o zI_5E4_h!wZ1Ybu7LHy!EOVQo*`abhanEm#e?YA<2UHpDMq?nh`QCGz7R$nYu+llg| z*$c{q)l{dpx+|S^S$(VgT7>KJ$1k#j)v7yDGSAw5XR=)_SXN(kJ97|?l4s5~ z{`Wc#`_9&?9hp9PhH4q+wv&C-3^(o0q6Wzx2VphPk&!26WAsj5po~Es;6#_wwY2J} zPkz8P9cv70FS0lDTi=#9LNb7}R_2k}uFf)McyM?^D+o^Jq+#=3kCD^>Zm4*&j>Zt9(RL z@9$N1UWv{=DXFAiJVa8DTV>!#u>HbH~Xcq6vrwHNJ|59^Cs$ zB=B6>K`V#g19n;+#D%YQ5R2nAzN2QXWEWJ%k4|bDy5YThf}RRohmz+wcmrZg@QAKK zf97XKsT32w46bf{5E=XY&tCo!6Ubw9ta=LX$%vv?05Q~_cMo%W;iU`Ebg^CPOT9*1vrh~YoM>M?E0l=c6eoiHoEkRnX4x;0Y==majwo zTwp^FrxdNRGS;njSiefy;D%14&s--0J5=gE&-hh*#~uL|E$Lc|Di&K=+xgXQy04>S z$DWQs{HJW9)+qG*4gO z#3uN|fDEKNucKo=Ey6R1+6F4%FP=#B>aOTC1CYulqqF;z1bJpM!J8?YvUA z_!P}?^oZ{U3lD3^dDRa6P^XAZ*xA?8fuPzfq*nrXpd-}|N4%87A9Qcf$smzi5&%ch zie9n(>HU+AnCF+vf`%=%XPRdo?Zi+?LoR471L9S5)U9`Bq?YZi077hV9qLy)2oPp6 zMuCoFJ(O$(v(7sUBB;pnA>@{q{7Q821i3&5)yuz(4q`yI^4-JjD~^huf`6z(RJlM$ zd5KJEhQECMTK z;B^?;FQelQ(W(t8gwP-BXiyJyyw!q~TtfuU88o?|5{9h>)RtHUnUuSENgaxA8O)AD z5~u#@R4zM@bW93CzuDC~;5pMF!j}I%jB#jlj4NkfPRBu6v0AG*Mv#&kZ0nD8)E?<@ zgSHNPngX7qr2-ucReX#ze=QxAz4-C=n}&#@tJ4Y5{O@(7)gZXzU+NtvtP4m+I{%PT z=9P3*vRj)bKNbx1h`03v5WYc24F)=>!UR00if{8SHV5Gm72<_-Y__M~b@9d=weAdn zZ_#0JSX*Ci!BdDMrlY^kf(N|Lp4Ay5qxqZLqrzo};+u3d&UN^$bq9ezKII(cN9f2d znP5X)0N~qnIQYY}v;fa3KwMz=C+Nu5kZ+?VfN#{HG5A#Ag69|`81SzD03B}&%BwzI z*n{uXQSw$1-j425Y&CR6_VslrJmp8d1in>=TgK+{u_1z|SS=Kq{a;_liVQaC2H&fr zQ=p&^H)O$6wnt1L+L;81AiK!CjE=hL>!42J_v)Bw)Nh^&%$y_`Fm6PxRp!%_DZk1V zV#mp0hX(%(9g6Wt2QX6z5AK6lW#w5g`-e|Sx&FlLI@ zM=1R2#0;L_=yH&Ts^4^vEeXRqaNJ(#wU$lXox?g8Ep>xoMXBvzh*3lIQrq?rK^i;t zhM#r_FI6&Ags8>_!~W;;&3SkawUuC=fqq)jW&D z*{4aoa)9b;25vK$xi2;v?QI^Sn~!RACA+ya(nEV?-;6Ct8z}WdXc}ARa`^KVRj!pR z%d~k&aXm`w%K}sC#hvqI5fANxM{Dk8bcvtQhj3(k7-=4k?-ewzlHAQG{RqZ z9jV|0VMOJYQ}HqhoTSefAbN)ktNk(3T)rhncTh#Lsh`vH^f)pxp9LXAS8GyZiSvac zj?RtMnt4_p1+kj)C@1-K7a&-e4)jh zt9=Fy3%35*l60-iT*m0s(V2Fx15FjCBH>P}bNaf)L?!m_U#rS&y2iIs=v=-;QQWAt zH1d`L9x~I{HU3h^bAFm>Rcq5h7CdIYcA6=gI+u>rqf^pjBIDfA7j`;|d}$EczOZb^ zXq*~`ww}zeYmG*umS*SvhuiCXI+DDpTm()dlkLcnBD=EEnsfevhEdC#1NrHltW3LR zeCF1(;0bd#{gGKKojcM06JaAn9bx`n4hQf%%x2)%sl;g4Fd-o!At50lAt50lAt50l jAt50lAt50lAvXL2E_;Iu`CC@m00000NkvXXu0mjfmYl!Z literal 0 HcmV?d00001 diff --git a/docs/lancet_logo_mini.png b/docs/lancet_logo_mini.png new file mode 100644 index 0000000000000000000000000000000000000000..9c20d1d2318567d6d14d1a31e083851ca5e21bd2 GIT binary patch literal 9551 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 literal 0 HcmV?d00001 diff --git a/docs/algorithm.md b/docs/olddocs/algorithm.md similarity index 100% rename from docs/algorithm.md rename to docs/olddocs/algorithm.md diff --git a/docs/algorithm_zh-CN.md b/docs/olddocs/algorithm_zh-CN.md similarity index 100% rename from docs/algorithm_zh-CN.md rename to docs/olddocs/algorithm_zh-CN.md diff --git a/docs/compare.md b/docs/olddocs/compare.md similarity index 100% rename from docs/compare.md rename to docs/olddocs/compare.md diff --git a/docs/compare_zh-CN.md b/docs/olddocs/compare_zh-CN.md similarity index 100% rename from docs/compare_zh-CN.md rename to docs/olddocs/compare_zh-CN.md diff --git a/docs/concurrency.md b/docs/olddocs/concurrency.md similarity index 100% rename from docs/concurrency.md rename to docs/olddocs/concurrency.md diff --git a/docs/concurrency_zh-CN.md b/docs/olddocs/concurrency_zh-CN.md similarity index 100% rename from docs/concurrency_zh-CN.md rename to docs/olddocs/concurrency_zh-CN.md diff --git a/docs/condition.md b/docs/olddocs/condition.md similarity index 100% rename from docs/condition.md rename to docs/olddocs/condition.md diff --git a/docs/condition_zh-CN.md b/docs/olddocs/condition_zh-CN.md similarity index 100% rename from docs/condition_zh-CN.md rename to docs/olddocs/condition_zh-CN.md diff --git a/docs/convertor.md b/docs/olddocs/convertor.md similarity index 100% rename from docs/convertor.md rename to docs/olddocs/convertor.md diff --git a/docs/convertor_zh-CN.md b/docs/olddocs/convertor_zh-CN.md similarity index 100% rename from docs/convertor_zh-CN.md rename to docs/olddocs/convertor_zh-CN.md diff --git a/docs/cryptor.md b/docs/olddocs/cryptor.md similarity index 100% rename from docs/cryptor.md rename to docs/olddocs/cryptor.md diff --git a/docs/cryptor_zh-CN.md b/docs/olddocs/cryptor_zh-CN.md similarity index 100% rename from docs/cryptor_zh-CN.md rename to docs/olddocs/cryptor_zh-CN.md diff --git a/docs/datastructure/copyonwritelist.md b/docs/olddocs/datastructure/copyonwritelist.md similarity index 100% rename from docs/datastructure/copyonwritelist.md rename to docs/olddocs/datastructure/copyonwritelist.md diff --git a/docs/datastructure/copyonwritelist_zh-CN.md b/docs/olddocs/datastructure/copyonwritelist_zh-CN.md similarity index 100% rename from docs/datastructure/copyonwritelist_zh-CN.md rename to docs/olddocs/datastructure/copyonwritelist_zh-CN.md diff --git a/docs/datastructure/hashmap.md b/docs/olddocs/datastructure/hashmap.md similarity index 100% rename from docs/datastructure/hashmap.md rename to docs/olddocs/datastructure/hashmap.md diff --git a/docs/datastructure/hashmap_zh-CN.md b/docs/olddocs/datastructure/hashmap_zh-CN.md similarity index 100% rename from docs/datastructure/hashmap_zh-CN.md rename to docs/olddocs/datastructure/hashmap_zh-CN.md diff --git a/docs/datastructure/heap.md b/docs/olddocs/datastructure/heap.md similarity index 100% rename from docs/datastructure/heap.md rename to docs/olddocs/datastructure/heap.md diff --git a/docs/datastructure/heap_zh-CN.md b/docs/olddocs/datastructure/heap_zh-CN.md similarity index 100% rename from docs/datastructure/heap_zh-CN.md rename to docs/olddocs/datastructure/heap_zh-CN.md diff --git a/docs/datastructure/link.md b/docs/olddocs/datastructure/link.md similarity index 100% rename from docs/datastructure/link.md rename to docs/olddocs/datastructure/link.md diff --git a/docs/datastructure/link_zh-CN.md b/docs/olddocs/datastructure/link_zh-CN.md similarity index 100% rename from docs/datastructure/link_zh-CN.md rename to docs/olddocs/datastructure/link_zh-CN.md diff --git a/docs/datastructure/list.md b/docs/olddocs/datastructure/list.md similarity index 100% rename from docs/datastructure/list.md rename to docs/olddocs/datastructure/list.md diff --git a/docs/datastructure/list_zh-CN.md b/docs/olddocs/datastructure/list_zh-CN.md similarity index 100% rename from docs/datastructure/list_zh-CN.md rename to docs/olddocs/datastructure/list_zh-CN.md diff --git a/docs/datastructure/queue.md b/docs/olddocs/datastructure/queue.md similarity index 100% rename from docs/datastructure/queue.md rename to docs/olddocs/datastructure/queue.md diff --git a/docs/datastructure/queue_zh-CN.md b/docs/olddocs/datastructure/queue_zh-CN.md similarity index 100% rename from docs/datastructure/queue_zh-CN.md rename to docs/olddocs/datastructure/queue_zh-CN.md diff --git a/docs/datastructure/set.md b/docs/olddocs/datastructure/set.md similarity index 100% rename from docs/datastructure/set.md rename to docs/olddocs/datastructure/set.md diff --git a/docs/datastructure/set_zh-CN.md b/docs/olddocs/datastructure/set_zh-CN.md similarity index 100% rename from docs/datastructure/set_zh-CN.md rename to docs/olddocs/datastructure/set_zh-CN.md diff --git a/docs/datastructure/stack.md b/docs/olddocs/datastructure/stack.md similarity index 100% rename from docs/datastructure/stack.md rename to docs/olddocs/datastructure/stack.md diff --git a/docs/datastructure/stack_zh-CN.md b/docs/olddocs/datastructure/stack_zh-CN.md similarity index 100% rename from docs/datastructure/stack_zh-CN.md rename to docs/olddocs/datastructure/stack_zh-CN.md diff --git a/docs/datastructure/tree.md b/docs/olddocs/datastructure/tree.md similarity index 100% rename from docs/datastructure/tree.md rename to docs/olddocs/datastructure/tree.md diff --git a/docs/datastructure/tree_zh-CN.md b/docs/olddocs/datastructure/tree_zh-CN.md similarity index 100% rename from docs/datastructure/tree_zh-CN.md rename to docs/olddocs/datastructure/tree_zh-CN.md diff --git a/docs/datetime.md b/docs/olddocs/datetime.md similarity index 100% rename from docs/datetime.md rename to docs/olddocs/datetime.md diff --git a/docs/datetime_zh-CN.md b/docs/olddocs/datetime_zh-CN.md similarity index 100% rename from docs/datetime_zh-CN.md rename to docs/olddocs/datetime_zh-CN.md diff --git a/docs/fileutil.md b/docs/olddocs/fileutil.md similarity index 100% rename from docs/fileutil.md rename to docs/olddocs/fileutil.md diff --git a/docs/fileutil_zh-CN.md b/docs/olddocs/fileutil_zh-CN.md similarity index 100% rename from docs/fileutil_zh-CN.md rename to docs/olddocs/fileutil_zh-CN.md diff --git a/docs/formatter.md b/docs/olddocs/formatter.md similarity index 100% rename from docs/formatter.md rename to docs/olddocs/formatter.md diff --git a/docs/formatter_zh-CN.md b/docs/olddocs/formatter_zh-CN.md similarity index 100% rename from docs/formatter_zh-CN.md rename to docs/olddocs/formatter_zh-CN.md diff --git a/docs/function.md b/docs/olddocs/function.md similarity index 100% rename from docs/function.md rename to docs/olddocs/function.md diff --git a/docs/function_zh-CN.md b/docs/olddocs/function_zh-CN.md similarity index 100% rename from docs/function_zh-CN.md rename to docs/olddocs/function_zh-CN.md diff --git a/docs/maputil.md b/docs/olddocs/maputil.md similarity index 100% rename from docs/maputil.md rename to docs/olddocs/maputil.md diff --git a/docs/maputil_zh-CN.md b/docs/olddocs/maputil_zh-CN.md similarity index 100% rename from docs/maputil_zh-CN.md rename to docs/olddocs/maputil_zh-CN.md diff --git a/docs/mathutil.md b/docs/olddocs/mathutil.md similarity index 100% rename from docs/mathutil.md rename to docs/olddocs/mathutil.md diff --git a/docs/mathutil_zh-CN.md b/docs/olddocs/mathutil_zh-CN.md similarity index 100% rename from docs/mathutil_zh-CN.md rename to docs/olddocs/mathutil_zh-CN.md diff --git a/docs/netutil.md b/docs/olddocs/netutil.md similarity index 100% rename from docs/netutil.md rename to docs/olddocs/netutil.md diff --git a/docs/netutil_zh-CN.md b/docs/olddocs/netutil_zh-CN.md similarity index 100% rename from docs/netutil_zh-CN.md rename to docs/olddocs/netutil_zh-CN.md diff --git a/docs/pointer.md b/docs/olddocs/pointer.md similarity index 100% rename from docs/pointer.md rename to docs/olddocs/pointer.md diff --git a/docs/pointer_zh-CN.md b/docs/olddocs/pointer_zh-CN.md similarity index 100% rename from docs/pointer_zh-CN.md rename to docs/olddocs/pointer_zh-CN.md diff --git a/docs/random.md b/docs/olddocs/random.md similarity index 100% rename from docs/random.md rename to docs/olddocs/random.md diff --git a/docs/random_zh-CN.md b/docs/olddocs/random_zh-CN.md similarity index 100% rename from docs/random_zh-CN.md rename to docs/olddocs/random_zh-CN.md diff --git a/docs/retry.md b/docs/olddocs/retry.md similarity index 100% rename from docs/retry.md rename to docs/olddocs/retry.md diff --git a/docs/retry_zh-CN.md b/docs/olddocs/retry_zh-CN.md similarity index 100% rename from docs/retry_zh-CN.md rename to docs/olddocs/retry_zh-CN.md diff --git a/docs/slice.md b/docs/olddocs/slice.md similarity index 100% rename from docs/slice.md rename to docs/olddocs/slice.md diff --git a/docs/slice_zh-CN.md b/docs/olddocs/slice_zh-CN.md similarity index 100% rename from docs/slice_zh-CN.md rename to docs/olddocs/slice_zh-CN.md diff --git a/docs/stream.md b/docs/olddocs/stream.md similarity index 100% rename from docs/stream.md rename to docs/olddocs/stream.md diff --git a/docs/stream_zh-CN.md b/docs/olddocs/stream_zh-CN.md similarity index 100% rename from docs/stream_zh-CN.md rename to docs/olddocs/stream_zh-CN.md diff --git a/docs/structs/field.md b/docs/olddocs/structs/field.md similarity index 100% rename from docs/structs/field.md rename to docs/olddocs/structs/field.md diff --git a/docs/structs/field_zh-CN.md b/docs/olddocs/structs/field_zh-CN.md similarity index 100% rename from docs/structs/field_zh-CN.md rename to docs/olddocs/structs/field_zh-CN.md diff --git a/docs/structs/struct.md b/docs/olddocs/structs/struct.md similarity index 100% rename from docs/structs/struct.md rename to docs/olddocs/structs/struct.md diff --git a/docs/structs/struct_zh-CN.md b/docs/olddocs/structs/struct_zh-CN.md similarity index 100% rename from docs/structs/struct_zh-CN.md rename to docs/olddocs/structs/struct_zh-CN.md diff --git a/docs/strutil.md b/docs/olddocs/strutil.md similarity index 100% rename from docs/strutil.md rename to docs/olddocs/strutil.md diff --git a/docs/strutil_zh-CN.md b/docs/olddocs/strutil_zh-CN.md similarity index 100% rename from docs/strutil_zh-CN.md rename to docs/olddocs/strutil_zh-CN.md diff --git a/docs/system.md b/docs/olddocs/system.md similarity index 100% rename from docs/system.md rename to docs/olddocs/system.md diff --git a/docs/system_zh-CN.md b/docs/olddocs/system_zh-CN.md similarity index 100% rename from docs/system_zh-CN.md rename to docs/olddocs/system_zh-CN.md diff --git a/docs/tuple.md b/docs/olddocs/tuple.md similarity index 100% rename from docs/tuple.md rename to docs/olddocs/tuple.md diff --git a/docs/tuple_zh-CN.md b/docs/olddocs/tuple_zh-CN.md similarity index 100% rename from docs/tuple_zh-CN.md rename to docs/olddocs/tuple_zh-CN.md diff --git a/docs/validator.md b/docs/olddocs/validator.md similarity index 100% rename from docs/validator.md rename to docs/olddocs/validator.md diff --git a/docs/validator_zh-CN.md b/docs/olddocs/validator_zh-CN.md similarity index 100% rename from docs/validator_zh-CN.md rename to docs/olddocs/validator_zh-CN.md diff --git a/docs/xerror.md b/docs/olddocs/xerror.md similarity index 100% rename from docs/xerror.md rename to docs/olddocs/xerror.md diff --git a/docs/xerror_zh-CN.md b/docs/olddocs/xerror_zh-CN.md similarity index 100% rename from docs/xerror_zh-CN.md rename to docs/olddocs/xerror_zh-CN.md diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 0000000..854cba2 --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,1277 @@ +{ + "name": "lancet-docs", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "lancet-docs", + "devDependencies": { + "vitepress": "^1.0.0-rc.4" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", + "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", + "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", + "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", + "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "dev": true, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.19.1.tgz", + "integrity": "sha512-FYAZWcGsFTTaSAwj9Std8UML3Bu8dyWDncM7Ls8g+58UOe4XYdlgzXWbrIgjaguP63pCCbMoExKr61B+ztK3tw==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.19.1" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.19.1.tgz", + "integrity": "sha512-XGghi3l0qA38HiqdoUY+wvGyBsGvKZ6U3vTiMBT4hArhP3fOGLXpIINgMiiGjTe4FVlTa5a/7Zf2bwlIHfRqqg==", + "dev": true + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.19.1.tgz", + "integrity": "sha512-+PDWL+XALGvIginigzu8oU6eWw+o76Z8zHbBovWYcrtWOEtinbl7a7UTt3x3lthv+wNuFr/YD1Gf+B+A9V8n5w==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.19.1" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.19.1.tgz", + "integrity": "sha512-Oy0ritA2k7AMxQ2JwNpfaEcgXEDgeyKu0V7E7xt/ZJRdXfEpZcwp9TOg4TJHC7Ia62gIeT2Y/ynzsxccPw92GA==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.19.1", + "@algolia/client-search": "4.19.1", + "@algolia/transporter": "4.19.1" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.19.1.tgz", + "integrity": "sha512-5QCq2zmgdZLIQhHqwl55ZvKVpLM3DNWjFI4T+bHr3rGu23ew2bLO4YtyxaZeChmDb85jUdPDouDlCumGfk6wOg==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.19.1", + "@algolia/client-search": "4.19.1", + "@algolia/requester-common": "4.19.1", + "@algolia/transporter": "4.19.1" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.19.1.tgz", + "integrity": "sha512-3kAIVqTcPrjfS389KQvKzliC559x+BDRxtWamVJt8IVp7LGnjq+aVAXg4Xogkur1MUrScTZ59/AaUd5EdpyXgA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.19.1", + "@algolia/transporter": "4.19.1" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.19.1.tgz", + "integrity": "sha512-8CWz4/H5FA+krm9HMw2HUQenizC/DxUtsI5oYC0Jxxyce1vsr8cb1aEiSJArQT6IzMynrERif1RVWLac1m36xw==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.19.1", + "@algolia/requester-common": "4.19.1", + "@algolia/transporter": "4.19.1" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.19.1.tgz", + "integrity": "sha512-mBecfMFS4N+yK/p0ZbK53vrZbL6OtWMk8YmnOv1i0LXx4pelY8TFhqKoTit3NPVPwoSNN0vdSN9dTu1xr1XOVw==", + "dev": true, + "dependencies": { + "@algolia/client-common": "4.19.1", + "@algolia/requester-common": "4.19.1", + "@algolia/transporter": "4.19.1" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.19.1.tgz", + "integrity": "sha512-i6pLPZW/+/YXKis8gpmSiNk1lOmYCmRI6+x6d2Qk1OdfvX051nRVdalRbEcVTpSQX6FQAoyeaui0cUfLYW5Elw==", + "dev": true + }, + "node_modules/@algolia/logger-console": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.19.1.tgz", + "integrity": "sha512-jj72k9GKb9W0c7TyC3cuZtTr0CngLBLmc8trzZlXdfvQiigpUdvTi1KoWIb2ZMcRBG7Tl8hSb81zEY3zI2RlXg==", + "dev": true, + "dependencies": { + "@algolia/logger-common": "4.19.1" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.19.1.tgz", + "integrity": "sha512-09K/+t7lptsweRTueHnSnmPqIxbHMowejAkn9XIcJMLdseS3zl8ObnS5GWea86mu3vy4+8H+ZBKkUN82Zsq/zg==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.19.1" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.19.1.tgz", + "integrity": "sha512-BisRkcWVxrDzF1YPhAckmi2CFYK+jdMT60q10d7z3PX+w6fPPukxHRnZwooiTUrzFe50UBmLItGizWHP5bDzVQ==", + "dev": true + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.19.1.tgz", + "integrity": "sha512-6DK52DHviBHTG2BK/Vv2GIlEw7i+vxm7ypZW0Z7vybGCNDeWzADx+/TmxjkES2h15+FZOqVf/Ja677gePsVItA==", + "dev": true, + "dependencies": { + "@algolia/requester-common": "4.19.1" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.19.1.tgz", + "integrity": "sha512-nkpvPWbpuzxo1flEYqNIbGz7xhfhGOKGAZS7tzC+TELgEmi7z99qRyTfNSUlW7LZmB3ACdnqAo+9A9KFBENviQ==", + "dev": true, + "dependencies": { + "@algolia/cache-common": "4.19.1", + "@algolia/logger-common": "4.19.1", + "@algolia/requester-common": "4.19.1" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", + "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.5.2.tgz", + "integrity": "sha512-SPiDHaWKQZpwR2siD0KQUwlStvIAnEyK6tAE2h2Wuoq8ue9skzhlyVQ1ddzOxX6khULnAALDiR/isSF3bnuciA==", + "dev": true + }, + "node_modules/@docsearch/js": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/js/-/js-3.5.2.tgz", + "integrity": "sha512-p1YFTCDflk8ieHgFJYfmyHBki1D61+U9idwrLh+GQQMrBSP3DLGKpy0XUJtPjAOPltcVbqsTjiPFfH7JImjUNg==", + "dev": true, + "dependencies": { + "@docsearch/react": "3.5.2", + "preact": "^10.0.0" + } + }, + "node_modules/@docsearch/react": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.5.2.tgz", + "integrity": "sha512-9Ahcrs5z2jq/DcAvYtvlqEBHImbm4YJI8M9y0x6Tqg598P40HTEkX7hsMcIuThI+hTFxRGZ9hll0Wygm2yEjng==", + "dev": true, + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.5.2", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", + "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==", + "dev": true + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.3.tgz", + "integrity": "sha512-ssxyhIAZqB0TrpUg6R0cBpCuMk9jTIlO1GNSKKQD6S8VjnXi6JXKfUXjSsxey9IwQiaRGsO1WnW9Rkl1L6AJVw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "dev": true, + "dependencies": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==", + "dev": true + }, + "node_modules/@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "dev": true, + "dependencies": { + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "dev": true, + "dependencies": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "dev": true, + "dependencies": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "dev": true, + "dependencies": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + }, + "peerDependencies": { + "vue": "3.3.4" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==", + "dev": true + }, + "node_modules/@vueuse/core": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.3.0.tgz", + "integrity": "sha512-BEM5yxcFKb5btFjTSAFjTu5jmwoW66fyV9uJIP4wUXXU8aR5Hl44gndaaXp7dC5HSObmgbnR2RN+Un1p68Mf5Q==", + "dev": true, + "dependencies": { + "@types/web-bluetooth": "^0.0.17", + "@vueuse/metadata": "10.3.0", + "@vueuse/shared": "10.3.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/integrations/-/integrations-10.3.0.tgz", + "integrity": "sha512-Jgiv7oFyIgC6BxmDtiyG/fxyGysIds00YaY7sefwbhCZ2/tjEx1W/1WcsISSJPNI30in28+HC2J4uuU8184ekg==", + "dev": true, + "dependencies": { + "@vueuse/core": "10.3.0", + "@vueuse/shared": "10.3.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "async-validator": "*", + "axios": "*", + "change-case": "*", + "drauu": "*", + "focus-trap": "*", + "fuse.js": "*", + "idb-keyval": "*", + "jwt-decode": "*", + "nprogress": "*", + "qrcode": "*", + "sortablejs": "*", + "universal-cookie": "*" + }, + "peerDependenciesMeta": { + "async-validator": { + "optional": true + }, + "axios": { + "optional": true + }, + "change-case": { + "optional": true + }, + "drauu": { + "optional": true + }, + "focus-trap": { + "optional": true + }, + "fuse.js": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "jwt-decode": { + "optional": true + }, + "nprogress": { + "optional": true + }, + "qrcode": { + "optional": true + }, + "sortablejs": { + "optional": true + }, + "universal-cookie": { + "optional": true + } + } + }, + "node_modules/@vueuse/integrations/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.3.0.tgz", + "integrity": "sha512-Ema3YhNOa4swDsV0V7CEY5JXvK19JI/o1szFO1iWxdFg3vhdFtCtSTP26PCvbUpnUtNHBY2wx5y3WDXND5Pvnw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.3.0.tgz", + "integrity": "sha512-kGqCTEuFPMK4+fNWy6dUOiYmxGcUbtznMwBZLC1PubidF4VZY05B+Oht7Jh7/6x4VOWGpvu3R37WHi81cKpiqg==", + "dev": true, + "dependencies": { + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.5.tgz", + "integrity": "sha512-o9NUVpl/YlsGJ7t+xuqJKx8EBGf1quRhCiT6D/J0pfwmk9zUwYkC7yrF4SZCe6fETvSM3UNL2edcbYrSyc4QHA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/algoliasearch": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.19.1.tgz", + "integrity": "sha512-IJF5b93b2MgAzcE/tuzW0yOPnuUyRgGAtaPv5UUywXM8kzqfdwZTO4sPJBzoGz1eOy6H9uEchsJsBFTELZSu+g==", + "dev": true, + "dependencies": { + "@algolia/cache-browser-local-storage": "4.19.1", + "@algolia/cache-common": "4.19.1", + "@algolia/cache-in-memory": "4.19.1", + "@algolia/client-account": "4.19.1", + "@algolia/client-analytics": "4.19.1", + "@algolia/client-common": "4.19.1", + "@algolia/client-personalization": "4.19.1", + "@algolia/client-search": "4.19.1", + "@algolia/logger-common": "4.19.1", + "@algolia/logger-console": "4.19.1", + "@algolia/requester-browser-xhr": "4.19.1", + "@algolia/requester-common": "4.19.1", + "@algolia/requester-node-http": "4.19.1", + "@algolia/transporter": "4.19.1" + } + }, + "node_modules/ansi-sequence-parser": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ansi-sequence-parser/-/ansi-sequence-parser-1.1.1.tgz", + "integrity": "sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==", + "dev": true + }, + "node_modules/body-scroll-lock": { + "version": "4.0.0-beta.0", + "resolved": "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz", + "integrity": "sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ==", + "dev": true + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true + }, + "node_modules/focus-trap": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.2.tgz", + "integrity": "sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw==", + "dev": true, + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, + "node_modules/magic-string": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", + "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/mark.js": { + "version": "8.11.1", + "resolved": "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz", + "integrity": "sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ==", + "dev": true + }, + "node_modules/minisearch": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/minisearch/-/minisearch-6.1.0.tgz", + "integrity": "sha512-PNxA/X8pWk+TiqPbsoIYH0GQ5Di7m6326/lwU/S4mlo4wGQddIcf/V//1f9TB0V4j59b57b+HZxt8h3iMROGvg==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/postcss": { + "version": "8.4.28", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.28.tgz", + "integrity": "sha512-Z7V5j0cq8oEKyejIKfpD8b4eBy9cwW2JWPk0+fB1HOAMsfHbnAXLLS+PfVWlzMSLQaWttKDt607I0XHmpE67Vw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.17.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.17.1.tgz", + "integrity": "sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/rollup": { + "version": "3.28.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.28.1.tgz", + "integrity": "sha512-R9OMQmIHJm9znrU3m3cpE8uhN0fGdXiawME7aZIpQqvpS/85+Vt1Hq1/yVIcYfOmaQiHjvXkQAoJukvLpau6Yw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/search-insights": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.7.0.tgz", + "integrity": "sha512-GLbVaGgzYEKMvuJbHRhLi1qoBFnjXZGZ6l4LxOYPCp4lI2jDRB3jPU9/XNhMwv6kvnA9slTreq6pvK+b3o3aqg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8.16.0" + } + }, + "node_modules/shiki": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-0.14.3.tgz", + "integrity": "sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==", + "dev": true, + "dependencies": { + "ansi-sequence-parser": "^1.1.0", + "jsonc-parser": "^3.2.0", + "vscode-oniguruma": "^1.7.0", + "vscode-textmate": "^8.0.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==", + "dev": true + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitepress": { + "version": "1.0.0-rc.4", + "resolved": "https://registry.npmjs.org/vitepress/-/vitepress-1.0.0-rc.4.tgz", + "integrity": "sha512-JCQ89Bm6ECUTnyzyas3JENo00UDJeK8q1SUQyJYou+4Yz5BKEc/F3O21cu++DnUT2zXc0kvQ2Aj4BZCc/nioXQ==", + "dev": true, + "dependencies": { + "@docsearch/css": "^3.5.1", + "@docsearch/js": "^3.5.1", + "@vitejs/plugin-vue": "^4.2.3", + "@vue/devtools-api": "^6.5.0", + "@vueuse/core": "^10.3.0", + "@vueuse/integrations": "^10.3.0", + "body-scroll-lock": "4.0.0-beta.0", + "focus-trap": "^7.5.2", + "mark.js": "8.11.1", + "minisearch": "^6.1.0", + "shiki": "^0.14.3", + "vite": "^4.4.9", + "vue": "^3.3.4" + }, + "bin": { + "vitepress": "bin/vitepress.js" + } + }, + "node_modules/vscode-oniguruma": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vscode-oniguruma/-/vscode-oniguruma-1.7.0.tgz", + "integrity": "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==", + "dev": true + }, + "node_modules/vscode-textmate": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/vscode-textmate/-/vscode-textmate-8.0.0.tgz", + "integrity": "sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==", + "dev": true + }, + "node_modules/vue": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "dev": true, + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 0000000..97f17b9 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,13 @@ +{ + "name": "lancet-docs", + "private": true, + "type": "module", + "scripts": { + "docs:dev": "vitepress dev", + "docs:build": "vitepress build", + "docs:preview": "vitepress preview" + }, + "devDependencies": { + "vitepress": "^1.0.0-rc.4" + } +}